Commit a3c6efb539d7d82d4b0eb2d109096aca82b45174

Authored by Perry Werneck
1 parent 958b8c48
Exists in master

Reimplementando módulo JNI

configure.ac
... ... @@ -249,6 +249,7 @@ else
249 249  
250 250 fi
251 251  
  252 +CXXFLAGS="$CXXFLAGS -I$JDK_HOME/include -I$jniinc"
252 253  
253 254 AC_SUBST(JVM_LIBS,$jvm_libs)
254 255  
... ... @@ -263,7 +264,6 @@ AC_SUBST(JAR)
263 264 AC_SUBST(jvm_arch)
264 265 AC_SUBST(JDK_HOME)
265 266 AC_SUBST(JRE_HOME)
266   -AC_SUBST(JNI_CPPFLAGS,"-I$JDK_HOME/include -I$jniinc")
267 267  
268 268  
269 269 dnl ---------------------------------------------------------------------------
... ... @@ -408,7 +408,7 @@ AC_ARG_ENABLE([pic],
408 408 ])
409 409  
410 410 if test "$app_cv_pic" == "yes"; then
411   - CFLAGS="$CFLAGS -fPIC"
  411 + CXXFLAGS="$CXXFLAGS -fPIC"
412 412 fi
413 413  
414 414 dnl ---------------------------------------------------------------------------
... ...
pw3270-java.cbp 0 → 100644
... ... @@ -0,0 +1,59 @@
  1 +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
  2 +<CodeBlocks_project_file>
  3 + <FileVersion major="1" minor="6" />
  4 + <Project>
  5 + <Option title="JNI module for pw3270/lib3270" />
  6 + <Option pch_mode="2" />
  7 + <Option compiler="gcc" />
  8 + <Build>
  9 + <Target title="Debug">
  10 + <Option output=".bin/Debug/JNI module for pw3270/lib3270" prefix_auto="1" extension_auto="1" />
  11 + <Option object_output=".obj/Debug/" />
  12 + <Option type="1" />
  13 + <Option compiler="gcc" />
  14 + <Compiler>
  15 + <Add option="-g" />
  16 + </Compiler>
  17 + </Target>
  18 + <Target title="Release">
  19 + <Option output=".bin/Release/JNI module for pw3270/lib3270" prefix_auto="1" extension_auto="1" />
  20 + <Option object_output=".obj/Release/" />
  21 + <Option type="1" />
  22 + <Option compiler="gcc" />
  23 + <Compiler>
  24 + <Add option="-O2" />
  25 + </Compiler>
  26 + <Linker>
  27 + <Add option="-s" />
  28 + </Linker>
  29 + </Target>
  30 + </Build>
  31 + <Compiler>
  32 + <Add option="-Wall" />
  33 + </Compiler>
  34 + <Unit filename="src/include/config.h" />
  35 + <Unit filename="src/jni/Makefile.in" />
  36 + <Unit filename="src/jni/actions.cc" />
  37 + <Unit filename="src/jni/call.cc" />
  38 + <Unit filename="src/jni/clipboard.cc" />
  39 + <Unit filename="src/jni/connect.cc" />
  40 + <Unit filename="src/jni/cursor.cc" />
  41 + <Unit filename="src/jni/dialog.cc" />
  42 + <Unit filename="src/jni/field.cc" />
  43 + <Unit filename="src/jni/getset.cc" />
  44 + <Unit filename="src/jni/info.cc" />
  45 + <Unit filename="src/jni/jni3270.h" />
  46 + <Unit filename="src/jni/keyboard.cc" />
  47 + <Unit filename="src/jni/main.cc" />
  48 + <Unit filename="src/jni/private.h" />
  49 + <Unit filename="src/jni/startstop.cc" />
  50 + <Unit filename="src/plugin/plugin.cc" />
  51 + <Unit filename="src/terminal.java" />
  52 + <Extensions>
  53 + <code_completion />
  54 + <envvars />
  55 + <debugger />
  56 + <lib_finder disable_auto="1" />
  57 + </Extensions>
  58 + </Project>
  59 +</CodeBlocks_project_file>
... ...
src/jni/Makefile.in
... ... @@ -25,9 +25,9 @@
25 25 #
26 26  
27 27 SOURCES=actions.cc clipboard.cc cursor.cc field.cc info.cc main.cc \
28   - call.cc connect.cc dialog.cc getset.cc keyboard.cc startstop.cc
  28 + connect.cc dialog.cc getset.cc keyboard.cc
29 29  
30   -LIBNAME=lib3270-java@DLLEXT@
  30 +LIBNAME=jni3270@DLLEXT@
31 31  
32 32 #---[ Configuration values ]-------------------------------------------------------------
33 33  
... ... @@ -68,7 +68,7 @@ JAVAH=@JAVAH@
68 68 JAVAC=@JAVAC@
69 69  
70 70 LIBS=-lpw3270cpp @LIBS@ @LIBICONV@
71   -CXXFLAGS=@CXXFLAGS@ @JNI_CPPFLAGS@
  71 +CXXFLAGS=@CXXFLAGS@
72 72 LDFLAGS=@LDFLAGS@
73 73  
74 74 #---[ Rules ]----------------------------------------------------------------------------
... ... @@ -82,7 +82,7 @@ $(OBJDBG)/%.o: \
82 82  
83 83 @echo $< ...
84 84 @$(MKDIR) `dirname $@`
85   - @$(CXX) $(CFLAGS) -fstack-check -DDEBUG=1 \
  85 + @$(CXX) $(CXXFLAGS) -fstack-check -DDEBUG=1 \
86 86 -DBUILD_DATE=`date +"0x%Y%m%d"`\
87 87 -g -o $@ -c $<
88 88  
... ... @@ -93,7 +93,7 @@ $(OBJRLS)/%.o: \
93 93  
94 94 @echo $< ...
95 95 @$(MKDIR) `dirname $@`
96   - @$(CXX) $(CFLAGS) -DNDEBUG=1 \
  96 + @$(CXX) $(CXXFLAGS) -DNDEBUG=1 \
97 97 -DBUILD_DATE=`date +"0x%Y%m%d"` \
98 98 -o $@ -c $<
99 99  
... ... @@ -125,3 +125,8 @@ $(BINDBG)/$(LIBNAME): \
125 125 @$(MKDIR) `dirname $@`
126 126 @$(LD) -shared -Wl,-soname,$(notdir $@) $(LDFLAGS) -o $@ $^ $(LIBS)
127 127  
  128 +clean:
  129 +
  130 + @rm -f jni3270.h
  131 + @rm -fr $(BINDIR)/java
  132 +
... ...
src/jni/actions.cc
... ... @@ -27,8 +27,7 @@
27 27 *
28 28 */
29 29  
30   - #include "jni3270.h"
31   - #include "private.h"
  30 +#include "private.h"
32 31  
33 32 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 33  
... ... @@ -40,7 +39,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_quit(JNIEnv *env, jobject obj) {
40 39  
41 40 try {
42 41  
43   - rc = java::getHandle(env,obj)->quit();
  42 + rc = getHandle(env,obj)->quit();
44 43  
45 44 } catch(std::exception &e) {
46 45  
... ... @@ -59,7 +58,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase_1eof(JNIEnv *env, jobject obj)
59 58  
60 59 try {
61 60  
62   - rc = java::getHandle(env,obj)->erase_eof();
  61 + rc = getHandle(env,obj)->erase_eof();
63 62  
64 63 } catch(std::exception &e) {
65 64  
... ... @@ -78,7 +77,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase(JNIEnv *env, jobject obj) {
78 77  
79 78 try {
80 79  
81   - rc = java::getHandle(env,obj)->erase();
  80 + rc = getHandle(env,obj)->erase();
82 81  
83 82 } catch(std::exception &e) {
84 83  
... ... @@ -96,7 +95,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase_1eol(JNIEnv *env, jobject obj)
96 95  
97 96 try {
98 97  
99   - rc = java::getHandle(env,obj)->erase_eol();
  98 + rc = getHandle(env,obj)->erase_eol();
100 99  
101 100 } catch(std::exception &e) {
102 101  
... ... @@ -115,7 +114,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase_1input(JNIEnv *env, jobject ob
115 114  
116 115 try {
117 116  
118   - rc = java::getHandle(env,obj)->erase_input();
  117 + rc = getHandle(env,obj)->erase_input();
119 118  
120 119 } catch(std::exception &e) {
121 120  
... ... @@ -135,7 +134,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_print(JNIEnv *env, jobject obj) {
135 134  
136 135 try {
137 136  
138   - rc = java::getHandle(env,obj)->print();
  137 + rc = getHandle(env,obj)->print();
139 138  
140 139 } catch(std::exception &e) {
141 140  
... ... @@ -155,7 +154,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_action(JNIEnv *env, jobject obj, jst
155 154  
156 155 try {
157 156  
158   - rc = java::getHandle(env,obj)->action(name);
  157 + rc = getHandle(env,obj)->action(name);
159 158  
160 159 } catch(std::exception &e) {
161 160  
... ...
src/jni/call.cc
... ... @@ -1,165 +0,0 @@
1   -/*
2   - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
3   - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
4   - * aplicativos mainframe. Registro no INPI sob o nome G3270.
5   - *
6   - * Copyright (C) <2008> <Banco do Brasil S.A.>
7   - *
8   - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
9   - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
10   - * Free Software Foundation.
11   - *
12   - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
13   - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
14   - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
15   - * obter mais detalhes.
16   - *
17   - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
18   - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
19   - * Place, Suite 330, Boston, MA, 02111-1307, USA
20   - *
21   - * Este programa está nomeado como call.cc e possui - linhas de código.
22   - *
23   - * Contatos:
24   - *
25   - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
26   - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
27   - *
28   - */
29   -
30   -
31   - #include "private.h"
32   - #include <v3270.h>
33   - #include <lib3270/trace.h>
34   - #include <lib3270/log.h>
35   -
36   -
37   -/*---[ Implement ]----------------------------------------------------------------------------------*/
38   -
39   -namespace PW3270_NAMESPACE {
40   -
41   -
42   - void java::call(GtkWidget *widget, const char *classname) {
43   -
44   - debug("%s(%s)",__FUNCTION__,classname);
45   -
46   - if(!trylock()) {
47   -
48   - failed(widget, _( "Can't access java virtual machine" ), "%s", strerror(EBUSY));
49   - return;
50   -
51   - }
52   -
53   - if(jvm || load_jvm(widget)) {
54   -
55   - v3270_set_script(widget,'J',TRUE);
56   -
57   - try {
58   -
59   - jclass cls;
60   - jmethodID mid;
61   -
62   - /*
63   -
64   - DONT WORK!!
65   - http://stackoverflow.com/questions/271506/why-cant-system-setproperty-change-the-classpath-at-runtime
66   -
67   - // Atualizar o classpath
68   - cls = env->FindClass("java/lang/System");
69   - if(!cls) {
70   - throw exception( _( "Can't find class %s" ), "java/lang/System");
71   - }
72   -
73   - mid = env->GetStaticMethodID(cls, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
74   - if(!mid) {
75   - throw exception( _( "Can't find method %s/%s" ), "java/lang/System","setProperty");
76   - }
77   -
78   - lib3270_trace_event(v3270_get_session(widget),"java.class.path=%s\n",classpath);
79   -
80   - jstring name = env->NewStringUTF("java.class.path");
81   - jstring path = env->NewStringUTF(classpath);
82   -
83   - jstring rc = (jstring) env->CallObjectMethod(cls,mid,name,path);
84   -
85   - env->DeleteLocalRef(name);
86   - env->DeleteLocalRef(path);
87   - env->DeleteLocalRef(rc);
88   - */
89   -
90   - // Get application entry point.
91   - cls = env->FindClass(classname);
92   - if(!cls) {
93   - throw exception( _( "Can't find class %s" ), classname);
94   - }
95   -
96   - mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
97   - if(!mid) {
98   - throw exception( _( "Can't find method %s/%s" ), classname, "main");
99   - }
100   -
101   - // Build arguments
102   - jobjectArray args = env->NewObjectArray(0, env->FindClass("java/lang/String"), env->NewStringUTF(""));
103   -
104   - // Call main()
105   - env->CallStaticVoidMethod(cls, mid, args);
106   -
107   - // Check for exception
108   - jthrowable exc = env->ExceptionOccurred();
109   - env->ExceptionClear();
110   -
111   - if (exc) {
112   - jclass throwable_class = env->FindClass("java/lang/Throwable");
113   -
114   - jmethodID jni_getMessage = env->GetMethodID(throwable_class,"getMessage","()Ljava/lang/String;");
115   - jstring j_msg = (jstring) env->CallObjectMethod(exc,jni_getMessage);
116   -
117   - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
118   - GTK_DIALOG_DESTROY_WITH_PARENT,
119   - GTK_MESSAGE_ERROR,
120   - GTK_BUTTONS_OK_CANCEL,
121   - _( "Java application \"%s\" has failed." ), classname );
122   -
123   - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" ));
124   -
125   - if(!env->IsSameObject(j_msg,NULL)) {
126   -
127   - const char * msg = env->GetStringUTFChars(j_msg, 0);
128   -
129   - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",msg);
130   -
131   - env->ReleaseStringUTFChars( j_msg, msg);
132   - }
133   -
134   - if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
135   - gtk_main_quit();
136   - gtk_widget_destroy(dialog);
137   -
138   -
139   - }
140   -
141   - // And finish
142   - env->DeleteLocalRef(args);
143   -
144   - } catch(std::exception &e) {
145   -
146   - failed(widget,_("Can't start java application"),"%s", e.what());
147   -
148   - }
149   -
150   -/*
151   - g_free(dirname);
152   - g_free(classname);
153   - g_free(classpath);
154   -*/
155   -
156   - v3270_set_script(widget,'J',FALSE);
157   -
158   - }
159   -
160   - unlock();
161   -
162   -
163   - }
164   -
165   -}
src/jni/clipboard.cc
... ... @@ -33,7 +33,6 @@
33 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34  
35 35 using namespace std;
36   -using namespace PW3270_NAMESPACE::java;
37 36  
38 37 JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1copy(JNIEnv *env, jobject obj, jstring j_str) {
39 38  
... ...
src/jni/connect.cc
... ... @@ -41,7 +41,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_connect(JNIEnv *env, jobject obj, js
41 41  
42 42 try {
43 43  
44   - rc = java::getHandle(env,obj)->connect(host,(time_t) seconds);
  44 + rc = getHandle(env,obj)->connect(host,(time_t) seconds);
45 45  
46 46 } catch(std::exception &e) {
47 47  
... ... @@ -60,7 +60,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_disconnect(JNIEnv *env, jobject obj)
60 60  
61 61 try {
62 62  
63   - return (jint) java::getHandle(env,obj)->disconnect();
  63 + return (jint) getHandle(env,obj)->disconnect();
64 64  
65 65 } catch(std::exception &e) {
66 66  
... ...
src/jni/cursor.cc
... ... @@ -40,7 +40,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1cursor_1position(JNIEnv *env, j
40 40  
41 41 try {
42 42  
43   - rc = java::getHandle(env,obj)->set_cursor_position((int) row, (int) col);
  43 + rc = getHandle(env,obj)->set_cursor_position((int) row, (int) col);
44 44  
45 45 } catch(std::exception &e) {
46 46  
... ... @@ -59,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1cursor_1addr(JNIEnv *env, jobje
59 59  
60 60 try {
61 61  
62   - rc = java::getHandle(env,obj)->set_cursor_addr((int) addr);
  62 + rc = getHandle(env,obj)->set_cursor_addr((int) addr);
63 63  
64 64 } catch(std::exception &e) {
65 65  
... ... @@ -79,7 +79,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1cursor_1addr(JNIEnv *env, jobje
79 79  
80 80 try {
81 81  
82   - rc = java::getHandle(env,obj)->get_cursor_addr();
  82 + rc = getHandle(env,obj)->get_cursor_addr();
83 83  
84 84 } catch(std::exception &e) {
85 85  
... ...
src/jni/dialog.cc
... ... @@ -43,7 +43,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_popup_1dialog(JNIEnv *env, jobject o
43 43  
44 44 try {
45 45  
46   - rc = (jint) java::getHandle(env,obj)->popup_dialog((LIB3270_NOTIFY) id, title, message, secondary);
  46 + rc = (jint) getHandle(env,obj)->popup_dialog((LIB3270_NOTIFY) id, title, message, secondary);
47 47  
48 48 } catch(std::exception &e) {
49 49  
... ... @@ -71,7 +71,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_file_1chooser_1dialog(JNIEnv *env
71 71  
72 72 try {
73 73  
74   - str = java::getHandle(env,obj)->file_chooser_dialog((int) action, title, extension, filename);
  74 + str = getHandle(env,obj)->file_chooser_dialog((int) action, title, extension, filename);
75 75  
76 76 } catch(std::exception &e) {
77 77  
... ...
src/jni/field.cc
... ... @@ -40,7 +40,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1start (JNIEnv *env, jobj
40 40  
41 41 try {
42 42  
43   - rc = java::getHandle(env,obj)->get_field_start((int) baddr);
  43 + rc = getHandle(env,obj)->get_field_start((int) baddr);
44 44  
45 45  
46 46 } catch(std::exception &e) {
... ... @@ -59,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1len (JNIEnv *env, jobjec
59 59  
60 60 try {
61 61  
62   - rc = java::getHandle(env,obj)->get_field_len((int) baddr);
  62 + rc = getHandle(env,obj)->get_field_len((int) baddr);
63 63  
64 64  
65 65 } catch(std::exception &e) {
... ... @@ -78,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1next_1unprotected(JNIEnv *env,
78 78  
79 79 try {
80 80  
81   - rc = java::getHandle(env,obj)->get_next_unprotected((int) baddr);
  81 + rc = getHandle(env,obj)->get_next_unprotected((int) baddr);
82 82  
83 83  
84 84 } catch(std::exception &e) {
... ... @@ -98,7 +98,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1is_1protected(JNIEnv *env, jobj
98 98  
99 99 try {
100 100  
101   - rc = java::getHandle(env,obj)->get_is_protected((int) baddr);
  101 + rc = getHandle(env,obj)->get_is_protected((int) baddr);
102 102  
103 103  
104 104 } catch(std::exception &e) {
... ... @@ -118,7 +118,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1is_1protected_1at(JNIEnv *env,
118 118  
119 119 try {
120 120  
121   - rc = java::getHandle(env,obj)->get_is_protected_at((int) row, (int) col);
  121 + rc = getHandle(env,obj)->get_is_protected_at((int) row, (int) col);
122 122  
123 123 } catch(std::exception &e) {
124 124  
... ...
src/jni/getset.cc
... ... @@ -41,7 +41,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_toString(JNIEnv *env, jobject obj
41 41  
42 42 try {
43 43  
44   - str = java::getHandle(env,obj)->get_string();
  44 + str = getHandle(env,obj)->get_string();
45 45  
46 46 } catch(std::exception &e) {
47 47  
... ... @@ -59,7 +59,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string(JNIEnv *env, jobject
59 59  
60 60 try {
61 61  
62   - str = java::getHandle(env,obj)->get_string((int) baddr, (int) len);
  62 + str = getHandle(env,obj)->get_string((int) baddr, (int) len);
63 63  
64 64  
65 65 } catch(std::exception &e) {
... ... @@ -78,7 +78,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string_1at(JNIEnv *env, jobj
78 78  
79 79 try {
80 80  
81   - str = java::getHandle(env,obj)->get_string_at((int) row, (int) col, (int) sz);
  81 + str = getHandle(env,obj)->get_string_at((int) row, (int) col, (int) sz);
82 82  
83 83  
84 84 } catch(std::exception &e) {
... ... @@ -98,7 +98,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1string_1at(JNIEnv *env, jobject
98 98  
99 99 try {
100 100  
101   - rc = java::getHandle(env,obj)->set_string_at((int) row, (int) col, str);
  101 + rc = getHandle(env,obj)->set_string_at((int) row, (int) col, str);
102 102  
103 103 } catch(std::exception &e) {
104 104  
... ... @@ -121,7 +121,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_cmp_1string_1at(JNIEnv *env, jobject
121 121  
122 122 try {
123 123  
124   - rc = java::getHandle(env,obj)->cmp_string_at((int) row, (int) col, str);
  124 + rc = getHandle(env,obj)->cmp_string_at((int) row, (int) col, str);
125 125  
126 126 } catch(std::exception &e) {
127 127  
... ... @@ -145,7 +145,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_wait_1for_1string_1at(JNIEnv *env, j
145 145  
146 146 try {
147 147  
148   - rc = java::getHandle(env,obj)->wait_for_string_at((int) row, (int) col, str, timeout);
  148 + rc = getHandle(env,obj)->wait_for_string_at((int) row, (int) col, str, timeout);
149 149  
150 150 } catch(std::exception &e) {
151 151  
... ... @@ -168,7 +168,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_input_1string(JNIEnv *env, jobject o
168 168  
169 169 try {
170 170  
171   - rc = java::getHandle(env,obj)->input_string(str);
  171 + rc = getHandle(env,obj)->input_string(str);
172 172  
173 173 } catch(std::exception &e) {
174 174  
... ... @@ -189,7 +189,7 @@ JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1connected(JNIEnv *env, jobje
189 189  
190 190 try {
191 191  
192   - rc = java::getHandle(env,obj)->is_connected();
  192 + rc = getHandle(env,obj)->is_connected();
193 193  
194 194 } catch(std::exception &e) {
195 195  
... ... @@ -209,7 +209,7 @@ JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1ready(JNIEnv *env, jobject o
209 209  
210 210 try {
211 211  
212   - rc = java::getHandle(env,obj)->is_ready();
  212 + rc = getHandle(env,obj)->is_ready();
213 213  
214 214 } catch(std::exception &e) {
215 215  
... ... @@ -226,7 +226,7 @@ JNIEXPORT void JNICALL Java_pw3270_terminal_set_1unlock_1delay(JNIEnv *env, jobj
226 226  
227 227 try {
228 228  
229   - java::getHandle(env,obj)->set_unlock_delay((unsigned short) ms);
  229 + getHandle(env,obj)->set_unlock_delay((unsigned short) ms);
230 230  
231 231 } catch(std::exception &e) {
232 232  
... ...
src/jni/info.cc
... ... @@ -37,21 +37,21 @@ using namespace PW3270_NAMESPACE;
37 37  
38 38 JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1version (JNIEnv *env, jobject obj) {
39 39  
40   - session *s = java::getHandle(env,obj);
  40 + session *s = getHandle(env,obj);
41 41 return env->NewStringUTF(s->get_version().c_str());
42 42  
43 43 }
44 44  
45 45 JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1revision(JNIEnv *env, jobject obj) {
46 46  
47   - session *s = java::getHandle(env,obj);
  47 + session *s = getHandle(env,obj);
48 48 return env->NewStringUTF(s->get_revision().c_str());
49 49  
50 50 }
51 51  
52 52 JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1encoding(JNIEnv *env, jobject obj) {
53 53  
54   - session *s = java::getHandle(env,obj);
  54 + session *s = getHandle(env,obj);
55 55 return env->NewStringUTF(s->get_encoding());
56 56  
57 57 }
... ... @@ -62,7 +62,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1secure(JNIEnv *env, jobject obj
62 62  
63 63 try {
64 64  
65   - rc = java::getHandle(env,obj)->get_secure();
  65 + rc = getHandle(env,obj)->get_secure();
66 66  
67 67 } catch(std::exception &e) {
68 68  
... ...
src/jni/keyboard.cc
... ... @@ -40,7 +40,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_enter(JNIEnv *env, jobject obj) {
40 40  
41 41 try {
42 42  
43   - rc = java::getHandle(env,obj)->enter();
  43 + rc = getHandle(env,obj)->enter();
44 44  
45 45 } catch(std::exception &e) {
46 46  
... ... @@ -59,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_pfkey(JNIEnv *env, jobject obj, jint
59 59  
60 60 try {
61 61  
62   - rc = java::getHandle(env,obj)->pfkey((int) key);
  62 + rc = getHandle(env,obj)->pfkey((int) key);
63 63  
64 64 } catch(std::exception &e) {
65 65  
... ... @@ -78,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_pakey(JNIEnv *env, jobject obj, jint
78 78  
79 79 try {
80 80  
81   - rc = java::getHandle(env,obj)->pakey((int) key);
  81 + rc = getHandle(env,obj)->pakey((int) key);
82 82  
83 83 } catch(std::exception &e) {
84 84  
... ...
src/jni/main.cc
... ... @@ -30,25 +30,21 @@
30 30 #include "jni3270.h"
31 31 #include "private.h"
32 32  
33   -/*---[ Implement ]----------------------------------------------------------------------------------*/
34   -
35   -namespace PW3270_NAMESPACE {
  33 + using namespace PW3270_NAMESPACE;
36 34  
37   - jfieldID java::getHandleField(JNIEnv *env, jobject obj) {
38   - jclass c = env->GetObjectClass(obj);
39   - // J is the type signature for long:
40   - return env->GetFieldID(c, "nativeHandle", "J");
41   - }
42 35  
43   - session * java::getHandle(JNIEnv *env, jobject obj) {
44   - jlong handle = env->GetLongField(obj, getHandleField(env, obj));
45   - return reinterpret_cast<PW3270_NAMESPACE::session *>(handle);
46   - }
  36 +/*---[ Implement ]----------------------------------------------------------------------------------*/
47 37  
  38 +jfieldID getHandleField(JNIEnv *env, jobject obj) {
  39 + jclass c = env->GetObjectClass(obj);
  40 + // J is the type signature for long:
  41 + return env->GetFieldID(c, "nativeHandle", "J");
48 42 }
49 43  
50   -using namespace PW3270_NAMESPACE;
51   -using namespace PW3270_NAMESPACE::java;
  44 +PW3270_NAMESPACE::session * getHandle(JNIEnv *env, jobject obj) {
  45 + jlong handle = env->GetLongField(obj, getHandleField(env, obj));
  46 + return reinterpret_cast<PW3270_NAMESPACE::session *>(handle);
  47 +}
52 48  
53 49 JNIEXPORT jint JNICALL Java_pw3270_terminal_init__(JNIEnv *env, jobject obj) {
54 50  
... ...
src/jni/private.h 0 → 100644
... ... @@ -0,0 +1,41 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
  19 + * Place, Suite 330, Boston, MA, 02111-1307, USA
  20 + *
  21 + * Este programa está nomeado como private.h e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 + #ifndef PRIVATE_H_INCLUDED
  31 +
  32 + #define PRIVATE_H_INCLUDED
  33 +
  34 + #include <pw3270cpp.h>
  35 + #include <jni.h>
  36 + #include "jni3270.h"
  37 +
  38 + extern PW3270_NAMESPACE::session * getHandle(JNIEnv *env, jobject obj);
  39 + extern jfieldID getHandleField(JNIEnv *env, jobject obj);
  40 +
  41 +#endif // PRIVATE_H_INCLUDED
... ...
src/jni/startstop.cc
... ... @@ -1,419 +0,0 @@
1   -/*
2   - * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
3   - * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
4   - * aplicativos mainframe. Registro no INPI sob o nome G3270.
5   - *
6   - * Copyright (C) <2008> <Banco do Brasil S.A.>
7   - *
8   - * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
9   - * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
10   - * Free Software Foundation.
11   - *
12   - * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
13   - * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
14   - * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
15   - * obter mais detalhes.
16   - *
17   - * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
18   - * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
19   - * Place, Suite 330, Boston, MA, 02111-1307, USA
20   - *
21   - * Este programa está nomeado como startstop.cc e possui - linhas de código.
22   - *
23   - * Contatos:
24   - *
25   - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
26   - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
27   - *
28   - */
29   -
30   -#if defined WIN32
31   -
32   - // http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
33   - #ifndef LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
34   - #define LOAD_LIBRARY_SEARCH_DEFAULT_DIRS 0x00001000
35   - #endif // LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
36   -
37   - #ifndef LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR
38   - #define LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR 0x00000100
39   - #endif // LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR
40   -
41   - #include <windows.h>
42   -
43   -#else
44   -
45   - #include <dlfcn.h>
46   -
47   -#endif
48   -
49   - #include "private.h"
50   -
51   - #include <pw3270.h>
52   - #include <pw3270/plugin.h>
53   - #include <v3270.h>
54   - #include <lib3270/actions.h>
55   - #include <lib3270/log.h>
56   - #include <lib3270/trace.h>
57   - #include <lib3270/charset.h>
58   - #include <pw3270/class.h>
59   - #include <pw3270/trace.h>
60   -
61   -/*---[ Implement ]----------------------------------------------------------------------------------*/
62   -
63   -using namespace PW3270_NAMESPACE::java;
64   -
65   -extern "C" {
66   -
67   - static void trace_cleanup(GtkWidget *widget, GtkWidget **window) {
68   - *window = NULL;
69   - }
70   -
71   - static jint JNICALL jni_vfprintf(FILE *fp, const char *fmt, va_list args) {
72   -
73   - char * msg = NULL;
74   - static GtkWidget * trace = NULL;
75   -
76   - if(vasprintf(&msg,fmt,args) < 1) {
77   - lib3270_write_log(lib3270_get_default_session_handle(),"java","vasprintf() error on \"%s\"",fmt);
78   - return 0;
79   - }
80   -
81   - fprintf(fp,"%s",msg);
82   - lib3270_write_log(lib3270_get_default_session_handle(),"java","%s",msg);
83   -
84   - if(!trace) {
85   - // Cria janela de trace.
86   - trace = pw3270_trace_new();
87   - g_signal_connect(G_OBJECT(trace), "destroy",G_CALLBACK(trace_cleanup), &trace);
88   -
89   - pw3270_trace_set_destroy_on_close(trace,TRUE);
90   -
91   - // gtk_window_set_transient_for(GTK_WINDOW(trace),GTK_WINDOW(gtk_widget_get_toplevel(widget)));
92   - gtk_window_set_destroy_with_parent(GTK_WINDOW(trace),TRUE);
93   -
94   - gtk_window_set_default_size(GTK_WINDOW(trace),590,430);
95   - gtk_widget_show_all(trace);
96   -
97   - pw3270_trace_printf(trace,"%s",msg);
98   -
99   - free(msg);
100   - }
101   -
102   - return 0;
103   - }
104   -
105   - LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget) {
106   -
107   - gchar *classname = (gchar *) g_object_get_data(G_OBJECT(action),"src");
108   -
109   - lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p\n",gtk_action_get_name(action),widget);
110   -
111   - if(classname)
112   - {
113   - // Has filename, call it directly
114   - call(widget,classname);
115   - }
116   - else
117   - {
118   -/*
119   - // No classname, ask user
120   - filename = pw3270_file_chooser(GTK_FILE_CHOOSER_ACTION_OPEN, "java", _( "Select script to run" ), "", "class");
121   -
122   - if(filename)
123   - {
124   - call(widget,filename);
125   - g_free(filename);
126   - }
127   -*/
128   - }
129   -
130   - }
131   - }
132   -
133   -
134   - namespace PW3270_NAMESPACE {
135   -
136   - JavaVM * java::jvm = NULL;
137   - JNIEnv * java::env = NULL;
138   -#ifdef _WIN32
139   - HMODULE java::hModule = NULL;
140   -#endif // _WIN32
141   -
142   - void java::failed(GtkWidget *widget, const char *msg, const char *format, ...) {
143   -
144   - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
145   - GTK_DIALOG_DESTROY_WITH_PARENT,
146   - GTK_MESSAGE_ERROR,
147   - GTK_BUTTONS_OK_CANCEL,
148   - "%s", msg );
149   -
150   - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" ));
151   -
152   - if(format) {
153   -
154   - va_list arg_ptr;
155   - va_start(arg_ptr, format);
156   - gchar *msg = g_strdup_vprintf(format,arg_ptr);
157   - va_end(arg_ptr);
158   - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",msg);
159   - g_free(msg);
160   -
161   - }
162   -
163   - if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
164   - gtk_main_quit();
165   - gtk_widget_destroy(dialog);
166   -
167   - }
168   -
169   -
170   -#ifdef WIN32
171   -
172   - bool java::load_jvm(GtkWidget *widget) {
173   -
174   - if(jvm != NULL) {
175   - return true;
176   - }
177   -
178   - // Dynamically load jvm library to avoid naming and path problems.
179   - HMODULE kernel;
180   - HANDLE WINAPI (*AddDllDirectory)(PCWSTR NewDirectory);
181   - BOOL WINAPI (*RemoveDllDirectory)(HANDLE Cookie);
182   -
183   - struct _dlldir {
184   - const gchar * env;
185   - const gchar * path;
186   - HANDLE cookie;
187   - } dlldir[] = {
188   - { "JRE_HOME", "bin\\client", 0 },
189   - { "JDK_HOME", "jre\\bin\\client", 0 }
190   - };
191   -
192   - kernel = LoadLibrary("kernel32.dll");
193   -
194   - if(kernel) {
195   -
196   - AddDllDirectory = (HANDLE WINAPI (*)(PCWSTR)) GetProcAddress(kernel,"AddDllDirectory");
197   - if(AddDllDirectory) {
198   -
199   - // Acrescenta mais caminhos para achar a dll
200   - for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) {
201   -
202   - const char *env = getenv(dlldir[f].env);
203   -
204   - debug("%s=\"%s\"",dlldir[f].env,env);
205   -
206   - if(env) {
207   -
208   - gchar *p = g_build_filename(env,dlldir[f].path,NULL);
209   -
210   - lib3270_trace_event(v3270_get_session(widget),"Adding \"%s\" to DLL search path",p);
211   -
212   - wchar_t *path = (wchar_t *) malloc(4096*sizeof(wchar_t));
213   - mbstowcs(path, p, 4095);
214   - dlldir[f].cookie = AddDllDirectory(path);
215   - free(path);
216   -
217   - g_free(p);
218   -
219   - }
220   - }
221   -
222   - } else {
223   -
224   - lib3270_trace_event(v3270_get_session(widget),"Can't find %s: %s","AddDllDirectory",session::win32_strerror(GetLastError()).c_str());
225   -
226   - }
227   -
228   - } else {
229   -
230   - lib3270_trace_event(v3270_get_session(widget),"Can't load %s: %s\n","kernel32.dll",session::win32_strerror(GetLastError()).c_str());
231   -
232   - }
233   -
234   - hModule = LoadLibrary("jvm.dll");
235   - if(!hModule) {
236   - lib3270_trace_event(v3270_get_session(widget),"Can't load %s\n","jvm.dll",session::win32_strerror(GetLastError()).c_str());
237   -
238   - for(size_t f = 0; !hModule && f < G_N_ELEMENTS(dlldir); f++) {
239   -
240   - const char *env = getenv(dlldir[f].env);
241   -
242   - debug("%s=\"%s\"",dlldir[f].env,env);
243   -
244   - if(env) {
245   -
246   - gchar *p = g_build_filename(env,dlldir[f].path,"jvm.dll",NULL);
247   - hModule = LoadLibrary(p);
248   - if(!hModule) {
249   - lib3270_trace_event(v3270_get_session(widget),"Can't load %s: %s\n",p,session::win32_strerror(GetLastError()).c_str());
250   - }
251   - g_free(p);
252   -
253   - }
254   - }
255   - }
256   -
257   - if(!hModule) {
258   - failed(widget, _( "Can't load java virtual machine" ), "%s", session::win32_strerror(GetLastError()).c_str());
259   - }
260   -
261   - if(kernel) {
262   -
263   - RemoveDllDirectory = (BOOL WINAPI (*)(HANDLE)) GetProcAddress(kernel,"RemoveDllDirectory");
264   - if(RemoveDllDirectory) {
265   -
266   - for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) {
267   -
268   - if(dlldir[f].cookie) {
269   -
270   - RemoveDllDirectory(dlldir[f].cookie);
271   -
272   - }
273   - }
274   -
275   - }
276   -
277   - FreeLibrary(kernel);
278   -
279   - }
280   -
281   - if(!hModule) {
282   - return false;
283   - }
284   -
285   - // Consegui carregar a JVM, obtenho o método de controle
286   - jint JNICALL (*CreateJavaVM)(JavaVM **, void **, void *) = (jint JNICALL (*)(JavaVM **, void **, void *)) GetProcAddress(hModule,"JNI_CreateJavaVM");
287   -
288   - if(!CreateJavaVM) {
289   - failed(widget, _( "Can't load java virtual machine creation method" ), "%s", session::win32_strerror(GetLastError()).c_str());
290   - return false;
291   - }
292   -
293   - // Crio a JVM
294   - JavaVMInitArgs vm_args;
295   - JavaVMOption options[5];
296   -
297   - jint rc = 0;
298   -
299   - memset(&vm_args,0,sizeof(vm_args));
300   - memset(options,0,sizeof(options));
301   -
302   - vm_args.version = JNI_VERSION_1_4;
303   - vm_args.nOptions = 0;
304   - vm_args.options = options;
305   - vm_args.ignoreUnrecognized = JNI_FALSE;
306   -
307   - options[vm_args.nOptions].optionString = g_strdup("vfprintf");
308   - options[vm_args.nOptions].extraInfo = (void *) jni_vfprintf;
309   - vm_args.nOptions++;
310   -
311   - gchar * exports = NULL;
312   - char buffer[1024];
313   - gchar * myDir;
314   -
315   - if(GetModuleFileName(NULL,buffer,sizeof(buffer)) < sizeof(buffer)) {
316   -
317   - gchar * ptr = strrchr(buffer,G_DIR_SEPARATOR);
318   - if(ptr) {
319   - *ptr = 0;
320   - myDir = g_strdup(buffer);
321   - } else {
322   - myDir = g_strdup(".");
323   - }
324   -
325   -
326   - } else {
327   -
328   - myDir = g_strdup(".");
329   -
330   - }
331   -
332   - debug("myDir=%s",myDir);
333   -
334   - exports = g_build_filename(myDir,"jvm-exports",NULL);
335   - g_mkdir_with_parents(exports,0777);
336   -
337   - lib3270_trace_event(v3270_get_session(widget),"java.class.path=%s",exports);
338   - lib3270_trace_event(v3270_get_session(widget),"java.library.path=%s",myDir);
339   -
340   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s",exports);
341   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",myDir);
342   -
343   - g_free(myDir);
344   - g_free(exports);
345   -
346   - rc = CreateJavaVM(&jvm,(void **)&env,&vm_args);
347   - if(rc < 0) {
348   - failed(widget, _( "Can't create java VM" ), _( "The error code was %d" ), (int) rc);
349   - jvm = NULL;
350   - }
351   -
352   - for(int f=0;f<vm_args.nOptions;f++) {
353   - trace("Releasing option %d: %s",f,options[f].optionString);
354   - g_free(options[f].optionString);
355   - }
356   -
357   -
358   - return jvm != NULL;
359   -
360   - }
361   -
362   -
363   -
364   -#else
365   -
366   - bool java::load_jvm(GtkWidget *widget) {
367   -
368   - if(jvm != NULL) {
369   - return true;
370   - }
371   -
372   - // Start JNI
373   - JavaVMInitArgs vm_args;
374   - JavaVMOption options[5];
375   - jint rc = 0;
376   -
377   -
378   - memset(&vm_args,0,sizeof(vm_args));
379   - memset(options,0,sizeof(options));
380   -
381   - vm_args.version = JNI_VERSION_1_4;
382   - vm_args.nOptions = 0;
383   - vm_args.options = options;
384   - vm_args.ignoreUnrecognized = JNI_FALSE;
385   -
386   - options[vm_args.nOptions].optionString = g_strdup("vfprintf");
387   - options[vm_args.nOptions].extraInfo = (void *) jni_vfprintf;
388   - vm_args.nOptions++;
389   -
390   -#if defined(DEBUG)
391   -
392   -// options[vm_args.nOptions++].optionString = g_strdup("-verbose");
393   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=.bin/Debug:.bin/Debug/lib:%s",JNIDIR);
394   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=./src/java:.bin/java:%s",JARDIR);
395   -
396   -#else
397   -
398   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR);
399   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s",JARDIR);
400   -
401   -#endif // JNIDIR
402   -
403   - // Linux, just create JVM
404   - rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args);
405   -
406   - if(rc) {
407   - jvm = NULL;
408   - failed(widget, _( "Can't create java virtual machine" ), _( "The return code was %d" ), (int) rc);
409   - }
410   -
411   - return jvm != NULL;
412   - }
413   -
414   -
415   -#endif // WIN32
416   -
417   - }
418   -
419   -
src/plugin/call.cc 0 → 100644
... ... @@ -0,0 +1,165 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
  19 + * Place, Suite 330, Boston, MA, 02111-1307, USA
  20 + *
  21 + * Este programa está nomeado como call.cc e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 +
  31 + #include "private.h"
  32 + #include <v3270.h>
  33 + #include <lib3270/trace.h>
  34 + #include <lib3270/log.h>
  35 +
  36 +
  37 +/*---[ Implement ]----------------------------------------------------------------------------------*/
  38 +
  39 +namespace PW3270_NAMESPACE {
  40 +
  41 +
  42 + void java::call(GtkWidget *widget, const char *classname) {
  43 +
  44 + debug("%s(%s)",__FUNCTION__,classname);
  45 +
  46 + if(!trylock()) {
  47 +
  48 + failed(widget, _( "Can't access java virtual machine" ), "%s", strerror(EBUSY));
  49 + return;
  50 +
  51 + }
  52 +
  53 + if(jvm || load_jvm(widget)) {
  54 +
  55 + v3270_set_script(widget,'J',TRUE);
  56 +
  57 + try {
  58 +
  59 + jclass cls;
  60 + jmethodID mid;
  61 +
  62 + /*
  63 +
  64 + DONT WORK!!
  65 + http://stackoverflow.com/questions/271506/why-cant-system-setproperty-change-the-classpath-at-runtime
  66 +
  67 + // Atualizar o classpath
  68 + cls = env->FindClass("java/lang/System");
  69 + if(!cls) {
  70 + throw exception( _( "Can't find class %s" ), "java/lang/System");
  71 + }
  72 +
  73 + mid = env->GetStaticMethodID(cls, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;");
  74 + if(!mid) {
  75 + throw exception( _( "Can't find method %s/%s" ), "java/lang/System","setProperty");
  76 + }
  77 +
  78 + lib3270_trace_event(v3270_get_session(widget),"java.class.path=%s\n",classpath);
  79 +
  80 + jstring name = env->NewStringUTF("java.class.path");
  81 + jstring path = env->NewStringUTF(classpath);
  82 +
  83 + jstring rc = (jstring) env->CallObjectMethod(cls,mid,name,path);
  84 +
  85 + env->DeleteLocalRef(name);
  86 + env->DeleteLocalRef(path);
  87 + env->DeleteLocalRef(rc);
  88 + */
  89 +
  90 + // Get application entry point.
  91 + cls = env->FindClass(classname);
  92 + if(!cls) {
  93 + throw exception( _( "Can't find class %s" ), classname);
  94 + }
  95 +
  96 + mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
  97 + if(!mid) {
  98 + throw exception( _( "Can't find method %s/%s" ), classname, "main");
  99 + }
  100 +
  101 + // Build arguments
  102 + jobjectArray args = env->NewObjectArray(0, env->FindClass("java/lang/String"), env->NewStringUTF(""));
  103 +
  104 + // Call main()
  105 + env->CallStaticVoidMethod(cls, mid, args);
  106 +
  107 + // Check for exception
  108 + jthrowable exc = env->ExceptionOccurred();
  109 + env->ExceptionClear();
  110 +
  111 + if (exc) {
  112 + jclass throwable_class = env->FindClass("java/lang/Throwable");
  113 +
  114 + jmethodID jni_getMessage = env->GetMethodID(throwable_class,"getMessage","()Ljava/lang/String;");
  115 + jstring j_msg = (jstring) env->CallObjectMethod(exc,jni_getMessage);
  116 +
  117 + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  118 + GTK_DIALOG_DESTROY_WITH_PARENT,
  119 + GTK_MESSAGE_ERROR,
  120 + GTK_BUTTONS_OK_CANCEL,
  121 + _( "Java application \"%s\" has failed." ), classname );
  122 +
  123 + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" ));
  124 +
  125 + if(!env->IsSameObject(j_msg,NULL)) {
  126 +
  127 + const char * msg = env->GetStringUTFChars(j_msg, 0);
  128 +
  129 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",msg);
  130 +
  131 + env->ReleaseStringUTFChars( j_msg, msg);
  132 + }
  133 +
  134 + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
  135 + gtk_main_quit();
  136 + gtk_widget_destroy(dialog);
  137 +
  138 +
  139 + }
  140 +
  141 + // And finish
  142 + env->DeleteLocalRef(args);
  143 +
  144 + } catch(std::exception &e) {
  145 +
  146 + failed(widget,_("Can't start java application"),"%s", e.what());
  147 +
  148 + }
  149 +
  150 +/*
  151 + g_free(dirname);
  152 + g_free(classname);
  153 + g_free(classpath);
  154 +*/
  155 +
  156 + v3270_set_script(widget,'J',FALSE);
  157 +
  158 + }
  159 +
  160 + unlock();
  161 +
  162 +
  163 + }
  164 +
  165 +}
... ...
src/plugin/startstop.cc 0 → 100644
... ... @@ -0,0 +1,419 @@
  1 +/*
  2 + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
  3 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
  4 + * aplicativos mainframe. Registro no INPI sob o nome G3270.
  5 + *
  6 + * Copyright (C) <2008> <Banco do Brasil S.A.>
  7 + *
  8 + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
  9 + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
  10 + * Free Software Foundation.
  11 + *
  12 + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
  13 + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
  14 + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
  15 + * obter mais detalhes.
  16 + *
  17 + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
  18 + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
  19 + * Place, Suite 330, Boston, MA, 02111-1307, USA
  20 + *
  21 + * Este programa está nomeado como startstop.cc e possui - linhas de código.
  22 + *
  23 + * Contatos:
  24 + *
  25 + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
  26 + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
  27 + *
  28 + */
  29 +
  30 +#if defined WIN32
  31 +
  32 + // http://msdn.microsoft.com/en-us/library/windows/desktop/ms684179(v=vs.85).aspx
  33 + #ifndef LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
  34 + #define LOAD_LIBRARY_SEARCH_DEFAULT_DIRS 0x00001000
  35 + #endif // LOAD_LIBRARY_SEARCH_DEFAULT_DIRS
  36 +
  37 + #ifndef LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR
  38 + #define LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR 0x00000100
  39 + #endif // LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR
  40 +
  41 + #include <windows.h>
  42 +
  43 +#else
  44 +
  45 + #include <dlfcn.h>
  46 +
  47 +#endif
  48 +
  49 + #include "private.h"
  50 +
  51 + #include <pw3270.h>
  52 + #include <pw3270/plugin.h>
  53 + #include <v3270.h>
  54 + #include <lib3270/actions.h>
  55 + #include <lib3270/log.h>
  56 + #include <lib3270/trace.h>
  57 + #include <lib3270/charset.h>
  58 + #include <pw3270/class.h>
  59 + #include <pw3270/trace.h>
  60 +
  61 +/*---[ Implement ]----------------------------------------------------------------------------------*/
  62 +
  63 +using namespace PW3270_NAMESPACE::java;
  64 +
  65 +extern "C" {
  66 +
  67 + static void trace_cleanup(GtkWidget *widget, GtkWidget **window) {
  68 + *window = NULL;
  69 + }
  70 +
  71 + static jint JNICALL jni_vfprintf(FILE *fp, const char *fmt, va_list args) {
  72 +
  73 + char * msg = NULL;
  74 + static GtkWidget * trace = NULL;
  75 +
  76 + if(vasprintf(&msg,fmt,args) < 1) {
  77 + lib3270_write_log(lib3270_get_default_session_handle(),"java","vasprintf() error on \"%s\"",fmt);
  78 + return 0;
  79 + }
  80 +
  81 + fprintf(fp,"%s",msg);
  82 + lib3270_write_log(lib3270_get_default_session_handle(),"java","%s",msg);
  83 +
  84 + if(!trace) {
  85 + // Cria janela de trace.
  86 + trace = pw3270_trace_new();
  87 + g_signal_connect(G_OBJECT(trace), "destroy",G_CALLBACK(trace_cleanup), &trace);
  88 +
  89 + pw3270_trace_set_destroy_on_close(trace,TRUE);
  90 +
  91 + // gtk_window_set_transient_for(GTK_WINDOW(trace),GTK_WINDOW(gtk_widget_get_toplevel(widget)));
  92 + gtk_window_set_destroy_with_parent(GTK_WINDOW(trace),TRUE);
  93 +
  94 + gtk_window_set_default_size(GTK_WINDOW(trace),590,430);
  95 + gtk_widget_show_all(trace);
  96 +
  97 + pw3270_trace_printf(trace,"%s",msg);
  98 +
  99 + free(msg);
  100 + }
  101 +
  102 + return 0;
  103 + }
  104 +
  105 + LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget) {
  106 +
  107 + gchar *classname = (gchar *) g_object_get_data(G_OBJECT(action),"src");
  108 +
  109 + lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p\n",gtk_action_get_name(action),widget);
  110 +
  111 + if(classname)
  112 + {
  113 + // Has filename, call it directly
  114 + call(widget,classname);
  115 + }
  116 + else
  117 + {
  118 +/*
  119 + // No classname, ask user
  120 + filename = pw3270_file_chooser(GTK_FILE_CHOOSER_ACTION_OPEN, "java", _( "Select script to run" ), "", "class");
  121 +
  122 + if(filename)
  123 + {
  124 + call(widget,filename);
  125 + g_free(filename);
  126 + }
  127 +*/
  128 + }
  129 +
  130 + }
  131 + }
  132 +
  133 +
  134 + namespace PW3270_NAMESPACE {
  135 +
  136 + JavaVM * java::jvm = NULL;
  137 + JNIEnv * java::env = NULL;
  138 +#ifdef _WIN32
  139 + HMODULE java::hModule = NULL;
  140 +#endif // _WIN32
  141 +
  142 + void java::failed(GtkWidget *widget, const char *msg, const char *format, ...) {
  143 +
  144 + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
  145 + GTK_DIALOG_DESTROY_WITH_PARENT,
  146 + GTK_MESSAGE_ERROR,
  147 + GTK_BUTTONS_OK_CANCEL,
  148 + "%s", msg );
  149 +
  150 + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" ));
  151 +
  152 + if(format) {
  153 +
  154 + va_list arg_ptr;
  155 + va_start(arg_ptr, format);
  156 + gchar *msg = g_strdup_vprintf(format,arg_ptr);
  157 + va_end(arg_ptr);
  158 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",msg);
  159 + g_free(msg);
  160 +
  161 + }
  162 +
  163 + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
  164 + gtk_main_quit();
  165 + gtk_widget_destroy(dialog);
  166 +
  167 + }
  168 +
  169 +
  170 +#ifdef WIN32
  171 +
  172 + bool java::load_jvm(GtkWidget *widget) {
  173 +
  174 + if(jvm != NULL) {
  175 + return true;
  176 + }
  177 +
  178 + // Dynamically load jvm library to avoid naming and path problems.
  179 + HMODULE kernel;
  180 + HANDLE WINAPI (*AddDllDirectory)(PCWSTR NewDirectory);
  181 + BOOL WINAPI (*RemoveDllDirectory)(HANDLE Cookie);
  182 +
  183 + struct _dlldir {
  184 + const gchar * env;
  185 + const gchar * path;
  186 + HANDLE cookie;
  187 + } dlldir[] = {
  188 + { "JRE_HOME", "bin\\client", 0 },
  189 + { "JDK_HOME", "jre\\bin\\client", 0 }
  190 + };
  191 +
  192 + kernel = LoadLibrary("kernel32.dll");
  193 +
  194 + if(kernel) {
  195 +
  196 + AddDllDirectory = (HANDLE WINAPI (*)(PCWSTR)) GetProcAddress(kernel,"AddDllDirectory");
  197 + if(AddDllDirectory) {
  198 +
  199 + // Acrescenta mais caminhos para achar a dll
  200 + for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) {
  201 +
  202 + const char *env = getenv(dlldir[f].env);
  203 +
  204 + debug("%s=\"%s\"",dlldir[f].env,env);
  205 +
  206 + if(env) {
  207 +
  208 + gchar *p = g_build_filename(env,dlldir[f].path,NULL);
  209 +
  210 + lib3270_trace_event(v3270_get_session(widget),"Adding \"%s\" to DLL search path",p);
  211 +
  212 + wchar_t *path = (wchar_t *) malloc(4096*sizeof(wchar_t));
  213 + mbstowcs(path, p, 4095);
  214 + dlldir[f].cookie = AddDllDirectory(path);
  215 + free(path);
  216 +
  217 + g_free(p);
  218 +
  219 + }
  220 + }
  221 +
  222 + } else {
  223 +
  224 + lib3270_trace_event(v3270_get_session(widget),"Can't find %s: %s","AddDllDirectory",session::win32_strerror(GetLastError()).c_str());
  225 +
  226 + }
  227 +
  228 + } else {
  229 +
  230 + lib3270_trace_event(v3270_get_session(widget),"Can't load %s: %s\n","kernel32.dll",session::win32_strerror(GetLastError()).c_str());
  231 +
  232 + }
  233 +
  234 + hModule = LoadLibrary("jvm.dll");
  235 + if(!hModule) {
  236 + lib3270_trace_event(v3270_get_session(widget),"Can't load %s\n","jvm.dll",session::win32_strerror(GetLastError()).c_str());
  237 +
  238 + for(size_t f = 0; !hModule && f < G_N_ELEMENTS(dlldir); f++) {
  239 +
  240 + const char *env = getenv(dlldir[f].env);
  241 +
  242 + debug("%s=\"%s\"",dlldir[f].env,env);
  243 +
  244 + if(env) {
  245 +
  246 + gchar *p = g_build_filename(env,dlldir[f].path,"jvm.dll",NULL);
  247 + hModule = LoadLibrary(p);
  248 + if(!hModule) {
  249 + lib3270_trace_event(v3270_get_session(widget),"Can't load %s: %s\n",p,session::win32_strerror(GetLastError()).c_str());
  250 + }
  251 + g_free(p);
  252 +
  253 + }
  254 + }
  255 + }
  256 +
  257 + if(!hModule) {
  258 + failed(widget, _( "Can't load java virtual machine" ), "%s", session::win32_strerror(GetLastError()).c_str());
  259 + }
  260 +
  261 + if(kernel) {
  262 +
  263 + RemoveDllDirectory = (BOOL WINAPI (*)(HANDLE)) GetProcAddress(kernel,"RemoveDllDirectory");
  264 + if(RemoveDllDirectory) {
  265 +
  266 + for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) {
  267 +
  268 + if(dlldir[f].cookie) {
  269 +
  270 + RemoveDllDirectory(dlldir[f].cookie);
  271 +
  272 + }
  273 + }
  274 +
  275 + }
  276 +
  277 + FreeLibrary(kernel);
  278 +
  279 + }
  280 +
  281 + if(!hModule) {
  282 + return false;
  283 + }
  284 +
  285 + // Consegui carregar a JVM, obtenho o método de controle
  286 + jint JNICALL (*CreateJavaVM)(JavaVM **, void **, void *) = (jint JNICALL (*)(JavaVM **, void **, void *)) GetProcAddress(hModule,"JNI_CreateJavaVM");
  287 +
  288 + if(!CreateJavaVM) {
  289 + failed(widget, _( "Can't load java virtual machine creation method" ), "%s", session::win32_strerror(GetLastError()).c_str());
  290 + return false;
  291 + }
  292 +
  293 + // Crio a JVM
  294 + JavaVMInitArgs vm_args;
  295 + JavaVMOption options[5];
  296 +
  297 + jint rc = 0;
  298 +
  299 + memset(&vm_args,0,sizeof(vm_args));
  300 + memset(options,0,sizeof(options));
  301 +
  302 + vm_args.version = JNI_VERSION_1_4;
  303 + vm_args.nOptions = 0;
  304 + vm_args.options = options;
  305 + vm_args.ignoreUnrecognized = JNI_FALSE;
  306 +
  307 + options[vm_args.nOptions].optionString = g_strdup("vfprintf");
  308 + options[vm_args.nOptions].extraInfo = (void *) jni_vfprintf;
  309 + vm_args.nOptions++;
  310 +
  311 + gchar * exports = NULL;
  312 + char buffer[1024];
  313 + gchar * myDir;
  314 +
  315 + if(GetModuleFileName(NULL,buffer,sizeof(buffer)) < sizeof(buffer)) {
  316 +
  317 + gchar * ptr = strrchr(buffer,G_DIR_SEPARATOR);
  318 + if(ptr) {
  319 + *ptr = 0;
  320 + myDir = g_strdup(buffer);
  321 + } else {
  322 + myDir = g_strdup(".");
  323 + }
  324 +
  325 +
  326 + } else {
  327 +
  328 + myDir = g_strdup(".");
  329 +
  330 + }
  331 +
  332 + debug("myDir=%s",myDir);
  333 +
  334 + exports = g_build_filename(myDir,"jvm-exports",NULL);
  335 + g_mkdir_with_parents(exports,0777);
  336 +
  337 + lib3270_trace_event(v3270_get_session(widget),"java.class.path=%s",exports);
  338 + lib3270_trace_event(v3270_get_session(widget),"java.library.path=%s",myDir);
  339 +
  340 + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s",exports);
  341 + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",myDir);
  342 +
  343 + g_free(myDir);
  344 + g_free(exports);
  345 +
  346 + rc = CreateJavaVM(&jvm,(void **)&env,&vm_args);
  347 + if(rc < 0) {
  348 + failed(widget, _( "Can't create java VM" ), _( "The error code was %d" ), (int) rc);
  349 + jvm = NULL;
  350 + }
  351 +
  352 + for(int f=0;f<vm_args.nOptions;f++) {
  353 + trace("Releasing option %d: %s",f,options[f].optionString);
  354 + g_free(options[f].optionString);
  355 + }
  356 +
  357 +
  358 + return jvm != NULL;
  359 +
  360 + }
  361 +
  362 +
  363 +
  364 +#else
  365 +
  366 + bool java::load_jvm(GtkWidget *widget) {
  367 +
  368 + if(jvm != NULL) {
  369 + return true;
  370 + }
  371 +
  372 + // Start JNI
  373 + JavaVMInitArgs vm_args;
  374 + JavaVMOption options[5];
  375 + jint rc = 0;
  376 +
  377 +
  378 + memset(&vm_args,0,sizeof(vm_args));
  379 + memset(options,0,sizeof(options));
  380 +
  381 + vm_args.version = JNI_VERSION_1_4;
  382 + vm_args.nOptions = 0;
  383 + vm_args.options = options;
  384 + vm_args.ignoreUnrecognized = JNI_FALSE;
  385 +
  386 + options[vm_args.nOptions].optionString = g_strdup("vfprintf");
  387 + options[vm_args.nOptions].extraInfo = (void *) jni_vfprintf;
  388 + vm_args.nOptions++;
  389 +
  390 +#if defined(DEBUG)
  391 +
  392 +// options[vm_args.nOptions++].optionString = g_strdup("-verbose");
  393 + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=.bin/Debug:.bin/Debug/lib:%s",JNIDIR);
  394 + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=./src/java:.bin/java:%s",JARDIR);
  395 +
  396 +#else
  397 +
  398 + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR);
  399 + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s",JARDIR);
  400 +
  401 +#endif // JNIDIR
  402 +
  403 + // Linux, just create JVM
  404 + rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args);
  405 +
  406 + if(rc) {
  407 + jvm = NULL;
  408 + failed(widget, _( "Can't create java virtual machine" ), _( "The return code was %d" ), (int) rc);
  409 + }
  410 +
  411 + return jvm != NULL;
  412 + }
  413 +
  414 +
  415 +#endif // WIN32
  416 +
  417 + }
  418 +
  419 +
... ...