1d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen// Copyright (c) 2005 Brian Wellington (bwelling@xbill.org)
2d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
3d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenpackage org.xbill.DNS;
4d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
5d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.io.*;
6d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.net.*;
7d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport java.nio.channels.*;
8d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenimport org.xbill.DNS.utils.hexdump;
9d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
10d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenclass Client {
11d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
12d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprotected long endTime;
13d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprotected SelectionKey key;
14d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
15d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenprotected
16d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenClient(SelectableChannel channel, long endTime) throws IOException {
17d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	boolean done = false;
18d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	Selector selector = null;
19d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	this.endTime = endTime;
20d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	try {
21d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		selector = Selector.open();
22d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		channel.configureBlocking(false);
23d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		key = channel.register(selector, SelectionKey.OP_READ);
24d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		done = true;
25d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
26d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	finally {
27d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		if (!done && selector != null)
28d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			selector.close();
29d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		if (!done)
30d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen			channel.close();
31d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	}
32d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
33d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
34d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic protected void
35d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenblockUntil(SelectionKey key, long endTime) throws IOException {
36d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	long timeout = endTime - System.currentTimeMillis();
37d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	int nkeys = 0;
38d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (timeout > 0)
39d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		nkeys = key.selector().select(timeout);
40d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	else if (timeout == 0)
41d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		nkeys = key.selector().selectNow();
42d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (nkeys == 0)
43d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		throw new SocketTimeoutException();
44d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
45d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
46d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenstatic protected void
47d7955ce24d294fb2014c59d11fca184471056f44Shuyi ChenverboseLog(String prefix, byte [] data) {
48d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	if (Options.check("verbosemsg"))
49d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen		System.err.println(hexdump.dump(prefix, data));
50d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
51d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
52d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chenvoid
53d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chencleanup() throws IOException {
54d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	key.selector().close();
55d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen	key.channel().close();
56d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
57d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen
58d7955ce24d294fb2014c59d11fca184471056f44Shuyi Chen}
59