Mercurial > hg > RemoteEditor > REPSessionManager
changeset 298:cf9328e66d25
*** empty log message ***
author | kono |
---|---|
date | Tue, 30 Sep 2008 22:42:33 +0900 |
parents | 9c553308b918 |
children | d13dad30fd24 |
files | rep/channel/SelectionKeySimulator.java rep/channel/SelectorSimulator.java test/sematest/TestEditor.java |
diffstat | 3 files changed, 68 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/rep/channel/SelectionKeySimulator.java Tue Sep 30 19:16:06 2008 +0900 +++ b/rep/channel/SelectionKeySimulator.java Tue Sep 30 22:42:33 2008 +0900 @@ -11,6 +11,7 @@ private SelectableChannel channel; private int ready; public Selector selector; + public boolean canceled = false; public SelectionKeySimulator(SelectableChannel cs, int opt, Selector _selector) { channel = cs; @@ -59,10 +60,12 @@ return scs.accept1(); } + @SuppressWarnings("unchecked") @Override public void cancel() { - System.err.println("cancel is not implemented yet."); - //selector. + canceled = true; + SelectorSimulator s = (SelectorSimulator)selector; + s.deregister(channel); } @Override @@ -78,7 +81,7 @@ @Override public boolean isValid() { - return true; + return (!canceled) && channel.isOpen() && selector.isOpen(); }
--- a/rep/channel/SelectorSimulator.java Tue Sep 30 19:16:06 2008 +0900 +++ b/rep/channel/SelectorSimulator.java Tue Sep 30 22:42:33 2008 +0900 @@ -6,6 +6,7 @@ import java.nio.channels.Selector; import java.nio.channels.spi.SelectorProvider; import java.util.HashSet; +import java.util.Iterator; import java.util.Set; public class SelectorSimulator<P> extends REPSelector<P>{ @@ -88,6 +89,13 @@ return key; } + public void deregister(SelectableChannel channel) { + for(Iterator<SelectionKey> it = keyList.iterator();it.hasNext();) { + if(it.next().channel() == channel) + it.remove(); + } + } + public Set<REPSelectionKey<P>> selectedKeys1() { Set<SelectionKey> keys = keyList; @@ -115,14 +123,12 @@ @Override public boolean isOpen() { - // TODO Auto-generated method stub - return false; + return true; } @Override public Set<SelectionKey> keys() { - // TODO Auto-generated method stub - return null; + return keyList; } @Override
--- a/test/sematest/TestEditor.java Tue Sep 30 19:16:06 2008 +0900 +++ b/test/sematest/TestEditor.java Tue Sep 30 22:42:33 2008 +0900 @@ -33,6 +33,12 @@ boolean running = true; long timeout = 1; private String name; + private REPCommand nop = new REPCommand(REP.REPCMD_NOP,0,0,0,0,""); + private boolean inputLock=false; + public boolean detached=false; + public boolean master=false; + private int syncCounter; + private boolean hasInputLock=true; static private String[] text1d = { "aaa", "bbb", "ccc", "ddd", "eee", @@ -45,14 +51,15 @@ this.name = name; cmds = new LinkedList<REPCommand>(); if (master) { + this.master=true; text = new Text(text1d); - cmds.add(new REPCommand(REP.SMCMD_PUT,0,0,seq++,0,name+"-file")); + cmds.add(new REPCommand(REP.SMCMD_PUT,0,0,0,0,name+"-file")); cmds.add(new REPCommand(REP.REPCMD_INSERT,0,0,0,0,"m0")); cmds.add(new REPCommand(REP.REPCMD_DELETE,0,0,0,0,"m0")); cmds.add(new REPCommand(REP.SMCMD_QUIT,0,0,0,0,"")); } else { text = new Text(new String[0]); - cmds.add(new REPCommand(REP.SMCMD_JOIN,0,0,seq++,0,name)); + cmds.add(new REPCommand(REP.SMCMD_JOIN,0,0,0,0,name)); cmds.add(new REPCommand(REP.REPCMD_INSERT,0,0,0,0,"c0")); cmds.add(new REPCommand(REP.REPCMD_DELETE,0,0,0,0,"c0")); //cmds.add(new REPCommand(REP.SMCMD_QUIT,0,0,0,0,"")); @@ -86,7 +93,25 @@ REPSelector<REPCommand> selector = REPSelector.create(); channel.register(selector, SelectionKey.OP_READ); while(running) { - if (selector.select(timeout)<=0) { + if (inputLock) { + // No user input during merge mode (optional) + if (selector.select(0)>0) { + handle(channel.read()); + } + continue; + } else if (selector.select(timeout)<=0) { + if (syncCounter>0) { + if (syncCounter>text.size()) { + syncCounter=0; + } else { + int i=syncCounter-1; + REPCommand del = new REPCommand(REP.REPCMD_DELETE,sid,eid,0,i, text.get(i)); + REPCommand ins = new REPCommand(REP.REPCMD_INSERT,sid,eid,0,i, text.get(i)); + sendCommand(del); + sendCommand(ins); + syncCounter++; + } + } userInput(); } else { handle(channel.read()); @@ -135,20 +160,27 @@ case REPCMD_INSERT : text.insert(cmd.lineno, cmd.string); sendCommand(cmd); + sendCommand(nop); break; case REPCMD_INSERT_ACK : + assert(false); break; case REPCMD_DELETE : String del = text.delete(cmd.lineno); cmd.setString(del); sendCommand(cmd); + sendCommand(nop); break; case REPCMD_DELETE_ACK : + assert(false); break; case REPCMD_CLOSE : case REPCMD_CLOSE_2 : + assert(false); break; case REPCMD_NOP : + sendCommand(cmd); + sendCommand(nop); break; case SMCMD_JOIN_ACK : sid = cmd.sid; @@ -159,16 +191,33 @@ eid = cmd.eid; break; case SMCMD_QUIT : + sendCommand(cmd); + cmds.clear(); + break; case SMCMD_QUIT_ACK : + assert(false); break; case SMCMD_START_MERGE : + // lock user input during merge (optional) + inputLock = hasInputLock; + cmd.cmd = REP.SMCMD_START_MERGE_ACK; + sendCommand(cmd); + break; case SMCMD_START_MERGE_ACK : + assert(false); break; case SMCMD_END_MERGE : + inputLock = false; break; case SMCMD_QUIT_2 : + sendCommand(cmd); running = false; break; + case SMCMD_SYNC: + // start contents sync with newly joined editor + cmd.cmd = REP.SMCMD_SYNC_ACK; sendCommand(cmd); + syncCounter = 1; + break; default: assert(false); break;