diff --git a/pw3270.cbp b/pw3270.cbp
index 07b4288..15fba74 100644
--- a/pw3270.cbp
+++ b/pw3270.cbp
@@ -114,6 +114,10 @@
+
+
+
+
@@ -174,6 +178,10 @@
+
+
+
+
diff --git a/src/java/Makefile.in b/src/java/Makefile.in
index 5859212..9b3ad1f 100644
--- a/src/java/Makefile.in
+++ b/src/java/Makefile.in
@@ -26,7 +26,7 @@
PACKAGE_NAME=@PACKAGE_NAME@
SOURCES=main.cc info.cc connect.cc getset.cc cursor.cc keyboard.cc actions.cc field.cc dialog.cc clipboard.cc
-PLUGIN_SRC=plugin.cc startstop.cc
+PLUGIN_SRC=plugin.cc startstop.cc call.cc
#---[ Paths ]------------------------------------------------------------------
diff --git a/src/java/call.cc b/src/java/call.cc
new file mode 100644
index 0000000..8376b23
--- /dev/null
+++ b/src/java/call.cc
@@ -0,0 +1,99 @@
+/*
+ * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270
+ * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a
+ * aplicativos mainframe. Registro no INPI sob o nome G3270.
+ *
+ * Copyright (C) <2008>
+ *
+ * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob
+ * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela
+ * Free Software Foundation.
+ *
+ * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER
+ * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO
+ * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para
+ * obter mais detalhes.
+ *
+ * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este
+ * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA, 02111-1307, USA
+ *
+ * Este programa está nomeado como call.cc e possui - linhas de código.
+ *
+ * Contatos:
+ *
+ * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck)
+ * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça)
+ *
+ */
+
+
+ #include "private.h"
+ #include
+
+
+/*---[ Implement ]----------------------------------------------------------------------------------*/
+
+namespace PW3270_NAMESPACE {
+
+
+ void java::call(GtkWidget *widget, const char *filename) {
+
+ if(!trylock()) {
+
+ failed(widget, _( "Can't access java virtual machine" ), "%s", strerror(EBUSY));
+ return;
+
+ }
+
+ if(jvm || load_jvm(widget)) {
+
+ v3270_set_script(widget,'J',TRUE);
+
+ gchar * dirname = g_path_get_dirname(filename);
+ gchar * classname = g_path_get_basename(filename);
+
+ gchar * ptr = strrchr(classname,'.');
+ if(ptr) {
+ *ptr = 0;
+ }
+
+
+
+ try {
+
+ jclass cls;
+ jmethodID mid;
+
+ // Atualizar o classpath
+ cls = env->FindClass("java.lang.System");
+ if(!cls) {
+ throw exception( _( "Can't find class %s" ), "java.lang.System");
+ }
+
+ mid = env->GetStaticMethodID(cls, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String");
+ if(!mid) {
+ throw exception( _( "Can't find method %s/%d" ), "java.lang.System","setProperty");
+ }
+
+
+
+ } catch(std::exception &e) {
+
+ failed(widget,_("Can't start java application"),"%s", e.what());
+
+ }
+
+ g_free(dirname);
+ g_free(classname);
+
+ v3270_set_script(widget,'J',FALSE);
+
+ }
+
+ unlock();
+
+
+ }
+
+}
diff --git a/src/java/private.h b/src/java/private.h
index cccb0e8..65d018b 100644
--- a/src/java/private.h
+++ b/src/java/private.h
@@ -62,6 +62,7 @@
bool trylock();
#ifdef PW3270_PLUGIN
+ bool load_jvm(GtkWidget *widget);
void call(GtkWidget *widget, const char *filename);
void failed(GtkWidget *widget, const char *msg, const char *format, ...);
#endif // PW3270_PLUGIN
diff --git a/src/java/startstop.cc b/src/java/startstop.cc
index 8558b22..a3f71e7 100644
--- a/src/java/startstop.cc
+++ b/src/java/startstop.cc
@@ -120,7 +120,9 @@ extern "C" {
#if GTK_CHECK_VERSION(2,32,0)
g_mutex_init(&mutex);
#endif // GTK_CHECK_VERSION
- set_java_session_factory(factory);
+
+ set_factory(factory);
+
return 0;
}
@@ -222,6 +224,84 @@ extern "C" {
#endif // GTK_CHECK_VERSION
}
+ void java::failed(GtkWidget *widget, const char *msg, const char *format, ...) {
+
+ GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)),
+ GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_MESSAGE_ERROR,
+ GTK_BUTTONS_OK_CANCEL,
+ "%s", msg );
+
+ gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" ));
+
+ if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL)
+ gtk_main_quit();
+ gtk_widget_destroy(dialog);
+
+ }
+
+
+#ifdef WIN32
+
+ bool java::load_jvm(GtkWidget *widget) {
+
+ #error Implementar
+
+ }
+
+
+
+#else
+
+ bool java::load_jvm(GtkWidget *widget) {
+
+ if(jvm != NULL) {
+ return true;
+ }
+
+ // Start JNI
+ JavaVMInitArgs vm_args;
+ JavaVMOption options[5];
+ jint rc = 0;
+
+
+ memset(&vm_args,0,sizeof(vm_args));
+ memset(options,0,sizeof(options));
+
+ vm_args.version = JNI_VERSION_1_4;
+ vm_args.nOptions = 0;
+ vm_args.options = options;
+ vm_args.ignoreUnrecognized = JNI_FALSE;
+
+ options[vm_args.nOptions].optionString = g_strdup("vfprintf");
+ options[vm_args.nOptions].extraInfo = (void *) jni_vfprintf;
+ vm_args.nOptions++;
+
+#if defined(DEBUG)
+
+// options[vm_args.nOptions++].optionString = g_strdup("-verbose");
+ options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s:.bin/Debug:.bin/Debug/lib",JNIDIR);
+
+#else
+
+ options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR);
+
+#endif // JNIDIR
+
+ // Linux, just create JVM
+ rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args);
+
+ if(rc) {
+ jvm = NULL;
+ failed(widget, _( "Can't create java virtual machine" ), _( "The return code was %d" ), (int) rc);
+ }
+
+ return jvm != NULL;
+ }
+
+
+#endif // WIN32
+
}
--
libgit2 0.21.2