Mercurial > hg > RemoteEditor > REPSessionManager
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);