changeset 9:2d4c2c19d2d0

*** empty log message ***
author pin
date Tue, 30 Oct 2007 15:52:02 +0900
parents b774b87cc2c1
children 09316c8a674a
files rep/EditorChannel.java rep/SelectableEditorChannel.java rep/Session.java rep/SessionList.java rep/SessionManager.java
diffstat 5 files changed, 165 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rep/EditorChannel.java	Tue Oct 30 15:52:02 2007 +0900
@@ -0,0 +1,28 @@
+package rep;
+
+import java.nio.channels.SocketChannel;
+import java.nio.channels.spi.SelectorProvider;
+
+public abstract class EditorChannel extends SocketChannel {
+
+	protected EditorChannel(SelectorProvider provider) {
+		super(provider);
+	}
+
+	private REPPacketSend repsend;
+	private REPPacketReceive reprec;
+	
+	public void putPacket(REPCommand comm){
+		repsend.send(comm);
+	}
+	public REPCommand getPacket(){
+		REPCommand command = reprec.unpack();
+		return command;
+	}
+
+	public void setIO(SocketChannel channel) {
+		repsend = new REPPacketSend(channel);
+		reprec = new REPPacketReceive(channel);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rep/SelectableEditorChannel.java	Tue Oct 30 15:52:02 2007 +0900
@@ -0,0 +1,85 @@
+package rep;
+
+import java.io.IOException;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.SelectableChannel;
+import java.nio.channels.SelectionKey;
+import java.nio.channels.Selector;
+import java.nio.channels.SocketChannel;
+import java.nio.channels.spi.SelectorProvider;
+
+public class SelectableEditorChannel extends SelectableChannel{
+	
+	private SocketChannel channel;
+	private REPPacketSend repsend;
+	private REPPacketReceive reprec;
+
+	public SelectableEditorChannel(SocketChannel channel){
+		this.channel = channel;
+		repsend = new REPPacketSend(channel);
+		reprec = new REPPacketReceive(channel);
+		
+	}
+
+	@Override
+	public Object blockingLock() {
+		return channel.blockingLock();
+		//return null;
+	}
+
+	@Override
+	public SelectableChannel configureBlocking(boolean block) throws IOException {
+		return channel.configureBlocking(block);
+		//return null;
+	}
+
+	@Override
+	public boolean isBlocking() {
+		
+		return channel.isBlocking();
+	}
+
+	@Override
+	public boolean isRegistered() {
+		return channel.isRegistered();
+	}
+
+	@Override
+	public SelectionKey keyFor(Selector sel) {
+		return channel.keyFor(sel);
+	}
+
+	@Override
+	public SelectorProvider provider() {
+		return channel.provider();
+	}
+
+	@Override
+	public SelectionKey register(Selector sel, int ops, Object att) throws ClosedChannelException {
+		return channel.register(sel, ops, att);
+	}
+
+	@Override
+	public int validOps() {
+		return channel.validOps();
+	}
+
+	@Override
+	protected void implCloseChannel() throws IOException {
+		
+	}
+	
+	public void putPacket(REPCommand comm){
+		repsend.send(comm);
+	}
+	public REPCommand getPacket(){
+		REPCommand command = reprec.unpack();
+		return command;
+	}
+
+	//public void setIO(SocketChannel channel) {
+	//	repsend = new REPPacketSend(channel);
+	//	reprec = new REPPacketReceive(channel);
+	//}
+
+}
--- a/rep/Session.java	Fri Oct 19 15:34:27 2007 +0900
+++ b/rep/Session.java	Tue Oct 30 15:52:02 2007 +0900
@@ -9,6 +9,7 @@
 	private int sessionID;
 	private String sessionName;
 	private LinkedList<Editor> editorList = new LinkedList<Editor>();
+	
 	public Session(int sessionID, String string, SocketChannel channel) {
 		masterEditor = new Editor(sessionID, channel);
 		this.sessionID = sessionID;
--- a/rep/SessionList.java	Fri Oct 19 15:34:27 2007 +0900
+++ b/rep/SessionList.java	Tue Oct 30 15:52:02 2007 +0900
@@ -35,6 +35,7 @@
 		//sessions.add(new LinkedList<SocketChannel>());
 		//return sessions2.size();
 		session3.put(sessionID, new Session(sessionID, string, channel));
+		//addEditor(channel, sid, command);
 		return sessionID; 
 		
 	}
@@ -44,6 +45,7 @@
 		//editorCount++;
 		//sessions.get(sid-1).add(channel);
 		//sessions2.get(sid).add(channel);
+		if(session3.get(sid) == null) System.out.println("ぬるぽ!");
 		session3.get(sid).addEditor(editorID, channel);
 	}
 
@@ -77,6 +79,7 @@
 		for(Editor editor : editorList){
 			SocketChannel channel2 = editor.getChannel();
 			if(channel.equals(channel2)){
+				System.out.println("equals");
 				channelequals = true;
 			}else if(channelequals){
 				repsend = new REPPacketSend(channel2);
@@ -126,6 +129,10 @@
 		}else{
 			editor3 = editorList.get(editorList.indexOf(editor2)+1);
 		}
+		if(editor3 != null){
+			REPPacketSend send = new REPPacketSend(editor3.getChannel());
+			send.send(repCmd);
+		}
 	}
 
 	public void addEditor(SocketChannel editorChannel, int sid, int eid) {
--- a/rep/SessionManager.java	Fri Oct 19 15:34:27 2007 +0900
+++ b/rep/SessionManager.java	Tue Oct 30 15:52:02 2007 +0900
@@ -2,15 +2,11 @@
 
 import java.io.IOException;
 import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.nio.ByteBuffer;
 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;
-import java.nio.charset.Charset;
-import java.util.Iterator;
 
 //+-------+--------+--------+-------+--------+---------+------+
 //| cmd   | session| editor | seqid | lineno | textsiz | text |
@@ -54,7 +50,7 @@
 		System.out.println("sessionManagerNet()");
 	
 		ServerSocketChannel ssc = ServerSocketChannel.open();
-		ssc.configureBlocking(false);
+		ssc.configureBlocking(false);	//should be true
 		ssc.socket().bind(new InetSocketAddress(port));
 		ssc.register(selector, SelectionKey.OP_ACCEPT);
 
@@ -66,17 +62,41 @@
 			selector.select();
 			for(SelectionKey key : selector.selectedKeys()){
 				if(key.isAcceptable()){
-					SocketChannel channel = ssc.accept();
+
+					/*** EditorChannel を用いない記述 ***/
+					SocketChannel channel = ssc.accept();	//keyからchannelを取って、accept 
 					registerChannel (selector, channel, SelectionKey.OP_READ);
 					channel = null;
+					
+					/*** EditorChannel を用いた記述 ****/
+					//EditorChannel echannel = (EditorChannel) ssc.accept();
+					//echannel.setIO();
+					//registerChannel(selector, echannel, SelectionKey.OP_READ);
+					//echannel = null;
+					
+					/*** SelectableEditorChannel ***/
+					//SocketChannel channel = ssc.accept();
+					//SelectableEditorChannel echannel2 = new SelectableEditorChannel(channel);
+					//registerChannel(selector, echannel2, SelectionKey.OP_READ);
+					//channel = null;
+					//echannel2 = null;
+					
 				}else if(key.isReadable()){
+					
+					/*** EditorChannel を用いない記述 ***/
 					SocketChannel channel = (SocketChannel)key.channel();
-					REPPacketReceive repRec = new REPPacketReceive(channel);
+					REPPacketReceive repRec = new REPPacketReceive(channel); //getPacket(), putPacket() にする。
 					REPCommand repCom = repRec.unpack();
 					manager(channel, repCom);
+					
+					/*** EditorChannel を用いた記述 ****/
+					//EditorChannel echannel = (EditorChannel) key.channel();
+					//REPCommand command = echannel.getPacket();
+					//manager(echannel, command);
+					
 				}else if(key.isConnectable()){
 					System.out.println("Connectable");
-				}
+				}	//Socketのcloseを実装する
 			}
 		}
 	}
@@ -85,7 +105,7 @@
 		if(channel == null) {
 			return;
 		}
-		System.out.println("registerChannel()");
+		//System.out.println("registerChannel()");
 		channel.configureBlocking(false);
 		selector.wakeup();
 		channel.register(selector, ops);
@@ -108,21 +128,21 @@
 			break;
 		case REP.SMCMD_PUT:
 			int sessionID = sessionlist.addSession(channel, repCmd.string);	//SIDを取得
-			smList.update(sessionID, repCmd.string);	//updateコマンド:Session生成を通知
-			sessionmanagerGUI.setComboSession(sessionID, repCmd.string);
-			repCmd.setSID(sessionID);		//SIDをセット
-			repCmd.setCMD(repCmd.cmd + 1);	//ACKを返す
+			smList.update(sessionID, repCmd.string);						//updateコマンド:Session生成を通知
+			sessionmanagerGUI.setComboSession(sessionID, repCmd.string);	//ComboBoxにSessionを追加
+			repCmd.setSID(sessionID);			//SIDをセット
+			repCmd.setCMD(repCmd.cmd + 1);		//ACKを返す
 			REPPacketSend repSend2 = new REPPacketSend(channel);
 			repSend2.send(repCmd);
 			//sessionlist.sendAddedSession(repCmd);
 			break;
-		case REP.SMCMD_PUT_ACK:
-			break;
+//		case REP.SMCMD_PUT_ACK:
+//			break;
 		case REP.SMCMD_SELECT:
 			sessionlist.addEditor(channel, repCmd.sid, repCmd);	//sessionlistへ追加
 			repCmd.setCMD(repCmd.cmd + 1);
 			REPPacketSend repSend3 = new REPPacketSend(channel);
-			repSend3.send(repCmd);								//ACKを返す
+			repSend3.send(repCmd);		//ACKを返す
 			break;
 		case REP.SMCMD_SELECT_ACK:
 			break;
@@ -140,16 +160,20 @@
 			smList.add(channel);								//SessionManagerのリストへ追加
 			break;
 		case REP.SMCMD_UPDATE:
-			int sessionID2 = sessionlist.addSession(channel, repCmd.string);
+			int sessionID2 = sessionlist.addSession(channel, repCmd.string);	//Sessionを作成
+			sessionlist.addEditor(channel, sessionID2, repCmd);
 			//sessionlist.sendAddedSession(repCmd);
-			sessionmanagerGUI.setComboSession(sessionID2, repCmd.string);
+			sessionmanagerGUI.setComboSession(sessionID2, repCmd.string);	//ComboBoxにSessionを追加
+			break;
+		case REP.SMCMD_UPDATE_ACK:
+			//
 			break;
 		case REP.REPCMD_READ:
 			sessionlist.sendCmd(channel, repCmd);
 			break;
 		default:
-			sessionlist.sendCmd(channel, repCmd, true);
-			//sessionlist.sendToNextEditor(channel, repCmd);
+			//sessionlist.sendCmd(channel, repCmd);
+			sessionlist.sendToNextEditor(channel, repCmd);
 			break;
 			
 		}
@@ -202,7 +226,6 @@
 	}
 
 	public void ActionOccured(REPActionEvent event) {
-		// TODO Auto-generated method stub
 		System.out.println("Action!");
 		SocketChannel editorChannel = event.getEditorChannel();
 		int sid = event.getSID();