Commit a3c6efb539d7d82d4b0eb2d109096aca82b45174

Authored by Perry Werneck
1 parent 958b8c48
Exists in master

Reimplementando módulo JNI

@@ -249,6 +249,7 @@ else @@ -249,6 +249,7 @@ else
249 249
250 fi 250 fi
251 251
  252 +CXXFLAGS="$CXXFLAGS -I$JDK_HOME/include -I$jniinc"
252 253
253 AC_SUBST(JVM_LIBS,$jvm_libs) 254 AC_SUBST(JVM_LIBS,$jvm_libs)
254 255
@@ -263,7 +264,6 @@ AC_SUBST(JAR) @@ -263,7 +264,6 @@ AC_SUBST(JAR)
263 AC_SUBST(jvm_arch) 264 AC_SUBST(jvm_arch)
264 AC_SUBST(JDK_HOME) 265 AC_SUBST(JDK_HOME)
265 AC_SUBST(JRE_HOME) 266 AC_SUBST(JRE_HOME)
266 -AC_SUBST(JNI_CPPFLAGS,"-I$JDK_HOME/include -I$jniinc")  
267 267
268 268
269 dnl --------------------------------------------------------------------------- 269 dnl ---------------------------------------------------------------------------
@@ -408,7 +408,7 @@ AC_ARG_ENABLE([pic], @@ -408,7 +408,7 @@ AC_ARG_ENABLE([pic],
408 ]) 408 ])
409 409
410 if test "$app_cv_pic" == "yes"; then 410 if test "$app_cv_pic" == "yes"; then
411 - CFLAGS="$CFLAGS -fPIC" 411 + CXXFLAGS="$CXXFLAGS -fPIC"
412 fi 412 fi
413 413
414 dnl --------------------------------------------------------------------------- 414 dnl ---------------------------------------------------------------------------
pw3270-java.cbp 0 → 100644
@@ -0,0 +1,59 @@ @@ -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,9 +25,9 @@
25 # 25 #
26 26
27 SOURCES=actions.cc clipboard.cc cursor.cc field.cc info.cc main.cc \ 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 #---[ Configuration values ]------------------------------------------------------------- 32 #---[ Configuration values ]-------------------------------------------------------------
33 33
@@ -68,7 +68,7 @@ JAVAH=@JAVAH@ @@ -68,7 +68,7 @@ JAVAH=@JAVAH@
68 JAVAC=@JAVAC@ 68 JAVAC=@JAVAC@
69 69
70 LIBS=-lpw3270cpp @LIBS@ @LIBICONV@ 70 LIBS=-lpw3270cpp @LIBS@ @LIBICONV@
71 -CXXFLAGS=@CXXFLAGS@ @JNI_CPPFLAGS@ 71 +CXXFLAGS=@CXXFLAGS@
72 LDFLAGS=@LDFLAGS@ 72 LDFLAGS=@LDFLAGS@
73 73
74 #---[ Rules ]---------------------------------------------------------------------------- 74 #---[ Rules ]----------------------------------------------------------------------------
@@ -82,7 +82,7 @@ $(OBJDBG)/%.o: \ @@ -82,7 +82,7 @@ $(OBJDBG)/%.o: \
82 82
83 @echo $< ... 83 @echo $< ...
84 @$(MKDIR) `dirname $@` 84 @$(MKDIR) `dirname $@`
85 - @$(CXX) $(CFLAGS) -fstack-check -DDEBUG=1 \ 85 + @$(CXX) $(CXXFLAGS) -fstack-check -DDEBUG=1 \
86 -DBUILD_DATE=`date +"0x%Y%m%d"`\ 86 -DBUILD_DATE=`date +"0x%Y%m%d"`\
87 -g -o $@ -c $< 87 -g -o $@ -c $<
88 88
@@ -93,7 +93,7 @@ $(OBJRLS)/%.o: \ @@ -93,7 +93,7 @@ $(OBJRLS)/%.o: \
93 93
94 @echo $< ... 94 @echo $< ...
95 @$(MKDIR) `dirname $@` 95 @$(MKDIR) `dirname $@`
96 - @$(CXX) $(CFLAGS) -DNDEBUG=1 \ 96 + @$(CXX) $(CXXFLAGS) -DNDEBUG=1 \
97 -DBUILD_DATE=`date +"0x%Y%m%d"` \ 97 -DBUILD_DATE=`date +"0x%Y%m%d"` \
98 -o $@ -c $< 98 -o $@ -c $<
99 99
@@ -125,3 +125,8 @@ $(BINDBG)/$(LIBNAME): \ @@ -125,3 +125,8 @@ $(BINDBG)/$(LIBNAME): \
125 @$(MKDIR) `dirname $@` 125 @$(MKDIR) `dirname $@`
126 @$(LD) -shared -Wl,-soname,$(notdir $@) $(LDFLAGS) -o $@ $^ $(LIBS) 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,8 +27,7 @@
27 * 27 *
28 */ 28 */
29 29
30 - #include "jni3270.h"  
31 - #include "private.h" 30 +#include "private.h"
32 31
33 /*---[ Implement ]----------------------------------------------------------------------------------*/ 32 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 33
@@ -40,7 +39,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_quit(JNIEnv *env, jobject obj) { @@ -40,7 +39,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_quit(JNIEnv *env, jobject obj) {
40 39
41 try { 40 try {
42 41
43 - rc = java::getHandle(env,obj)->quit(); 42 + rc = getHandle(env,obj)->quit();
44 43
45 } catch(std::exception &e) { 44 } catch(std::exception &e) {
46 45
@@ -59,7 +58,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase_1eof(JNIEnv *env, jobject obj) @@ -59,7 +58,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase_1eof(JNIEnv *env, jobject obj)
59 58
60 try { 59 try {
61 60
62 - rc = java::getHandle(env,obj)->erase_eof(); 61 + rc = getHandle(env,obj)->erase_eof();
63 62
64 } catch(std::exception &e) { 63 } catch(std::exception &e) {
65 64
@@ -78,7 +77,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase(JNIEnv *env, jobject obj) { @@ -78,7 +77,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase(JNIEnv *env, jobject obj) {
78 77
79 try { 78 try {
80 79
81 - rc = java::getHandle(env,obj)->erase(); 80 + rc = getHandle(env,obj)->erase();
82 81
83 } catch(std::exception &e) { 82 } catch(std::exception &e) {
84 83
@@ -96,7 +95,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase_1eol(JNIEnv *env, jobject obj) @@ -96,7 +95,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase_1eol(JNIEnv *env, jobject obj)
96 95
97 try { 96 try {
98 97
99 - rc = java::getHandle(env,obj)->erase_eol(); 98 + rc = getHandle(env,obj)->erase_eol();
100 99
101 } catch(std::exception &e) { 100 } catch(std::exception &e) {
102 101
@@ -115,7 +114,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase_1input(JNIEnv *env, jobject ob @@ -115,7 +114,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_erase_1input(JNIEnv *env, jobject ob
115 114
116 try { 115 try {
117 116
118 - rc = java::getHandle(env,obj)->erase_input(); 117 + rc = getHandle(env,obj)->erase_input();
119 118
120 } catch(std::exception &e) { 119 } catch(std::exception &e) {
121 120
@@ -135,7 +134,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_print(JNIEnv *env, jobject obj) { @@ -135,7 +134,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_print(JNIEnv *env, jobject obj) {
135 134
136 try { 135 try {
137 136
138 - rc = java::getHandle(env,obj)->print(); 137 + rc = getHandle(env,obj)->print();
139 138
140 } catch(std::exception &e) { 139 } catch(std::exception &e) {
141 140
@@ -155,7 +154,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_action(JNIEnv *env, jobject obj, jst @@ -155,7 +154,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_action(JNIEnv *env, jobject obj, jst
155 154
156 try { 155 try {
157 156
158 - rc = java::getHandle(env,obj)->action(name); 157 + rc = getHandle(env,obj)->action(name);
159 158
160 } catch(std::exception &e) { 159 } catch(std::exception &e) {
161 160
src/jni/call.cc
@@ -1,165 +0,0 @@ @@ -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,7 +33,6 @@
33 /*---[ Implement ]----------------------------------------------------------------------------------*/ 33 /*---[ Implement ]----------------------------------------------------------------------------------*/
34 34
35 using namespace std; 35 using namespace std;
36 -using namespace PW3270_NAMESPACE::java;  
37 36
38 JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1copy(JNIEnv *env, jobject obj, jstring j_str) { 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,7 +41,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_connect(JNIEnv *env, jobject obj, js
41 41
42 try { 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 } catch(std::exception &e) { 46 } catch(std::exception &e) {
47 47
@@ -60,7 +60,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_disconnect(JNIEnv *env, jobject obj) @@ -60,7 +60,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_disconnect(JNIEnv *env, jobject obj)
60 60
61 try { 61 try {
62 62
63 - return (jint) java::getHandle(env,obj)->disconnect(); 63 + return (jint) getHandle(env,obj)->disconnect();
64 64
65 } catch(std::exception &e) { 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,7 +40,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1cursor_1position(JNIEnv *env, j
40 40
41 try { 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 } catch(std::exception &e) { 45 } catch(std::exception &e) {
46 46
@@ -59,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1cursor_1addr(JNIEnv *env, jobje @@ -59,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1cursor_1addr(JNIEnv *env, jobje
59 59
60 try { 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 } catch(std::exception &e) { 64 } catch(std::exception &e) {
65 65
@@ -79,7 +79,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1cursor_1addr(JNIEnv *env, jobje @@ -79,7 +79,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1cursor_1addr(JNIEnv *env, jobje
79 79
80 try { 80 try {
81 81
82 - rc = java::getHandle(env,obj)->get_cursor_addr(); 82 + rc = getHandle(env,obj)->get_cursor_addr();
83 83
84 } catch(std::exception &e) { 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,7 +43,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_popup_1dialog(JNIEnv *env, jobject o
43 43
44 try { 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 } catch(std::exception &e) { 48 } catch(std::exception &e) {
49 49
@@ -71,7 +71,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_file_1chooser_1dialog(JNIEnv *env @@ -71,7 +71,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_file_1chooser_1dialog(JNIEnv *env
71 71
72 try { 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 } catch(std::exception &e) { 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,7 +40,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1start (JNIEnv *env, jobj
40 40
41 try { 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 } catch(std::exception &e) { 46 } catch(std::exception &e) {
@@ -59,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1len (JNIEnv *env, jobjec @@ -59,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1field_1len (JNIEnv *env, jobjec
59 59
60 try { 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 } catch(std::exception &e) { 65 } catch(std::exception &e) {
@@ -78,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1next_1unprotected(JNIEnv *env, @@ -78,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1next_1unprotected(JNIEnv *env,
78 78
79 try { 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 } catch(std::exception &e) { 84 } catch(std::exception &e) {
@@ -98,7 +98,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1is_1protected(JNIEnv *env, jobj @@ -98,7 +98,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1is_1protected(JNIEnv *env, jobj
98 98
99 try { 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 } catch(std::exception &e) { 104 } catch(std::exception &e) {
@@ -118,7 +118,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1is_1protected_1at(JNIEnv *env, @@ -118,7 +118,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1is_1protected_1at(JNIEnv *env,
118 118
119 try { 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 } catch(std::exception &e) { 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,7 +41,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_toString(JNIEnv *env, jobject obj
41 41
42 try { 42 try {
43 43
44 - str = java::getHandle(env,obj)->get_string(); 44 + str = getHandle(env,obj)->get_string();
45 45
46 } catch(std::exception &e) { 46 } catch(std::exception &e) {
47 47
@@ -59,7 +59,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string(JNIEnv *env, jobject @@ -59,7 +59,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string(JNIEnv *env, jobject
59 59
60 try { 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 } catch(std::exception &e) { 65 } catch(std::exception &e) {
@@ -78,7 +78,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string_1at(JNIEnv *env, jobj @@ -78,7 +78,7 @@ JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1string_1at(JNIEnv *env, jobj
78 78
79 try { 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 } catch(std::exception &e) { 84 } catch(std::exception &e) {
@@ -98,7 +98,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1string_1at(JNIEnv *env, jobject @@ -98,7 +98,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_set_1string_1at(JNIEnv *env, jobject
98 98
99 try { 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 } catch(std::exception &e) { 103 } catch(std::exception &e) {
104 104
@@ -121,7 +121,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_cmp_1string_1at(JNIEnv *env, jobject @@ -121,7 +121,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_cmp_1string_1at(JNIEnv *env, jobject
121 121
122 try { 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 } catch(std::exception &e) { 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,7 +145,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_wait_1for_1string_1at(JNIEnv *env, j
145 145
146 try { 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 } catch(std::exception &e) { 150 } catch(std::exception &e) {
151 151
@@ -168,7 +168,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_input_1string(JNIEnv *env, jobject o @@ -168,7 +168,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_input_1string(JNIEnv *env, jobject o
168 168
169 try { 169 try {
170 170
171 - rc = java::getHandle(env,obj)->input_string(str); 171 + rc = getHandle(env,obj)->input_string(str);
172 172
173 } catch(std::exception &e) { 173 } catch(std::exception &e) {
174 174
@@ -189,7 +189,7 @@ JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1connected(JNIEnv *env, jobje @@ -189,7 +189,7 @@ JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1connected(JNIEnv *env, jobje
189 189
190 try { 190 try {
191 191
192 - rc = java::getHandle(env,obj)->is_connected(); 192 + rc = getHandle(env,obj)->is_connected();
193 193
194 } catch(std::exception &e) { 194 } catch(std::exception &e) {
195 195
@@ -209,7 +209,7 @@ JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1ready(JNIEnv *env, jobject o @@ -209,7 +209,7 @@ JNIEXPORT jboolean JNICALL Java_pw3270_terminal_is_1ready(JNIEnv *env, jobject o
209 209
210 try { 210 try {
211 211
212 - rc = java::getHandle(env,obj)->is_ready(); 212 + rc = getHandle(env,obj)->is_ready();
213 213
214 } catch(std::exception &e) { 214 } catch(std::exception &e) {
215 215
@@ -226,7 +226,7 @@ JNIEXPORT void JNICALL Java_pw3270_terminal_set_1unlock_1delay(JNIEnv *env, jobj @@ -226,7 +226,7 @@ JNIEXPORT void JNICALL Java_pw3270_terminal_set_1unlock_1delay(JNIEnv *env, jobj
226 226
227 try { 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 } catch(std::exception &e) { 231 } catch(std::exception &e) {
232 232
src/jni/info.cc
@@ -37,21 +37,21 @@ using namespace PW3270_NAMESPACE; @@ -37,21 +37,21 @@ using namespace PW3270_NAMESPACE;
37 37
38 JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1version (JNIEnv *env, jobject obj) { 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 return env->NewStringUTF(s->get_version().c_str()); 41 return env->NewStringUTF(s->get_version().c_str());
42 42
43 } 43 }
44 44
45 JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1revision(JNIEnv *env, jobject obj) { 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 return env->NewStringUTF(s->get_revision().c_str()); 48 return env->NewStringUTF(s->get_revision().c_str());
49 49
50 } 50 }
51 51
52 JNIEXPORT jstring JNICALL Java_pw3270_terminal_get_1encoding(JNIEnv *env, jobject obj) { 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 return env->NewStringUTF(s->get_encoding()); 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,7 +62,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_get_1secure(JNIEnv *env, jobject obj
62 62
63 try { 63 try {
64 64
65 - rc = java::getHandle(env,obj)->get_secure(); 65 + rc = getHandle(env,obj)->get_secure();
66 66
67 } catch(std::exception &e) { 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,7 +40,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_enter(JNIEnv *env, jobject obj) {
40 40
41 try { 41 try {
42 42
43 - rc = java::getHandle(env,obj)->enter(); 43 + rc = getHandle(env,obj)->enter();
44 44
45 } catch(std::exception &e) { 45 } catch(std::exception &e) {
46 46
@@ -59,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_pfkey(JNIEnv *env, jobject obj, jint @@ -59,7 +59,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_pfkey(JNIEnv *env, jobject obj, jint
59 59
60 try { 60 try {
61 61
62 - rc = java::getHandle(env,obj)->pfkey((int) key); 62 + rc = getHandle(env,obj)->pfkey((int) key);
63 63
64 } catch(std::exception &e) { 64 } catch(std::exception &e) {
65 65
@@ -78,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_pakey(JNIEnv *env, jobject obj, jint @@ -78,7 +78,7 @@ JNIEXPORT jint JNICALL Java_pw3270_terminal_pakey(JNIEnv *env, jobject obj, jint
78 78
79 try { 79 try {
80 80
81 - rc = java::getHandle(env,obj)->pakey((int) key); 81 + rc = getHandle(env,obj)->pakey((int) key);
82 82
83 } catch(std::exception &e) { 83 } catch(std::exception &e) {
84 84
src/jni/main.cc
@@ -30,25 +30,21 @@ @@ -30,25 +30,21 @@
30 #include "jni3270.h" 30 #include "jni3270.h"
31 #include "private.h" 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 JNIEXPORT jint JNICALL Java_pw3270_terminal_init__(JNIEnv *env, jobject obj) { 49 JNIEXPORT jint JNICALL Java_pw3270_terminal_init__(JNIEnv *env, jobject obj) {
54 50
src/jni/private.h 0 → 100644
@@ -0,0 +1,41 @@ @@ -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,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 @@ @@ -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 @@ @@ -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 +