Commit 5555ae85f525505c9c2681bb0fbfd269f5cb7aa4

Authored by perry.werneck@gmail.com
1 parent 687a562d

Tratando erros ao chamar aplicação java

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 &quot;C&quot;
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 &quot;C&quot;
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 &quot;C&quot;
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 &quot;C&quot;
700 768  
701 769 g_free(classname);
702 770  
703   - exit(-1);
704   -
705 771 jvm->DestroyJavaVM();
706 772 }
707 773  
... ...
src/java/sample/except.java 0 → 100644
... ... @@ -0,0 +1,11 @@
  1 +public class except
  2 +{
  3 + public static void main (String[] args) throws Exception
  4 + {
  5 + throw new Exception("Testing exceptions");
  6 + }
  7 +};
  8 +
  9 +
  10 +
  11 +
... ...
src/java/sample/out.java 0 → 100755
... ... @@ -0,0 +1,9 @@
  1 +
  2 +public class out
  3 +{
  4 + public static void main (String[] args)
  5 + {
  6 + System.out.println("Test out");
  7 + System.err.println("Test err");
  8 + }
  9 +};
... ...