view rep/channel/REPSelectionKey.java @ 240:168dd841be51 iterator-bug-fig **INVALID**

selected key Interator fix.
author kono
date Sun, 31 Aug 2008 20:39:06 +0900
parents 6cd4aab9fea3
children d6a33e295d47
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;
	private REPSelector<P> selector;
	
	public REPSelectionKey() {
		
	}
	
	public REPSelectionKey(SelectionKey key,REPSelector<P>s) {
		this.key = key;
		this.selector = s;
		attach(key.attachment());
	}
	
	@Override
	public void cancel() {
		key.cancel();
	}

	@Override
	public SelectableChannel channel() {
		if (REPServerSocketChannel.isSimulation) return key.channel();
		if (key.isAcceptable()) {
			//System.err.println("Accept selectionKey.channel = "+key.channel());
			SelectableChannel sc = key.channel();
			SelectableChannel rsc = REPSocketChannel.channels.get(sc);
			return rsc;
		} else if (key.isReadable()) {
			//System.err.println("Read selectionKey.channel = "+key.channel());
			SelectableChannel sc = key.channel();
			SelectableChannel rsc = REPSocketChannel.channels.get(sc);
			return rsc;
		}
		return null;

	}

	public SelectableChannel channel(REPPack<P>packer) {
		if (REPServerSocketChannel.isSimulation) return key.channel();
		if (key.isAcceptable()) {
			//System.err.println("AcceptP selectionKey.channel = "+key.channel());
			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()) {
			//System.err.println("ReadP selectionKey.channel = "+key.channel());
			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() {
		return selector;
	}

	@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();
		//System.err.println("Accept in SelectionKey "+ss);
		if (ss==null) return null;
		return new REPSocketChannel(ss, pack);
	}


}