Mercurial > hg > RemoteEditor > Eclipse
comparison src/rep/channel/SelectionKeySimulator.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.nio.channels.SelectableChannel; | |
5 import java.nio.channels.SelectionKey; | |
6 import java.nio.channels.Selector; | |
7 | |
8 public class SelectionKeySimulator<P> extends REPSelectionKey<P>{ | |
9 | |
10 private int interestOpt; | |
11 private SelectableChannel channel; | |
12 private int ready; | |
13 public Selector selector; | |
14 public boolean canceled = false; | |
15 | |
16 public SelectionKeySimulator(SelectableChannel cs, int opt, Selector _selector) { | |
17 channel = cs; | |
18 interestOpt = opt; | |
19 selector = _selector; | |
20 } | |
21 public SelectionKeySimulator(SelectionKey k) { | |
22 channel = k.channel(); | |
23 interestOpt = k.interestOps(); | |
24 selector = k.selector(); | |
25 attach(k.attachment()); | |
26 } | |
27 | |
28 | |
29 public boolean isAble() { | |
30 if ( (interestOpt&OP_READ)!=0 && isReadable() ) | |
31 return true; | |
32 else if( (interestOpt&OP_ACCEPT)!=0 && isAcceptable() ) | |
33 return true; | |
34 else if( (interestOpt&OP_WRITE)!=0 && isWritable() ) | |
35 return true; | |
36 else | |
37 return false; | |
38 } | |
39 | |
40 public void setFlag() { | |
41 ChannelSimulator<?> scs = (ChannelSimulator<?>) channel; | |
42 ready = 0; | |
43 if(scs.isAcceptable()) ready |= OP_ACCEPT; | |
44 if(scs.isReadable()) ready |= OP_READ; | |
45 if(scs.isWritable()) ready |= OP_WRITE; | |
46 } | |
47 | |
48 public SelectableChannel channel() { | |
49 return channel; | |
50 } | |
51 | |
52 @SuppressWarnings("unchecked") | |
53 @Override | |
54 public REPSocketChannel<P> channel1() { | |
55 return (REPSocketChannel<P>)channel; | |
56 } | |
57 | |
58 @SuppressWarnings("unchecked") | |
59 @Override | |
60 public REPServerSocketChannel<P> serverSocketChannel() { | |
61 return (REPServerSocketChannel<P>)channel; | |
62 } | |
63 | |
64 public SelectableChannel channel(REPPack<P> packer) { | |
65 return channel; | |
66 } | |
67 | |
68 @SuppressWarnings("unchecked") | |
69 public REPSocketChannel<P> accept(REPPack<P> pack) throws IOException { | |
70 assert(channel instanceof ServerChannelSimulator); | |
71 ServerChannelSimulator<P> scs = (ServerChannelSimulator<P>) channel; | |
72 return scs.accept1(); | |
73 } | |
74 | |
75 @SuppressWarnings("unchecked") | |
76 @Override | |
77 public void cancel() { | |
78 canceled = true; | |
79 SelectorSimulator s = (SelectorSimulator)selector; | |
80 s.deregister(channel); | |
81 } | |
82 | |
83 @Override | |
84 public int interestOps() { | |
85 return interestOpt; | |
86 } | |
87 | |
88 @Override | |
89 public SelectionKey interestOps(int ops) { | |
90 interestOpt = ops; | |
91 return this; | |
92 } | |
93 | |
94 @Override | |
95 public boolean isValid() { | |
96 return (!canceled) && channel.isOpen() && selector.isOpen(); | |
97 } | |
98 | |
99 | |
100 @Override | |
101 public Selector selector() { | |
102 return selector; | |
103 } | |
104 | |
105 @Override | |
106 public int readyOps() { | |
107 int ops=0; | |
108 if ( channel instanceof ServerChannelSimulator ){ | |
109 ServerChannelSimulator<?> scs = (ServerChannelSimulator<?>) channel; | |
110 ops = ( OP_ACCEPT * (scs.isAcceptable()? 1:0) ); | |
111 } else if ( channel instanceof ChannelSimulator ){ | |
112 ChannelSimulator<?> scs = (ChannelSimulator<?>) channel; | |
113 ops = ( OP_READ * (scs.isReadable()? 1:0) ) | |
114 | ( OP_WRITE * (scs.isWritable()? 1:0) ); | |
115 // (OP_READ & true) がつかえないらしい. | |
116 } | |
117 return ops; | |
118 } | |
119 | |
120 } |