Commit 137bb9df0a68e590f66dd0f7b3d8e3b8bf12ce58
1 parent
21a36f03
Exists in
master
and in
5 other branches
Reimplementando plugin java de forma mais organizada
Showing
5 changed files
with
190 additions
and
2 deletions
Show diff stats
pw3270.cbp
... | ... | @@ -114,6 +114,10 @@ |
114 | 114 | <Option target="Debug" /> |
115 | 115 | <Option target="Release" /> |
116 | 116 | </Unit> |
117 | + <Unit filename="src/java/call.cc"> | |
118 | + <Option target="Debug" /> | |
119 | + <Option target="Release" /> | |
120 | + </Unit> | |
117 | 121 | <Unit filename="src/java/clipboard.cc"> |
118 | 122 | <Option target="Debug" /> |
119 | 123 | <Option target="Release" /> |
... | ... | @@ -174,6 +178,10 @@ |
174 | 178 | <Option target="Debug" /> |
175 | 179 | <Option target="Release" /> |
176 | 180 | </Unit> |
181 | + <Unit filename="src/java/startstop.cc"> | |
182 | + <Option target="Debug" /> | |
183 | + <Option target="Release" /> | |
184 | + </Unit> | |
177 | 185 | <Unit filename="src/java/terminal.java"> |
178 | 186 | <Option target="Debug" /> |
179 | 187 | <Option target="Release" /> | ... | ... |
src/java/Makefile.in
... | ... | @@ -26,7 +26,7 @@ |
26 | 26 | |
27 | 27 | PACKAGE_NAME=@PACKAGE_NAME@ |
28 | 28 | SOURCES=main.cc info.cc connect.cc getset.cc cursor.cc keyboard.cc actions.cc field.cc dialog.cc clipboard.cc |
29 | -PLUGIN_SRC=plugin.cc startstop.cc | |
29 | +PLUGIN_SRC=plugin.cc startstop.cc call.cc | |
30 | 30 | |
31 | 31 | #---[ Paths ]------------------------------------------------------------------ |
32 | 32 | ... | ... |
... | ... | @@ -0,0 +1,99 @@ |
1 | +/* | |
2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
5 | + * | |
6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
7 | + * | |
8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
10 | + * Free Software Foundation. | |
11 | + * | |
12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
15 | + * obter mais detalhes. | |
16 | + * | |
17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple | |
19 | + * Place, Suite 330, Boston, MA, 02111-1307, USA | |
20 | + * | |
21 | + * Este programa está nomeado como call.cc e possui - linhas de código. | |
22 | + * | |
23 | + * Contatos: | |
24 | + * | |
25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
27 | + * | |
28 | + */ | |
29 | + | |
30 | + | |
31 | + #include "private.h" | |
32 | + #include <pw3270/v3270.h> | |
33 | + | |
34 | + | |
35 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | |
36 | + | |
37 | +namespace PW3270_NAMESPACE { | |
38 | + | |
39 | + | |
40 | + void java::call(GtkWidget *widget, const char *filename) { | |
41 | + | |
42 | + if(!trylock()) { | |
43 | + | |
44 | + failed(widget, _( "Can't access java virtual machine" ), "%s", strerror(EBUSY)); | |
45 | + return; | |
46 | + | |
47 | + } | |
48 | + | |
49 | + if(jvm || load_jvm(widget)) { | |
50 | + | |
51 | + v3270_set_script(widget,'J',TRUE); | |
52 | + | |
53 | + gchar * dirname = g_path_get_dirname(filename); | |
54 | + gchar * classname = g_path_get_basename(filename); | |
55 | + | |
56 | + gchar * ptr = strrchr(classname,'.'); | |
57 | + if(ptr) { | |
58 | + *ptr = 0; | |
59 | + } | |
60 | + | |
61 | + | |
62 | + | |
63 | + try { | |
64 | + | |
65 | + jclass cls; | |
66 | + jmethodID mid; | |
67 | + | |
68 | + // Atualizar o classpath | |
69 | + cls = env->FindClass("java.lang.System"); | |
70 | + if(!cls) { | |
71 | + throw exception( _( "Can't find class %s" ), "java.lang.System"); | |
72 | + } | |
73 | + | |
74 | + mid = env->GetStaticMethodID(cls, "setProperty", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String"); | |
75 | + if(!mid) { | |
76 | + throw exception( _( "Can't find method %s/%d" ), "java.lang.System","setProperty"); | |
77 | + } | |
78 | + | |
79 | + | |
80 | + | |
81 | + } catch(std::exception &e) { | |
82 | + | |
83 | + failed(widget,_("Can't start java application"),"%s", e.what()); | |
84 | + | |
85 | + } | |
86 | + | |
87 | + g_free(dirname); | |
88 | + g_free(classname); | |
89 | + | |
90 | + v3270_set_script(widget,'J',FALSE); | |
91 | + | |
92 | + } | |
93 | + | |
94 | + unlock(); | |
95 | + | |
96 | + | |
97 | + } | |
98 | + | |
99 | +} | ... | ... |
src/java/private.h
src/java/startstop.cc
... | ... | @@ -120,7 +120,9 @@ extern "C" { |
120 | 120 | #if GTK_CHECK_VERSION(2,32,0) |
121 | 121 | g_mutex_init(&mutex); |
122 | 122 | #endif // GTK_CHECK_VERSION |
123 | - set_java_session_factory(factory); | |
123 | + | |
124 | + set_factory(factory); | |
125 | + | |
124 | 126 | return 0; |
125 | 127 | } |
126 | 128 | |
... | ... | @@ -222,6 +224,84 @@ extern "C" { |
222 | 224 | #endif // GTK_CHECK_VERSION |
223 | 225 | } |
224 | 226 | |
227 | + void java::failed(GtkWidget *widget, const char *msg, const char *format, ...) { | |
228 | + | |
229 | + GtkWidget *dialog = gtk_message_dialog_new( GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
230 | + GTK_DIALOG_DESTROY_WITH_PARENT, | |
231 | + GTK_MESSAGE_ERROR, | |
232 | + GTK_BUTTONS_OK_CANCEL, | |
233 | + "%s", msg ); | |
234 | + | |
235 | + gtk_window_set_title(GTK_WINDOW(dialog), _( "Java error" )); | |
236 | + | |
237 | + if(gtk_dialog_run(GTK_DIALOG (dialog)) == GTK_RESPONSE_CANCEL) | |
238 | + gtk_main_quit(); | |
239 | + gtk_widget_destroy(dialog); | |
240 | + | |
241 | + } | |
242 | + | |
243 | + | |
244 | +#ifdef WIN32 | |
245 | + | |
246 | + bool java::load_jvm(GtkWidget *widget) { | |
247 | + | |
248 | + #error Implementar | |
249 | + | |
250 | + } | |
251 | + | |
252 | + | |
253 | + | |
254 | +#else | |
255 | + | |
256 | + bool java::load_jvm(GtkWidget *widget) { | |
257 | + | |
258 | + if(jvm != NULL) { | |
259 | + return true; | |
260 | + } | |
261 | + | |
262 | + // Start JNI | |
263 | + JavaVMInitArgs vm_args; | |
264 | + JavaVMOption options[5]; | |
265 | + jint rc = 0; | |
266 | + | |
267 | + | |
268 | + memset(&vm_args,0,sizeof(vm_args)); | |
269 | + memset(options,0,sizeof(options)); | |
270 | + | |
271 | + vm_args.version = JNI_VERSION_1_4; | |
272 | + vm_args.nOptions = 0; | |
273 | + vm_args.options = options; | |
274 | + vm_args.ignoreUnrecognized = JNI_FALSE; | |
275 | + | |
276 | + options[vm_args.nOptions].optionString = g_strdup("vfprintf"); | |
277 | + options[vm_args.nOptions].extraInfo = (void *) jni_vfprintf; | |
278 | + vm_args.nOptions++; | |
279 | + | |
280 | +#if defined(DEBUG) | |
281 | + | |
282 | +// options[vm_args.nOptions++].optionString = g_strdup("-verbose"); | |
283 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s:.bin/Debug:.bin/Debug/lib",JNIDIR); | |
284 | + | |
285 | +#else | |
286 | + | |
287 | + options[vm_args.nOptions++].optionString = g_strdup_printf("-Djava.library.path=%s",JNIDIR); | |
288 | + | |
289 | +#endif // JNIDIR | |
290 | + | |
291 | + // Linux, just create JVM | |
292 | + rc = JNI_CreateJavaVM(&jvm,(void **)&env,&vm_args); | |
293 | + | |
294 | + if(rc) { | |
295 | + jvm = NULL; | |
296 | + failed(widget, _( "Can't create java virtual machine" ), _( "The return code was %d" ), (int) rc); | |
297 | + } | |
298 | + | |
299 | + return jvm != NULL; | |
300 | + } | |
301 | + | |
302 | + | |
303 | +#endif // WIN32 | |
304 | + | |
225 | 305 | } |
226 | 306 | |
227 | 307 | ... | ... |