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 | 44 | |
45 | 45 | #include "private.h" |
46 | 46 | |
47 | + #include <malloc.h> | |
47 | 48 | #include <libintl.h> |
48 | 49 | #include <glib/gi18n.h> |
49 | 50 | #include <gtk/gtk.h> |
... | ... | @@ -56,6 +57,7 @@ |
56 | 57 | #include <lib3270/trace.h> |
57 | 58 | #include <lib3270/charset.h> |
58 | 59 | #include <pw3270/class.h> |
60 | + #include <pw3270/trace.h> | |
59 | 61 | |
60 | 62 | |
61 | 63 | /*--[ Globals ]--------------------------------------------------------------------------------------*/ |
... | ... | @@ -323,15 +325,46 @@ |
323 | 325 | |
324 | 326 | extern "C" { |
325 | 327 | |
326 | - static session * factory(const char *name) | |
327 | - { | |
328 | + static session * factory(const char *name) { | |
328 | 329 | debug("---> %s",__FUNCTION__); |
329 | 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 | 368 | return 0; |
336 | 369 | } |
337 | 370 | |
... | ... | @@ -655,7 +688,7 @@ extern "C" |
655 | 688 | GTK_BUTTONS_CANCEL, |
656 | 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 | 692 | if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) |
660 | 693 | gtk_main_quit(); |
661 | 694 | gtk_widget_destroy(dialog); |
... | ... | @@ -672,7 +705,8 @@ extern "C" |
672 | 705 | GTK_BUTTONS_OK_CANCEL, |
673 | 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 | 710 | if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) |
677 | 711 | gtk_main_quit(); |
678 | 712 | gtk_widget_destroy(dialog); |
... | ... | @@ -687,6 +721,40 @@ extern "C" |
687 | 721 | env->CallStaticVoidMethod(cls, mid, args); |
688 | 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 | 758 | } catch(std::exception &e) { |
691 | 759 | |
692 | 760 | debug("Java error: %s",e.what()); |
... | ... | @@ -700,8 +768,6 @@ extern "C" |
700 | 768 | |
701 | 769 | g_free(classname); |
702 | 770 | |
703 | - exit(-1); | |
704 | - | |
705 | 771 | jvm->DestroyJavaVM(); |
706 | 772 | } |
707 | 773 | ... | ... |