diff rep/SessionManager.java @ 315:20fb70068089

*** empty log message ***
author kono
date Mon, 06 Oct 2008 18:58:49 +0900
parents 0585fd2410b8
children 77f443f6dc9f
line wrap: on
line diff
--- a/rep/SessionManager.java	Mon Oct 06 10:34:37 2008 +0900
+++ b/rep/SessionManager.java	Mon Oct 06 18:58:49 2008 +0900
@@ -407,14 +407,15 @@
 			if (session==null) throw new IOException();
 			// 次のエディタへコマンドを送信する処理
 			Editor editor = session.getEditor(channel);
-			boolean old = editor.isMerging();
-			session.translate(channel, receivedCommand);
-			if(editor.isMerging()!=old){
-				assert(old==false);
-				REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,receivedCommand.sid,editor.getEID(),editor.seq(),0,"");
-				editor.send(mergeEnd);
+			Editor.TranslatorResult r = editor.translate(session.getNextEditor(editor), receivedCommand);
+			if(r==Editor.TranslatorResult.MERGE_END) {
+				endMerge(receivedCommand, session, editor);
+			} else if (r==Editor.TranslatorResult.START_MERGE) {
+				// マージ中のエディタはコマンドを受け取らない
+				// ここで止めることによって、SMCMD_START_MERGE_ACK
+				// が来た時には、editor.writeQueue はemptyになる
 				Editor prevEditor = session.getPrevEditor(editor);
-				setNormalState(prevEditor.getChannel(), session.getSID());
+				setMergeState(prevEditor.getChannel(), session.getSID());
 			}
 			break;
 		}
@@ -425,10 +426,9 @@
 			if (session==null) throw new IOException();
 			// マージの処理と次のエディタへコマンドを送信する処理
 			Editor editor = session.getEditor(channel);
-			if (editor.merge(receivedCommand)) {
-				//マージ中のエディタはコマンドを受け取らない
-				Editor prevEditor = session.getPrevEditor(editor);
-				setMergeState(prevEditor.getChannel(), session.getSID());
+			if (!editor.merge(editor,receivedCommand)) {
+				// nothing to do, send END_MERGE
+				endMerge(receivedCommand, session, editor);
 			}
 			break;
 		}
@@ -454,6 +454,14 @@
 		}
 	}
 
+	private void endMerge(REPCommand receivedCommand, Session session,
+			Editor editor) {
+		REPCommand mergeEnd = new REPCommand(REP.SMCMD_END_MERGE,receivedCommand.sid,editor.getEID(),editor.seq(),0,"");
+		editor.send(mergeEnd);
+		Editor prevEditor = session.getPrevEditor(editor);
+		setNormalState(prevEditor.getChannel(), session.getSID());
+	}
+
 	private void updateGUI() {
 		//リストのコピーをGUIに渡す
 		LinkedList<Session> sList = new LinkedList<Session>(sessionList);