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.InetAddress;
23 import java.net.Socket;
24 import java.net.SocketAddress;
25 import java.net.SocketException;
26 import java.nio.ByteBuffer;
27 import java.nio.channels.SocketChannel;
28
29 import org.activeio.Disposable;
30 import org.activeio.packet.ByteBufferPacket;
31
32 /***
33 * Base class for the Asynch and Synch implementations of NIO channels.
34 *
35 * @version $Revision$
36 */
37 public class NIOBaseChannel implements SocketMetadata, Disposable {
38
39 protected final SocketChannel socketChannel;
40 protected final Socket socket;
41 private final boolean useDirect;
42 private int curentSoTimeout;
43 private boolean disposed;
44 private final String name;
45
46 protected NIOBaseChannel(SocketChannel socketChannel, boolean useDirect) throws IOException {
47 this.socketChannel = socketChannel;
48 this.useDirect = useDirect;
49 this.socket = this.socketChannel.socket();
50
51 if( useDirect ) {
52 socket.setSendBufferSize(ByteBufferPacket.DEFAULT_DIRECT_BUFFER_SIZE);
53 socket.setReceiveBufferSize(ByteBufferPacket.DEFAULT_DIRECT_BUFFER_SIZE);
54 } else {
55 socket.setSendBufferSize(ByteBufferPacket.DEFAULT_BUFFER_SIZE);
56 socket.setReceiveBufferSize(ByteBufferPacket.DEFAULT_BUFFER_SIZE);
57 }
58
59 this.name = "NIO Socket Connection: "+getLocalSocketAddress()+" -> "+getRemoteSocketAddress();
60 }
61
62 protected ByteBuffer allocateBuffer() {
63 if( useDirect ) {
64 return ByteBuffer.allocateDirect(ByteBufferPacket.DEFAULT_DIRECT_BUFFER_SIZE);
65 } else {
66 return ByteBuffer.allocate(ByteBufferPacket.DEFAULT_BUFFER_SIZE);
67 }
68 }
69
70 protected void setSoTimeout(int i) throws SocketException {
71 if( curentSoTimeout != i ) {
72 socket.setSoTimeout(i);
73 curentSoTimeout = i;
74 }
75 }
76 public Object narrow(Class target) {
77 if( target.isAssignableFrom(getClass()) ) {
78 return this;
79 }
80 return null;
81 }
82
83 public String toString() {
84 return name;
85 }
86
87 public void dispose() {
88 if (disposed)
89 return;
90
91 try {
92 socketChannel.close();
93 } catch (IOException ignore) {
94 }
95 disposed = true;
96 }
97
98 /***
99 * @see org.activeio.Channel#flush()
100 */
101 public void flush() throws IOException {
102 }
103
104 public InetAddress getInetAddress() {
105 return socket.getInetAddress();
106 }
107 public boolean getKeepAlive() throws SocketException {
108 return socket.getKeepAlive();
109 }
110 public InetAddress getLocalAddress() {
111 return socket.getLocalAddress();
112 }
113 public int getLocalPort() {
114 return socket.getLocalPort();
115 }
116 public SocketAddress getLocalSocketAddress() {
117 return socket.getLocalSocketAddress();
118 }
119 public boolean getOOBInline() throws SocketException {
120 return socket.getOOBInline();
121 }
122 public int getPort() {
123 return socket.getPort();
124 }
125 public int getReceiveBufferSize() throws SocketException {
126 return socket.getReceiveBufferSize();
127 }
128 public SocketAddress getRemoteSocketAddress() {
129 return socket.getRemoteSocketAddress();
130 }
131 public boolean getReuseAddress() throws SocketException {
132 return socket.getReuseAddress();
133 }
134 public int getSendBufferSize() throws SocketException {
135 return socket.getSendBufferSize();
136 }
137 public int getSoLinger() throws SocketException {
138 return socket.getSoLinger();
139 }
140 public int getSoTimeout() throws SocketException {
141 return socket.getSoTimeout();
142 }
143 public boolean getTcpNoDelay() throws SocketException {
144 return socket.getTcpNoDelay();
145 }
146 public int getTrafficClass() throws SocketException {
147 return socket.getTrafficClass();
148 }
149 public boolean isBound() {
150 return socket.isBound();
151 }
152 public boolean isClosed() {
153 return socket.isClosed();
154 }
155 public boolean isConnected() {
156 return socket.isConnected();
157 }
158 public void setKeepAlive(boolean on) throws SocketException {
159 socket.setKeepAlive(on);
160 }
161 public void setOOBInline(boolean on) throws SocketException {
162 socket.setOOBInline(on);
163 }
164 public void setReceiveBufferSize(int size) throws SocketException {
165 socket.setReceiveBufferSize(size);
166 }
167 public void setReuseAddress(boolean on) throws SocketException {
168 socket.setReuseAddress(on);
169 }
170 public void setSendBufferSize(int size) throws SocketException {
171 socket.setSendBufferSize(size);
172 }
173 public void setSoLinger(boolean on, int linger) throws SocketException {
174 socket.setSoLinger(on, linger);
175 }
176 public void setTcpNoDelay(boolean on) throws SocketException {
177 socket.setTcpNoDelay(on);
178 }
179 public void setTrafficClass(int tc) throws SocketException {
180 socket.setTrafficClass(tc);
181 }
182 }