// Copyright (c) 2005 Brian Wellington (bwelling@xbill.org)

package org.xbill.DNS;

import java.io.*;
import java.net.*;
import java.nio.channels.*;

import org.xbill.DNS.utils.hexdump;

class Client {

    protected long endTime;
    protected SelectionKey key;

    protected Client(SelectableChannel channel, long endTime) throws IOException {
        boolean done = false;
        Selector selector = null;
        this.endTime = endTime;
        try {
            selector = Selector.open();
            channel.configureBlocking(false);
            key = channel.register(selector, SelectionKey.OP_READ);
            done = true;
        } finally {
            if (!done && selector != null)
                selector.close();
            if (!done)
                channel.close();
        }
    }

    static protected void
    blockUntil(SelectionKey key, long endTime) throws IOException {
        long timeout = endTime - System.currentTimeMillis();
        int nkeys = 0;
        if (timeout > 0)
            nkeys = key.selector().select(timeout);
        else if (timeout == 0)
            nkeys = key.selector().selectNow();
        if (nkeys == 0)
            throw new SocketTimeoutException();
    }

    static protected void
    verboseLog(String prefix, byte[] data) {
        if (Options.check("verbosemsg"))
            System.err.println(hexdump.dump(prefix, data));
    }

    void
    cleanup() throws IOException {
        key.selector().close();
        key.channel().close();
    }

}
