Commit 137bb9df0a68e590f66dd0f7b3d8e3b8bf12ce58
1 parent
21a36f03
Exists in
master
and in
5 other branches
Reimplementando plugin java de forma mais organizada
Showing
5 changed files
with
190 additions
and
2 deletions
Show diff stats
pw3270.cbp
| @@ -114,6 +114,10 @@ | @@ -114,6 +114,10 @@ | ||
| 114 | <Option target="Debug" /> | 114 | <Option target="Debug" /> |
| 115 | <Option target="Release" /> | 115 | <Option target="Release" /> |
| 116 | </Unit> | 116 | </Unit> |
| 117 | + <Unit filename="src/java/call.cc"> | ||
| 118 | + <Option target="Debug" /> | ||
| 119 | + <Option target="Release" /> | ||
| 120 | + </Unit> | ||
| 117 | <Unit filename="src/java/clipboard.cc"> | 121 | <Unit filename="src/java/clipboard.cc"> |
| 118 | <Option target="Debug" /> | 122 | <Option target="Debug" /> |
| 119 | <Option target="Release" /> | 123 | <Option target="Release" /> |
| @@ -174,6 +178,10 @@ | @@ -174,6 +178,10 @@ | ||
| 174 | <Option target="Debug" /> | 178 | <Option target="Debug" /> |
| 175 | <Option target="Release" /> | 179 | <Option target="Release" /> |
| 176 | </Unit> | 180 | </Unit> |
| 181 | + <Unit filename="src/java/startstop.cc"> | ||
| 182 | + <Option target="Debug" /> | ||
| 183 | + <Option target="Release" /> | ||
| 184 | + </Unit> | ||
| 177 | <Unit filename="src/java/terminal.java"> | 185 | <Unit filename="src/java/terminal.java"> |
| 178 | <Option target="Debug" /> | 186 | <Option target="Debug" /> |
| 179 | <Option target="Release" /> | 187 | <Option target="Release" /> |
src/java/Makefile.in
| @@ -26,7 +26,7 @@ | @@ -26,7 +26,7 @@ | ||
| 26 | 26 | ||
| 27 | PACKAGE_NAME=@PACKAGE_NAME@ | 27 | PACKAGE_NAME=@PACKAGE_NAME@ |
| 28 | SOURCES=main.cc info.cc connect.cc getset.cc cursor.cc keyboard.cc actions.cc field.cc dialog.cc clipboard.cc | 28 | SOURCES=main.cc info.cc connect.cc getset.cc cursor.cc keyboard.cc actions.cc field.cc dialog.cc clipboard.cc |
| 29 | -PLUGIN_SRC=plugin.cc startstop.cc | 29 | +PLUGIN_SRC=plugin.cc startstop.cc call.cc |
| 30 | 30 | ||
| 31 | #---[ Paths ]------------------------------------------------------------------ | 31 | #---[ Paths ]------------------------------------------------------------------ |
| 32 | 32 |
| @@ -0,0 +1,99 @@ | @@ -0,0 +1,99 @@ | ||
| 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 <pw3270/v3270.h> | ||
| 33 | + | ||
| 34 | + | ||
| 35 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | ||
| 36 | + | ||
| 37 | +namespace PW3270_NAMESPACE { | ||
| 38 | + | ||
| 39 | + | ||
| 40 | + void java::call(GtkWidget *widget, const char *filename) { | ||
| 41 | + | ||
| 42 | + if(!trylock()) { | ||
| 43 | + | ||
| 44 | + failed(widget, _( "Can't access java virtual machine" ), "%s", strerror(EBUSY)); | ||
| 45 | + return; | ||
| 46 | + | ||
| 47 | + } | ||
| 48 | + | ||
| 49 | + if(jvm || load_jvm(widget)) { | ||
| 50 | + | ||
| 51 | + v3270_set_script(widget,'J',TRUE); | ||
| 52 | + | ||
| 53 | + gchar * dirname = g_path_get_dirname(filename); | ||
| 54 | + gchar * classname = g_path_get_basename(filename); | ||
| 55 | + | ||
| 56 | + gchar * ptr = strrchr(classname,'.'); | ||
| 57 | + if(ptr) { | ||
| 58 | + *ptr = 0; | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + | ||
| 62 | + | ||
| 63 | + try { | ||
| 64 | + | ||
| 65 | + jclass cls; | ||
| 66 | + jmethodID mid; | ||
| 67 | + | ||
| 68 | + // Atualizar o classpath | ||
| 69 | + cls = env->FindClass("java.lang.System"); | ||
| 70 | + if(!cls) { | ||
| 71 | + throw exception( _( "Can't find class %s" ), "java.lang.System"); | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + mid = env->GetStaticMethodID(cls, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String"); | ||
| 75 | + if(!mid) { | ||
| 76 | + throw exception( _( "Can't find method %s/%d" ), "java.lang.System","setProperty"); | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + | ||
| 80 | + | ||
| 81 | + } catch(std::exception &e) { | ||
| 82 | + | ||
| 83 | + failed(widget,_("Can't start java application"),"%s", e.what()); | ||
| 84 | + | ||
| 85 | + } | ||
| 86 | + | ||
| 87 | + g_free(dirname); | ||
| 88 | + g_free(classname); | ||
| 89 | + | ||
| 90 | + v3270_set_script(widget,'J',FALSE); | ||
| 91 | + | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + unlock(); | ||
| 95 | + | ||
| 96 | + | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | +} |
src/java/private.h
| @@ -62,6 +62,7 @@ | @@ -62,6 +62,7 @@ | ||
| 62 | bool trylock(); | 62 | bool trylock(); |
| 63 | 63 | ||
| 64 | #ifdef PW3270_PLUGIN | 64 | #ifdef PW3270_PLUGIN |
| 65 | + bool load_jvm(GtkWidget *widget); | ||
| 65 | void call(GtkWidget *widget, const char *filename); | 66 | void call(GtkWidget *widget, const char *filename); |
| 66 | void failed(GtkWidget *widget, const char *msg, const char *format, ...); | 67 | void failed(GtkWidget *widget, const char *msg, const char *format, ...); |
| 67 | #endif // PW3270_PLUGIN | 68 | #endif // PW3270_PLUGIN |
src/java/startstop.cc
| @@ -120,7 +120,9 @@ extern "C" { | @@ -120,7 +120,9 @@ extern "C" { | ||
| 120 | #if GTK_CHECK_VERSION(2,32,0) | 120 | #if GTK_CHECK_VERSION(2,32,0) |
| 121 | g_mutex_init(&mutex); | 121 | g_mutex_init(&mutex); |
| 122 | #endif // GTK_CHECK_VERSION | 122 | #endif // GTK_CHECK_VERSION |
| 123 | - set_java_session_factory(factory); | 123 | + |
| 124 | + set_factory(factory); | ||
| 125 | + | ||
| 124 | return 0; | 126 | return 0; |
| 125 | } | 127 | } |
| 126 | 128 | ||
| @@ -222,6 +224,84 @@ extern "C" { | @@ -222,6 +224,84 @@ extern "C" { | ||
| 222 | #endif // GTK_CHECK_VERSION | 224 | #endif // GTK_CHECK_VERSION |
| 223 | } | 225 | } |
| 224 | 226 | ||
| 227 | + void java::failed(GtkWidget *widget, const char *msg, const char *format, ...) { | ||
| 228 | + | ||
| 229 | + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | ||
| 230 | + GTK_DIALOG_DESTROY_WITH_PARENT, | ||
| 231 | + GTK_MESSAGE_ERROR, | ||
| 232 | + GTK_BUTTONS_OK_CANCEL, | ||
| 233 | + "%s", msg ); | ||
| 234 | + | ||
| 235 | + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" )); | ||
| 236 | + | ||
| 237 | + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) | ||
| 238 | + gtk_main_quit(); | ||
| 239 | + gtk_widget_destroy(dialog); | ||
| 240 | + | ||
| 241 | + } | ||
| 242 | + | ||
| 243 | + | ||
| 244 | +#ifdef WIN32 | ||
| 245 | + | ||
| 246 | + bool java::load_jvm(GtkWidget *widget) { | ||
| 247 | + | ||
| 248 | + #error Implementar | ||
| 249 | + | ||
| 250 | + } | ||
| 251 | + | ||
| 252 | + | ||
| 253 | + | ||
| 254 | +#else | ||
| 255 | + | ||
| 256 | + bool java::load_jvm(GtkWidget *widget) { | ||
| 257 | + | ||
| 258 | + if(jvm != NULL) { | ||
| 259 | + return true; | ||
| 260 | + } | ||
| 261 | + | ||
| 262 | + // Start JNI | ||
| 263 | + JavaVMInitArgs vm_args; | ||
| 264 | + JavaVMOption options[5]; | ||
| 265 | + jint rc = 0; | ||
| 266 | + | ||
| 267 | + | ||
| 268 | + memset(&vm_args,0,sizeof(vm_args)); | ||
| 269 | + memset(options,0,sizeof(options)); | ||
| 270 | + | ||
| 271 | + vm_args.version = JNI_VERSION_1_4; | ||
| 272 | + vm_args.nOptions = 0; | ||
| 273 | + vm_args.options = options; | ||
| 274 | + vm_args.ignoreUnrecognized = JNI_FALSE; | ||
| 275 | + | ||
| 276 | + options[vm_args.nOptions].optionString = g_strdup("vfprintf"); | ||
| 277 | + options[vm_args.nOptions].extraInfo = (void *) jni_vfprintf; | ||
| 278 | + vm_args.nOptions++; | ||
| 279 | + | ||
| 280 | +#if defined(DEBUG) | ||
| 281 | + | ||
| 282 | +// options[vm_args.nOptions++].optionString = g_strdup("-verbose"); | ||
| 283 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s:.bin/Debug:.bin/Debug/lib",JNIDIR); | ||
| 284 | + | ||
| 285 | +#else | ||
| 286 | + | ||
| 287 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR); | ||
| 288 | + | ||
| 289 | +#endif // JNIDIR | ||
| 290 | + | ||
| 291 | + // Linux, just create JVM | ||
| 292 | + rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args); | ||
| 293 | + | ||
| 294 | + if(rc) { | ||
| 295 | + jvm = NULL; | ||
| 296 | + failed(widget, _( "Can't create java virtual machine" ), _( "The return code was %d" ), (int) rc); | ||
| 297 | + } | ||
| 298 | + | ||
| 299 | + return jvm != NULL; | ||
| 300 | + } | ||
| 301 | + | ||
| 302 | + | ||
| 303 | +#endif // WIN32 | ||
| 304 | + | ||
| 225 | } | 305 | } |
| 226 | 306 | ||
| 227 | 307 |