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 | ... | ... |