1 /***
2 *
3 * Copyright 2004 Hiram Chirino
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 **/
18
19 package org.activeio.net;
20
21 import java.io.IOException;
22 import java.net.SocketException;
23 import java.net.SocketTimeoutException;
24 import java.net.URI;
25
26 import org.activeio.AsynchChannel;
27 import org.activeio.Channel;
28 import org.activeio.SynchChannelServer;
29 import org.activeio.filter.WriteBufferedAsynchChannel;
30 import org.activeio.packet.ByteBufferPacket;
31
32 import com.ibm.io.async.AsyncServerSocketChannel;
33
34 /***
35 * @version $Revision$
36 */
37 public class AIOSynchChannelServer implements SynchChannelServer {
38
39 private final AsyncServerSocketChannel serverSocket;
40 private final URI bindURI;
41 private final URI connectURI;
42 private int curentSoTimeout;
43
44 public AIOSynchChannelServer(AsyncServerSocketChannel serverSocket, URI bindURI, URI connectURI) throws IOException {
45 this.serverSocket=serverSocket;
46 this.bindURI=bindURI;
47 this.connectURI=connectURI;
48 this.curentSoTimeout = serverSocket.socket().getSoTimeout();
49 }
50
51 public URI getBindURI() {
52 return bindURI;
53 }
54
55 public URI getConnectURI() {
56 return this.connectURI;
57 }
58
59 public void dispose() {
60 try {
61 serverSocket.close();
62 } catch (IOException e) {
63 }
64 }
65
66 synchronized public void start() throws IOException {
67 }
68
69 synchronized public void stop(long timeout) {
70 }
71
72 public Channel accept(long timeout) throws IOException {
73 try {
74
75 if (timeout == SynchChannelServer.WAIT_FOREVER_TIMEOUT)
76 setSoTimeout(0);
77 else if (timeout == SynchChannelServer.NO_WAIT_TIMEOUT)
78 setSoTimeout(1);
79 else
80 setSoTimeout((int) timeout);
81
82 AsynchChannel channel = new AIOAsynchChannel(serverSocket.accept());
83 channel = new WriteBufferedAsynchChannel(channel, ByteBufferPacket.createDefaultBuffer(true), false);
84 return channel;
85
86 } catch (SocketTimeoutException ignore) {
87 }
88 return null;
89 }
90
91 private void setSoTimeout(int i) throws SocketException {
92 if (curentSoTimeout != i) {
93 serverSocket.socket().setSoTimeout(i);
94 curentSoTimeout = i;
95 }
96 }
97
98 public Object narrow(Class target) {
99 if( target.isAssignableFrom(getClass()) ) {
100 return this;
101 }
102 return null;
103 }
104
105 public String toString() {
106 return "AIO Server: "+getConnectURI();
107 }
108
109 }