diff --git a/src/java/main.cc b/src/java/main.cc index 67fe8b0..5809ae2 100644 --- a/src/java/main.cc +++ b/src/java/main.cc @@ -34,11 +34,6 @@ namespace PW3270_NAMESPACE { - void java::set_factory(PW3270_NAMESPACE::session * (*factory)(const char *name)) { - trace("%s(%p)",__FUNCTION__,factory); - session::set_plugin(factory); - } - jfieldID java::getHandleField(JNIEnv *env, jobject obj) { jclass c = env->GetObjectClass(obj); // J is the type signature for long: diff --git a/src/java/plugin.cc b/src/java/plugin.cc index 532b6b9..194bc4a 100644 --- a/src/java/plugin.cc +++ b/src/java/plugin.cc @@ -325,12 +325,76 @@ /*---[ Implement ]----------------------------------------------------------------------------------*/ +namespace PW3270_NAMESPACE { + + void java::lock() { +#if GTK_CHECK_VERSION(2,32,0) + g_mutex_lock(&mutex); +#else + g_static_mutex_lock(&mutex); +#endif // GTK_CHECK_VERSION + } + + void java::unlock() { +#if GTK_CHECK_VERSION(2,32,0) + g_mutex_unlock(&mutex); +#else + g_static_mutex_unlock(&mutex); +#endif // GTK_CHECK_VERSION + } + + bool java::trylock() { +#if GTK_CHECK_VERSION(2,32,0) + return g_mutex_trylock(&mutex); +#else + return g_static_mutex_trylock(&mutex); +#endif // GTK_CHECK_VERSION + } + +} + +using namespace PW3270_NAMESPACE; + extern "C" { - PW3270_NAMESPACE::session * factory(const char *name) { + static PW3270_NAMESPACE::session * factory(const char *name) { debug("---> %s",__FUNCTION__); return new plugin(lib3270_get_default_session_handle()); } + LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window) { + + trace("JAVA: %s",__FUNCTION__); + + #if GTK_CHECK_VERSION(2,32,0) + g_mutex_init(&mutex); + #endif // GTK_CHECK_VERSION + + session::set_plugin(factory); + + return 0; + } + + LIB3270_EXPORT int pw3270_plugin_stop(GtkWidget *window) { + + java::lock(); + + if(java::jvm) { + java::jvm->DestroyJavaVM(); + java::jvm = NULL; + } + + java::unlock(); + + #if GTK_CHECK_VERSION(2,32,0) + g_mutex_clear(&mutex); + #endif // GTK_CHECK_VERSION + + trace("JAVA: %s",__FUNCTION__); + + return 0; + } + + } diff --git a/src/java/private.h b/src/java/private.h index 65d018b..ff9c319 100644 --- a/src/java/private.h +++ b/src/java/private.h @@ -52,8 +52,6 @@ extern JavaVM * jvm; extern JNIEnv * env; - void set_factory(PW3270_NAMESPACE::session * (*factory)(const char *name)); - PW3270_NAMESPACE::session * getHandle(JNIEnv *env, jobject obj); jfieldID getHandleField(JNIEnv *env, jobject obj); @@ -75,12 +73,6 @@ } - extern "C" { - - LIB3270_EXPORT void set_java_session_factory(PW3270_NAMESPACE::session * (*factory)(const char *name)); - extern PW3270_NAMESPACE::session * factory(const char *name); - - } diff --git a/src/java/startstop.cc b/src/java/startstop.cc index a3f71e7..87d742b 100644 --- a/src/java/startstop.cc +++ b/src/java/startstop.cc @@ -58,16 +58,6 @@ #include #include -/*--[ Globals ]--------------------------------------------------------------------------------------*/ - -#if GTK_CHECK_VERSION(2,32,0) - static GMutex mutex; - -#else - static GStaticMutex mutex = G_STATIC_MUTEX_INIT; - -#endif // GTK_CHECK_VERSION - /*---[ Implement ]----------------------------------------------------------------------------------*/ using namespace PW3270_NAMESPACE::java; @@ -112,118 +102,60 @@ extern "C" { return 0; } - } - - LIB3270_EXPORT int pw3270_plugin_start(GtkWidget *window) - { - trace("JAVA: %s",__FUNCTION__); -#if GTK_CHECK_VERSION(2,32,0) - g_mutex_init(&mutex); -#endif // GTK_CHECK_VERSION - - set_factory(factory); - - return 0; - } - - LIB3270_EXPORT int pw3270_plugin_stop(GtkWidget *window) - { - lock(); + LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget) { - if(jvm) { - jvm->DestroyJavaVM(); - jvm = NULL; - } + gchar *filename = (gchar *) g_object_get_data(G_OBJECT(action),"src"); - unlock(); - -#if GTK_CHECK_VERSION(2,32,0) - g_mutex_clear(&mutex); -#endif // GTK_CHECK_VERSION - trace("JAVA: %s",__FUNCTION__); - - - - return 0; - } - - LIB3270_EXPORT void pw3270_action_java_activated(GtkAction *action, GtkWidget *widget) - { - gchar *filename = (gchar *) g_object_get_data(G_OBJECT(action),"src"); - - lib3270_trace_event(v3270_get_session(widget),"Action %s activated on widget %p",gtk_action_get_name(action),widget); - - if(filename) - { - // Has filename, call it directly - call(widget,filename); - } - else - { - // No filename, ask user - static const struct _list - { - const gchar *name; - const gchar *pattern; - } list[] = - { - { N_( "Java class file" ), "*.class" } - }; - - GtkFileFilter * filter[G_N_ELEMENTS(list)+1]; - unsigned int f; - - memset(filter,0,sizeof(filter)); - - for(f=0;f