// 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;
public class Client {
protected long endTime;
protected SelectionKey key;
/**
* Packet logger, if available.
*/
private static PacketLogger packetLogger = null;
public 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, SocketAddress local, SocketAddress remote,
byte[] data) {
if (Options.check("verbosemsg"))
System.err.println(hexdump.dump(prefix, data));
if (packetLogger != null)
packetLogger.log(prefix, local, remote, data);
}
public void cleanup() throws IOException {
key.selector().close();
key.channel().close();
}
static void setPacketLogger(PacketLogger logger) {
packetLogger = logger;
}
}