Mercurial > hg > RemoteEditor > REPSessionManager
view rep/channel/REPSelectionKey.java @ 208:302c4a0afab6
*** empty log message ***
author | kono |
---|---|
date | Sat, 30 Aug 2008 12:15:21 +0900 |
parents | 4c0a94836357 |
children | ed43dc6ccb07 |
line wrap: on
line source
package rep.channel; import java.io.IOException; import java.nio.channels.SelectableChannel; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; public class REPSelectionKey<P> extends SelectionKey { SelectionKey key; public REPSelectionKey(SelectionKey key) { this.key = key; } @Override public void cancel() { key.cancel(); } @Override public SelectableChannel channel() { assert(false); // use public SelectableChannel channel(REPPack<P>packer) instead return key.channel(); } public SelectableChannel channel(REPPack<P>packer) { if (REPServerSocketChannel.isSimulation) return key.channel(); if (key.isAcceptable()) { SelectableChannel sc = key.channel(); SelectableChannel rsc = REPSocketChannel.channels.get(sc); if (rsc!=null) return rsc; return new REPServerSocketChannel<P>(key.channel(),packer); } else if (key.isReadable()) { SelectableChannel sc = key.channel(); SelectableChannel rsc = REPSocketChannel.channels.get(sc); if (rsc!=null) return rsc; return new REPSocketChannel<P>(key.channel(),packer); } return null; } @Override public int interestOps() { return key.interestOps(); } @Override public SelectionKey interestOps(int ops) { return key.interestOps(ops); } @Override public boolean isValid() { return key.isValid(); } @Override public int readyOps() { return key.readyOps(); } @Override public Selector selector() { assert(false); return key.selector(); // should return REPSelector } @SuppressWarnings("unchecked") public REPSocketChannel<P> accept(REPPack<P> pack) throws IOException { assert(!REPServerSocketChannel.isSimulation); if (!key.isAcceptable()) throw new IOException(); ServerSocketChannel ssc = (ServerSocketChannel)key.channel(); if (ssc==null) return null; SocketChannel ss = (SocketChannel)ssc.accept(); if (ss==null) return null; REPSocketChannel<P> rsc = (REPSocketChannel<P>)REPSocketChannel.channels.get(ss); if (rsc!=null) return rsc; return new REPSocketChannel<P>(ss,pack); } }