Commit 0459733be8f48961414e04761af4d3dfc5c6d419

Authored by perry.werneck@gmail.com
1 parent fe4a5aff

Implementando chamadas remotas na API rexx

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 +}
... ...
src/plugins/rx3270/sample/remote.rex
... ... @@ -4,6 +4,7 @@ use arg uri
4 4 host = .rx3270~new("pw3270:a")
5 5  
6 6 say "PW3270 version is "||host~revision()
  7 +say "Connections state is "||rx3270QueryCState()
7 8  
8 9 return 0
9 10  
... ...