diff --git a/android/jni/main.cpp b/android/jni/main.cpp index 8b7f126..23d0a5c 100644 --- a/android/jni/main.cpp +++ b/android/jni/main.cpp @@ -50,9 +50,11 @@ const char * java_class_name = "br/com/bb/pw3270/lib3270"; PW3270_JNI * pw3270_jni_active = NULL; static pthread_mutex_t mutex; + static char * startup_script = NULL; /*--[ Implement ]------------------------------------------------------------------------------------*/ + jmethodID lib3270_getmethodID(const char *name, const char *sig) { if(!pw3270_jni_active) @@ -268,25 +270,13 @@ static void ctlr_done(H3270 *session) static void autostart(H3270 *session) { + if(startup_script) { - char *text = lib3270_get_text(PW3270_SESSION,0,-1); - if(text) - { - char *strtok_r(char *str, const char *delim, char **saveptr); - char *save; - -/* - __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "Contents:\n"); - for(char *ptr = strtok_r(text,"\n",&save);ptr;ptr = strtok_r(NULL,"\n",&save)) - __android_log_print(ANDROID_LOG_DEBUG, PACKAGE_NAME, "%s\n",ptr); -*/ - - lib3270_free(text); - } + // Input startup script contents + lib3270_emulate_input(PW3270_SESSION,startup_script,-1,0); + free(startup_script); + startup_script = NULL; } - - pw3270_jni_post_message(10); - } jint JNI_OnLoad(JavaVM *vm, void *reserved) @@ -352,6 +342,27 @@ JNIEXPORT void JNICALL Java_br_com_bb_pw3270_lib3270_setHost(JNIEnv *env, jobjec PW3270_JNI_END } +JNIEXPORT void JNICALL Java_br_com_bb_pw3270_lib3270_setStartupScript(JNIEnv *env, jobject obj, jstring str) +{ + const char *text; + + PW3270_JNI_BEGIN + + text = env->GetStringUTFChars(str, 0); + + if(startup_script) + free(startup_script); + + if(text || strlen(text) > 0) + startup_script = strdup(text); + else + startup_script = NULL; + + PW3270_JNI_END + +} + + JNIEXPORT jstring JNICALL Java_br_com_bb_pw3270_lib3270_getHost(JNIEnv *env, jobject obj) { return env->NewStringUTF(lib3270_get_host(lib3270_get_default_session_handle())); diff --git a/android/jni/text.cpp b/android/jni/text.cpp index a406940..82cc2c2 100644 --- a/android/jni/text.cpp +++ b/android/jni/text.cpp @@ -139,18 +139,3 @@ JNIEXPORT void JNICALL Java_br_com_bb_pw3270_lib3270_setTextAt(JNIEnv *env, jobj PW3270_JNI_END } -JNIEXPORT void JNICALL Java_br_com_bb_pw3270_lib3270_runStartupString(JNIEnv *env, jobject obj, jstring str) -{ - int rc = -1; - - PW3270_JNI_BEGIN - - if(lib3270_connected(PW3270_SESSION)) - { - lib3270_set_cursor_address(PW3270_SESSION,lib3270_get_next_unprotected(PW3270_SESSION,0)); - lib3270_emulate_input(PW3270_SESSION, env->GetStringUTFChars(str, 0), -1, 0); - } - - PW3270_JNI_END - -} diff --git a/android/src/br/com/bb/pw3270/lib3270.java b/android/src/br/com/bb/pw3270/lib3270.java index 4b97ead..ea0d6a2 100644 --- a/android/src/br/com/bb/pw3270/lib3270.java +++ b/android/src/br/com/bb/pw3270/lib3270.java @@ -84,7 +84,8 @@ public abstract class lib3270 { switch (msg.what) { - case 0: // Reconnect + case 0: // Connection lost + reload(); if(!hSession.isConnected() && settings.getString("hostname","") != "" && settings.getBoolean("reconnect",false)) { Log.d(TAG,"Connection lost, reconnecting"); @@ -139,14 +140,14 @@ public abstract class lib3270 new timer(((Long) msg.obj).longValue(), msg.arg1); break; +/* case 10: // Run autostart - String str = settings.getString("logonstring",""); Log.v(TAG, "Logon string is \"" + str + "\""); if( str != "") runStartupString(str); break; - +*/ } } }; @@ -273,6 +274,10 @@ public abstract class lib3270 { Log.v(TAG,"Getting socket for " + hostname + ":" + port.toString()); sock = socketFactory.createSocket(hostname, port); + + sock.setKeepAlive(true); + // sock.setSoTimeout(1000); + outData = new DataOutputStream(sock.getOutputStream()); inData = new DataInputStream(sock.getInputStream()); } @@ -418,6 +423,7 @@ public abstract class lib3270 case 4: // LIB3270_MESSAGE_DISCONNECTED Log.v(TAG, "Status changed to disconnected"); connected = false; + net_cleanup(); reload(); break; @@ -447,10 +453,12 @@ public abstract class lib3270 protected void showPopupMessage(int type, String title, String text, String info) { + /* Log.v(TAG,"Popup Message:"); Log.v(TAG,title); Log.v(TAG,text); Log.v(TAG,info); + */ AlertDialog d = new AlertDialog.Builder(mainact).create(); @@ -510,31 +518,76 @@ public abstract class lib3270 public int connect() { + if(connected) + { + Log.v(TAG, "Already connected"); + return -1; + } + + Log.v(TAG, "Connecting"); if (mainloop == null) { info(TAG, "Starting comm thread"); + setStartupScript(settings.getString("logonstring","")); mainloop = new NetworkThread(); mainloop.start(); return 0; } - error(TAG, "Comm thread already active during connect"); + Log.v(TAG, "Comm thread already active during connect"); + disconnect(); + return -1; } - public int disconnect() + private int net_cleanup() { - Log.v(TAG, "Disconnecting"); - connected = reconnect = false; - + Log.v(TAG, "Stopping network activity"); + if(sock != null) { - try + if(sock.isConnected()) + { + try + { + sock.shutdownInput(); + return 0; + } + catch(Exception e) + { + String msg = e.getLocalizedMessage(); + if(msg == null) + msg = e.getMessage(); + + Log.v(TAG,": shutdownInput error" + (msg != null ? msg : e.toString())); + } + } + + if(!sock.isClosed()) { - sock.shutdownInput(); - sock.shutdownOutput(); - } catch(Exception e) { } + try + { + sock.close(); + return 0; + } + catch(Exception e) + { + String msg = e.getLocalizedMessage(); + if(msg == null) + msg = e.getMessage(); + + Log.v(TAG,"sockclose error: " + (msg != null ? msg : e.toString())); + } + } } - + + return 0; + } + + public int disconnect() + { + Log.v(TAG, "Disconnecting"); + connected = reconnect = false; + net_cleanup(); return 0; } @@ -623,5 +676,6 @@ public abstract class lib3270 public native boolean in3270(); - public native void runStartupString(String text); + public native void setStartupScript(String str); + } -- libgit2 0.21.2