From 844f2ac240556597dfb14ec803ef409c659248a6 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Mon, 16 Jul 2012 18:37:34 +0000 Subject: [PATCH] Iniciando implementação da passagem de valores da interface jni para o buffer de terminal --- android/jni/Android.mk | 2 +- android/jni/html.cpp | 112 ---------------------------------------------------------------------------------------------------------------- android/jni/text.cpp | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ android/lib3270NDK.cbp | 2 +- android/res/raw/jsmain.js | 13 +++++++++++-- android/res/raw/theme.css | 2 -- android/src/br/com/bb/pw3270/lib3270.java | 12 +++++++++++- pw3270.cbp | 1 + src/lib3270/html.c | 12 +++++++++++- 9 files changed, 172 insertions(+), 120 deletions(-) delete mode 100644 android/jni/html.cpp create mode 100644 android/jni/text.cpp diff --git a/android/jni/Android.mk b/android/jni/Android.mk index dc182b7..8901409 100644 --- a/android/jni/Android.mk +++ b/android/jni/Android.mk @@ -34,7 +34,7 @@ LOCAL_DEFAULT_CPP_EXTENSION := cpp LOCAL_MODULE := lib3270 LOCAL_LDLIBS := -llog LOCAL_SRC_FILES := $(foreach SRC, $(TERMINAL_SOURCES) $(NETWORK_SOURCES), ../../src/lib3270/$(SRC)) \ - main.cpp misc.cpp html.cpp actions.cpp + main.cpp misc.cpp text.cpp actions.cpp include $(BUILD_SHARED_LIBRARY) diff --git a/android/jni/html.cpp b/android/jni/html.cpp deleted file mode 100644 index ca2ae93..0000000 --- a/android/jni/html.cpp +++ /dev/null @@ -1,112 +0,0 @@ -/* - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a - * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270. - * - * Copyright (C) <2008> - * - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela - * Free Software Foundation. - * - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para - * obter mais detalhes. - * - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA, 02111-1307, USA - * - * Este programa está nomeado como main.cpp e possui - linhas de código. - * - * Contatos: - * - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) - * - */ - - #include "globals.h" - #include - #include - -/*--[ Implement ]------------------------------------------------------------------------------------*/ - -static jbyteArray retString(JNIEnv *env, const char *txt) -{ - size_t len = strlen(txt); - jbyteArray ret = env->NewByteArray(len); - env->SetByteArrayRegion(ret, 0, len, (jbyte*) txt); - return ret; -} - -JNIEXPORT jbyteArray JNICALL Java_br_com_bb_pw3270_lib3270_getHTML(JNIEnv *env, jobject obj) -{ - jbyteArray ret; - - session_request(env,obj); - - trace("%s starts, session=%p",__FUNCTION__,session); - - if(session) - { - char *text = lib3270_get_as_html(session,(LIB3270_HTML_OPTION) (LIB3270_HTML_OPTION_ALL|LIB3270_HTML_OPTION_FORM)); - - if(text) - { - ret = retString(env,text); - lib3270_free(text); - } - else - { - ret = retString(env, "Empty session"); - } - } - else - { - ret = retString(env, "Invalid Session ID"); - } - - trace("%s ends",__FUNCTION__); - - session_release(); - - return ret; -} - - -JNIEXPORT jbyteArray JNICALL Java_br_com_bb_pw3270_lib3270_getText(JNIEnv *env, jobject obj) -{ - jbyteArray ret; - - session_request(env,obj); - - trace("%s starts, session=%p",__FUNCTION__,session); - - if(session) - { - char *text = lib3270_get_text(session,0,-1); - - trace("%s will return \"%s\"",__FUNCTION__,text ? text : ""); - - if(text) - { - ret = retString(env,text); - lib3270_free(text); - } - else - { - ret = retString(env, ""); - } - } - else - { - ret = retString(env, "Invalid Session ID"); - } - - trace("%s ends",__FUNCTION__); - - session_release(); - - return ret; -} diff --git a/android/jni/text.cpp b/android/jni/text.cpp new file mode 100644 index 0000000..5117b59 --- /dev/null +++ b/android/jni/text.cpp @@ -0,0 +1,136 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA, 02111-1307, USA + * + * Este programa está nomeado como text.cpp e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * + */ + + #include "globals.h" + #include + #include + +/*--[ Implement ]------------------------------------------------------------------------------------*/ + +static jbyteArray retString(JNIEnv *env, const char *txt) +{ + size_t len = strlen(txt); + jbyteArray ret = env->NewByteArray(len); + env->SetByteArrayRegion(ret, 0, len, (jbyte*) txt); + return ret; +} + +JNIEXPORT jbyteArray JNICALL Java_br_com_bb_pw3270_lib3270_getHTML(JNIEnv *env, jobject obj) +{ + jbyteArray ret; + + session_request(env,obj); + + trace("%s starts, session=%p",__FUNCTION__,session); + + if(session) + { + char *text = lib3270_get_as_html(session,(LIB3270_HTML_OPTION) (LIB3270_HTML_OPTION_ALL|LIB3270_HTML_OPTION_FORM)); + + if(text) + { + ret = retString(env,text); + lib3270_free(text); + } + else + { + ret = retString(env, "Empty session"); + } + } + else + { + ret = retString(env, "Invalid Session ID"); + } + + trace("%s ends",__FUNCTION__); + + session_release(); + + return ret; +} + + +JNIEXPORT jbyteArray JNICALL Java_br_com_bb_pw3270_lib3270_getText(JNIEnv *env, jobject obj) +{ + jbyteArray ret; + + session_request(env,obj); + + trace("%s starts, session=%p",__FUNCTION__,session); + + if(session) + { + char *text = lib3270_get_text(session,0,-1); + + trace("%s will return \"%s\"",__FUNCTION__,text ? text : ""); + + if(text) + { + ret = retString(env,text); + lib3270_free(text); + } + else + { + ret = retString(env, ""); + } + } + else + { + ret = retString(env, "Invalid Session ID"); + } + + trace("%s ends",__FUNCTION__); + + session_release(); + + return ret; +} + +JNIEXPORT void JNICALL Java_br_com_bb_pw3270_lib3270_setTextAt(JNIEnv *env, jobject obj, jint pos, jbyteArray inText, jint szText) +{ + char str[szText+1]; + int f; + jbyte * bt; + + + session_request(env,obj); + + if(!session) + return; + + bt = env->GetByteArrayElements(inText,0); + + for(int f=0;fReleaseByteArrayElements(inText,bt,JNI_ABORT); + session_release(); +} diff --git a/android/lib3270NDK.cbp b/android/lib3270NDK.cbp index 1c42ddc..3a5d397 100644 --- a/android/lib3270NDK.cbp +++ b/android/lib3270NDK.cbp @@ -58,10 +58,10 @@ - + diff --git a/android/res/raw/jsmain.js b/android/res/raw/jsmain.js index f5ab167..3328574 100644 --- a/android/res/raw/jsmain.js +++ b/android/res/raw/jsmain.js @@ -17,7 +17,17 @@ function pfkey(id) function xmit() { - pw3270.xmit(); + var form = document.getElementById("form3270"); + + for(var i=0;i < form.elements.length;i++) + { + if(form.elements[i].name.substr(0,1) == "F") + { + var offset = parseInt(form.elements[i].name.substr(1,4)); + alert("offset="+offset+" \""+form.elements[i].value+"\""); + pw3270.setStringAt(offset,form.elements[i].value); + } + } return false; } @@ -25,4 +35,3 @@ function eraseinput() { return false; } - diff --git a/android/res/raw/theme.css b/android/res/raw/theme.css index d34fd69..891b6d6 100644 --- a/android/res/raw/theme.css +++ b/android/res/raw/theme.css @@ -60,8 +60,6 @@ input[type="password"]:focus #pfbar { z-index: -1; - position: fixed; - bottom: 1px; width: 49em; background: black; color: white; diff --git a/android/src/br/com/bb/pw3270/lib3270.java b/android/src/br/com/bb/pw3270/lib3270.java index 24292cc..ead7c73 100644 --- a/android/src/br/com/bb/pw3270/lib3270.java +++ b/android/src/br/com/bb/pw3270/lib3270.java @@ -55,7 +55,7 @@ public class lib3270 id = timer_id; Log.d(TAG,"Timer " + id + " set to " + msec + " ms"); - + this.start(); } @@ -380,6 +380,15 @@ public class lib3270 return 0; } + public void setStringAt(int offset, String str) + { + try + { + setTextAt(offset,str.getBytes(getEncoding()),str.length()); + } catch( Exception e ) { } + } + + /*---[ Native calls ]----------------------------------------------------*/ static private native int init(); @@ -417,6 +426,7 @@ public class lib3270 // Get/Set screen contents public native byte[] getHTML(); public native byte[] getText(); + public native void setTextAt(int offset, byte[] str, int len); } diff --git a/pw3270.cbp b/pw3270.cbp index f2dcd25..a5d5559 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -53,6 +53,7 @@ + diff --git a/src/lib3270/html.c b/src/lib3270/html.c index b0693fe..4f7ea4d 100644 --- a/src/lib3270/html.c +++ b/src/lib3270/html.c @@ -274,6 +274,16 @@ if(*ptr) { + int f; + char * last = ptr; + + for(f=0;ptr[f];f++) + { + if(ptr[f] > ' ') + last = ptr+f+1; + } + *last = 0; + append_string(&info," value=\""); append_string(&info,ptr); append_string(&info,"\""); @@ -397,7 +407,7 @@ if(info.form) { - static const char * prefix = "
"; + static const char * prefix = ""; static const char * suffix = "
"; char *text = info.text; -- libgit2 0.21.2