changeset 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 89b6389aa5b2
children 759c61d72006
files Makefile app/build.gradle app/src/main/AndroidManifest.xml app/src/main/java/com/five_ten_sg/connectbot/monitor/MonitorActivity.java app/src/main/java/com/five_ten_sg/connectbot/monitor/MonitorService.java build.gradle gradle/wrapper/gradle-wrapper.properties xml/510connectbotmonitor.in xml/Makefile
diffstat 9 files changed, 82 insertions(+), 66 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Thu Nov 08 11:59:30 2018 -0800
+++ b/Makefile	Sun Apr 28 14:45:56 2019 -0700
@@ -1,12 +1,13 @@
 #mc40 is "On Device Storage"
 #tc55 is "Internal Storage"
 
+na=$(shell find . -iname '*.c' -o -iname '*.h' -o -iname '*.cpp')
 style:=release
 dest:=/run/user/1000/gvfs/mtp*/*torage/Download
 ver:=$(shell grep versionName app/src/main/AndroidManifest.xml | cut -d'"' -f2)
-apk:='app/build/outputs/apk/510ConnectbotMonitor-$(ver).apk'
+apk:='app/build/outputs/apk/510ConnectbotMonitor-$(ver).$(style).apk'
 id:=$(shell hg id --id || echo 1)
-da:=$(shell date +%Y-%m-%d)
+da:=$(shell date '+%Y-%m-%dT%H:%M:%S')
 version:=\
 <?xml version=\"1.0\" encoding=\"utf-8\"?>\n\
 <resources>\n\
@@ -15,8 +16,10 @@
 
 ifeq ($(style),release)
     task:=assembleArmRelease
+	debug:=0
 else
 	task:=assembleArmDebug
+	debug:=1
 endif
 
 all:
@@ -54,6 +57,8 @@
 	convert res/drawable-ldpi/icon.png    -resize 50% -colorspace Gray res/drawable-ldpi/notification_icon.png
 
 indentc:
+	dos2unix $(na)
+	for i in $(na); do sed -i -e 's/\r//g' $$i; done
 	indent --line-length100 \
 		   --brace-indent4 \
 		   --braces-on-if-line \
@@ -62,15 +67,17 @@
 		   --case-indentation4 \
 		   --comment-indentation60 \
 		   --cuddle-else \
+		   --cuddle-do-while \
 		   --declaration-comment-column60 \
 		   --no-tabs \
 		   -nbbo \
 		   -npcs \
 		   -nprs \
 		   -npsl \
+		   -bad -bap -bbb -sob \
 		   -saf -sai -saw \
 		   -i4 \
-		   $(shell find . -iname *.c -o -iname *.h -o -iname *.cpp)
+		   $(na)
 
 indentjava:
 	astyle --style=java \
@@ -93,5 +100,4 @@
 		--convert-tabs \
 		--break-after-logical \
 		--mode=java \
-		   $(shell find . -iname *.java | grep -v /gen/)
-
+		   $(shell find . -iname '*.java' | grep -v /gen/)
--- a/app/build.gradle	Thu Nov 08 11:59:30 2018 -0800
+++ b/app/build.gradle	Sun Apr 28 14:45:56 2019 -0700
@@ -1,23 +1,3 @@
-task copyDebugLibTask(type: Copy) {
-    from 'build/intermediates/binaries/debug/arm/lib/armeabi'
-    into 'src/main/jniLibs/armeabi'
-}
-task copyReleaseLibTask(type: Copy) {
-    from 'build/intermediates/binaries/release/arm/lib/armeabi'
-    into 'src/main/jniLibs/armeabi'
-}
-
-tasks.whenTaskAdded { task ->
-    if (task.name.contains("merge") && task.name.contains("JniLibFolders")) {
-        if (task.name.contains("ArmDebug")) {
-            task.dependsOn copyDebugLibTask
-        }
-        if (task.name.contains("ArmRelease")) {
-            task.dependsOn copyReleaseLibTask
-        }
-    }
-}
-
 
 apply plugin: 'com.android.application'
 
@@ -36,14 +16,29 @@
             keyAlias  = "510Connectbot"
         }
     }
-    compileSdkVersion = 16
+    compileSdkVersion = 28
     buildTypes {
         release {
             minifyEnabled = false
-            signingConfig = signingConfigs.release
+            signingConfig = android.signingConfigs.release
+            ndk {
+                debuggable = false
+                abiFilters 'armeabi-v7a', 'arm64-v8a'
+            }
         }
         debug {
             debuggable = true
+            initWith debug
+            jniDebuggable true
+            externalNativeBuild {
+                ndkBuild {
+                    cFlags "-DDEBUG=1"
+                }
+            }
+            ndk {
+                debuggable = true
+                abiFilters 'armeabi-v7a', 'arm64-v8a'
+            }
         }
     }
     flavorDimensions "arch"
@@ -57,9 +52,13 @@
     }
 
     defaultConfig {
-        applicationId = "com.five_ten_sg.connectbot"
-        minSdkVersion = 8
-        targetSdkVersion = 15
+        applicationId = "com.five_ten_sg.connectbot.monitor"
+        minSdkVersion  21
+        targetSdkVersion  28
+        ndk {
+            moduleName = "monitor"
+            abiFilters 'armeabi-v7a', 'arm64-v8a'
+        }
     }
 
 }
--- a/app/src/main/AndroidManifest.xml	Thu Nov 08 11:59:30 2018 -0800
+++ b/app/src/main/AndroidManifest.xml	Sun Apr 28 14:45:56 2019 -0700
@@ -1,12 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.five_ten_sg.connectbot.monitor"
-    android:versionCode="1"
-    android:versionName="1.0.4-0" >
-
-    <uses-sdk
-        android:minSdkVersion="8"
-        android:targetSdkVersion="17" />
+    android:versionName="1.0.5-0"
+    android:versionCode="100500" >
 
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
--- a/app/src/main/java/com/five_ten_sg/connectbot/monitor/MonitorActivity.java	Thu Nov 08 11:59:30 2018 -0800
+++ b/app/src/main/java/com/five_ten_sg/connectbot/monitor/MonitorActivity.java	Sun Apr 28 14:45:56 2019 -0700
@@ -24,8 +24,7 @@
 import android.widget.TextView;
 
 public class MonitorActivity extends Activity {
-    public final static String TAG = "ConnectBot.MonitorActivity";
-
+    public static final String TAG = "ConnectBot.MonitorAct.";
     public static final int MESSAGE_CODE_PRINT = 6000;
     private final int       LINES = 20;
     private String[]        texts   = new String[LINES];
@@ -67,6 +66,7 @@
         printer("");
         Log.i(TAG, "binding to monitor service");
         Intent intent = new Intent ("com.five_ten_sg.connectbot.monitor.MonitorService");
+        intent.setPackage("com.five_ten_sg.connectbot.monitor");
         bindService(intent, connection, Context.BIND_AUTO_CREATE);
     }
 
--- a/app/src/main/java/com/five_ten_sg/connectbot/monitor/MonitorService.java	Thu Nov 08 11:59:30 2018 -0800
+++ b/app/src/main/java/com/five_ten_sg/connectbot/monitor/MonitorService.java	Sun Apr 28 14:45:56 2019 -0700
@@ -45,6 +45,7 @@
     public  static final char MONITOR_CMD_SHOWURL       = 9;
     public  static final char MONITOR_CMD_SWITCHSESSION = 10;
     public  static final char MONITOR_CMD_CURSORREQUEST = 11;
+    public  static final char MONITOR_CMD_SAYSTRING     = 12;
 
     public  static final char CURSOR_REQUESTED      = 0;
     public  static final char CURSOR_SCREEN_CHANGE  = 1;
@@ -199,12 +200,19 @@
         }
 
         public void speak(byte [] msg, boolean flush, boolean synchronous) {
+            speak(utf8BytesToString(msg), flush, synchronous);
+        }
+
+        public void speak(char [] msg, boolean flush, boolean synchronous) {
+            speak(new String(msg), flush, synchronous);
+        }
+
+        public void speak(String msg, boolean flush, boolean synchronous) {
             if (speech) {
-                String smsg = bytesToString(msg);
                 if (synchronous) {
                     HashMap<String, String> myHashParms = new HashMap();
                     myHashParms.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, String.format("connection %d", connection));
-                	talker.speak(smsg, (flush) ? TextToSpeech.QUEUE_FLUSH : TextToSpeech.QUEUE_ADD, myHashParms);
+                	talker.speak(msg, (flush) ? TextToSpeech.QUEUE_FLUSH : TextToSpeech.QUEUE_ADD, myHashParms);
                     try {
                         String x = talkerQueue.take(); // wait for completion
                     } catch (InterruptedException e) {
@@ -212,20 +220,18 @@
                     }
                 }
                 else {
-            	    talker.speak(smsg, (flush) ? TextToSpeech.QUEUE_FLUSH : TextToSpeech.QUEUE_ADD, null);
+            	    talker.speak(msg, (flush) ? TextToSpeech.QUEUE_FLUSH : TextToSpeech.QUEUE_ADD, null);
                 }
             }
         }
 
-        public String bytesToString(byte[] b) {
-            char[] c = new char[b.length];
-            int bp = 0;
-            for(int i = 0; i < c.length; i++) {
-                byte b1 = 0;
-                byte b2 = b[bp++];
-                c[i] = (char) (((b1 & 0x00FF) << 8) + (b2 & 0x00FF));
+        public String utf8BytesToString(byte[] b) {
+            try {
+                return new String(b, "UTF-8");
             }
-            return new String(c);
+            catch (Exception e) {
+                return "invalid utf-8";
+            }
         }
 
         public char[] bytesToChars(byte[] b, int len) {
@@ -287,7 +293,7 @@
                 }
                 client_out = null;
             }
-        };
+        }
 
         private char[] forceRead(int len) throws IOException {
             int len2 = len*2;
@@ -398,6 +404,11 @@
                             value_queue.clear();
                             value_queue.put(reformatValue(packet));
                             break;
+                        case MONITOR_CMD_SAYSTRING:
+                            buf = new char[plen-3];
+                            System.arraycopy(packet, 3, buf, 0, plen-3);
+                            cleanup(buf);
+                            speak(buf, (packet[1] != 0), (packet[2] != 0));
                         default:
                             break;
                     }
@@ -411,6 +422,7 @@
             }
             Log.i(TAG, String.format("shutting down connection %d", connection));
             try {
+                teClose(connection);
                 if (client_in     != null) client_in.close();
                 if (client_out    != null) client_out.close();
                 if (client_socket != null) client_socket.close();
@@ -457,7 +469,7 @@
         boolean sameinit = false;
         CommunicationThread cm = clients.get(currentConnection);
         if (cm != null) {
-            sameinit = (cm.initString == fn);
+            sameinit = (cm.initString.equals(fn));
         }
         setCurrentConnection(connection);
     }
@@ -535,7 +547,7 @@
             arg[2] = (char) (l & 0x0000ffff);
             arg[3] = (char) (c & 0x0000ffff);
             arg[4] = (char) (len & 0x0000ffff);
-            cm.clientWrite(MONITOR_CMD_GETFIELD, arg);
+            cm.clientWrite(MONITOR_CMD_SCREENWATCH, arg);
         }
     }
 
--- a/build.gradle	Thu Nov 08 11:59:30 2018 -0800
+++ b/build.gradle	Sun Apr 28 14:45:56 2019 -0700
@@ -6,7 +6,7 @@
         google()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.2.1'
+        classpath 'com.android.tools.build:gradle:3.4.0'
     }
 }
 
--- a/gradle/wrapper/gradle-wrapper.properties	Thu Nov 08 11:59:30 2018 -0800
+++ b/gradle/wrapper/gradle-wrapper.properties	Sun Apr 28 14:45:56 2019 -0700
@@ -1,8 +1,6 @@
-#Wed Oct 21 11:34:03 PDT 2015
+#Wed Apr 17 12:40:18 PDT 2019
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-#distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
-
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
--- a/xml/510connectbotmonitor.in	Thu Nov 08 11:59:30 2018 -0800
+++ b/xml/510connectbotmonitor.in	Sun Apr 28 14:45:56 2019 -0700
@@ -19,7 +19,7 @@
 
     <refentry id="x@PACKAGE@.1">
         <refentryinfo>
-            <date>2015-05-01</date>
+            <date>2019-04-28</date>
             <author>
                 <firstname>Carl</firstname>
                 <surname>Byington</surname>
@@ -42,8 +42,7 @@
             <title>Build method</title>
             <para>
                 This is an android project with no native code, so
-                "android update project -p . -t android-16; ant debug"
-                should build cleanly.
+                "make docs; make builder style=release" should build cleanly.
             </para>
         </refsect1>
 
@@ -77,9 +76,9 @@
             <para>
                 The messages exchanged between the terminal emulator and the
                 terminal monitor are arrays of uint16 values in network byte
-                order. Each message starts with a uint16 message byte length,
-                followed by that many bytes of data. Note that the message length
-                will always be even. The next uint16 contains the message
+                order. Each message starts with a uint16 message length,
+                followed by that many uint16 values.
+                The next uint16 contains the message
                 command value, and the remaining uint16 values are the arguments
                 if any for that command.
             </para>
@@ -139,7 +138,7 @@
                 and the second argument is the column number (0..79).
                 That is followed by the field value, a sequence of uint16
                 character codes from the screen buffer. The field
-                covers N columns, where N = (message length - 4) / 2.
+                covers N columns, where N = (message length - 4).
                 When sent from the monitor to the emulator, this causes
                 the emulator to send the field codes to the host (for async
                 modes) or to set the specified field contents (for block modes).
@@ -192,6 +191,13 @@
                 in block mode (tn5250) sessions. Those commands do trigger CURSORMOVE
                 updates in async mode (telnet, ssh) sessions.
             </para>
+
+            <para>
+                SAYSTRING = 12 (TE -> Monitor). The first argument is nonzero if
+                any current speech should be flushed. The second argument is nonzero
+                if this speech should be synchronous. That is followed by uint16
+                character codes to be spoken.
+            </para>
         </refsect1>
 
         <refsect1 id='synchronization.1'>
--- a/xml/Makefile	Thu Nov 08 11:59:30 2018 -0800
+++ b/xml/Makefile	Sun Apr 28 14:45:56 2019 -0700
@@ -4,9 +4,8 @@
 all:
 	sed -e 's/@PACKAGE@/$(pkg)/g' -e 's/@VERSION@/$(ver)/g' <510connectbotmonitor.in >510connectbotmonitor
 	cat header.xml  510connectbotmonitor >510connectbotmonitor.xml
-	cat header.sgml 510connectbotmonitor >510connectbotmonitor.sgml
 	rm -f ../html/*html
 	rm -f ../html/*pdf
 	xmlto        -o ../html xhtml 510connectbotmonitor.xml
 	xmlto        -o ../html pdf   510connectbotmonitor.xml
-	rm -f 510connectbotmonitor.xml 510connectbotmonitor.sgml
+	rm -f 510connectbotmonitor.xml