annotate app/src/main/java/com/five_ten_sg/connectbot/monitor/MonitorService.java @ 31:0bc0b4798d9e

fix saystring(12) command for proper unicode and document it
author Carl Byington <carl@five-ten-sg.com>
date Sun, 28 Apr 2019 14:45:56 -0700
parents 807f7e4eaebe
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
1 package com.five_ten_sg.connectbot.monitor;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
2
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
3 import java.io.IOException;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
4 import java.io.InputStream;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
5 import java.io.OutputStream;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
6 import java.net.ServerSocket;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
7 import java.net.Socket;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
8 import java.util.HashMap;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
9 import java.util.concurrent.ArrayBlockingQueue;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
10 import java.util.concurrent.BlockingQueue;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
11 import java.util.concurrent.ConcurrentHashMap;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
12 import java.util.Locale;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
13
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
14 import android.app.Activity;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
15 import android.app.Service;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
16 import android.content.Context;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
17 import android.content.Intent;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
18 import android.content.ServiceConnection;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
19 import android.net.wifi.WifiManager.WifiLock;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
20 import android.net.wifi.WifiManager;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
21 import android.os.Binder;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
22 import android.os.Bundle;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
23 import android.os.Handler;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
24 import android.os.IBinder;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
25 import android.os.Message;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
26 import android.os.PowerManager;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
27 import android.speech.tts.TextToSpeech;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
28 import android.speech.tts.TextToSpeech.OnInitListener;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
29 import android.util.Log;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
30 import android.widget.TextView;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
31
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
32 public class MonitorService extends Service implements OnInitListener {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
33 public final static String TAG = "ConnectBot.MonitorService";
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
34
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
35 public static final char MONITOR_CMD_INIT = 0;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
36 public static final char MONITOR_CMD_ACTIVATE = 1;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
37 public static final char MONITOR_CMD_KEYSTATE = 2;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
38 public static final char MONITOR_CMD_CURSORMOVE = 3;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
39 public static final char MONITOR_CMD_SCREENCHANGE = 4;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
40 public static final char MONITOR_CMD_FIELDVALUE = 5;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
41 public static final char MONITOR_CMD_SETFIELD = 5;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
42 public static final char MONITOR_CMD_GETFIELD = 6;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
43 public static final char MONITOR_CMD_SCREENWATCH = 7;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
44 public static final char MONITOR_CMD_DEPRESS = 8;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
45 public static final char MONITOR_CMD_SHOWURL = 9;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
46 public static final char MONITOR_CMD_SWITCHSESSION = 10;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
47 public static final char MONITOR_CMD_CURSORREQUEST = 11;
31
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
48 public static final char MONITOR_CMD_SAYSTRING = 12;
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
49
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
50 public static final char CURSOR_REQUESTED = 0;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
51 public static final char CURSOR_SCREEN_CHANGE = 1;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
52 public static final char CURSOR_USER_KEY = 2;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
53
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
54 public static final int MONITORPORT = 6000;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
55 public static ConcurrentHashMap<Integer,CommunicationThread> clients = new ConcurrentHashMap<Integer,CommunicationThread>();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
56 public static int currentConnection = -1;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
57
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
58 private boolean speech = false;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
59 private TextToSpeech talker = null;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
60 private BlockingQueue<String> talkerQueue = null;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
61 public Handler handler = null;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
62 private ServerSocket serverSocket;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
63 private Thread serverThread = null;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
64 private WifiManager.WifiLock wifiLock;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
65 private PowerManager.WakeLock wakeLock;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
66 final private IBinder binder = new MonitorBinder();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
67
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
68
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
69 public class MonitorBinder extends Binder {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
70 public MonitorService getService() {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
71 return MonitorService.this;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
72 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
73 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
74
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
75 @Override
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
76 public void onInit(int status) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
77 if (status == TextToSpeech.SUCCESS) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
78 talker.setLanguage(Locale.US);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
79 speech = true;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
80 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
81 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
82
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
83 @Override
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
84 public void onCreate() {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
85 WifiManager wMgr = (WifiManager) getSystemService(Context.WIFI_SERVICE);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
86 wifiLock = wMgr.createWifiLock(WifiManager.WIFI_MODE_FULL, "MyWifiLock");
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
87 wifiLock.acquire();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
88
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
89 PowerManager pMgr = (PowerManager) getSystemService(Context.POWER_SERVICE);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
90 wakeLock = pMgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
91 wakeLock.acquire();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
92
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
93 talker = new TextToSpeech(this, this);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
94 this.serverThread = new Thread(new ServerThread());
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
95 this.serverThread.start();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
96 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
97
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
98 @Override
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
99 public IBinder onBind(Intent intent) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
100 startService(new Intent(this, MonitorService.class));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
101 return binder;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
102 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
103
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
104 public void printer(String msg) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
105 if (handler != null) handler.sendMessage(handler.obtainMessage(MonitorActivity.MESSAGE_CODE_PRINT, msg));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
106 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
107
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
108 public synchronized void setCurrentConnection(int connection) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
109 currentConnection = connection;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
110 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
111
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
112 public synchronized int nextConnection() {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
113 int c = 1;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
114 while (clients.get(c) != null) c++;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
115 return c;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
116 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
117
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
118 @Override
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
119 public int onStartCommand(Intent intent, int flags, int startId) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
120 Log.i(TAG, "service onStartCommand()");
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
121 return START_STICKY;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
122 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
123
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
124 @Override
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
125 public void onDestroy() {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
126 try {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
127 Log.i(TAG, "service onDestroy()");
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
128 teCloseAll();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
129 talker.stop();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
130 talker.shutdown();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
131 wifiLock.release();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
132 wakeLock.release();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
133 serverSocket.close();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
134 } catch (IOException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
135 Log.e(TAG, "exception in onDestroy()", e);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
136 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
137 super.onDestroy();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
138 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
139
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
140 class ServerThread extends Thread {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
141 public void run() {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
142 Socket socket = null;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
143 int connection = 0;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
144 try {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
145 serverSocket = new ServerSocket(MONITORPORT);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
146 } catch (IOException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
147 Log.e(TAG, "exception in ServerThread.run(), cannot create listening socket", e);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
148 return;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
149 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
150 while (true) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
151 try{
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
152 socket = serverSocket.accept();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
153 connection = nextConnection();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
154 CommunicationThread commThread = new CommunicationThread(connection, socket);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
155 clients.put(connection, commThread);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
156 commThread.start();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
157 } catch (IOException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
158 Log.e(TAG, "exception in ServerThread.run(), listening socket closed", e);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
159 break;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
160 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
161 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
162 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
163 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
164
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
165 class triple {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
166 private int l, c;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
167 private char[] b;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
168 public triple(int l, int c, char[] b) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
169 this.l = l;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
170 this.c = c;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
171 this.b = b;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
172 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
173 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
174
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
175 class CommunicationThread extends Thread {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
176 public int thread_id;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
177 public int connection;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
178 private String initString = null;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
179 private Socket client_socket;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
180 private InputStream client_in;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
181 private OutputStream client_out;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
182 private boolean is_closing = false;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
183 private Integer getfields_outstanding = 0;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
184 private BlockingQueue<triple> value_queue = new ArrayBlockingQueue<triple>(1);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
185 private BlockingQueue<char[]> packet_queue = new ArrayBlockingQueue<char[]>(10000);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
186
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
187 public CommunicationThread(int handle, Socket socket) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
188 connection = handle;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
189 client_socket = socket;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
190 try {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
191 client_in = client_socket.getInputStream();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
192 client_out = client_socket.getOutputStream();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
193 } catch (IOException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
194 Log.e(TAG, "exception in CommunicationThread() constructor, cannot get socket streams", e);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
195 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
196 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
197
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
198 public synchronized void abandon() {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
199 value_queue.offer(new triple(0, 0, new char[0]));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
200 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
201
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
202 public void speak(byte [] msg, boolean flush, boolean synchronous) {
31
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
203 speak(utf8BytesToString(msg), flush, synchronous);
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
204 }
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
205
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
206 public void speak(char [] msg, boolean flush, boolean synchronous) {
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
207 speak(new String(msg), flush, synchronous);
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
208 }
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
209
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
210 public void speak(String msg, boolean flush, boolean synchronous) {
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
211 if (speech) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
212 if (synchronous) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
213 HashMap<String, String> myHashParms = new HashMap();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
214 myHashParms.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, String.format("connection %d", connection));
31
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
215 talker.speak(msg, (flush) ? TextToSpeech.QUEUE_FLUSH : TextToSpeech.QUEUE_ADD, myHashParms);
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
216 try {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
217 String x = talkerQueue.take(); // wait for completion
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
218 } catch (InterruptedException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
219 Log.e(TAG, "exception in cm.speak()", e);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
220 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
221 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
222 else {
31
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
223 talker.speak(msg, (flush) ? TextToSpeech.QUEUE_FLUSH : TextToSpeech.QUEUE_ADD, null);
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
224 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
225 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
226 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
227
31
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
228 public String utf8BytesToString(byte[] b) {
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
229 try {
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
230 return new String(b, "UTF-8");
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
231 }
31
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
232 catch (Exception e) {
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
233 return "invalid utf-8";
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
234 }
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
235 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
236
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
237 public char[] bytesToChars(byte[] b, int len) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
238 char[] c = new char[len >> 1];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
239 int bp = 0;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
240 for(int i = 0; i < c.length; i++) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
241 byte b1 = b[bp++];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
242 byte b2 = b[bp++];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
243 c[i] = (char) (((b1 & 0x00FF) << 8) + (b2 & 0x00FF));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
244 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
245 return c;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
246 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
247
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
248 public byte[] charsToBytes(char[] c) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
249 byte[] b = new byte[c.length << 1];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
250 int bp = 0;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
251 for (int i=0; i<c.length; i++) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
252 b[bp++] = (byte) ((c[i] & 0xff00) >> 8);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
253 b[bp++] = (byte) (c[i] & 0x00ff);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
254 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
255 return b;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
256 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
257
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
258 void cleanup(char[] buf) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
259 int i;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
260 for (i=0; i<buf.length; i++) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
261 if ((int)(buf[i]) < 32) buf[i] = ' ';
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
262 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
263 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
264
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
265 public int cmGetField(char[] c) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
266 int request;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
267 synchronized(getfields_outstanding) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
268 request = getfields_outstanding;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
269 getfields_outstanding = getfields_outstanding + 1;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
270 value_queue.clear(); // we never have more than one outstanding getfield request from the reco thread on the connection
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
271 clientWrite(MONITOR_CMD_GETFIELD, c);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
272 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
273 return request;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
274 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
275
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
276 public synchronized void clientWrite(char cmd, char[] c) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
277 try {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
278 if (client_out != null) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
279 c[0] = (char)(c.length - 1); // number of chars following
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
280 c[1] = cmd;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
281 Log.i(TAG, String.format("sending %d command", (int)cmd));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
282 client_out.write(charsToBytes(c));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
283 client_out.flush();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
284 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
285 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
286 catch (IOException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
287 Log.e(TAG, "exception in monitorWrite()", e);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
288 try {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
289 client_out.close();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
290 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
291 catch (IOException ee) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
292 Log.e(TAG, "exception in monitorWrite() closing socket", ee);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
293 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
294 client_out = null;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
295 }
31
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
296 }
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
297
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
298 private char[] forceRead(int len) throws IOException {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
299 int len2 = len*2;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
300 int off = 0;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
301 byte[] b = new byte[len2];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
302 while (off < len2) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
303 int l = client_in.read(b, off, len2-off);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
304 if (l < 0) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
305 is_closing = true;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
306 throw new IOException("eof");
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
307 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
308 off += l;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
309 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
310 return bytesToChars(b, len2);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
311 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
312
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
313 public char[] readPacket() throws IOException {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
314 char[] len = forceRead(1);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
315 return forceRead(len[0]);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
316 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
317
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
318 public char[] nextPacket() throws IOException, InterruptedException {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
319 char[] packet = packet_queue.poll();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
320 if (packet == null) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
321 packet = readPacket();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
322 if (packet[0] == MONITOR_CMD_FIELDVALUE) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
323 synchronized(getfields_outstanding) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
324 getfields_outstanding = getfields_outstanding - 1;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
325 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
326 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
327 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
328 return packet;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
329 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
330
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
331 private triple reformatValue(char[] packet) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
332 int plen = packet.length;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
333 char[] buf = new char[plen-3];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
334 System.arraycopy(packet, 3, buf, 0, plen-3);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
335 cleanup(buf);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
336 Log.i(TAG, String.format("teFieldValue %d line %d column %d b.len %d", connection, (int)packet[1], (int)packet[2], buf.length));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
337 return new triple(packet[1], packet[2], buf);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
338 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
339
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
340 public triple peekValue(int request) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
341 try {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
342 while (true) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
343 char[] packet = readPacket();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
344 if (packet[0] == MONITOR_CMD_FIELDVALUE) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
345 synchronized(getfields_outstanding) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
346 getfields_outstanding = getfields_outstanding - 1;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
347 if (request == 0) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
348 return reformatValue(packet);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
349 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
350 else {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
351 packet_queue.put(packet);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
352 request = request - 1;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
353 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
354 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
355 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
356 else {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
357 packet_queue.put(packet);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
358 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
359 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
360 } catch (IOException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
361 return new triple(0, 0, new char[0]);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
362 } catch (InterruptedException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
363 return new triple(0, 0, new char[0]);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
364 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
365 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
366
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
367 public void run() {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
368 thread_id = android.os.Process.myTid();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
369 Log.i(TAG, String.format("CommunicationThread.run() client %d connected", connection));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
370 while (true) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
371 try {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
372 char[] packet = nextPacket();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
373 char[] buf;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
374 char cmd = packet[0];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
375 int plen = packet.length;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
376 //Log.i(TAG, String.format("received %d command length %d", (int)cmd, plen));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
377 switch (cmd) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
378 case MONITOR_CMD_INIT:
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
379 buf = new char[plen-1];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
380 System.arraycopy(packet, 1, buf, 0, plen-1);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
381 abandonGetField(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
382 initString = new String(buf);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
383 teInit(connection, initString);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
384 break;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
385 case MONITOR_CMD_ACTIVATE:
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
386 abandonGetField(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
387 buf = new char[plen-3];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
388 System.arraycopy(packet, 3, buf, 0, plen-3);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
389 teActivate(connection, initString, packet[1], packet[2], buf);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
390 break;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
391 case MONITOR_CMD_KEYSTATE:
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
392 teKeyState(connection, (packet[1] == 1));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
393 break;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
394 case MONITOR_CMD_CURSORMOVE:
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
395 teCursorMove(connection, packet[1], packet[2], packet[3]);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
396 break;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
397 case MONITOR_CMD_SCREENCHANGE:
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
398 buf = new char[plen-3];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
399 System.arraycopy(packet, 3, buf, 0, plen-3);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
400 cleanup(buf);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
401 teScreenChange(connection, packet[1], packet[2], buf);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
402 break;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
403 case MONITOR_CMD_FIELDVALUE:
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
404 value_queue.clear();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
405 value_queue.put(reformatValue(packet));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
406 break;
31
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
407 case MONITOR_CMD_SAYSTRING:
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
408 buf = new char[plen-3];
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
409 System.arraycopy(packet, 3, buf, 0, plen-3);
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
410 cleanup(buf);
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
411 speak(buf, (packet[1] != 0), (packet[2] != 0));
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
412 default:
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
413 break;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
414 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
415 } catch (IOException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
416 if (!is_closing) Log.e(TAG, "exception in CommunicationThread.run()", e);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
417 break;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
418 } catch (InterruptedException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
419 Log.e(TAG, "exception in CommunicationThread.run()", e);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
420 break;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
421 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
422 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
423 Log.i(TAG, String.format("shutting down connection %d", connection));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
424 try {
31
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
425 teClose(connection);
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
426 if (client_in != null) client_in.close();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
427 if (client_out != null) client_out.close();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
428 if (client_socket != null) client_socket.close();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
429 } catch (IOException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
430 Log.e(TAG, "exception in CommunicationThread.run() closing sockets", e);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
431 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
432 client_in = null;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
433 client_out = null;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
434 client_socket = null;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
435 clients.remove(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
436 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
437 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
438
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
439 private void abandonGetField(int except) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
440 for (CommunicationThread cm : clients.values()) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
441 if (cm.connection != except) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
442 cm.abandon();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
443 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
444 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
445 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
446
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
447
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
448 ////////////////////////////////////////
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
449 //// these functions run on the reader thread here and call your monitoring code
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
450
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
451 public void teInit(int connection, String fn) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
452 Log.i(TAG, String.format("teInit %d file %s", connection, fn));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
453 printer(String.format("init %d %s", connection, fn));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
454 setCurrentConnection(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
455 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
456
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
457 public void teCloseAll() {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
458 Log.i(TAG, String.format("teCloseAll"));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
459 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
460
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
461 public void teClose(int connection) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
462 Log.i(TAG, String.format("teClose %d", connection));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
463 setCurrentConnection(-1);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
464 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
465
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
466 public void teActivate(int connection, String fn, int lines, int columns, char[] buf) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
467 Log.i(TAG, String.format("teActivate %d", connection));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
468 printer(String.format("activate %d lines %d columns %d b.len %d", connection, lines, columns, buf.length));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
469 boolean sameinit = false;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
470 CommunicationThread cm = clients.get(currentConnection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
471 if (cm != null) {
31
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
472 sameinit = (cm.initString.equals(fn));
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
473 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
474 setCurrentConnection(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
475 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
476
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
477 public void teKeyState(int connection, boolean down) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
478 String d = (down) ? "yes" : "no";
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
479 Log.i(TAG, String.format("teKeyState %d isdown %s", connection, d));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
480 printer(String.format("keystate %d isdown %s", connection, d));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
481 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
482
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
483 public void teCursorMove(int connection, int l, int c, int why) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
484 Log.i(TAG, String.format("teCursorMove %d line %d column %d why %d", connection, l, c, why));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
485 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
486
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
487 public void teScreenChange(int connection, int lines, int columns, char[] buf) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
488 Log.i(TAG, String.format("teScreenChange %d lines %d columns %d b.len %d", connection, lines, columns, buf.length));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
489 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
490
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
491
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
492 ////////////////////////////////////////
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
493 //// these functions are called from your monitoring code thread
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
494
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
495 public static void teSetField(int connection, int l, int c, char[] buf) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
496 int len = buf.length;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
497 Log.i(TAG, String.format("teSetField %d request line %d column %d len %d", connection, l, c, len));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
498 CommunicationThread cm = clients.get(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
499 if (cm != null) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
500 char[] arg2 = new char[4 + len];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
501 arg2[2] = (char) (l & 0x0000ffff);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
502 arg2[3] = (char) (c & 0x0000ffff);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
503 int base = 4;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
504 System.arraycopy(buf, 0, arg2, base, len);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
505 cm.clientWrite(MONITOR_CMD_SETFIELD, arg2);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
506 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
507 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
508
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
509 public static char[] teGetField(int connection, int l, int c, int len) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
510 Log.i(TAG, String.format("teGetField %d request line %d column %d len %d", connection, l, c, len));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
511 CommunicationThread cm = clients.get(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
512 if (cm != null) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
513 char[] arg = new char[5];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
514 arg[2] = (char) (l & 0x0000ffff);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
515 arg[3] = (char) (c & 0x0000ffff);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
516 arg[4] = (char) (len & 0x0000ffff);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
517 int request = cm.cmGetField(arg);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
518 try {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
519 int tid = android.os.Process.myTid();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
520 triple t;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
521 if (tid == cm.thread_id) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
522 // we are running on the socket reader thread, called via teCursorMove() or teScreenChange()
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
523 // we need to peek command packets from the socket looking for our fieldvalue response
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
524 Log.i(TAG, String.format("java teGetField() peeking value for getfield on reader thread"));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
525 t = cm.peekValue(request);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
526 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
527 else {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
528 // we are running on some other thread, just wait for the reader thread to
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
529 // process the fieldvalue and put it on the queue.
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
530 Log.i(TAG, String.format("java teGetField() waiting for data for getfield on reco thread"));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
531 t = cm.value_queue.take(); // wait for response
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
532 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
533 Log.i(TAG, String.format("teGetField %d response line %d column %d len %d", connection, t.l, t.c, t.b.length));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
534 return t.b;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
535 } catch (InterruptedException e) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
536 Log.e(TAG, "exception in teGetField(), return empty string", e);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
537 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
538 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
539 return new char[0];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
540 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
541
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
542 public static void teScreenWatch(int connection, int l, int c, int len) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
543 Log.i(TAG, String.format("teScreenWatch %d request line %d column %d len %d", connection, l, c, len));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
544 CommunicationThread cm = clients.get(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
545 if (cm != null) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
546 char[] arg = new char[5];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
547 arg[2] = (char) (l & 0x0000ffff);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
548 arg[3] = (char) (c & 0x0000ffff);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
549 arg[4] = (char) (len & 0x0000ffff);
31
0bc0b4798d9e fix saystring(12) command for proper unicode and document it
Carl Byington <carl@five-ten-sg.com>
parents: 27
diff changeset
550 cm.clientWrite(MONITOR_CMD_SCREENWATCH, arg);
27
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
551 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
552 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
553
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
554 public static void teSpeak(int connection, byte [] msg, boolean flush, boolean synchronous) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
555 CommunicationThread cm = clients.get(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
556 if (cm != null) cm.speak(msg, flush, synchronous);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
557 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
558
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
559 public static void teDepress(int connection, int vk_key) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
560 // http://msdn.microsoft.com/en-us/library/windows/desktop/dd375731
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
561 Log.i(TAG, String.format("teDepress %d, %d", connection, vk_key));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
562 CommunicationThread cm = clients.get(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
563 if (cm != null) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
564 char[] arg = new char[3];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
565 arg[2] = (char) (vk_key & 0x0000ffff);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
566 cm.clientWrite(MONITOR_CMD_DEPRESS, arg);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
567 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
568 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
569
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
570 public static void teShowUrl(int connection, char [] url) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
571 int len = url.length;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
572 CommunicationThread cm = clients.get(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
573 if (cm != null) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
574 char[] arg2 = new char[2 + len];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
575 int base = 2;
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
576 System.arraycopy(url, 0, arg2, base, len);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
577 cm.clientWrite(MONITOR_CMD_SHOWURL, arg2);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
578 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
579 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
580
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
581 public static void teAbandonGetField(int connection) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
582 Log.i(TAG, String.format("teAbandonGetField %d", connection));
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
583 CommunicationThread cm = clients.get(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
584 if (cm != null) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
585 cm.abandon();
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
586 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
587 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
588
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
589 public static void teSwitchSession(int connection) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
590 CommunicationThread cm = clients.get(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
591 if (cm != null) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
592 char [] arg2 = new char[2];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
593 cm.clientWrite(MONITOR_CMD_SWITCHSESSION, arg2);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
594 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
595 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
596
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
597 public static void teCursorRequest(int connection) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
598 CommunicationThread cm = clients.get(connection);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
599 if (cm != null) {
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
600 char [] arg2 = new char[2];
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
601 cm.clientWrite(MONITOR_CMD_CURSORREQUEST, arg2);
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
602 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
603 }
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
604
807f7e4eaebe starting update to latest toolchain
Carl Byington <carl@five-ten-sg.com>
parents:
diff changeset
605 }