Mercurial > hg > RemoteEditor > Eclipse
comparison src/rep/channel/REPSocketChannel.java @ 193:3133040ee4f4
(no commit message)
author | one |
---|---|
date | Wed, 31 Dec 2008 15:06:22 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
192:c921022bf494 | 193:3133040ee4f4 |
---|---|
1 package rep.channel; | |
2 | |
3 import java.io.IOException; | |
4 import java.net.Socket; | |
5 import java.net.SocketAddress; | |
6 import java.nio.ByteBuffer; | |
7 import java.nio.channels.ClosedChannelException; | |
8 import java.nio.channels.SelectableChannel; | |
9 import java.nio.channels.SelectionKey; | |
10 import java.nio.channels.Selector; | |
11 import java.nio.channels.SocketChannel; | |
12 import java.nio.channels.spi.AbstractSelector; | |
13 import java.nio.channels.spi.SelectorProvider; | |
14 import java.util.Collections; | |
15 import java.util.HashMap; | |
16 import java.util.Map; | |
17 | |
18 public class REPSocketChannel<P> extends SelectableChannel{ | |
19 | |
20 public SocketChannel sc; | |
21 private REPPack<P> pack; | |
22 static public Map<SelectableChannel,SelectableChannel> channels = | |
23 Collections.synchronizedMap(new HashMap<SelectableChannel,SelectableChannel>()); | |
24 | |
25 public REPSocketChannel(SocketChannel channel, REPPack<P> packer) { | |
26 sc = channel; | |
27 pack = packer; | |
28 addChannel(sc,this); | |
29 } | |
30 | |
31 public REPSocketChannel(SelectableChannel channel, REPPack<P> packer) { | |
32 sc = (SocketChannel)channel; | |
33 pack = packer; | |
34 addChannel(sc,this); | |
35 } | |
36 | |
37 public static void addChannel(SelectableChannel sc,SelectableChannel rc) { | |
38 channels.put(sc, rc); | |
39 } | |
40 | |
41 public void close1() throws IOException { | |
42 removeChannel(sc); | |
43 sc.close(); | |
44 } | |
45 | |
46 public static void removeChannel(SelectableChannel sc) throws IOException { | |
47 if(channels.containsKey(sc)) channels.remove(sc); | |
48 } | |
49 | |
50 @Override | |
51 public Object blockingLock() { | |
52 return sc.blockingLock(); | |
53 } | |
54 | |
55 @Override | |
56 public SelectableChannel configureBlocking(boolean block) throws IOException { | |
57 return sc.configureBlocking(block); | |
58 } | |
59 | |
60 @Override | |
61 public boolean isBlocking() { | |
62 return sc.isBlocking(); | |
63 } | |
64 | |
65 @Override | |
66 public boolean isRegistered() { | |
67 return sc.isRegistered(); | |
68 } | |
69 | |
70 @Override | |
71 public SelectionKey keyFor(Selector sel) { | |
72 return sc.keyFor(sel); | |
73 } | |
74 | |
75 public SelectionKey keyFor(REPSelector<?> sel) { | |
76 return sc.keyFor(sel.selector); | |
77 } | |
78 | |
79 public REPSelectionKey<P> keyFor1(REPSelector<P> sel) { | |
80 return new REPSelectionKey<P>(sc.keyFor(sel.selector), | |
81 new REPSelector<P>((AbstractSelector) sel.selector)); | |
82 } | |
83 | |
84 @Override | |
85 public SelectorProvider provider() { | |
86 return sc.provider(); | |
87 } | |
88 | |
89 | |
90 @Override | |
91 public int validOps() { | |
92 return sc.validOps(); | |
93 } | |
94 | |
95 @Override | |
96 protected void implCloseChannel() throws IOException { | |
97 close1(); | |
98 } | |
99 | |
100 | |
101 public int read(ByteBuffer header) throws IOException { | |
102 return sc.read(header); | |
103 } | |
104 | |
105 public void write(ByteBuffer buffer) throws IOException { | |
106 sc.write(buffer); | |
107 | |
108 } | |
109 | |
110 public boolean finishConnect() throws IOException { | |
111 return sc.finishConnect(); | |
112 } | |
113 | |
114 public Socket socket() { | |
115 return sc.socket(); | |
116 } | |
117 | |
118 public P read() throws IOException{ | |
119 return pack.unpackUConv(sc); | |
120 } | |
121 | |
122 public boolean write(P p){ | |
123 ByteBuffer bb = pack.packUConv(p); | |
124 if (bb==null) return true; | |
125 try { | |
126 while (bb.remaining() > 0 ){ | |
127 sc.write(bb); | |
128 } | |
129 return true; | |
130 } catch (IOException e) { | |
131 return false; | |
132 } | |
133 } | |
134 | |
135 public static <T> REPSocketChannel<T> create(REPPack<T> packer) throws IOException { | |
136 if (REPServerSocketChannel.isSimulation) { | |
137 return new ChannelSimulator<T>(); | |
138 } else { | |
139 REPSocketChannel<T> rsc = new REPSocketChannel<T>(SocketChannel.open(), packer); | |
140 return rsc; | |
141 } | |
142 } | |
143 | |
144 | |
145 public boolean connect(SocketAddress semaIP) throws IOException { | |
146 return sc.connect(semaIP); | |
147 } | |
148 | |
149 public SelectionKey register(REPSelector<P> sel, int ops, Object att) throws ClosedChannelException { | |
150 return sc.register(sel.selector, ops, att); | |
151 } | |
152 | |
153 | |
154 | |
155 public SelectionKey register1(REPSelector<P> sel, int ops, Object att) | |
156 throws ClosedChannelException { | |
157 if(sel instanceof REPSelector) { | |
158 REPSelector<P> s = (REPSelector<P>)sel; | |
159 return sc.register(s.selector, ops,att); | |
160 } | |
161 return sc.register(sel, ops,att); | |
162 } | |
163 | |
164 @SuppressWarnings("unchecked") | |
165 @Override | |
166 public SelectionKey register(Selector sel, int ops, Object att) | |
167 throws ClosedChannelException { | |
168 if(sel instanceof REPSelector) { | |
169 REPSelector<P> s = (REPSelector<P>)sel; | |
170 return sc.register(s.selector, ops,att); | |
171 } | |
172 return sc.register(sel, ops,att); | |
173 } | |
174 | |
175 public String getLocalHostName() { | |
176 return sc.socket().getLocalAddress().getHostName(); | |
177 | |
178 } | |
179 | |
180 | |
181 } |