Commit 5555ae85f525505c9c2681bb0fbfd269f5cb7aa4
1 parent
687a562d
Exists in
master
and in
5 other branches
Tratando erros ao chamar aplicação java
Showing
3 changed files
with
95 additions
and
9 deletions
Show diff stats
src/java/plugin.cc
@@ -44,6 +44,7 @@ | @@ -44,6 +44,7 @@ | ||
44 | 44 | ||
45 | #include "private.h" | 45 | #include "private.h" |
46 | 46 | ||
47 | + #include <malloc.h> | ||
47 | #include <libintl.h> | 48 | #include <libintl.h> |
48 | #include <glib/gi18n.h> | 49 | #include <glib/gi18n.h> |
49 | #include <gtk/gtk.h> | 50 | #include <gtk/gtk.h> |
@@ -56,6 +57,7 @@ | @@ -56,6 +57,7 @@ | ||
56 | #include <lib3270/trace.h> | 57 | #include <lib3270/trace.h> |
57 | #include <lib3270/charset.h> | 58 | #include <lib3270/charset.h> |
58 | #include <pw3270/class.h> | 59 | #include <pw3270/class.h> |
60 | + #include <pw3270/trace.h> | ||
59 | 61 | ||
60 | 62 | ||
61 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ | 63 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ |
@@ -323,15 +325,46 @@ | @@ -323,15 +325,46 @@ | ||
323 | 325 | ||
324 | extern "C" { | 326 | extern "C" { |
325 | 327 | ||
326 | - static session * factory(const char *name) | ||
327 | - { | 328 | + static session * factory(const char *name) { |
328 | debug("---> %s",__FUNCTION__); | 329 | debug("---> %s",__FUNCTION__); |
329 | return new plugin(lib3270_get_default_session_handle()); | 330 | return new plugin(lib3270_get_default_session_handle()); |
330 | } | 331 | } |
331 | 332 | ||
332 | - static jint JNICALL jni_vfprintf(FILE *fp, const char *format, va_list args) | ||
333 | - { | ||
334 | - lib3270_write_va_log(lib3270_get_default_session_handle(),"java",format,args); | 333 | + static void trace_cleanup(GtkWidget *widget, GtkWidget **window) { |
334 | + *window = NULL; | ||
335 | + } | ||
336 | + | ||
337 | + static jint JNICALL jni_vfprintf(FILE *fp, const char *fmt, va_list args) { | ||
338 | + | ||
339 | + char * msg = NULL; | ||
340 | + static GtkWidget * trace = NULL; | ||
341 | + | ||
342 | + if(vasprintf(&msg,fmt,args) < 1) { | ||
343 | + lib3270_write_log(lib3270_get_default_session_handle(),"java","vasprintf() error on \"%s\"",fmt); | ||
344 | + return 0; | ||
345 | + } | ||
346 | + | ||
347 | + fprintf(fp,"%s",msg); | ||
348 | + lib3270_write_log(lib3270_get_default_session_handle(),"java","%s",msg); | ||
349 | + | ||
350 | + if(!trace) { | ||
351 | + // Cria janela de trace. | ||
352 | + trace = pw3270_trace_new(); | ||
353 | + g_signal_connect(G_OBJECT(trace), "destroy",G_CALLBACK(trace_cleanup), &trace); | ||
354 | + | ||
355 | + pw3270_trace_set_destroy_on_close(trace,TRUE); | ||
356 | + | ||
357 | + // gtk_window_set_transient_for(GTK_WINDOW(trace),GTK_WINDOW(gtk_widget_get_toplevel(widget))); | ||
358 | + gtk_window_set_destroy_with_parent(GTK_WINDOW(trace),TRUE); | ||
359 | + | ||
360 | + gtk_window_set_default_size(GTK_WINDOW(trace),590,430); | ||
361 | + gtk_widget_show_all(trace); | ||
362 | + | ||
363 | + pw3270_trace_printf(trace,"%s",msg); | ||
364 | + | ||
365 | + free(msg); | ||
366 | + } | ||
367 | + | ||
335 | return 0; | 368 | return 0; |
336 | } | 369 | } |
337 | 370 | ||
@@ -655,7 +688,7 @@ extern "C" | @@ -655,7 +688,7 @@ extern "C" | ||
655 | GTK_BUTTONS_CANCEL, | 688 | GTK_BUTTONS_CANCEL, |
656 | _( "Can't find class %s" ), classname ); | 689 | _( "Can't find class %s" ), classname ); |
657 | 690 | ||
658 | - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java script failure" )); | 691 | + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" )); |
659 | if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) | 692 | if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) |
660 | gtk_main_quit(); | 693 | gtk_main_quit(); |
661 | gtk_widget_destroy(dialog); | 694 | gtk_widget_destroy(dialog); |
@@ -672,7 +705,8 @@ extern "C" | @@ -672,7 +705,8 @@ extern "C" | ||
672 | GTK_BUTTONS_OK_CANCEL, | 705 | GTK_BUTTONS_OK_CANCEL, |
673 | _( "Can't find class \"%s\"" ), classname ); | 706 | _( "Can't find class \"%s\"" ), classname ); |
674 | 707 | ||
675 | - gtk_window_set_title(GTK_WINDOW(dialog), _( "Java script failure" )); | 708 | + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" )); |
709 | + | ||
676 | if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) | 710 | if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) |
677 | gtk_main_quit(); | 711 | gtk_main_quit(); |
678 | gtk_widget_destroy(dialog); | 712 | gtk_widget_destroy(dialog); |
@@ -687,6 +721,40 @@ extern "C" | @@ -687,6 +721,40 @@ extern "C" | ||
687 | env->CallStaticVoidMethod(cls, mid, args); | 721 | env->CallStaticVoidMethod(cls, mid, args); |
688 | debug("%s: CallStaticVoidMethod() has returned",__FUNCTION__); | 722 | debug("%s: CallStaticVoidMethod() has returned",__FUNCTION__); |
689 | 723 | ||
724 | + jthrowable exc = env->ExceptionOccurred(); | ||
725 | + env->ExceptionClear(); | ||
726 | + | ||
727 | + if (exc) { | ||
728 | + jclass throwable_class = env->FindClass("java/lang/Throwable"); | ||
729 | + | ||
730 | + jmethodID jni_getMessage = env->GetMethodID(throwable_class,"getMessage","()Ljava/lang/String;"); | ||
731 | + jstring j_msg = (jstring) env->CallObjectMethod(exc,jni_getMessage); | ||
732 | + | ||
733 | + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | ||
734 | + GTK_DIALOG_DESTROY_WITH_PARENT, | ||
735 | + GTK_MESSAGE_ERROR, | ||
736 | + GTK_BUTTONS_OK_CANCEL, | ||
737 | + _( "Java application \"%s\" has failed." ), classname ); | ||
738 | + | ||
739 | + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java failure" )); | ||
740 | + | ||
741 | + if(!env->IsSameObject(j_msg,NULL)) { | ||
742 | + | ||
743 | + const char * msg = env->GetStringUTFChars(j_msg, 0); | ||
744 | + | ||
745 | + debug("jni_getMessage = %s",msg); | ||
746 | + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",msg); | ||
747 | + | ||
748 | + env->ReleaseStringUTFChars( j_msg, msg); | ||
749 | + } | ||
750 | + | ||
751 | + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) | ||
752 | + gtk_main_quit(); | ||
753 | + gtk_widget_destroy(dialog); | ||
754 | + | ||
755 | + | ||
756 | + } | ||
757 | + | ||
690 | } catch(std::exception &e) { | 758 | } catch(std::exception &e) { |
691 | 759 | ||
692 | debug("Java error: %s",e.what()); | 760 | debug("Java error: %s",e.what()); |
@@ -700,8 +768,6 @@ extern "C" | @@ -700,8 +768,6 @@ extern "C" | ||
700 | 768 | ||
701 | g_free(classname); | 769 | g_free(classname); |
702 | 770 | ||
703 | - exit(-1); | ||
704 | - | ||
705 | jvm->DestroyJavaVM(); | 771 | jvm->DestroyJavaVM(); |
706 | } | 772 | } |
707 | 773 |