annotate src/remoteeditor/editors/REPEditor.java @ 209:a853f36c238c

EclipseRemoteEditor clean
author dimolto
date Sun, 19 Dec 2010 14:23:37 +0900
parents ca9f72b8b4ab
children 58c0e5c876b8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
1 package remoteeditor.editors;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
2
3133040ee4f4 (no commit message)
one
parents:
diff changeset
3 import java.io.IOException;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
4 import java.net.InetSocketAddress;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
5 import java.nio.channels.SelectionKey;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
6 import java.util.LinkedList;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
7 import rep.REP;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
8 import rep.REPCommand;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
9 import rep.REPCommandPacker;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
10 import rep.channel.REPSelectionKey;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
11 import rep.channel.REPSelector;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
12 import rep.channel.REPSocketChannel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
13
3133040ee4f4 (no commit message)
one
parents:
diff changeset
14
3133040ee4f4 (no commit message)
one
parents:
diff changeset
15 public class REPEditor extends Thread implements REPTextListener{
3133040ee4f4 (no commit message)
one
parents:
diff changeset
16
3133040ee4f4 (no commit message)
one
parents:
diff changeset
17 private REPSocketChannel<REPCommand> channel;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
18 REPSelector<REPCommand> selector;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
19 private boolean running = true;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
20 private boolean inputLock = false;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
21 private long timeout = 1;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
22 private int syncCounter = 0;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
23 private LinkedList<REPCommand> userCommand = new LinkedList<REPCommand>();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
24 private LinkedList<Runnable> runners = new LinkedList<Runnable>();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
25 private String name = "test";
3133040ee4f4 (no commit message)
one
parents:
diff changeset
26 private int seq;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
27 private int eid;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
28 private int sid;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
29 private REPText repText;
196
ca9f72b8b4ab (no commit message)
one
parents: 193
diff changeset
30 private boolean hasInputLock = true;
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
31 private boolean master;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
32 private boolean syncEnable = true;
209
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
33 private REPCommand quit = null;
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
34
3133040ee4f4 (no commit message)
one
parents:
diff changeset
35 public REPEditor(REPText repText, boolean master){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
36 this.repText = repText;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
37 this.master = master;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
38 repText.addTextListener(this);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
39 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
40
3133040ee4f4 (no commit message)
one
parents:
diff changeset
41 public void textDeleted(REPTextEvent event) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
42 Logger.print(event.getText());
3133040ee4f4 (no commit message)
one
parents:
diff changeset
43 addUserInput(new REPCommand(REP.REPCMD_DELETE_USER, 0, 0, 0, event.getLineno(), event.getText()));
3133040ee4f4 (no commit message)
one
parents:
diff changeset
44 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
45
3133040ee4f4 (no commit message)
one
parents:
diff changeset
46 public void textInserted(REPTextEvent event) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
47 Logger.print(event.getText());
3133040ee4f4 (no commit message)
one
parents:
diff changeset
48 addUserInput(new REPCommand(REP.REPCMD_INSERT_USER, 0, 0, 0, event.getLineno(), event.getText()));
3133040ee4f4 (no commit message)
one
parents:
diff changeset
49 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
50
3133040ee4f4 (no commit message)
one
parents:
diff changeset
51 private void addUserInput(final REPCommand command) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
52 Runnable runner = new Runnable(){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
53 public void run(){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
54 userCommand.add(command);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
55 timeout = 1;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
56 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
57 };
3133040ee4f4 (no commit message)
one
parents:
diff changeset
58 synchronized(runners){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
59 runners.add(runner);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
60 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
61 if(selector != null){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
62 selector.wakeup();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
63 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
64 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
65
3133040ee4f4 (no commit message)
one
parents:
diff changeset
66 public void run(){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
67 /*
3133040ee4f4 (no commit message)
one
parents:
diff changeset
68 * Create Socket and connect to the session manager
3133040ee4f4 (no commit message)
one
parents:
diff changeset
69 */
3133040ee4f4 (no commit message)
one
parents:
diff changeset
70 try {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
71 channel = REPSocketChannel.<REPCommand>create(new REPCommandPacker());
3133040ee4f4 (no commit message)
one
parents:
diff changeset
72 } catch (IOException e) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
73 e.printStackTrace();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
74 return;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
75 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
76 try {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
77 InetSocketAddress semaIP = new InetSocketAddress("localhost", 8766);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
78 while (!channel.connect(semaIP)){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
79 Logger.print("SeMa not listen to socket yet, wait");
3133040ee4f4 (no commit message)
one
parents:
diff changeset
80 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
81 } catch (IOException e) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
82 e.printStackTrace();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
83 return;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
84 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
85 /*
3133040ee4f4 (no commit message)
one
parents:
diff changeset
86 * Start editor main loop
3133040ee4f4 (no commit message)
one
parents:
diff changeset
87 * public REPCommand(REP cmd,int sid,int eid, int seq, int lineno, String string)
3133040ee4f4 (no commit message)
one
parents:
diff changeset
88 */
3133040ee4f4 (no commit message)
one
parents:
diff changeset
89 try {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
90 mainloop();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
91 } catch (IOException e) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
92 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
93 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
94
3133040ee4f4 (no commit message)
one
parents:
diff changeset
95 /*
3133040ee4f4 (no commit message)
one
parents:
diff changeset
96 * Editor main loop with input lock
3133040ee4f4 (no commit message)
one
parents:
diff changeset
97 */
196
ca9f72b8b4ab (no commit message)
one
parents: 193
diff changeset
98 void mainloop() throws IOException {
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
99
3133040ee4f4 (no commit message)
one
parents:
diff changeset
100 channel.configureBlocking(false);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
101 selector = REPSelector.create();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
102 channel.register(selector, SelectionKey.OP_READ);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
103 while(running) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
104
3133040ee4f4 (no commit message)
one
parents:
diff changeset
105 synchronized(runners){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
106 for(Runnable runner : runners){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
107 runner.run();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
108 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
109 runners.clear();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
110 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
111
196
ca9f72b8b4ab (no commit message)
one
parents: 193
diff changeset
112 // if(inputLock){
ca9f72b8b4ab (no commit message)
one
parents: 193
diff changeset
113 if (repText.isMerging()) {
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
114 // No user input during merge mode (optional)
3133040ee4f4 (no commit message)
one
parents:
diff changeset
115 if (selector.select(0)>0) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
116 handle(channel.read());
3133040ee4f4 (no commit message)
one
parents:
diff changeset
117 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
118 continue;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
119 } else if (selector.select(timeout)<=0) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
120 if (syncCounter>0) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
121 syncText(); // send the master editor buffer to clients.
3133040ee4f4 (no commit message)
one
parents:
diff changeset
122 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
123 userInput();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
124 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
125 // selector(timeout) returns 0, but it may contain readable channel..
3133040ee4f4 (no commit message)
one
parents:
diff changeset
126 for(REPSelectionKey<REPCommand> key : selector.selectedKeys1()) {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
127 REPSocketChannel<REPCommand> ch = key.channel1();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
128 handle(ch.read());
3133040ee4f4 (no commit message)
one
parents:
diff changeset
129 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
130 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
131 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
132
209
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
133
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
134
3133040ee4f4 (no commit message)
one
parents:
diff changeset
135 private void userInput() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
136 REPCommand command = userCommand.poll();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
137 if(command != null){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
138 switch(command.cmd){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
139 case REPCMD_DELETE_USER:
209
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
140 sendCommand(command);
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
141 break;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
142 case REPCMD_INSERT_USER:
209
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
143 sendCommand(command);
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
144 break;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
145 case SMCMD_PUT:
3133040ee4f4 (no commit message)
one
parents:
diff changeset
146 case SMCMD_JOIN:
209
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
147 sendCommand(command);
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
148 break;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
149 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
150 }else{
3133040ee4f4 (no commit message)
one
parents:
diff changeset
151 if(syncCounter == 0){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
152 timeout = 0;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
153 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
154 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
155 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
156
209
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
157 private void handle(REPCommand cmd) {
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
158 if (cmd==null) return;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
159 switch(cmd.cmd) {
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
160 case REPCMD_INSERT :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
161 if (cmd.eid!=eid) {
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
162 repText.insert(cmd.lineno, cmd.string);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
163 }
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
164 forwardCommand(cmd);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
165 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
166 case REPCMD_DELETE :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
167 if (cmd.eid!=eid) {
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
168 String del="";
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
169 if(cmd.lineno<repText.size()) {
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
170 del = repText.delete(cmd.lineno);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
171 }
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
172 cmd.setString(del);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
173 }
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
174 forwardCommand(cmd);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
175 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
176 case REPCMD_NOP :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
177 case REPCMD_MERGE_MARK :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
178 case REPCMD_INSERT_ACK :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
179 case REPCMD_DELETE_ACK :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
180 forwardCommand(cmd);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
181 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
182 case REPCMD_CLOSE :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
183 case REPCMD_CLOSE_2 :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
184 assert(false);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
185 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
186
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
187 case SMCMD_JOIN_ACK :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
188 sid = cmd.sid;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
189 eid = cmd.eid;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
190 setName(name+eid);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
191 name += "(sid="+sid+")";
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
192 inputLock = false;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
193 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
194 case SMCMD_PUT_ACK :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
195 sid = cmd.sid;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
196 eid = cmd.eid;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
197 setName(name+eid);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
198 name += "(sid="+sid+")";
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
199 inputLock = false;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
200 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
201 case SMCMD_QUIT :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
202 if (cmd.eid!=eid)
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
203 quit = cmd;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
204 else // eid=-1 means do not forward but send it.
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
205 quit = new REPCommand(REP.SMCMD_QUIT_2,
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
206 sid, -1, seq, 0, "");
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
207 timeout=1;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
208 if (quit.eid==-1)
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
209 sendCommand(quit);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
210 else
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
211 forwardCommand(quit);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
212 quit=null;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
213 //close connection user
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
214
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
215 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
216 case SMCMD_START_MERGE :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
217 // lock user input during merge (optional)
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
218 inputLock = hasInputLock;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
219 cmd.cmd = REP.SMCMD_START_MERGE_ACK;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
220 sendCommand(cmd);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
221 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
222 case SMCMD_END_MERGE :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
223 inputLock = false;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
224 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
225 // master editor changes QUIT_2 to QUIT_2_ACK
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
226 // Session manager should do this
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
227 case SMCMD_QUIT_2 :
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
228 if (cmd.eid!=eid) {
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
229 forwardCommand(cmd);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
230 } else {
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
231 cmd.cmd = REP.SMCMD_QUIT_2_ACK;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
232 sendCommand(cmd);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
233 }
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
234 running = false;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
235 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
236 case SMCMD_SYNC:
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
237 // start contents sync with newly joined editor
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
238 cmd.cmd = REP.SMCMD_SYNC_ACK;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
239 forwardCommand(cmd);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
240 //if (cmd.eid==eid) {
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
241 if (master && syncEnable ) {
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
242 syncCounter = 1;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
243 timeout = 1;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
244 }
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
245 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
246 default:
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
247 assert(false);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
248 break;
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
249 }
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
250 }
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
251
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
252 private void forwardCommand(REPCommand command) {
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
253 REPCommand cmd = new REPCommand(command);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
254 channel.write(cmd);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
255 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
256
209
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
257 private void sendCommand(REPCommand command) {
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
258 REPCommand cmd = new REPCommand(command);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
259 cmd.setSEQID(seq++);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
260 cmd.setEID(eid);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
261 cmd.setSID(sid);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
262 channel.write(cmd);
3133040ee4f4 (no commit message)
one
parents:
diff changeset
263 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
264
3133040ee4f4 (no commit message)
one
parents:
diff changeset
265 private void syncText() {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
266 Logger.print();
3133040ee4f4 (no commit message)
one
parents:
diff changeset
267 if(syncCounter>repText.size()){
3133040ee4f4 (no commit message)
one
parents:
diff changeset
268 syncCounter = 0;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
269 }else {
3133040ee4f4 (no commit message)
one
parents:
diff changeset
270 if(inputLock) return;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
271 int i = syncCounter - 1;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
272 REPCommand del = new REPCommand(REP.REPCMD_DELETE_USER, sid, eid, 0, i, repText.get(i));
3133040ee4f4 (no commit message)
one
parents:
diff changeset
273 REPCommand ins = new REPCommand(REP.REPCMD_INSERT_USER, sid, eid, 0, i, repText.get(i));
209
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
274 sendCommand(del);
a853f36c238c EclipseRemoteEditor clean
dimolto
parents: 196
diff changeset
275 sendCommand(ins);
193
3133040ee4f4 (no commit message)
one
parents:
diff changeset
276 syncCounter++;
3133040ee4f4 (no commit message)
one
parents:
diff changeset
277 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
278 }
3133040ee4f4 (no commit message)
one
parents:
diff changeset
279
3133040ee4f4 (no commit message)
one
parents:
diff changeset
280 }