Commit 21a36f033c91cc66a82c7b1b77c386c506b2864e

Authored by perry.werneck@gmail.com
1 parent 1ab298e6

Reorganizando estrutura do java devido à problemas na carga da jvm

src/java/Makefile.in
... ... @@ -83,7 +83,7 @@ CXXFLAGS=@CFLAGS@ @CXXFLAGS@ @DLL_CFLAGS@ @JNI_CPPFLAGS@ -I../include
83 83 # PW3270_LIBS ?= -L../../.bin/Debug@DLLDIR@ -l3270 -lpw3270
84 84 PW3270_CFLAGS ?= -I../include
85 85  
86   -PLUGIN_CFLAGS=@CXXFLAGS@ -Wno-deprecated-declarations @DLL_CFLAGS@ @JNI_CPPFLAGS@ -DJNIDIR="\"$(jnidir)\"" \
  86 +PLUGIN_CFLAGS=@CXXFLAGS@ -DPW3270_PLUGIN -Wno-deprecated-declarations @DLL_CFLAGS@ @JNI_CPPFLAGS@ -DJNIDIR="\"$(jnidir)\"" \
87 87 -DJARDIR="\"$(jvmjardir)\"" @GTK_CFLAGS@ @GTKMAC_CFLAGS@ $(PW3270_CFLAGS)
88 88  
89 89 PLUGIN_LIBS=@GTK_LIBS@ @GTKMAC_LIBS@ @JVM_LIBS@
... ...
src/java/actions.cc
... ... @@ -32,13 +32,15 @@
32 32  
33 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34  
  35 +using namespace PW3270_NAMESPACE;
  36 +
35 37 JNIEXPORT jint JNICALL Java_pw3270_terminal_quit(JNIEnv *env, jobject obj) {
36 38  
37 39 jint rc = -1;
38 40  
39 41 try {
40 42  
41   - rc = getHandle(env,obj)->quit();
  43 + rc = java::getHandle(env,obj)->quit();
42 44  
43 45 } catch(std::exception &e) {
44 46  
... ... @@ -57,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase_1eof(JNIEnv *env, jobject obj)
57 59  
58 60 try {
59 61  
60   - rc = getHandle(env,obj)->erase_eof();
  62 + rc = java::getHandle(env,obj)->erase_eof();
61 63  
62 64 } catch(std::exception &e) {
63 65  
... ... @@ -76,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_print(JNIEnv *env, jobject obj) {
76 78  
77 79 try {
78 80  
79   - rc = getHandle(env,obj)->print();
  81 + rc = java::getHandle(env,obj)->print();
80 82  
81 83 } catch(std::exception &e) {
82 84  
... ...
src/java/clipboard.cc
... ... @@ -32,6 +32,9 @@
32 32  
33 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34  
  35 +using namespace std;
  36 +using namespace PW3270_NAMESPACE::java;
  37 +
35 38 JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1copy(JNIEnv *env, jobject obj, jstring j_str) {
36 39  
37 40 const char * str = env->GetStringUTFChars(j_str, 0);
... ...
src/java/connect.cc
... ... @@ -32,6 +32,8 @@
32 32  
33 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34  
  35 +using namespace PW3270_NAMESPACE;
  36 +
35 37 JNIEXPORT jint JNICALL Java_pw3270_terminal_connect(JNIEnv *env, jobject obj, jstring j_host, jint seconds) {
36 38  
37 39 const char * host = env->GetStringUTFChars(j_host, 0);
... ... @@ -39,7 +41,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_connect(JNIEnv *env, jobject obj, js
39 41  
40 42 try {
41 43  
42   - rc = getHandle(env,obj)->connect(host,(time_t) seconds);
  44 + rc = java::getHandle(env,obj)->connect(host,(time_t) seconds);
43 45  
44 46 } catch(std::exception &e) {
45 47  
... ... @@ -58,7 +60,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_disconnect(JNIEnv *env, jobject obj)
58 60  
59 61 try {
60 62  
61   - return (jint) getHandle(env,obj)->disconnect();
  63 + return (jint) java::getHandle(env,obj)->disconnect();
62 64  
63 65 } catch(std::exception &e) {
64 66  
... ...
src/java/cursor.cc
... ... @@ -32,13 +32,15 @@
32 32  
33 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34  
  35 +using namespace PW3270_NAMESPACE;
  36 +
35 37 JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1cursor_1position(JNIEnv *env, jobject obj, jint row, jint col) {
36 38  
37 39 jint rc = -1;
38 40  
39 41 try {
40 42  
41   - rc = getHandle(env,obj)->set_cursor_position((int) row, (int) col);
  43 + rc = java::getHandle(env,obj)->set_cursor_position((int) row, (int) col);
42 44  
43 45 } catch(std::exception &e) {
44 46  
... ... @@ -57,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1cursor_1addr(JNIEnv *env, jobje
57 59  
58 60 try {
59 61  
60   - rc = getHandle(env,obj)->set_cursor_addr((int) addr);
  62 + rc = java::getHandle(env,obj)->set_cursor_addr((int) addr);
61 63  
62 64 } catch(std::exception &e) {
63 65  
... ... @@ -77,7 +79,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1cursor_1addr(JNIEnv *env, jobje
77 79  
78 80 try {
79 81  
80   - rc = getHandle(env,obj)->get_cursor_addr();
  82 + rc = java::getHandle(env,obj)->get_cursor_addr();
81 83  
82 84 } catch(std::exception &e) {
83 85  
... ...
src/java/dialog.cc
... ... @@ -32,6 +32,8 @@
32 32  
33 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34  
  35 +using namespace PW3270_NAMESPACE;
  36 +
35 37 JNIEXPORT jint JNICALL Java_pw3270_terminal_popup_1dialog(JNIEnv *env, jobject obj, jint id, jstring j_title, jstring j_message, jstring j_secondary) {
36 38  
37 39 const char * title = env->GetStringUTFChars(j_title, 0);
... ... @@ -41,7 +43,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_popup_1dialog(JNIEnv *env, jobject o
41 43  
42 44 try {
43 45  
44   - rc = (jint) getHandle(env,obj)->popup_dialog((LIB3270_NOTIFY) id, title, message, secondary);
  46 + rc = (jint) java::getHandle(env,obj)->popup_dialog((LIB3270_NOTIFY) id, title, message, secondary);
45 47  
46 48 } catch(std::exception &e) {
47 49  
... ... @@ -70,7 +72,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_file_1chooser_1dialog(JNIEnv *env
70 72  
71 73 try {
72 74  
73   - str = getHandle(env,obj)->file_chooser_dialog((int) action, title, extension, filename);
  75 + str = java::getHandle(env,obj)->file_chooser_dialog((int) action, title, extension, filename);
74 76  
75 77 } catch(std::exception &e) {
76 78  
... ...
src/java/field.cc
... ... @@ -32,13 +32,15 @@
32 32  
33 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34  
  35 +using namespace PW3270_NAMESPACE;
  36 +
35 37 JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1start (JNIEnv *env, jobject obj, jint baddr) {
36 38  
37 39 jint rc = -1;
38 40  
39 41 try {
40 42  
41   - rc = getHandle(env,obj)->get_field_start((int) baddr);
  43 + rc = java::getHandle(env,obj)->get_field_start((int) baddr);
42 44  
43 45  
44 46 } catch(std::exception &e) {
... ... @@ -57,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1len (JNIEnv *env, jobjec
57 59  
58 60 try {
59 61  
60   - rc = getHandle(env,obj)->get_field_len((int) baddr);
  62 + rc = java::getHandle(env,obj)->get_field_len((int) baddr);
61 63  
62 64  
63 65 } catch(std::exception &e) {
... ... @@ -76,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1next_1unprotected(JNIEnv *env,
76 78  
77 79 try {
78 80  
79   - rc = getHandle(env,obj)->get_next_unprotected((int) baddr);
  81 + rc = java::getHandle(env,obj)->get_next_unprotected((int) baddr);
80 82  
81 83  
82 84 } catch(std::exception &e) {
... ...
src/java/getset.cc
... ... @@ -32,6 +32,8 @@
32 32  
33 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34  
  35 +using namespace std;
  36 +using namespace PW3270_NAMESPACE;
35 37  
36 38 JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string(JNIEnv *env, jobject obj, jint baddr, jint len) {
37 39  
... ... @@ -39,7 +41,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string(JNIEnv *env, jobject
39 41  
40 42 try {
41 43  
42   - str = getHandle(env,obj)->get_string((int) baddr, (int) len);
  44 + str = java::getHandle(env,obj)->get_string((int) baddr, (int) len);
43 45  
44 46  
45 47 } catch(std::exception &e) {
... ... @@ -58,7 +60,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string_1at(JNIEnv *env, jobj
58 60  
59 61 try {
60 62  
61   - str = getHandle(env,obj)->get_string_at((int) row, (int) col, (int) sz);
  63 + str = java::getHandle(env,obj)->get_string_at((int) row, (int) col, (int) sz);
62 64  
63 65  
64 66 } catch(std::exception &e) {
... ... @@ -78,7 +80,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1string_1at(JNIEnv *env, jobject
78 80  
79 81 try {
80 82  
81   - rc = getHandle(env,obj)->set_string_at((int) row, (int) col, str);
  83 + rc = java::getHandle(env,obj)->set_string_at((int) row, (int) col, str);
82 84  
83 85 } catch(std::exception &e) {
84 86  
... ... @@ -101,7 +103,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_cmp_1string_1at(JNIEnv *env, jobject
101 103  
102 104 try {
103 105  
104   - rc = getHandle(env,obj)->cmp_string_at((int) row, (int) col, str);
  106 + rc = java::getHandle(env,obj)->cmp_string_at((int) row, (int) col, str);
105 107  
106 108 } catch(std::exception &e) {
107 109  
... ... @@ -123,7 +125,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_input_1string(JNIEnv *env, jobject o
123 125  
124 126 try {
125 127  
126   - rc = getHandle(env,obj)->input_string(str);
  128 + rc = java::getHandle(env,obj)->input_string(str);
127 129  
128 130 } catch(std::exception &e) {
129 131  
... ... @@ -144,7 +146,7 @@ JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1connected(JNIEnv *env, jobje
144 146  
145 147 try {
146 148  
147   - rc = getHandle(env,obj)->is_connected();
  149 + rc = java::getHandle(env,obj)->is_connected();
148 150  
149 151 } catch(std::exception &e) {
150 152  
... ... @@ -164,7 +166,7 @@ JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1ready(JNIEnv *env, jobject o
164 166  
165 167 try {
166 168  
167   - rc = getHandle(env,obj)->is_ready();
  169 + rc = java::getHandle(env,obj)->is_ready();
168 170  
169 171 } catch(std::exception &e) {
170 172  
... ...
src/java/info.cc
... ... @@ -33,23 +33,25 @@
33 33  
34 34 /*---[ Implement ]----------------------------------------------------------------------------------*/
35 35  
  36 +using namespace PW3270_NAMESPACE;
  37 +
36 38 JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1version (JNIEnv *env, jobject obj) {
37 39  
38   - session *s = getHandle(env,obj);
  40 + session *s = java::getHandle(env,obj);
39 41 return env->NewStringUTF(s->get_version().c_str());
40 42  
41 43 }
42 44  
43 45 JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1revision(JNIEnv *env, jobject obj) {
44 46  
45   - session *s = getHandle(env,obj);
  47 + session *s = java::getHandle(env,obj);
46 48 return env->NewStringUTF(s->get_revision().c_str());
47 49  
48 50 }
49 51  
50 52 JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1encoding(JNIEnv *env, jobject obj) {
51 53  
52   - session *s = getHandle(env,obj);
  54 + session *s = java::getHandle(env,obj);
53 55 return env->NewStringUTF(s->get_encoding());
54 56  
55 57 }
... ...
src/java/keyboard.cc
... ... @@ -32,13 +32,15 @@
32 32  
33 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34  
  35 +using namespace PW3270_NAMESPACE;
  36 +
35 37 JNIEXPORT jint JNICALL Java_pw3270_terminal_enter(JNIEnv *env, jobject obj) {
36 38  
37 39 jint rc = -1;
38 40  
39 41 try {
40 42  
41   - rc = getHandle(env,obj)->enter();
  43 + rc = java::getHandle(env,obj)->enter();
42 44  
43 45 } catch(std::exception &e) {
44 46  
... ... @@ -57,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_pfkey(JNIEnv *env, jobject obj, jint
57 59  
58 60 try {
59 61  
60   - rc = getHandle(env,obj)->pfkey((int) key);
  62 + rc = java::getHandle(env,obj)->pfkey((int) key);
61 63  
62 64 } catch(std::exception &e) {
63 65  
... ... @@ -76,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_pakey(JNIEnv *env, jobject obj, jint
76 78  
77 79 try {
78 80  
79   - rc = getHandle(env,obj)->pakey((int) key);
  81 + rc = java::getHandle(env,obj)->pakey((int) key);
80 82  
81 83 } catch(std::exception &e) {
82 84  
... ...
src/java/main.cc
... ... @@ -32,22 +32,29 @@
32 32  
33 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34  
35   -void set_java_session_factory(PW3270_NAMESPACE::session * (*factory)(const char *name)) {
36   - trace("%s(%p)",__FUNCTION__,factory);
37   - session::set_plugin(factory);
38   -}
  35 +namespace PW3270_NAMESPACE {
39 36  
40   -static jfieldID getHandleField(JNIEnv *env, jobject obj) {
41   - jclass c = env->GetObjectClass(obj);
42   - // J is the type signature for long:
43   - return env->GetFieldID(c, "nativeHandle", "J");
44   -}
  37 + void java::set_factory(PW3270_NAMESPACE::session * (*factory)(const char *name)) {
  38 + trace("%s(%p)",__FUNCTION__,factory);
  39 + session::set_plugin(factory);
  40 + }
  41 +
  42 + jfieldID java::getHandleField(JNIEnv *env, jobject obj) {
  43 + jclass c = env->GetObjectClass(obj);
  44 + // J is the type signature for long:
  45 + return env->GetFieldID(c, "nativeHandle", "J");
  46 + }
  47 +
  48 + session * java::getHandle(JNIEnv *env, jobject obj) {
  49 + jlong handle = env->GetLongField(obj, getHandleField(env, obj));
  50 + return reinterpret_cast<PW3270_NAMESPACE::session *>(handle);
  51 + }
45 52  
46   -session * getHandle(JNIEnv *env, jobject obj) {
47   - jlong handle = env->GetLongField(obj, getHandleField(env, obj));
48   - return reinterpret_cast<PW3270_NAMESPACE::session *>(handle);
49 53 }
50 54  
  55 +using namespace PW3270_NAMESPACE;
  56 +using namespace PW3270_NAMESPACE::java;
  57 +
51 58 JNIEXPORT jint JNICALL Java_pw3270_terminal_init__(JNIEnv *env, jobject obj) {
52 59  
53 60 trace("%s",__FUNCTION__);
... ...
src/java/plugin.cc
... ... @@ -70,6 +70,8 @@
70 70  
71 71 /*--[ Plugin session object ]--------------------------------------------------------------------------------*/
72 72  
  73 + using namespace std;
  74 +
73 75 class plugin : public PW3270_NAMESPACE::session
74 76 {
75 77 private:
... ... @@ -325,7 +327,7 @@
325 327  
326 328 extern "C" {
327 329  
328   - session * factory(const char *name) {
  330 + PW3270_NAMESPACE::session * factory(const char *name) {
329 331 debug("---> %s",__FUNCTION__);
330 332 return new plugin(lib3270_get_default_session_handle());
331 333 }
... ...
src/java/private.h
... ... @@ -37,14 +37,47 @@
37 37 #include <jni.h>
38 38 #include <pw3270/class.h>
39 39  
40   - using namespace PW3270_NAMESPACE;
  40 + #include <malloc.h>
  41 + #include <libintl.h>
41 42  
42   - PW3270_NAMESPACE::session * getHandle(JNIEnv *env, jobject obj);
  43 +#ifdef PW3270_PLUGIN
  44 + #include <glib/gi18n.h>
  45 + #include <gtk/gtk.h>
  46 +#endif // PW3270_PLUGIN
  47 +
  48 + namespace PW3270_NAMESPACE {
  49 +
  50 + namespace java {
  51 +
  52 + extern JavaVM * jvm;
  53 + extern JNIEnv * env;
  54 +
  55 + void set_factory(PW3270_NAMESPACE::session * (*factory)(const char *name));
  56 +
  57 + PW3270_NAMESPACE::session * getHandle(JNIEnv *env, jobject obj);
  58 + jfieldID getHandleField(JNIEnv *env, jobject obj);
  59 +
  60 + void lock();
  61 + void unlock();
  62 + bool trylock();
  63 +
  64 +#ifdef PW3270_PLUGIN
  65 + void call(GtkWidget *widget, const char *filename);
  66 + void failed(GtkWidget *widget, const char *msg, const char *format, ...);
  67 +#endif // PW3270_PLUGIN
  68 +
  69 +
  70 +
  71 +
  72 + }
  73 +
  74 +
  75 + }
43 76  
44 77 extern "C" {
45 78  
46   - LIB3270_EXPORT void set_java_session_factory(PW3270_NAMESPACE::session * (*factory)(const char *name));
47   - extern session * factory(const char *name);
  79 + LIB3270_EXPORT void set_java_session_factory(PW3270_NAMESPACE::session * (*factory)(const char *name));
  80 + extern PW3270_NAMESPACE::session * factory(const char *name);
48 81  
49 82 }
50 83  
... ...
src/java/startstop.cc
... ... @@ -48,11 +48,6 @@
48 48  
49 49 #include "private.h"
50 50  
51   - #include <malloc.h>
52   - #include <libintl.h>
53   - #include <glib/gi18n.h>
54   - #include <gtk/gtk.h>
55   -
56 51 #include <pw3270.h>
57 52 #include <pw3270/plugin.h>
58 53 #include <pw3270/v3270.h>
... ... @@ -68,21 +63,15 @@
68 63 #if GTK_CHECK_VERSION(2,32,0)
69 64 static GMutex mutex;
70 65  
71   - #define trylock() g_mutex_trylock(&mutex)
72   - #define lock() g_mutex_lock(&mutex)
73   - #define unlock() g_mutex_unlock(&mutex)
74   -
75 66 #else
76 67 static GStaticMutex mutex = G_STATIC_MUTEX_INIT;
77 68  
78   - #define trylock() g_static_mutex_trylock(&mutex)
79   - #define lock() g_static_mutex_lock(&mutex)
80   - #define unlock() g_static_mutex_unlock(&mutex)
81   -
82 69 #endif // GTK_CHECK_VERSION
83 70  
84 71 /*---[ Implement ]----------------------------------------------------------------------------------*/
85 72  
  73 +using namespace PW3270_NAMESPACE::java;
  74 +
86 75 extern "C" {
87 76  
88 77 static void trace_cleanup(GtkWidget *widget, GtkWidget **window) {
... ... @@ -123,118 +112,8 @@ extern &quot;C&quot; {
123 112 return 0;
124 113 }
125 114  
126   -}
127   -
128   -#ifdef _WIN32
129   - /*
130   - * Dynamically load jvm to avoid naming and path problems
131   - *
132   - */
133   - static void load_jvm(GtkWidget *widget, HMODULE &hModule) {
134   -
135   - // Dynamically load jvm library to avoid naming and path problems.
136   - HMODULE kernel;
137   - HANDLE WINAPI (*AddDllDirectory)(PCWSTR NewDirectory);
138   - BOOL WINAPI (*RemoveDllDirectory)(HANDLE Cookie);
139   -
140   - struct _dlldir {
141   - const gchar * env;
142   - const gchar * path;
143   - HANDLE cookie;
144   - } dlldir[] = {
145   - { "JRE_HOME", "bin\\client", 0 },
146   - { "JDK_HOME", "jre\\bin\\client", 0 }
147   - };
148   -
149   - kernel = LoadLibrary("kernel32.dll");
150   -
151   - debug("---[ %s ]---------------------------------------------------",__FUNCTION__);
152   -
153   - AddDllDirectory = (HANDLE WINAPI (*)(PCWSTR)) GetProcAddress(kernel,"AddDllDirectory");
154   - if(AddDllDirectory) {
155   -
156   - // Acrescenta mais caminhos para achar a dll
157   - for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) {
158   -
159   - const char *env = getenv(dlldir[f].env);
160   -
161   - debug("%s=\"%s\"",dlldir[f].env,env);
162   -
163   - if(env) {
164   -
165   - gchar *p = g_build_filename(env,dlldir[f].path,NULL);
166   -
167   - debug("Adicionando diretório \"%s\"",p);
168   -
169   - wchar_t *path = (wchar_t *) malloc(4096*sizeof(wchar_t));
170   - mbstowcs(path, p, 4095);
171   - dlldir[f].cookie = AddDllDirectory(path);
172   - free(path);
173   -
174   - g_free(p);
175   -
176   - }
177   - }
178   -
179   - }
180   -#ifdef DEBUG
181   - else {
182   - debug("Can't get %s: %s","AddDllDirectory",session::win32_strerror(GetLastError()).c_str())
183   - }
184   -#endif // DEBUG
185   -
186   - hModule = LoadLibrary("jvm.dll");
187   -
188   - debug("hModule=%08lx",(long) hModule);
189   -
190   - if(!hModule) {
191   -
192   - DWORD err = GetLastError();
193   -
194   - debug("%s",session::win32_strerror(err).c_str());
195   -
196   - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
197   - GTK_DIALOG_DESTROY_WITH_PARENT,
198   - GTK_MESSAGE_ERROR,
199   - GTK_BUTTONS_CANCEL,
200   - "%s", _( "Can't load java virtual machine" ) );
201   -
202   - gtk_window_set_title(GTK_WINDOW(dialog),_( "JVM error" ));
203   - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s", session::win32_strerror(err).c_str());
204   -
205   - gtk_dialog_run(GTK_DIALOG (dialog));
206   - gtk_widget_destroy(dialog);
207   -
208   - }
209   -
210   - // Libera caminhos extras.
211   - RemoveDllDirectory = (BOOL WINAPI (*)(HANDLE)) GetProcAddress(kernel,"RemoveDllDirectory");
212   - if(RemoveDllDirectory) {
213   -
214   - for(size_t f = 0; f < G_N_ELEMENTS(dlldir); f++) {
215   -
216   - if(dlldir[f].cookie) {
217   -
218   - RemoveDllDirectory(dlldir[f].cookie);
219   -
220   - }
221   - }
222   -
223   - }
224   -#ifdef DEBUG
225   - else {
226   - debug("Can't get %s: %s","RemoveDllDirectory",session::win32_strerror(GetLastError()).c_str())
227   - }
228   -#endif // DEBUG
229   -
230   - FreeLibrary(kernel);
231   -
232 115 }
233 116  
234   -
235   -#endif // _WIN32
236   -
237   -
238 117 LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window)
239 118 {
240 119 trace("JAVA: %s",__FUNCTION__);
... ... @@ -247,292 +126,23 @@ extern &quot;C&quot; {
247 126  
248 127 LIB3270_EXPORT int pw3270_plugin_stop(GtkWidget *window)
249 128 {
250   -#if GTK_CHECK_VERSION(2,32,0)
251   - g_mutex_clear(&mutex);
252   -#endif // GTK_CHECK_VERSION
253   - trace("JAVA: %s",__FUNCTION__);
254   - return 0;
255   - }
256   -
257   -extern "C"
258   -{
259   -
260   - void call_java_program(GtkAction *action, GtkWidget *widget, const gchar *filename)
261   - {
  129 + lock();
262 130  
263   - if(!trylock()) {
264   -
265   - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
266   - GTK_DIALOG_DESTROY_WITH_PARENT,
267   - GTK_MESSAGE_ERROR,
268   - GTK_BUTTONS_CANCEL,
269   - _( "Can't start %s program" ), "java" );
270   -
271   - gtk_window_set_title(GTK_WINDOW(dialog),_( "JVM busy" ));
272   - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),_( "%s interpreter is busy" ), "java");
273   -
274   - gtk_dialog_run(GTK_DIALOG (dialog));
275   - gtk_widget_destroy(dialog);
276   -
277   - return;
  131 + if(jvm) {
  132 + jvm->DestroyJavaVM();
  133 + jvm = NULL;
278 134 }
279 135  
280   - v3270_set_script(widget,'J',TRUE);
281   -
282   -#ifdef _WIN32
283   -
284   - HMODULE hJVM = 0;
285   -
286   - load_jvm(widget,hJVM);
287   -
288   - debug("hJVM=%p",hJVM);
289   -
290   - if(!hJVM) {
291   - v3270_set_script(widget,'J',FALSE);
  136 + unlock();
292 137  
293 138 #if GTK_CHECK_VERSION(2,32,0)
294   - g_mutex_unlock(&mutex);
295   -#else
296   - g_static_mutex_unlock(&mutex);
  139 + g_mutex_clear(&mutex);
297 140 #endif // GTK_CHECK_VERSION
  141 + trace("JAVA: %s",__FUNCTION__);
298 142  
299   - return;
300   -
301   - }
302   -
303   -#endif // _WIN32
304   -
305   - debug("%s",__FUNCTION__);
306   -
307   - // Start JNI
308   - JavaVMInitArgs vm_args;
309   - JavaVMOption options[5];
310   -
311   - JavaVM * jvm = NULL;
312   - JNIEnv * env = NULL;
313   - jint rc = 0;
314   -
315   - memset(&vm_args,0,sizeof(vm_args));
316   - memset(options,0,sizeof(options));
317   -
318   - vm_args.version = JNI_VERSION_1_4;
319   - vm_args.nOptions = 0;
320   - vm_args.options = options;
321   - vm_args.ignoreUnrecognized = JNI_FALSE;
322   -
323   - options[vm_args.nOptions].optionString = g_strdup("vfprintf");
324   - options[vm_args.nOptions].extraInfo = (void *) jni_vfprintf;
325   - vm_args.nOptions++;
326   -
327   -//#ifdef DEBUG
328   -// options[vm_args.nOptions++].optionString = g_strdup("-verbose");
329   -//#endif
330   -
331   - gchar * dirname = g_path_get_dirname(filename);
332   -
333   - debug("Dirname=%s",dirname);
334   -
335   -#if defined( WIN32 )
336   -
337   - gchar * exports = NULL;
338   - char buffer[1024];
339   - gchar * myDir;
340   -
341   - if(GetModuleFileName(NULL,buffer,sizeof(buffer)) < sizeof(buffer)) {
342   -
343   - gchar * ptr = strrchr(buffer,G_DIR_SEPARATOR);
344   - if(ptr) {
345   - *ptr = 0;
346   - myDir = g_strdup(buffer);
347   - } else {
348   - myDir = g_strdup(".");
349   - }
350   -
351   -
352   - } else {
353   -
354   - myDir = g_strdup(".");
355   -
356   - }
357   -
358   - debug("myDir=%s",myDir);
359   -
360   - exports = g_build_filename(myDir,"jvm-exports",NULL);
361   - g_mkdir_with_parents(exports,0777);
362   -
363   - lib3270_trace_event(v3270_get_session(widget),"java.class.path=%s;%s",dirname,exports);
364   - lib3270_trace_event(v3270_get_session(widget),"java.library.path=%s",myDir);
365   -
366   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",myDir);
367   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s;%s",dirname,exports);
368   -
369   - g_free(myDir);
370   - g_free(exports);
371   -
372   - // Windows, first find the method, then call it.
373   - jint JNICALL (*CreateJavaVM)(JavaVM **, void **, void *) = (jint JNICALL (*)(JavaVM **, void **, void *)) GetProcAddress(hJVM,"JNI_CreateJavaVM");
374   -
375   - if(!CreateJavaVM) {
376   - rc = ENOENT;
377   - } else {
378   - debug("Calling %s","CreateJavaVM");
379   - rc = CreateJavaVM(&jvm,(void **)&env,&vm_args);
380   - debug("%s exits with rc=%d","CreateJavaVM",rc);
381   - }
382   -
383   -#else
384   -
385   -#if defined(DEBUG)
386   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s:.bin/Debug:.bin/Debug/lib",JNIDIR);
387   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s:%s:./src/java/.bin/java",JARDIR,dirname);
388   -#else
389   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR);
390   - options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.class.path=%s:%s",JARDIR,dirname);
391   -#endif // JNIDIR
392   -
393   - // Linux, just create JVM
394   - rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args);
395   -
396   -#endif // _WIn32
397   -
398   - debug("JNI_CreateJavaVM exits with rc=%d",rc);
399   -
400   - g_free(dirname);
401   -
402   -
403   - // Release options
404   - for(int f=0;f<vm_args.nOptions;f++) {
405   - trace("Releasing option %d: %s",f,options[f].optionString);
406   - g_free(options[f].optionString);
407   - }
408   -
409   - if(rc < 0) {
410   -
411   - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
412   - GTK_DIALOG_DESTROY_WITH_PARENT,
413   - GTK_MESSAGE_ERROR,
414   - GTK_BUTTONS_CANCEL,
415   - "%s", _( "Can't create java VM" ));
416   -
417   - gtk_window_set_title(GTK_WINDOW(dialog), _( "Script startup failure" ));
418   - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),_( "The error code was %d" ), (int) rc);
419   -
420   - gtk_dialog_run(GTK_DIALOG (dialog));
421   - gtk_widget_destroy(dialog);
422   -
423   - } else {
424   -
425   - gchar * classname = g_path_get_basename(filename);
426   -
427   - gchar * ptr = strchr(classname,'.');
428   - if(ptr) {
429   - *ptr = 0;
430   - }
431   -
432   - jclass cls = env->FindClass(classname);
433   -
434   - if(cls == 0) {
435   -
436   - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
437   - GTK_DIALOG_DESTROY_WITH_PARENT,
438   - GTK_MESSAGE_ERROR,
439   - GTK_BUTTONS_CANCEL,
440   - _( "Can't find class %s" ), classname );
441   -
442   - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" ));
443   - if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
444   - gtk_main_quit();
445   - gtk_widget_destroy(dialog);
446   -
447   - } else {
448   -
449   - jmethodID mid = env->GetStaticMethodID(cls, "main", "([Ljava/lang/String;)V");
450   -
451   - if(mid == 0) {
452   -
453   - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
454   - GTK_DIALOG_DESTROY_WITH_PARENT,
455   - GTK_MESSAGE_ERROR,
456   - GTK_BUTTONS_OK_CANCEL,
457   - _( "Can't find class \"%s\"" ), classname );
458   -
459   - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" ));
460   -
461   - if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
462   - gtk_main_quit();
463   - gtk_widget_destroy(dialog);
464   -
465   - } else {
466   -
467   - jobjectArray args = env->NewObjectArray(0, env->FindClass("java/lang/String"), env->NewStringUTF(""));
468   -
469   - try {
470   -
471   - debug("%s: Calling CallStaticVoidMethod()",__FUNCTION__);
472   - env->CallStaticVoidMethod(cls, mid, args);
473   - debug("%s: CallStaticVoidMethod() has returned",__FUNCTION__);
474   -
475   - jthrowable exc = env->ExceptionOccurred();
476   - env->ExceptionClear();
477   -
478   - if (exc) {
479   - jclass throwable_class = env->FindClass("java/lang/Throwable");
480   -
481   - jmethodID jni_getMessage = env->GetMethodID(throwable_class,"getMessage","()Ljava/lang/String;");
482   - jstring j_msg = (jstring) env->CallObjectMethod(exc,jni_getMessage);
483   -
484   - GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
485   - GTK_DIALOG_DESTROY_WITH_PARENT,
486   - GTK_MESSAGE_ERROR,
487   - GTK_BUTTONS_OK_CANCEL,
488   - _( "Java application \"%s\" has failed." ), classname );
489   -
490   - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java failure" ));
491   -
492   - if(!env->IsSameObject(j_msg,NULL)) {
493   -
494   - const char * msg = env->GetStringUTFChars(j_msg, 0);
495   -
496   - debug("jni_getMessage = %s",msg);
497   - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",msg);
498   -
499   - env->ReleaseStringUTFChars( j_msg, msg);
500   - }
501   -
502   - if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
503   - gtk_main_quit();
504   - gtk_widget_destroy(dialog);
505   -
506   -
507   - }
508   -
509   - } catch(std::exception &e) {
510   -
511   - debug("Java error: %s",e.what());
512   - trace("%s",e.what());
513   - }
514   -
515   -
516   - }
517   -
518   - }
519   -
520   - g_free(classname);
521   -
522   - rc = jvm->DestroyJavaVM();
523   - debug("DestroyJavaVM=%d",(int) rc);
524   - }
525   -
526   -#ifdef _WIN32
527   - if(hJVM)
528   - FreeLibrary(hJVM);
529   -#endif // _WIN32
530   -
531   - // And release
532   - v3270_set_script(widget,'J',FALSE);
533 143  
534   - unlock();
535 144  
  145 + return 0;
536 146 }
537 147  
538 148 LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget)
... ... @@ -544,7 +154,7 @@ extern &quot;C&quot;
544 154 if(filename)
545 155 {
546 156 // Has filename, call it directly
547   - call_java_program(action,widget,filename);
  157 + call(widget,filename);
548 158 }
549 159 else
550 160 {
... ... @@ -574,7 +184,7 @@ extern &quot;C&quot;
574 184  
575 185 if(filename)
576 186 {
577   - call_java_program(action,widget,filename);
  187 + call(widget,filename);
578 188 g_free(filename);
579 189 }
580 190  
... ... @@ -583,5 +193,35 @@ extern &quot;C&quot;
583 193  
584 194 }
585 195  
586   -}
  196 + namespace PW3270_NAMESPACE {
  197 +
  198 + JavaVM * java::jvm = NULL;
  199 + JNIEnv * java::env = NULL;
  200 +
  201 + void java::lock() {
  202 +#if GTK_CHECK_VERSION(2,32,0)
  203 + g_mutex_lock(&mutex);
  204 +#else
  205 + g_static_mutex_lock(&mutex);
  206 +#endif // GTK_CHECK_VERSION
  207 + }
  208 +
  209 + void java::unlock() {
  210 +#if GTK_CHECK_VERSION(2,32,0)
  211 + g_mutex_unlock(&mutex);
  212 +#else
  213 + g_static_mutex_unlock(&mutex);
  214 +#endif // GTK_CHECK_VERSION
  215 + }
  216 +
  217 + bool java::trylock() {
  218 +#if GTK_CHECK_VERSION(2,32,0)
  219 + return g_mutex_trylock(&mutex);
  220 +#else
  221 + return g_static_mutex_trylock(&mutex);
  222 +#endif // GTK_CHECK_VERSION
  223 + }
  224 +
  225 + }
  226 +
587 227  
... ...