11 package com.google.scrollview;
13 import com.google.scrollview.events.SVEvent;
14 import com.google.scrollview.ui.SVImageHandler;
15 import com.google.scrollview.ui.SVWindow;
17 import java.io.BufferedReader;
18 import java.io.IOException;
19 import java.io.InputStreamReader;
20 import java.io.PrintStream;
21 import java.net.ServerSocket;
22 import java.net.Socket;
23 import java.util.ArrayList;
24 import java.util.regex.Pattern;
42 private static Socket socket;
43 private static PrintStream out;
44 public static BufferedReader
in;
49 private static ArrayList<SVWindow> windows;
50 private static Pattern intPattern;
51 private static Pattern floatPattern;
54 static int nrInputLines = 0;
57 static boolean debugViewNetworkTraffic =
false;
61 if (debugViewNetworkTraffic) {
62 System.out.println(
"(S->c) " + e.
toString());
67 byte [] utf8 = str.getBytes(
"UTF8");
68 out.write(utf8, 0, utf8.length);
69 }
catch (java.io.UnsupportedEncodingException ex) {
70 System.out.println(
"Oops... can't encode to UTF8... Exiting");
75 boolean error = out.checkError();
77 System.out.println(
"Connection error. Quitting ScrollView Server...");
91 private static void IOLoop() {
95 while (!socket.isClosed() && !socket.isInputShutdown() &&
96 !socket.isOutputShutdown() &&
97 socket.isConnected() && socket.isBound()) {
100 if (debugViewNetworkTraffic) {
101 System.out.println(
"(c->S," + nrInputLines +
")" + inputLine);
107 boolean first =
true;
108 for (String coordStr : inputLine.split(
",")) {
109 int coord = Integer.parseInt(coordStr);
118 }
else if (SVImageHandler.getReadImageData() ==
false) {
121 processInput(inputLine);
129 else if (inputLine.length() >
130 SVImageHandler.getMissingRemainingBytes()) {
131 String luaCmd = inputLine.substring(
132 SVImageHandler.getMissingRemainingBytes());
133 String imgData = inputLine.substring(0,
134 SVImageHandler.getMissingRemainingBytes());
135 SVImageHandler.parseData(imgData);
136 processInput(luaCmd);
139 SVImageHandler.parseData(inputLine);
144 catch (IOException e) {
145 System.out.println(
"Connection error. Quitting ScrollView Server...");
160 private static void parseArguments(String argList,
161 ArrayList<Integer> intList,
162 ArrayList<Float> floatList,
163 ArrayList<String> stringList,
164 ArrayList<Boolean> boolList) {
171 for (String argStr : argList.split(
",")) {
175 int length = str.length() + 1 + argStr.length();
176 StringBuilder appended =
new StringBuilder(length);
177 appended.append(str);
178 appended.append(
",");
179 appended.append(argStr);
180 str = appended.toString();
181 }
else if (argStr.length() == 0) {
184 char quote = argStr.charAt(0);
187 if (quote ==
'\'' || quote ==
'"') {
193 assert str.charAt(0) ==
'\'' || str.charAt(0) ==
'"';
194 int len = str.length();
195 if (len > 1 && str.charAt(len - 1) == str.charAt(0)) {
199 while (slash > 0 && str.charAt(slash - 1) ==
'\\')
201 if ((len - 1 - slash) % 2 == 0) {
204 stringList.add(str.substring(1, len - 1));
212 }
else if (floatPattern.matcher(argStr).matches()) {
214 floatList.add(Float.parseFloat(argStr));
215 }
else if (argStr.equals(
"true")) {
217 }
else if (argStr.equals(
"false")) {
219 }
else if (intPattern.matcher(argStr).matches()) {
221 intList.add(Integer.parseInt(argStr));
230 private static void processInput(String inputLine) {
232 if (inputLine.charAt(0) ==
'w') {
234 String noWLine = inputLine.substring(1);
235 String[] idStrs = noWLine.split(
"[ :]", 2);
236 int windowID = Integer.parseInt(idStrs[0]);
238 int start = inputLine.indexOf(
'(');
239 int end = inputLine.lastIndexOf(
')');
241 ArrayList<Integer> intList =
new ArrayList<Integer>(4);
242 ArrayList<Float> floatList =
new ArrayList<Float>(2);
243 ArrayList<String> stringList =
new ArrayList<String>(4);
244 ArrayList<Boolean> boolList =
new ArrayList<Boolean>(3);
245 parseArguments(inputLine.substring(start + 1, end),
246 intList, floatList, stringList, boolList);
247 int colon = inputLine.indexOf(
':');
248 if (colon > 1 && colon < start) {
250 String func = inputLine.substring(colon + 1, start);
251 if (func.equals(
"drawLine")) {
252 windows.get(windowID).drawLine(intList.get(0), intList.get(1),
253 intList.get(2), intList.get(3));
254 }
else if (func.equals(
"createPolyline")) {
255 windows.get(windowID).createPolyline(intList.get(0));
256 }
else if (func.equals(
"drawPolyline")) {
257 windows.get(windowID).drawPolyline();
258 }
else if (func.equals(
"drawRectangle")) {
259 windows.get(windowID).drawRectangle(intList.get(0), intList.get(1),
260 intList.get(2), intList.get(3));
261 }
else if (func.equals(
"setVisible")) {
262 windows.get(windowID).setVisible(boolList.get(0));
263 }
else if (func.equals(
"setAlwaysOnTop")) {
264 windows.get(windowID).setAlwaysOnTop(boolList.get(0));
265 }
else if (func.equals(
"addMessage")) {
266 windows.get(windowID).addMessage(stringList.get(0));
267 }
else if (func.equals(
"addMessageBox")) {
268 windows.get(windowID).addMessageBox();
269 }
else if (func.equals(
"clear")) {
270 windows.get(windowID).clear();
271 }
else if (func.equals(
"setStrokeWidth")) {
272 windows.get(windowID).setStrokeWidth(floatList.get(0));
273 }
else if (func.equals(
"drawEllipse")) {
274 windows.get(windowID).drawEllipse(intList.get(0), intList.get(1),
275 intList.get(2), intList.get(3));
276 }
else if (func.equals(
"pen")) {
277 if (intList.size() == 4) {
278 windows.get(windowID).pen(intList.get(0), intList.get(1),
279 intList.get(2), intList.get(3));
281 windows.get(windowID).pen(intList.get(0), intList.get(1),
284 }
else if (func.equals(
"brush")) {
285 if (intList.size() == 4) {
286 windows.get(windowID).brush(intList.get(0), intList.get(1),
287 intList.get(2), intList.get(3));
289 windows.get(windowID).brush(intList.get(0), intList.get(1),
292 }
else if (func.equals(
"textAttributes")) {
293 windows.get(windowID).textAttributes(stringList.get(0),
298 }
else if (func.equals(
"drawText")) {
299 windows.get(windowID).drawText(intList.get(0), intList.get(1),
301 }
else if (func.equals(
"openImage")) {
302 windows.get(windowID).openImage(stringList.get(0));
303 }
else if (func.equals(
"drawImage")) {
304 windows.get(windowID).drawImage(stringList.get(0),
305 intList.get(0), intList.get(1));
306 }
else if (func.equals(
"addMenuBarItem")) {
307 if (boolList.size() > 0) {
308 windows.get(windowID).addMenuBarItem(stringList.get(0),
312 }
else if (intList.size() > 0) {
313 windows.get(windowID).addMenuBarItem(stringList.get(0),
317 windows.get(windowID).addMenuBarItem(stringList.get(0),
320 }
else if (func.equals(
"addPopupMenuItem")) {
321 if (stringList.size() == 4) {
322 windows.get(windowID).addPopupMenuItem(stringList.get(0),
328 windows.get(windowID).addPopupMenuItem(stringList.get(0),
331 }
else if (func.equals(
"update")) {
332 windows.get(windowID).update();
333 }
else if (func.equals(
"showInputDialog")) {
334 windows.get(windowID).showInputDialog(stringList.get(0));
335 }
else if (func.equals(
"showYesNoDialog")) {
336 windows.get(windowID).showYesNoDialog(stringList.get(0));
337 }
else if (func.equals(
"zoomRectangle")) {
338 windows.get(windowID).zoomRectangle(intList.get(0), intList.get(1),
339 intList.get(2), intList.get(3));
340 }
else if (func.equals(
"createImage")) {
341 windows.get(windowID).createImage(stringList.get(0), intList.get(0),
342 intList.get(1), intList.get(2));
343 }
else if (func.equals(
"drawImage")) {
344 windows.get(windowID).drawImage(stringList.get(0),
345 intList.get(0), intList.get(1));
346 }
else if (func.equals(
"destroy")) {
347 windows.get(windowID).destroy();
353 if (idStrs[1].startsWith(
"= luajava.newInstance")) {
354 while (windows.size() <= windowID) {
357 windows.set(windowID,
new SVWindow(stringList.get(1),
358 intList.get(0), intList.get(1),
359 intList.get(2), intList.get(3),
360 intList.get(4), intList.get(5),
366 }
else if (inputLine.startsWith(
"svmain")) {
368 if (inputLine.startsWith(
"svmain:exit")) {
387 public static void main(String[] args) {
388 if (args.length > 0) {
391 windows =
new ArrayList<SVWindow>(100);
392 intPattern = Pattern.compile(
"[0-9-][0-9]*");
393 floatPattern = Pattern.compile(
"[0-9-][0-9]*\\.[0-9]*");
397 ServerSocket serverSocket =
new ServerSocket(
SERVER_PORT);
398 System.out.println(
"Socket started on port " +
SERVER_PORT);
401 socket = serverSocket.accept();
402 System.out.println(
"Client connected");
405 out =
new PrintStream(socket.getOutputStream(),
true);
407 new BufferedReader(
new InputStreamReader(socket.getInputStream(),
409 }
catch (IOException e) {