From 70fe145b4cdfa3f054600e78b41857228d748cf6 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Thu, 18 Jun 2015 14:23:32 +0000 Subject: [PATCH] Incluindo plugin java --- Makefile.in | 6 ++++++ configure.ac | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ pw3270.cbp | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/java/Makefile.in | 23 +++++++++++++++-------- src/java/clipboard.cc | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/java/dialog.cc | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/java/field.cc | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/java/getset.cc | 40 ++++++++++++++++++++++++++++++++++++++++ src/java/jni3270.cbp | 8 ++++++++ src/java/main.cc | 20 ++++++++++++++++++++ src/java/plugin.cc | 221 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/java/terminal.java | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/java/testprogram.java | 3 +++ src/pw3270/Makefile.in | 2 +- ui/80java.xml | 42 ++++++++++++++++++++++++++++++++++++++++++ 15 files changed, 861 insertions(+), 11 deletions(-) create mode 100644 src/java/clipboard.cc create mode 100644 src/java/dialog.cc create mode 100644 src/java/field.cc create mode 100644 ui/80java.xml diff --git a/Makefile.in b/Makefile.in index 691d89c..085bbf7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -136,6 +136,12 @@ $(BINDIR)/Debug/plugins/%@DLLEXT@: src/plugins/%/* $(BINDIR)/Debug/$(PACKAGE_TAR $(BINDIR)/Release/plugins/%@DLLEXT@: src/plugins/%/* $(BINDIR)/Release/$(PACKAGE_TARNAME)$(EXEEXT) @make $(PLUGIN_RELEASE_ARGS) -C $(dir $<) Release +$(BINDIR)/Debug/plugins/j3270@DLLEXT@: src/java/* $(BINDIR)/Debug/$(PACKAGE_TARNAME)$(EXEEXT) + @make BINDIR="../../$(BINDIR)" PW3270_LIBS="-L../../$(BINDIR)/Debug@DLLDIR@ -l3270 -lpw3270" PW3270_CFLAGS="-I../include" -C $(dir $<) Debug + +$(BINDIR)/Release/plugins/j3270@DLLEXT@: src/java/* $(BINDIR)/Release/$(PACKAGE_TARNAME)$(EXEEXT) + @make BINDIR="../../$(BINDIR)" PW3270_LIBS="-L../../$(BINDIR)/Release@DLLDIR@ -l3270 -lpw3270" PW3270_CFLAGS="-I../include" -C $(dir $<) Release + #---[ Release targets ]-------------------------------------------------------- all: Release diff --git a/configure.ac b/configure.ac index 92449ef..3df0feb 100644 --- a/configure.ac +++ b/configure.ac @@ -345,12 +345,67 @@ if test "$app_cv_java" = "yes" ; then AC_PATH_TOOL([JAVADOC], [javadoc], [no], [$JDK_HOME/bin:$JRE_HOME/bin:$PATH]) EXTENSIONS="$EXTENSIONS java" + PLUGINS="$PLUGINS j3270" fi +# Set JVM arch +case $host_cpu in + +x86_64) + jvm_arch=amd64 + ;; + +i?86) + jvm_arch=i386 + ;; + +*) + jvm_arch="$host_cpu" + ;; + +esac + +# JVMDIR +if test "_$JVMDIR" = "_" ; then + + case "$host" in + *-mingw32) + JVMDIR="\$(JRE_HOME)/bin" + ;; + + *-apple-*) + JVMDIR="\$(JRE_HOME)/lib/$jvm_arch/server" + ;; + + *) + JVMDIR="\$(JRE_HOME)/lib/$jvm_arch/server" + esac + +fi + + +# Java link options depends on OS +case "$host" in + *-mingw32) + jvm_libs="-L\$(JVMDIR) -Wl,-rpath,\$(JVMDIR) -ljvm" + ;; + + *-apple-*) + jvm_libs="-L\$(JVMDIR) -Wl,-rpath,\$(JVMDIR) -ljvm" + ;; + + *) + jvm_libs="-L\$(JVMDIR) -Wl,-rpath,\$(JVMDIR) -ljvm" +esac + + +AC_SUBST(JVM_LIBS,$jvm_libs) + AC_SUBST(JAVAC) AC_SUBST(JAVAH) AC_SUBST(JAVADOC) +AC_SUBST(JVMDIR) AC_SUBST(jnidir) AC_SUBST(jvmjardir) AC_SUBST(javadocdir) diff --git a/pw3270.cbp b/pw3270.cbp index ba1b2b0..dcf9f63 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -102,6 +102,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/java/Makefile.in b/src/java/Makefile.in index 737a9ac..05e1086 100644 --- a/src/java/Makefile.in +++ b/src/java/Makefile.in @@ -25,7 +25,7 @@ # PACKAGE_NAME=@PACKAGE_NAME@ -SOURCES=main.cc info.cc connect.cc getset.cc cursor.cc keyboard.cc actions.cc +SOURCES=main.cc info.cc connect.cc getset.cc cursor.cc keyboard.cc actions.cc field.cc dialog.cc clipboard.cc PLUGIN_SRC=plugin.cc #---[ Paths ]------------------------------------------------------------------ @@ -55,6 +55,7 @@ JAR=@JAR@ JAVADOC=@JAVADOC@ JDK_HOME=@JDK_HOME@ JRE_HOME=@JRE_HOME@ +JVMDIR=@JVMDIR@ #---[ Paths ]------------------------------------------------------------------ @@ -78,8 +79,14 @@ include $(CLASSLIBDIR)/class.mak #---[ Build options ]---------------------------------------------------------- CXXFLAGS=@CXXFLAGS@ @DLL_CFLAGS@ @JNI_CPPFLAGS@ -I../include -PLUGIN_CFLAGS=@CXXFLAGS@ @DLL_CFLAGS@ @JNI_CPPFLAGS@ @GTK_CFLAGS@ @GTKMAC_CFLAGS@ -I../include -PLUGINS_LIBS=@GTK_LIBS@ @GTKMAC_LIBS@ + +PW3270_LIBS ?= -L../../.bin/Debug@DLLDIR@ -l3270 -lpw3270 +PW3270_CFLAGS ?= -I../include + +PLUGIN_CFLAGS=@CXXFLAGS@ @DLL_CFLAGS@ @JNI_CPPFLAGS@ -DJNIDIR="\"$(jnidir)\"" \ + -DJARDIR="\"$(jvmjardir)\"" @GTK_CFLAGS@ @GTKMAC_CFLAGS@ $(PW3270_CFLAGS) + +PLUGIN_LIBS=@GTK_LIBS@ @GTKMAC_LIBS@ $(PW3270_LIBS) @JVM_LIBS@ #---[ Rules ]------------------------------------------------------------------ @@ -146,14 +153,14 @@ $(BINRLS)@DLLDIR@/@DLLPREFIX@jni3270@DLLEXT@: \ @echo " LD `basename $@`" @$(MKDIR) `dirname $@` - @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -o $@ $^ $(CLASS_LIBS) + @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -Wl,-soname,`basename $@` -o $@ $^ $(CLASS_LIBS) $(BINRLS)/plugins/j3270@DLLEXT@: \ $(foreach SRC, $(basename $(PLUGIN_SRC)), $(OBJRLS)/j3270/$(SRC)@OBJEXT@) @echo " LD `basename $@`" @$(MKDIR) `dirname $@` - @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -o $@ $^ $(CLASS_LIBS) $(PLUGIN_LIBS) -ljni3270 + @$(CXX) @SYSDLL_FLAGS@ -Wl,--rpath,$(jnidir) $(LDFLAGS) -o $@ $^ $(CLASS_LIBS) $(PLUGIN_LIBS) -L$(BINDBG)@DLLDIR@ -ljni3270 #---[ Debug targets ]---------------------------------------------------------- @@ -167,7 +174,7 @@ $(BINDBG)@DLLDIR@/@DLLPREFIX@jni3270@DLLEXT@: \ @echo " LD `basename $@`" @$(MKDIR) `dirname $@` - @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -o $@ $^ $(CLASS_LIBS) + @$(CXX) @SYSDLL_FLAGS@ $(LDFLAGS) -Wl,-soname,`basename $@` -o $@ $^ $(CLASS_LIBS) $(BINDBG)/plugins/j3270@DLLEXT@: \ $(BINDBG)@DLLDIR@/@DLLPREFIX@jni3270@DLLEXT@ \ @@ -175,10 +182,10 @@ $(BINDBG)/plugins/j3270@DLLEXT@: \ @echo " LD `basename $@`" @$(MKDIR) `dirname $@` - @$(CXX) @SYSDLL_FLAGS@ @DBGRPATH@ $(LDFLAGS) -o $@ $^ $(CLASS_LIBS) $(PLUGIN_LIBS) -L$(BINDBG)@DLLDIR@ -ljni3270 + $(CXX) @SYSDLL_FLAGS@ -Wl,--rpath,.bin/Debug@DLLDIR@ $(LDFLAGS) -Wl,-soname,`basename $@` -o $@ $^ $(CLASS_LIBS) $(PLUGIN_LIBS) -L$(BINDBG)@DLLDIR@ -ljni3270 run: $(BINDBG)@DLLDIR@/@DLLPREFIX@jni3270@DLLEXT@ $(BINDIR)/java/testprogram.class - @LD_LIBRARY_PATH=../../.bin/Debug/lib/ java -Djava.library.path=$(BINDBG)@DLLDIR@ -cp .bin/java/ testprogram + @LD_LIBRARY_PATH=../../.bin/Debug@DLLDIR@/ java -Djava.library.path=$(BINDBG)@DLLDIR@ -cp .bin/java/ testprogram #---[ Misc targets ]----------------------------------------------------------- diff --git a/src/java/clipboard.cc b/src/java/clipboard.cc new file mode 100644 index 0000000..e726e97 --- /dev/null +++ b/src/java/clipboard.cc @@ -0,0 +1,117 @@ +/* + * "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. + * + * 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 dialog.cc e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "jni3270.h" + #include "private.h" + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + +JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1copy(JNIEnv *env, jobject obj, jstring j_str) { + + const char * str = env->GetStringUTFChars(j_str, 0); + jint rc = -1; + + try { + + rc = getHandle(env,obj)->set_copy(str); + + } catch(std::exception &e) { + + env->ReleaseStringUTFChars( j_str, str); + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + return -1; + + } + + env->ReleaseStringUTFChars( j_str, str); + return rc; + +} + +JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1copy(JNIEnv *env, jobject obj) { + + string str; + + try { + + str = getHandle(env,obj)->get_copy(); + + + } catch(std::exception &e) { + + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + + } + + return env->NewStringUTF(str.c_str()); + + +} + +JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1clipboard(JNIEnv *env, jobject obj) { + + string str; + + try { + + str = getHandle(env,obj)->get_clipboard(); + + + } catch(std::exception &e) { + + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + + } + + return env->NewStringUTF(str.c_str()); + +} + +JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1clipboard(JNIEnv *env, jobject obj, jstring j_str) { + + const char * str = env->GetStringUTFChars(j_str, 0); + jint rc = -1; + + try { + + rc = getHandle(env,obj)->set_clipboard(str); + + } catch(std::exception &e) { + + env->ReleaseStringUTFChars( j_str, str); + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + return -1; + + } + + env->ReleaseStringUTFChars( j_str, str); + return rc; + + +} diff --git a/src/java/dialog.cc b/src/java/dialog.cc new file mode 100644 index 0000000..25bb662 --- /dev/null +++ b/src/java/dialog.cc @@ -0,0 +1,91 @@ +/* + * "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. + * + * 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 dialog.cc e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "jni3270.h" + #include "private.h" + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + +JNIEXPORT jint JNICALL Java_pw3270_terminal_popup_1dialog(JNIEnv *env, jobject obj, jint id, jstring j_title, jstring j_message, jstring j_secondary) { + + const char * title = env->GetStringUTFChars(j_title, 0); + const char * message = env->GetStringUTFChars(j_message, 0); + const char * secondary = env->GetStringUTFChars(j_secondary, 0); + jint rc; + + try { + + rc = (jint) getHandle(env,obj)->popup_dialog((LIB3270_NOTIFY) id, title, message, secondary); + + } catch(std::exception &e) { + + env->ReleaseStringUTFChars( j_title, title); + env->ReleaseStringUTFChars( j_message, message); + env->ReleaseStringUTFChars( j_secondary, secondary); + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + + } + + env->ReleaseStringUTFChars( j_title, title); + env->ReleaseStringUTFChars( j_message, message); + env->ReleaseStringUTFChars( j_secondary, secondary); + + return rc; + +} + +JNIEXPORT jstring JNICALL Java_pw3270_terminal_file_1chooser_1dialog(JNIEnv *env, jobject obj, jint action, jstring j_title, jstring j_extension, jstring j_filename) { + + string str; + const char * title = env->GetStringUTFChars(j_title, 0); + const char * extension = env->GetStringUTFChars(j_extension, 0); + const char * filename = env->GetStringUTFChars(j_filename, 0); + jint rc; + + try { + + str = getHandle(env,obj)->file_chooser_dialog((int) action, title, extension, filename); + + } catch(std::exception &e) { + + env->ReleaseStringUTFChars( j_title, title); + env->ReleaseStringUTFChars( j_extension, extension); + env->ReleaseStringUTFChars( j_filename, filename); + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + + } + + env->ReleaseStringUTFChars( j_title, title); + env->ReleaseStringUTFChars( j_extension, extension); + env->ReleaseStringUTFChars( j_filename, filename); + + return env->NewStringUTF(str.c_str()); + + +} diff --git a/src/java/field.cc b/src/java/field.cc new file mode 100644 index 0000000..8e32381 --- /dev/null +++ b/src/java/field.cc @@ -0,0 +1,91 @@ +/* + * "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. + * + * 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 field.cc e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + + #include "jni3270.h" + #include "private.h" + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + +JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1start (JNIEnv *env, jobject obj, jint baddr) { + + jint rc; + + try { + + rc = getHandle(env,obj)->get_field_start((int) baddr); + + + } catch(std::exception &e) { + + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + + } + + return rc; + +} + +JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1len (JNIEnv *env, jobject obj, jint baddr) { + + jint rc; + + try { + + rc = getHandle(env,obj)->get_field_len((int) baddr); + + + } catch(std::exception &e) { + + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + + } + + return rc; + +} + +JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1next_1unprotected(JNIEnv *env, jobject obj, jint baddr) { + + jint rc; + + try { + + rc = getHandle(env,obj)->get_next_unprotected((int) baddr); + + + } catch(std::exception &e) { + + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + + } + + return rc; + + +} diff --git a/src/java/getset.cc b/src/java/getset.cc index a6e9765..313f619 100644 --- a/src/java/getset.cc +++ b/src/java/getset.cc @@ -138,3 +138,43 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_input_1string(JNIEnv *env, jobject o } +JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1connected(JNIEnv *env, jobject obj) { + + jboolean rc = false; + + try { + + rc = getHandle(env,obj)->is_connected(); + + } catch(std::exception &e) { + + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + return rc; + + } + + + return rc; + +} + +JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1ready(JNIEnv *env, jobject obj) { + + jboolean rc = false; + + try { + + rc = getHandle(env,obj)->is_ready(); + + } catch(std::exception &e) { + + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + return rc; + + } + + + return rc; + +} + diff --git a/src/java/jni3270.cbp b/src/java/jni3270.cbp index b14e93d..d3b3bc9 100644 --- a/src/java/jni3270.cbp +++ b/src/java/jni3270.cbp @@ -39,12 +39,20 @@ + + + + + + + + diff --git a/src/java/main.cc b/src/java/main.cc index b8c8e42..341990a 100644 --- a/src/java/main.cc +++ b/src/java/main.cc @@ -121,3 +121,23 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_wait_1for_1ready(JNIEnv *env, jobjec return 0; } + +JNIEXPORT void JNICALL Java_pw3270_terminal_log(JNIEnv *env, jobject obj, jstring j_str) { + + const char * str = env->GetStringUTFChars(j_str, 0); + + try { + + getHandle(env,obj)->log("%s", str); + + } catch(std::exception &e) { + + env->ReleaseStringUTFChars( j_str, str); + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + return; + + } + + env->ReleaseStringUTFChars( j_str, str); + +} diff --git a/src/java/plugin.cc b/src/java/plugin.cc index f8301e0..befe36b 100644 --- a/src/java/plugin.cc +++ b/src/java/plugin.cc @@ -313,7 +313,7 @@ LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window) { - trace("%s",__FUNCTION__); + trace("JAVA: %s",__FUNCTION__); #if GTK_CHECK_VERSION(2,32,0) g_mutex_init(&mutex); #endif // GTK_CHECK_VERSION @@ -326,7 +326,224 @@ #if GTK_CHECK_VERSION(2,32,0) g_mutex_clear(&mutex); #endif // GTK_CHECK_VERSION - trace("%s",__FUNCTION__); + trace("JAVA: %s",__FUNCTION__); return 0; } + void call_java_program(GtkAction *action, GtkWidget *widget, const gchar *filename) + { + +#if GTK_CHECK_VERSION(2,32,0) + if(!g_mutex_trylock(&mutex)) { +#else + if(!g_static_mutex_trylock(&mutex)) { +#endif // GTK_CHECK_VERSION + + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CANCEL, + _( "Can't start %s program" ), "java" ); + + gtk_window_set_title(GTK_WINDOW(dialog),_( "JVM busy" )); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),_( "%s interpreter is busy" ), "java"); + + gtk_dialog_run(GTK_DIALOG (dialog)); + gtk_widget_destroy(dialog); + + return; + } + + v3270_set_script(widget,'J',TRUE); + + // Start JNI + JavaVMInitArgs vm_args; + JavaVMOption options[5]; + + JavaVM * jvm = NULL; + JNIEnv * env = NULL; + jint rc = 0; + + memset(&vm_args,0,sizeof(vm_args)); + memset(options,0,sizeof(options)); + + vm_args.version = JNI_VERSION_1_2; + vm_args.nOptions = 0; + vm_args.options = options; + +#ifdef DEBUG + options[vm_args.nOptions++].optionString = g_strdup("-verbose"); +#endif + + gchar * dirname = g_path_get_dirname(filename); + +#if defined( WIN32 ) + + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s","."); + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=.;%s",dirname); + +#else + + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR); + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s:%s",JARDIR,dirname); + +#endif // JNIDIR + + g_free(dirname); + + rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args); + + // Release options + for(size_t f=0;fFindClass(classname); + + if(cls == 0) { + + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CANCEL, + _( "Can't find class %s" ), classname ); + + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java script failure" )); + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) + gtk_main_quit(); + gtk_widget_destroy(dialog); + + } else { + + jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V"); + + if(mid == 0) { + + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK_CANCEL, + _( "Can't find class \"%s\"" ), classname ); + + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java script failure" )); + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) + gtk_main_quit(); + gtk_widget_destroy(dialog); + + } else { + + jobjectArray args = env->NewObjectArray(0, env->FindClass("java/lang/String"), env->NewStringUTF("")); + + env->CallStaticVoidMethod(cls, mid, args); + + } + + } + + g_free(classname); + + + jvm->DestroyJavaVM(); + } + + // And release + v3270_set_script(widget,'J',FALSE); + +#if GTK_CHECK_VERSION(2,32,0) + g_mutex_unlock(&mutex); +#else + g_static_mutex_unlock(&mutex); +#endif // GTK_CHECK_VERSION + + + } + + +extern "C" +{ + LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget) + { + gchar *filename = (gchar *) g_object_get_data(G_OBJECT(action),"src"); + + lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p",gtk_action_get_name(action),widget); + +#if GTK_CHECK_VERSION(3,10,0) + g_simple_action_set_enabled(G_SIMPLE_ACTION(action),FALSE); +#else + gtk_action_set_sensitive(action,FALSE); +#endif // GTK(3,10) + + if(filename) + { + // Has filename, call it directly + call_java_program(action,widget,filename); + } + else + { + // No filename, ask user + static const struct _list + { + const gchar *name; + const gchar *pattern; + } list[] = + { + { N_( "Java class file" ), "*.class" } + }; + + GtkFileFilter * filter[G_N_ELEMENTS(list)+1]; + unsigned int f; + + memset(filter,0,sizeof(filter)); + + for(f=0;f + + 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., 51 Franklin + St, Fifth Floor, Boston, MA 02110-1301 USA + + + Contatos: + + perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + licinio@bb.com.br (Licínio Luis Branco) + kraucer@bb.com.br (Kraucer Fernandes Mazuco) + +------------------------------------------------------------------------------> + + + + + + + + + + + + -- libgit2 0.21.2