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 |