annotate src/main/java/jp/ac/u_ryukyu/treevnc/TreeVncCommandChannelListener.java @ 423:ffe01c959cdd

Fix LostChild for root node
author Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
date Fri, 22 Jan 2016 07:51:57 +0900
parents 47c018aed50e
children 344a35b7c47f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
31
872d9bcbfe56 Before changing the Viewer.
one
parents: 17
diff changeset
1 package jp.ac.u_ryukyu.treevnc;
303
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
2 import java.io.UnsupportedEncodingException;
204
d9d234715853 TreeManager for each interface
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 169
diff changeset
3 import java.net.InetAddress;
d9d234715853 TreeManager for each interface
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 169
diff changeset
4 import java.net.NetworkInterface;
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 import java.net.Socket;
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
6 import java.nio.ByteBuffer;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
7 import java.nio.ByteOrder;
160
b9052986bbb3 fix command loop.
oc
parents: 159
diff changeset
8 import java.util.concurrent.LinkedBlockingQueue;
b9052986bbb3 fix command loop.
oc
parents: 159
diff changeset
9 import java.util.concurrent.TimeUnit;
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
10 import java.io.IOException;
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 import java.io.InputStream;
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 import java.io.OutputStream;
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
13
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
14 import com.glavsoft.exceptions.TransportException;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
15 import com.glavsoft.rfb.protocol.ProtocolContext;
159
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
16 import com.glavsoft.rfb.protocol.ProtocolContext.TreeCommand;
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
17 import com.glavsoft.rfb.protocol.state.HandshakeState;
17
718cdde720d4 add setInitData()
one
parents: 12
diff changeset
18 import com.glavsoft.transport.Reader;
718cdde720d4 add setInitData()
one
parents: 12
diff changeset
19 import com.glavsoft.transport.Writer;
718cdde720d4 add setInitData()
one
parents: 12
diff changeset
20
231
0e0e6744432c get new nodeList for checkDelay.
oc
parents: 223
diff changeset
21
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
22 public class TreeVncCommandChannelListener implements Runnable {
207
b31903e5b02d rename myRFBProto
oc
parents: 204
diff changeset
23 public TreeRFBProto rfb = null;
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
24 byte[] imageBytes;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
25 int port;
160
b9052986bbb3 fix command loop.
oc
parents: 159
diff changeset
26 LinkedBlockingQueue<TreeVncCommand> cmdQueue = new LinkedBlockingQueue<TreeVncCommand>();
159
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
27 private Thread acceptThread;
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
28 protected final static String versionMsg_3_856 = "RFB 003.856\n";
223
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
29
207
b31903e5b02d rename myRFBProto
oc
parents: 204
diff changeset
30 public TreeVncCommandChannelListener(TreeRFBProto _rfb, int p) {
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
31 rfb = _rfb;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
32 port = p;
159
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
33
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
34 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
35
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
36 public void commandMainLoop() {
223
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
37 acceptThread = new Thread(new Runnable() {
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
38 @Override
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
39 public void run() {
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
40 TreeVncCommand cmd = null;
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
41 do {
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
42 try {
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
43 cmd = cmdQueue.poll(1000, TimeUnit.MILLISECONDS);
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
44 } catch (InterruptedException e) {
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
45 continue;
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
46 }
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
47 if (cmd!=null) {
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
48 cmd.handleTreeVncCommand();
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
49 }
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
50 } while (cmd == null || cmd.getCommand() != TreeCommand.QUIT_LOOP);
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
51 }
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
52 },"root-command-loop");
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
53 acceptThread.start();
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
54 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
55
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
56 public void run() {
159
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
57 commandMainLoop();
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
58 while (true) {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
59 try {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
60 final Socket newCli = rfb.accept();
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
61 final OutputStream os = newCli.getOutputStream();
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
62 final InputStream is = newCli.getInputStream();
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
63 new Thread(new Runnable() {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
64 public void run() {
329
230038d5127d change reconnect new node instead of lost child node.
oc
parents: 319
diff changeset
65 TreeVncCommand cmd = newClientHandler(newCli, new Writer(os), new Reader(is));
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
66 if (cmd!=null) cmdQueue.add(cmd);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
67 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
68 },"accepting").start();
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
69 } catch (Exception e) {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
70 System.out.println("failed to connect incoming client" + e.getMessage());
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
71 }
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 }
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
73 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
74
231
0e0e6744432c get new nodeList for checkDelay.
oc
parents: 223
diff changeset
75
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
76 public TreeVncCommand newClientHandler (final Socket newCli, final Writer os, final Reader is) {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
77 TreeVncCommand cmd = null;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
78 try {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
79 cmd = initialConnection(rfb, os, is, newCli);
161
e997deb54314 is os isn't closed in NEW_NODE command.
oc
parents: 160
diff changeset
80 if (cmd!=null && cmd.getCommand()!=TreeCommand.NEW_NODE) {
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
81 // TreeVNC command is processed
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
82 newCli.close();
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
83 return cmd;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
84 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
85 } catch (Exception e) {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
86 try {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
87 System.out.println("new client faild :" + e.getMessage());
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
88 newCli.close();
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
89 return null;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
90 } catch (IOException e1) {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
91 System.out.println("new client close faild");
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
92 return null;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
93 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
94 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
95 return cmd;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
96 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
97
207
b31903e5b02d rename myRFBProto
oc
parents: 204
diff changeset
98 public TreeVncCommand initialConnection(TreeRFBProto myRfbProto, final Writer os, final Reader is, Socket connection)
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
99 throws IOException, TransportException {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
100 /**
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
101 * initial connection of RFB protocol
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
102 */
204
d9d234715853 TreeManager for each interface
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 169
diff changeset
103 InetAddress adr = connection.getLocalAddress();
263
4075f68f1c91 add joinGroup IPv6 and IPv4 adderss version.
oc
parents: 239
diff changeset
104 String myHostAddress = adr.getHostAddress();
204
d9d234715853 TreeManager for each interface
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 169
diff changeset
105 String intf = NetworkInterface.getByInetAddress(adr).getName();
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
106 sendRfbVersion(os);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
107 byte[] b;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
108 if ((b = readVersionMsg(is, os))!=null) {
381
47c018aed50e Change condition to ZRLEESender.decode method
innparusu
parents: 350
diff changeset
109 // direct TreeVNC Command from TreeRoot
47c018aed50e Change condition to ZRLEESender.decode method
innparusu
parents: 350
diff changeset
110 // such as connectTo, connectToAsLeader
47c018aed50e Change condition to ZRLEESender.decode method
innparusu
parents: 350
diff changeset
111 // or direct TreeVNC Command from lower node
47c018aed50e Change condition to ZRLEESender.decode method
innparusu
parents: 350
diff changeset
112 // such as LostParent, LostChild
204
d9d234715853 TreeManager for each interface
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 169
diff changeset
113 TreeVncCommand cmd = treeVncCommand(b,is,os,myHostAddress,intf);
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
114 if (cmd!=null) return cmd;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
115 }
381
47c018aed50e Change condition to ZRLEESender.decode method
innparusu
parents: 350
diff changeset
116 // normal connection from TreeVNC node candidate
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
117 sendSecurityType(os);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
118 readSecType(is);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
119 sendSecResult(os);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
120 readClientInit(is);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
121 sendInitData(os);
381
47c018aed50e Change condition to ZRLEESender.decode method
innparusu
parents: 350
diff changeset
122 System.out.println("direct connection from "+connection.getInetAddress());
423
ffe01c959cdd Fix LostChild for root node
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 381
diff changeset
123 return new TreeVncCommand(rfb, myHostAddress, TreeCommand.NEW_NODE, os, is, connection, intf);
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
124 }
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
126 /**
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
127 * handle TreeVNC Command
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
128 * @param b byte [] command
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
129 * @param is
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
130 * @param os
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
131 * @param myHostName
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
132 * @return
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
133 * @throws TransportException
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
134 * @throws IOException
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
135 *
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
136 * TreeVNC Command is sent as a possible replied version message. 12 bytes is already read.
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
137 * Command 4 byte (including padding)
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
138 * lenght 4 byte
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
139 * port 4 byte
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
140 * rest of data ( add padding if it is shorter than 12 byte)
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
141 */
204
d9d234715853 TreeManager for each interface
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 169
diff changeset
142 TreeVncCommand treeVncCommand(byte[] b, Reader is, Writer os, String myHostName,String intf) throws TransportException, IOException {
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
143 ByteBuffer buf = ByteBuffer.wrap(b);
159
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
144 TreeCommand command = TreeCommand.create(buf.get()&0xff); // make it unsigned
169
8ab1f6905db4 Try to hide root frame
oc
parents: 164
diff changeset
145 buf.get();
8ab1f6905db4 Try to hide root frame
oc
parents: 164
diff changeset
146 short value = buf.getShort();
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
147 int length = buf.getInt();
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
148 int port = buf.getInt();
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
149 String hostname = null;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
150 if (length>4) {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
151 if (length>1024) {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
152 System.out.println("Too long TreeVncCommand ");
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
153 return null;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
154 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
155 byte namebuf[] = new byte[length-4];
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
156 try {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
157 is.readBytes(namebuf);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
158 } catch (TransportException e) {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
159 return null;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
160 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
161 hostname = new String(namebuf);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
162 }
204
d9d234715853 TreeManager for each interface
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 169
diff changeset
163 return new TreeVncCommand(rfb, myHostName, command, port, hostname, intf, value);
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
164 }
223
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
165
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
166
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
167 void sendRfbVersion(Writer writer) throws IOException, TransportException {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
168 writer.write(versionMsg_3_856.getBytes());
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
169 }
223
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
170
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
171 byte[] readVersionMsg(Reader reader, Writer writer) throws IOException, TransportException {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
172
302
7ef19658eb41 add createOriginalInitData().
oc
parents: 263
diff changeset
173 byte[] b = new byte[HandshakeState.PROTOCOL_STRING_LENGTH];
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
174
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
175 reader.readBytes(b);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
176
159
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
177 if ((b[0]&0xff)>=220) return b; // TreeVNC extension command.
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
178 if ((b[0] != 'R') || (b[1] != 'F') || (b[2] != 'B') || (b[3] != ' ')
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
179 || (b[4] < '0') || (b[4] > '9') || (b[5] < '0') || (b[5] > '9')
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
180 || (b[6] < '0') || (b[6] > '9') || (b[7] != '.')
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
181 || (b[8] < '0') || (b[8] > '9') || (b[9] < '0') || (b[9] > '9')
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
182 || (b[10] < '0') || (b[10] > '9') || (b[11] != '\n')) {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
183 throw new IOException("this is not an RFB server");
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
184 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
185
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
186 int rfbMajor = (b[4] - '0') * 100 + (b[5] - '0') * 10 + (b[6] - '0');
223
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
187 // int rfbMinor = (b[8] - '0') * 100 + (b[9] - '0') * 10 + (b[10] - '0');
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
188
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
189 if (rfbMajor < 3) {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
190 throw new IOException(
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
191 "RFB server does not support protocol version 3");
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
192 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
193
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
194 return null;
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
195 }
223
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
196
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
197
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
198 void readSecType(Reader reader) throws TransportException {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
199 byte[] b = new byte[1];
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
200 reader.read(b);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
201 }
223
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
202
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
203 void sendSecurityType(Writer os) throws TransportException {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
204 // number-of-security-types
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
205 os.writeInt(1);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
206 // security-types
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
207 // 1:None
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
208 os.writeInt(1);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
209
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
210 /*
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
211 * os.write(4); os.write(30); os.write(31); os.write(32); os.write(35);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
212 * os.flush();
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
213 */
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
214 }
223
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
215
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
216 void sendSecResult(Writer os) throws TransportException {
223
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
217 ByteBuffer b = ByteBuffer.allocate(4);
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
218 b.order(ByteOrder.BIG_ENDIAN);
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
219 b.putInt(0);
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
220 os.write(b.array());
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
221 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
222
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
223 void readClientInit(Reader in) throws TransportException {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
224 byte[] b = new byte[0];
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
225 in.readBytes(b);
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
226 }
223
3189e210a7ed indent fix.
oc
parents: 215
diff changeset
227
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
228 void sendInitData(Writer os) throws TransportException {
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
229 ProtocolContext context = rfb.context;
319
f2b835466a24 fix send initData
oc
parents: 306
diff changeset
230 if (context != null) {
f2b835466a24 fix send initData
oc
parents: 306
diff changeset
231 if (rfb.filterSingleDisplay) {
f2b835466a24 fix send initData
oc
parents: 306
diff changeset
232 int width = rfb.getSingleWidth();
f2b835466a24 fix send initData
oc
parents: 306
diff changeset
233 int height = rfb.getSingleHeight();
f2b835466a24 fix send initData
oc
parents: 306
diff changeset
234 byte[] initData = createOriginalInitData(width, height, context.getRemoteDesktopName());
350
7050b41329c6 remove original InitData
oc
parents: 329
diff changeset
235 // os.write(initData);
7050b41329c6 remove original InitData
oc
parents: 329
diff changeset
236 os.write(context.getInitData());
319
f2b835466a24 fix send initData
oc
parents: 306
diff changeset
237 } else {
f2b835466a24 fix send initData
oc
parents: 306
diff changeset
238 os.write(context.getInitData());
f2b835466a24 fix send initData
oc
parents: 306
diff changeset
239 }
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
240 } else {
303
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
241 // In case of "-d" we have no context
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
242 // Send dummy data
303
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
243 // width : 1920
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
244 // height : 1080
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
245 // title : "girefly"
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
246 byte[] dummyInitData = {7, -128, 4, 56, 32, 24, 0, 1, 0, -1, 0, -1, 0, -1, 16, 8, 0, 0, 0, 0, 0, 0, 0, 7, 103, 105, 114, 101, 102, 108, 121};
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
247 os.write(dummyInitData);
157
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
248 }
7cea8789387b thread base command listening loop
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 153
diff changeset
249 }
159
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
250
304
d2a56d7d4b2d send initData secound
oc
parents: 303
diff changeset
251 public byte[] createOriginalInitData(int width, int height, String desktopName) {
303
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
252 byte[] titleBytes = null;
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
253 int titleLength = 0;
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
254 byte[] pixelFormat = {32, 24, 0, 1, 0, -1, 0, -1, 0, -1, 16, 8, 0, 0, 0, 0, 0, 0, 0};
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
255 try {
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
256 titleBytes = desktopName.getBytes("UTF-8");
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
257 titleLength = titleBytes.length;
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
258 } catch (UnsupportedEncodingException e) {
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
259 e.printStackTrace();
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
260 }
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
261 ByteBuffer initData = ByteBuffer.allocate(2+2+19+1+titleLength); // w+h+pixelFormat+titleLength+titleBytes
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
262 initData.putShort((short) width);
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
263 initData.putShort((short) height);
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
264 initData.put(pixelFormat);
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
265 initData.put((byte) titleLength);
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
266 initData.put(titleBytes);
302
7ef19658eb41 add createOriginalInitData().
oc
parents: 263
diff changeset
267 initData.flip();
7ef19658eb41 add createOriginalInitData().
oc
parents: 263
diff changeset
268
7ef19658eb41 add createOriginalInitData().
oc
parents: 263
diff changeset
269 return initData.array();
7ef19658eb41 add createOriginalInitData().
oc
parents: 263
diff changeset
270 }
7ef19658eb41 add createOriginalInitData().
oc
parents: 263
diff changeset
271
159
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
272 public void waitForShutdown() {
303
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
273 if (acceptThread!=null) {
159
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
274 try {
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
275 acceptThread.join();
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
276 } catch (InterruptedException e) {
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
277 }
303
1526c99f5d21 upgrade createOriginalInitData.
oc
parents: 302
diff changeset
278 }
159
1c9f6acdfeb2 TreeCommand enum
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 157
diff changeset
279 }
11
57ae9fbb1245 add files
Taninari YU <you@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
280 }