Commit 0459733be8f48961414e04761af4d3dfc5c6d419
1 parent
fe4a5aff
Exists in
master
and in
5 other branches
Implementando chamadas remotas na API rexx
Showing
9 changed files
with
109 additions
and
12 deletions
Show diff stats
pw3270.cbp
... | ... | @@ -292,6 +292,7 @@ |
292 | 292 | <Unit filename="src/plugins/rx3270/rx3270.h" /> |
293 | 293 | <Unit filename="src/plugins/rx3270/rxapimain.cc" /> |
294 | 294 | <Unit filename="src/plugins/rx3270/sample/object.rex" /> |
295 | + <Unit filename="src/plugins/rx3270/sample/remote.rex" /> | |
295 | 296 | <Unit filename="src/plugins/rx3270/text.cc" /> |
296 | 297 | <Unit filename="src/plugins/rx3270/typed_routines.cc" /> |
297 | 298 | <Unit filename="src/pw3270/Makefile.in" /> | ... | ... |
src/plugins/dbus3270/gobject.c
... | ... | @@ -103,6 +103,13 @@ void pw3270_dbus_get_message_id(PW3270Dbus *object, DBusGMethodInvocation *conte |
103 | 103 | dbus_g_method_return(context,lib3270_get_program_message(pw3270_dbus_get_session_handle(object))); |
104 | 104 | } |
105 | 105 | |
106 | +void pw3270_dbus_get_connection_state(PW3270Dbus *object, DBusGMethodInvocation *context) | |
107 | +{ | |
108 | + trace("%s object=%p context=%p",__FUNCTION__,object,context); | |
109 | + dbus_g_method_return(context,lib3270_get_connection_state(pw3270_dbus_get_session_handle(object))); | |
110 | +} | |
111 | + | |
112 | + | |
106 | 113 | GError * pw3270_dbus_get_error_from_errno(int code) |
107 | 114 | { |
108 | 115 | return g_error_new(ERROR_DOMAIN,code,"%s",g_strerror(code)); | ... | ... |
src/plugins/dbus3270/pw3270dbus.xml
... | ... | @@ -22,6 +22,10 @@ |
22 | 22 | <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> |
23 | 23 | <arg type="i" name="status" direction="out" /> |
24 | 24 | </method> |
25 | + <method name="getConnectionState"> | |
26 | + <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> | |
27 | + <arg type="i" name="status" direction="out" /> | |
28 | + </method> | |
25 | 29 | <method name="getScreenContents"> |
26 | 30 | <annotation name="org.freedesktop.DBus.GLib.Async" value="true"/> |
27 | 31 | <arg type="s" name="contents" direction="out" /> | ... | ... |
src/plugins/dbus3270/service.h
... | ... | @@ -68,6 +68,7 @@ |
68 | 68 | void pw3270_dbus_connect(PW3270Dbus *object, const gchar *uri, DBusGMethodInvocation *context); |
69 | 69 | void pw3270_dbus_disconnect(PW3270Dbus *object, DBusGMethodInvocation *context); |
70 | 70 | void pw3270_dbus_get_message_id(PW3270Dbus *object, DBusGMethodInvocation *context); |
71 | + void pw3270_dbus_get_connection_state(PW3270Dbus *object, DBusGMethodInvocation *context); | |
71 | 72 | void pw3270_dbus_get_screen_contents(PW3270Dbus *object, DBusGMethodInvocation *context); |
72 | 73 | H3270 * pw3270_dbus_get_session_handle(PW3270Dbus *object); |
73 | 74 | GError * pw3270_dbus_get_error_from_errno(int code); | ... | ... |
src/plugins/rx3270/pluginmain.cc
... | ... | @@ -31,6 +31,7 @@ |
31 | 31 | #include <string.h> |
32 | 32 | #include <pw3270/plugin.h> |
33 | 33 | #include <lib3270/actions.h> |
34 | + #include <lib3270/log.h> | |
34 | 35 | |
35 | 36 | /*--[ Plugin session object ]--------------------------------------------------------------------------------*/ |
36 | 37 | |
... | ... | @@ -46,6 +47,8 @@ |
46 | 47 | bool is_connected(void); |
47 | 48 | bool is_ready(void); |
48 | 49 | |
50 | + void logva(const char *fmt, va_list args); | |
51 | + | |
49 | 52 | int iterate(bool wait); |
50 | 53 | int wait(int seconds); |
51 | 54 | int wait_for_ready(int seconds); |
... | ... | @@ -184,3 +187,8 @@ |
184 | 187 | { |
185 | 188 | lib3270_set_toggle(hSession,ix,(int) value); |
186 | 189 | } |
190 | + | |
191 | + void plugin::logva(const char *fmt, va_list args) | |
192 | + { | |
193 | + lib3270_write_va_log(hSession,"REXX",fmt,args); | |
194 | + } | ... | ... |
src/plugins/rx3270/remote.cc
... | ... | @@ -18,7 +18,7 @@ |
18 | 18 | * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple |
19 | 19 | * Place, Suite 330, Boston, MA, 02111-1307, USA |
20 | 20 | * |
21 | - * Este programa está nomeado como local.cc e possui - linhas de código. | |
21 | + * Este programa está nomeado como remote.cc e possui - linhas de código. | |
22 | 22 | * |
23 | 23 | * Contatos: |
24 | 24 | * |
... | ... | @@ -78,6 +78,7 @@ |
78 | 78 | DBusMessage * create_message(const char *method); |
79 | 79 | DBusMessage * call(DBusMessage *msg); |
80 | 80 | char * query_string(const char *method); |
81 | + int query_intval(const char *method); | |
81 | 82 | #endif |
82 | 83 | |
83 | 84 | |
... | ... | @@ -103,7 +104,7 @@ DBusMessage * remote::create_message(const char *method) |
103 | 104 | method); // method |
104 | 105 | |
105 | 106 | if (!msg) |
106 | - fprintf(stderr, "Error creating message for method %s\n",method); | |
107 | + log("Error creating message for method %s",method); | |
107 | 108 | |
108 | 109 | return msg; |
109 | 110 | } |
... | ... | @@ -170,13 +171,13 @@ remote::remote(const char *name) |
170 | 171 | |
171 | 172 | if (dbus_error_is_set(&err)) |
172 | 173 | { |
173 | - fprintf(stderr, "DBUS Connection Error (%s)\n", err.message); | |
174 | + log("DBUS Connection Error (%s)", err.message); | |
174 | 175 | dbus_error_free(&err); |
175 | 176 | } |
176 | 177 | |
177 | 178 | if(!conn) |
178 | 179 | { |
179 | - fprintf(stderr, "%s\n", "DBUS Connection failed"); | |
180 | + log("%s", "DBUS Connection failed"); | |
180 | 181 | dbus_connection_close(conn); |
181 | 182 | conn = NULL; |
182 | 183 | return; |
... | ... | @@ -186,13 +187,13 @@ remote::remote(const char *name) |
186 | 187 | |
187 | 188 | if (dbus_error_is_set(&err)) |
188 | 189 | { |
189 | - fprintf(stderr, "Name Error (%s)\n", err.message); | |
190 | + log("Name Error (%s)", err.message); | |
190 | 191 | dbus_error_free(&err); |
191 | 192 | } |
192 | 193 | |
193 | 194 | if(rc != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) |
194 | 195 | { |
195 | - fprintf(stderr, "%s\n", "DBUS request name failed"); | |
196 | + log("%s", "DBUS request name failed"); | |
196 | 197 | dbus_connection_close(conn); |
197 | 198 | conn = NULL; |
198 | 199 | return; |
... | ... | @@ -232,7 +233,7 @@ DBusMessage * remote::call(DBusMessage *msg) |
232 | 233 | if(reply) |
233 | 234 | return reply; |
234 | 235 | |
235 | - fprintf(stderr,"%s\n",error.message); | |
236 | + log("%s",error.message); | |
236 | 237 | dbus_error_free(&error); |
237 | 238 | |
238 | 239 | return NULL; |
... | ... | @@ -267,6 +268,35 @@ char * remote::query_string(const char *method) |
267 | 268 | return rc; |
268 | 269 | } |
269 | 270 | |
271 | +int remote::query_intval(const char *method) | |
272 | +{ | |
273 | + int rc = -1; | |
274 | + | |
275 | + if(conn) | |
276 | + { | |
277 | + DBusMessage * msg = call(create_message(method)); | |
278 | + if(msg) | |
279 | + { | |
280 | + DBusMessageIter iter; | |
281 | + | |
282 | + if(dbus_message_iter_init(msg, &iter)) | |
283 | + { | |
284 | + if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_INT32) | |
285 | + { | |
286 | + dbus_int32_t iSigned; | |
287 | + dbus_message_iter_get_basic(&iter, &iSigned); | |
288 | + rc = (int) iSigned; | |
289 | + } | |
290 | + } | |
291 | + | |
292 | + dbus_message_unref(msg); | |
293 | + } | |
294 | + } | |
295 | + | |
296 | + return rc; | |
297 | +} | |
298 | + | |
299 | + | |
270 | 300 | #endif // HAVE_DBUS |
271 | 301 | |
272 | 302 | char * remote::get_revision(void) |
... | ... | @@ -293,12 +323,18 @@ LIB3270_CSTATE remote::get_cstate(void) |
293 | 323 | { |
294 | 324 | #if defined(WIN32) |
295 | 325 | |
326 | + return (LIB3270_CSTATE) -1; | |
327 | + | |
296 | 328 | #elif defined(HAVE_DBUS) |
297 | 329 | |
298 | -#endif | |
330 | + return (LIB3270_CSTATE) query_intval("getConnectionState"); | |
331 | + | |
332 | +#else | |
299 | 333 | |
300 | 334 | return (LIB3270_CSTATE) -1; |
301 | 335 | |
336 | +#endif | |
337 | + | |
302 | 338 | } |
303 | 339 | |
304 | 340 | int remote::disconnect(void) |
... | ... | @@ -307,9 +343,14 @@ int remote::disconnect(void) |
307 | 343 | |
308 | 344 | #elif defined(HAVE_DBUS) |
309 | 345 | |
310 | -#endif | |
346 | + return query_intval("disconnect"); | |
347 | + | |
348 | +#else | |
311 | 349 | |
312 | 350 | return -1; |
351 | + | |
352 | +#endif | |
353 | + | |
313 | 354 | } |
314 | 355 | |
315 | 356 | int remote::connect(const char *uri, bool wait) |
... | ... | @@ -351,8 +392,7 @@ int remote::iterate(bool wait) |
351 | 392 | |
352 | 393 | #elif defined(HAVE_DBUS) |
353 | 394 | |
354 | - if(wait) | |
355 | - this->wait(1); | |
395 | + return 0; | |
356 | 396 | |
357 | 397 | #endif |
358 | 398 | |
... | ... | @@ -366,6 +406,7 @@ int remote::wait(int seconds) |
366 | 406 | #elif defined(HAVE_DBUS) |
367 | 407 | |
368 | 408 | sleep(seconds); |
409 | + return 0; | |
369 | 410 | |
370 | 411 | #endif |
371 | 412 | |
... | ... | @@ -431,11 +472,18 @@ int remote::enter(void) |
431 | 472 | { |
432 | 473 | #if defined(WIN32) |
433 | 474 | |
475 | + return -1; | |
476 | + | |
434 | 477 | #elif defined(HAVE_DBUS) |
435 | 478 | |
436 | -#endif | |
479 | + return query_intval("enter"); | |
480 | + | |
481 | +#else | |
437 | 482 | |
438 | 483 | return -1; |
484 | + | |
485 | +#endif | |
486 | + | |
439 | 487 | } |
440 | 488 | |
441 | 489 | int remote::pfkey(int key) | ... | ... |
src/plugins/rx3270/rx3270.h
... | ... | @@ -46,6 +46,7 @@ |
46 | 46 | #include <stdio.h> |
47 | 47 | #include <lib3270.h> |
48 | 48 | #include <lib3270/log.h> |
49 | + #include <stdarg.h> | |
49 | 50 | |
50 | 51 | #ifndef ETIMEDOUT |
51 | 52 | #define ETIMEDOUT -1 |
... | ... | @@ -130,10 +131,14 @@ |
130 | 131 | char * get_3270_string(const char *str); |
131 | 132 | char * get_local_string(const char *str); |
132 | 133 | |
134 | + void log(const char *fmt, ...); | |
135 | + virtual void logva(const char *fmt, va_list arg); | |
136 | + | |
133 | 137 | virtual char * get_version(void); |
134 | 138 | virtual char * get_revision(void); |
135 | 139 | virtual LIB3270_CSTATE get_cstate(void) = 0; |
136 | 140 | |
141 | + | |
137 | 142 | virtual int connect(const char *uri, bool wait = true) = 0; |
138 | 143 | virtual int disconnect(void) = 0; |
139 | 144 | virtual bool is_connected(void) = 0; | ... | ... |
src/plugins/rx3270/rxapimain.cc
... | ... | @@ -38,6 +38,10 @@ |
38 | 38 | #include "rx3270.h" |
39 | 39 | #include <lib3270/actions.h> |
40 | 40 | |
41 | +#ifdef HAVE_SYSLOG | |
42 | + #include <syslog.h> | |
43 | +#endif // HAVE_SYSLOG | |
44 | + | |
41 | 45 | #include <string.h> |
42 | 46 | |
43 | 47 | #if defined WIN32 |
... | ... | @@ -162,3 +166,21 @@ LIB3270_EXPORT RexxPackageEntry * RexxEntry RexxGetPackage(void) |
162 | 166 | END_EXTERN_C() |
163 | 167 | |
164 | 168 | |
169 | +void rx3270::log(const char *fmt, ...) | |
170 | +{ | |
171 | + va_list arg_ptr; | |
172 | + va_start(arg_ptr, fmt); | |
173 | + this->logva(fmt,arg_ptr); | |
174 | + va_end(arg_ptr); | |
175 | +} | |
176 | + | |
177 | +void rx3270::logva(const char *fmt, va_list args) | |
178 | +{ | |
179 | +#ifdef HAVE_SYSLOG | |
180 | + openlog(PACKAGE_NAME, LOG_NDELAY, LOG_USER); | |
181 | + vsyslog(LOG_INFO,fmt,args); | |
182 | + closelog(); | |
183 | +#else | |
184 | + vfprintf(stderr,fmt,args); | |
185 | +#endif | |
186 | +} | ... | ... |