Commit fe4a5aff05acab023646331ebfd0349678f42f9f

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

Implementando interface DBUS no modulo rexx

src/plugins/rx3270/Makefile.in
@@ -38,7 +38,7 @@ LN_S=@LN_S@ @@ -38,7 +38,7 @@ LN_S=@LN_S@
38 38
39 #---[ Include plugin rules ]--------------------------------------------------- 39 #---[ Include plugin rules ]---------------------------------------------------
40 40
41 -LIBS=@REXX_LIBS@ @LIBICONV@ 41 +LIBS=@REXX_LIBS@ @LIBICONV@ @DBUS_LIBS@
42 CFLAGS=@REXX_CFLAGS@ @DBUS_CFLAGS@ 42 CFLAGS=@REXX_CFLAGS@ @DBUS_CFLAGS@
43 REXX_HOME=@REXX_HOME@ 43 REXX_HOME=@REXX_HOME@
44 REXXLIBDIR=$(libdir)/ooRexx 44 REXXLIBDIR=$(libdir)/ooRexx
src/plugins/rx3270/local.cc
@@ -60,7 +60,7 @@ @@ -60,7 +60,7 @@
60 dynamic(); 60 dynamic();
61 ~dynamic(); 61 ~dynamic();
62 62
63 - const char * get_version(void); 63 + char * get_version(void);
64 LIB3270_CSTATE get_cstate(void); 64 LIB3270_CSTATE get_cstate(void);
65 int disconnect(void); 65 int disconnect(void);
66 int connect(const char *uri, bool wait = true); 66 int connect(const char *uri, bool wait = true);
@@ -154,6 +154,15 @@ rx3270 * rx3270::create(const char *name) @@ -154,6 +154,15 @@ rx3270 * rx3270::create(const char *name)
154 return new dynamic(); 154 return new dynamic();
155 } 155 }
156 156
  157 +char * rx3270::get_version(void)
  158 +{
  159 + return strdup(PACKAGE_VERSION);
  160 +}
  161 +
  162 +char * rx3270::get_revision(void)
  163 +{
  164 + return strdup(PACKAGE_REVISION);
  165 +}
157 166
158 rx3270 * rx3270::get_default(void) 167 rx3270 * rx3270::get_default(void)
159 { 168 {
@@ -424,11 +433,11 @@ dynamic::~dynamic() @@ -424,11 +433,11 @@ dynamic::~dynamic()
424 433
425 } 434 }
426 435
427 -const char * dynamic::get_version(void) 436 +char * dynamic::get_version(void)
428 { 437 {
429 if(!hModule) 438 if(!hModule)
430 return NULL; 439 return NULL;
431 - return _get_version(); 440 + return strdup(_get_version());
432 } 441 }
433 442
434 LIB3270_CSTATE dynamic::get_cstate(void) 443 LIB3270_CSTATE dynamic::get_cstate(void)
src/plugins/rx3270/pluginmain.cc
@@ -28,6 +28,7 @@ @@ -28,6 +28,7 @@
28 */ 28 */
29 29
30 #include "rx3270.h" 30 #include "rx3270.h"
  31 + #include <string.h>
31 #include <pw3270/plugin.h> 32 #include <pw3270/plugin.h>
32 #include <lib3270/actions.h> 33 #include <lib3270/actions.h>
33 34
@@ -38,7 +39,7 @@ @@ -38,7 +39,7 @@
38 public: 39 public:
39 plugin(H3270 *hSession); 40 plugin(H3270 *hSession);
40 41
41 - const char * get_version(void); 42 + char * get_version(void);
42 LIB3270_CSTATE get_cstate(void); 43 LIB3270_CSTATE get_cstate(void);
43 int disconnect(void); 44 int disconnect(void);
44 int connect(const char *uri, bool wait = true); 45 int connect(const char *uri, bool wait = true);
@@ -93,9 +94,9 @@ @@ -93,9 +94,9 @@
93 this->hSession = hSession; 94 this->hSession = hSession;
94 } 95 }
95 96
96 - const char * plugin::get_version(void) 97 + char * plugin::get_version(void)
97 { 98 {
98 - return lib3270_get_version(); 99 + return strdup(lib3270_get_version());
99 } 100 }
100 101
101 LIB3270_CSTATE plugin::get_cstate(void) 102 LIB3270_CSTATE plugin::get_cstate(void)
src/plugins/rx3270/remote.cc
@@ -44,7 +44,7 @@ @@ -44,7 +44,7 @@
44 remote(const char *session); 44 remote(const char *session);
45 ~remote(); 45 ~remote();
46 46
47 - const char * get_version(void); 47 + char * get_revision(void);
48 LIB3270_CSTATE get_cstate(void); 48 LIB3270_CSTATE get_cstate(void);
49 int disconnect(void); 49 int disconnect(void);
50 int connect(const char *uri, bool wait = true); 50 int connect(const char *uri, bool wait = true);
@@ -72,10 +72,12 @@ @@ -72,10 +72,12 @@
72 72
73 #elif defined(HAVE_DBUS) 73 #elif defined(HAVE_DBUS)
74 DBusConnection * conn; 74 DBusConnection * conn;
75 - char * service_name;  
76 - char * interface_name; 75 + char * dest;
  76 + char * path;
  77 + char * intf;
77 DBusMessage * create_message(const char *method); 78 DBusMessage * create_message(const char *method);
78 - 79 + DBusMessage * call(DBusMessage *msg);
  80 + char * query_string(const char *method);
79 #endif 81 #endif
80 82
81 83
@@ -84,8 +86,8 @@ @@ -84,8 +86,8 @@
84 /*--[ Globals ]--------------------------------------------------------------------------------------*/ 86 /*--[ Globals ]--------------------------------------------------------------------------------------*/
85 87
86 #if defined(HAVE_DBUS) 88 #if defined(HAVE_DBUS)
87 - static const char * prefix = "br.com.bb.";  
88 - static const char * object = "br/com/bb/" PACKAGE_NAME; 89 + static const char * prefix_dest = "br.com.bb.";
  90 + static const char * prefix_path = "/br/com/bb/";
89 #else 91 #else
90 #error AQUI 92 #error AQUI
91 #endif // HAVE_DBUS 93 #endif // HAVE_DBUS
@@ -95,10 +97,10 @@ @@ -95,10 +97,10 @@
95 #if defined(HAVE_DBUS) 97 #if defined(HAVE_DBUS)
96 DBusMessage * remote::create_message(const char *method) 98 DBusMessage * remote::create_message(const char *method)
97 { 99 {
98 - DBusMessage * msg = dbus_message_new_method_call( service_name,  
99 - object,  
100 - interface_name,  
101 - method); 100 + DBusMessage * msg = dbus_message_new_method_call( this->dest, // Destination
  101 + this->path, // Path
  102 + this->intf, // Interface
  103 + method); // method
102 104
103 if (!msg) 105 if (!msg)
104 fprintf(stderr, "Error creating message for method %s\n",method); 106 fprintf(stderr, "Error creating message for method %s\n",method);
@@ -130,40 +132,35 @@ remote::remote(const char *name) @@ -130,40 +132,35 @@ remote::remote(const char *name)
130 132
131 *(ptr++) = 0; 133 *(ptr++) = 0;
132 134
133 - sz = strlen(ptr)+strlen(name)+strlen(prefix)+2; 135 + // Build destination
  136 + sz = strlen(ptr)+strlen(str)+strlen(prefix_dest)+2;
  137 + dest = (char *) malloc(sz+1);
  138 + strncpy(dest,prefix_dest,sz);
  139 + strncat(dest,str,sz);
  140 + strncat(dest,".",sz);
  141 + strncat(dest,ptr,sz);
  142 +
  143 + // Build path
  144 + sz = strlen(str)+strlen(prefix_path);
  145 + path = (char *) malloc(sz+1);
  146 + strncpy(path,prefix_path,sz);
  147 + strncat(path,str,sz);
  148 +
  149 + // Build intf
  150 + sz = strlen(str)+strlen(prefix_dest)+1;
  151 + intf = (char *) malloc(sz+1);
  152 + strncpy(intf,prefix_dest,sz);
  153 + strncat(intf,str,sz);
134 154
135 - service_name = (char *) malloc(sz+1);  
136 - strncpy(service_name,prefix,sz);  
137 - strncat(service_name,".",sz);  
138 - strncat(service_name,name,sz);  
139 - strncat(service_name,".",sz);  
140 - strncat(service_name,ptr,sz);  
141 155
142 - sz = strlen(prefix)+strlen(name)+1;  
143 - interface_name = (char *) malloc(sz+1);  
144 - strncpy(interface_name,prefix,sz);  
145 - strncat(interface_name,".",sz);  
146 - strncat(interface_name,name,sz);  
147 } 156 }
148 else 157 else
149 { 158 {
150 - size_t sz = strlen(name)+strlen(prefix)+1;  
151 -  
152 - service_name = (char *) malloc(sz+1);  
153 - strncpy(service_name,prefix,sz);  
154 - strncat(service_name,".",sz);  
155 - strncat(service_name,name,sz);  
156 -  
157 - sz = strlen(prefix)+strlen(name)+1;  
158 - interface_name = (char *) malloc(sz+1);  
159 - strncpy(interface_name,prefix,sz);  
160 - strncat(interface_name,".",sz);  
161 - strncat(interface_name,name,sz); 159 + exit(-1);
162 160
163 } 161 }
164 162
165 - trace("service_name: [%s]", service_name);  
166 - trace("interface_name: [%s]", interface_name); 163 + trace("DBUS:\nDestination:\t[%s]\nPath:\t\t[%s]\nInterface:\t[%s]",dest,path,intf);
167 164
168 free(str); 165 free(str);
169 166
@@ -213,28 +210,85 @@ remote::~remote() @@ -213,28 +210,85 @@ remote::~remote()
213 210
214 #elif defined(HAVE_DBUS) 211 #elif defined(HAVE_DBUS)
215 212
216 - if(conn)  
217 - dbus_connection_close(conn);  
218 -  
219 - free(service_name);  
220 - free(interface_name); 213 + free(dest);
  214 + free(path);
  215 + free(intf);
221 216
222 #else 217 #else
223 218
224 #endif 219 #endif
225 } 220 }
226 221
227 -const char * remote::get_version(void) 222 +#if defined(HAVE_DBUS)
  223 +DBusMessage * remote::call(DBusMessage *msg)
  224 +{
  225 + DBusMessage * reply;
  226 + DBusError error;
  227 +
  228 + dbus_error_init(&error);
  229 + reply = dbus_connection_send_with_reply_and_block(conn,msg,10000,&error);
  230 + dbus_message_unref(msg);
  231 +
  232 + if(reply)
  233 + return reply;
  234 +
  235 + fprintf(stderr,"%s\n",error.message);
  236 + dbus_error_free(&error);
  237 +
  238 + return NULL;
  239 +
  240 +}
  241 +
  242 +char * remote::query_string(const char *method)
  243 +{
  244 + char *rc = NULL;
  245 +
  246 + if(conn)
  247 + {
  248 + DBusMessage * msg = call(create_message(method));
  249 + if(msg)
  250 + {
  251 + DBusMessageIter iter;
  252 +
  253 + if(dbus_message_iter_init(msg, &iter))
  254 + {
  255 + if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING)
  256 + {
  257 + const char * str;
  258 + dbus_message_iter_get_basic(&iter, &str);
  259 + rc = strdup(str);
  260 + }
  261 + }
  262 +
  263 + dbus_message_unref(msg);
  264 + }
  265 + }
  266 +
  267 + return rc;
  268 +}
  269 +
  270 +#endif // HAVE_DBUS
  271 +
  272 +char * remote::get_revision(void)
228 { 273 {
229 #if defined(WIN32) 274 #if defined(WIN32)
230 275
  276 + return NULL;
  277 +
  278 +
231 #elif defined(HAVE_DBUS) 279 #elif defined(HAVE_DBUS)
232 280
233 -#endif 281 + return query_string("getRevision");
  282 +
  283 +#else
234 284
235 return NULL; 285 return NULL;
  286 +
  287 +#endif
  288 +
236 } 289 }
237 290
  291 +
238 LIB3270_CSTATE remote::get_cstate(void) 292 LIB3270_CSTATE remote::get_cstate(void)
239 { 293 {
240 #if defined(WIN32) 294 #if defined(WIN32)
@@ -297,6 +351,9 @@ int remote::iterate(bool wait) @@ -297,6 +351,9 @@ int remote::iterate(bool wait)
297 351
298 #elif defined(HAVE_DBUS) 352 #elif defined(HAVE_DBUS)
299 353
  354 + if(wait)
  355 + this->wait(1);
  356 +
300 #endif 357 #endif
301 358
302 return -1; 359 return -1;
@@ -308,6 +365,8 @@ int remote::wait(int seconds) @@ -308,6 +365,8 @@ int remote::wait(int seconds)
308 365
309 #elif defined(HAVE_DBUS) 366 #elif defined(HAVE_DBUS)
310 367
  368 + sleep(seconds);
  369 +
311 #endif 370 #endif
312 371
313 return -1; 372 return -1;
src/plugins/rx3270/rexx_methods.cc
@@ -54,6 +54,36 @@ RexxMethod1(int, rx3270_method_uninit, CSELF, sessionPtr) @@ -54,6 +54,36 @@ RexxMethod1(int, rx3270_method_uninit, CSELF, sessionPtr)
54 return 0; 54 return 0;
55 } 55 }
56 56
  57 +RexxMethod1(RexxStringObject, rx3270_method_version, CSELF, sessionPtr)
  58 +{
  59 + rx3270 * session = (rx3270 *) sessionPtr;
  60 +
  61 + if(session)
  62 + {
  63 + char * version = session->get_version();
  64 + RexxStringObject ret = context->String((CSTRING) (version ? version : "ERROR:"));
  65 + free(version);
  66 + return ret;
  67 + }
  68 +
  69 + return context->String((CSTRING) PACKAGE_VERSION);
  70 +}
  71 +
  72 +RexxMethod1(RexxStringObject, rx3270_method_revision, CSELF, sessionPtr)
  73 +{
  74 + rx3270 * session = (rx3270 *) sessionPtr;
  75 +
  76 + if(session)
  77 + {
  78 + char * version = session->get_revision();
  79 + RexxStringObject ret = context->String((CSTRING) (version ? version : PACKAGE_REVISION));
  80 + free(version);
  81 + return ret;
  82 + }
  83 +
  84 + return context->String((CSTRING) PACKAGE_REVISION);
  85 +}
  86 +
57 RexxMethod3(int, rx3270_method_connect, CSELF, sessionPtr, CSTRING, uri, OPTIONAL_int, wait) 87 RexxMethod3(int, rx3270_method_connect, CSELF, sessionPtr, CSTRING, uri, OPTIONAL_int, wait)
58 { 88 {
59 rx3270 *hSession = (rx3270 *) sessionPtr; 89 rx3270 *hSession = (rx3270 *) sessionPtr;
src/plugins/rx3270/rx3270.cls
@@ -37,6 +37,9 @@ @@ -37,6 +37,9 @@
37 ::METHOD INIT EXTERNAL "LIBRARY rx3270 rx3270_method_init" 37 ::METHOD INIT EXTERNAL "LIBRARY rx3270 rx3270_method_init"
38 ::METHOD UNINIT EXTERNAL "LIBRARY rx3270 rx3270_method_uninit" 38 ::METHOD UNINIT EXTERNAL "LIBRARY rx3270 rx3270_method_uninit"
39 39
  40 +::METHOD VERSION EXTERNAL "LIBRARY rx3270 rx3270_method_version"
  41 +::METHOD REVISION EXTERNAL "LIBRARY rx3270 rx3270_method_revision"
  42 +
40 ::METHOD CONNECT EXTERNAL "LIBRARY rx3270 rx3270_method_connect" 43 ::METHOD CONNECT EXTERNAL "LIBRARY rx3270 rx3270_method_connect"
41 ::METHOD DISCONNECT EXTERNAL "LIBRARY rx3270 rx3270_method_disconnect" 44 ::METHOD DISCONNECT EXTERNAL "LIBRARY rx3270 rx3270_method_disconnect"
42 45
src/plugins/rx3270/rx3270.h
@@ -74,6 +74,8 @@ @@ -74,6 +74,8 @@
74 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270queryStringAt); 74 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270queryStringAt);
75 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270SetStringAt); 75 REXX_TYPED_ROUTINE_PROTOTYPE(rx3270SetStringAt);
76 76
  77 + REXX_METHOD_PROTOTYPE(rx3270_method_version);
  78 + REXX_METHOD_PROTOTYPE(rx3270_method_revision);
77 REXX_METHOD_PROTOTYPE(rx3270_method_init); 79 REXX_METHOD_PROTOTYPE(rx3270_method_init);
78 REXX_METHOD_PROTOTYPE(rx3270_method_uninit); 80 REXX_METHOD_PROTOTYPE(rx3270_method_uninit);
79 REXX_METHOD_PROTOTYPE(rx3270_method_connect); 81 REXX_METHOD_PROTOTYPE(rx3270_method_connect);
@@ -128,7 +130,8 @@ @@ -128,7 +130,8 @@
128 char * get_3270_string(const char *str); 130 char * get_3270_string(const char *str);
129 char * get_local_string(const char *str); 131 char * get_local_string(const char *str);
130 132
131 - virtual const char * get_version(void) = 0; 133 + virtual char * get_version(void);
  134 + virtual char * get_revision(void);
132 virtual LIB3270_CSTATE get_cstate(void) = 0; 135 virtual LIB3270_CSTATE get_cstate(void) = 0;
133 136
134 virtual int connect(const char *uri, bool wait = true) = 0; 137 virtual int connect(const char *uri, bool wait = true) = 0;
src/plugins/rx3270/rxapimain.cc
@@ -111,6 +111,8 @@ RexxRoutineEntry rx3270_functions[] = @@ -111,6 +111,8 @@ RexxRoutineEntry rx3270_functions[] =
111 111
112 RexxMethodEntry rx3270_methods[] = 112 RexxMethodEntry rx3270_methods[] =
113 { 113 {
  114 + REXX_METHOD(rx3270_method_version, rx3270_method_version ),
  115 + REXX_METHOD(rx3270_method_revision, rx3270_method_revision ),
114 REXX_METHOD(rx3270_method_init, rx3270_method_init ), 116 REXX_METHOD(rx3270_method_init, rx3270_method_init ),
115 REXX_METHOD(rx3270_method_uninit, rx3270_method_uninit ), 117 REXX_METHOD(rx3270_method_uninit, rx3270_method_uninit ),
116 REXX_METHOD(rx3270_method_connect, rx3270_method_connect ), 118 REXX_METHOD(rx3270_method_connect, rx3270_method_connect ),
src/plugins/rx3270/sample/remote.rex 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +
  2 +use arg uri
  3 +
  4 +host = .rx3270~new("pw3270:a")
  5 +
  6 +say "PW3270 version is "||host~revision()
  7 +
  8 +return 0
  9 +
  10 +::requires "rx3270.cls"
  11 +