From 0459733be8f48961414e04761af4d3dfc5c6d419 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Thu, 4 Apr 2013 20:05:28 +0000 Subject: [PATCH] Implementando chamadas remotas na API rexx --- pw3270.cbp | 1 + src/plugins/dbus3270/gobject.c | 7 +++++++ src/plugins/dbus3270/pw3270dbus.xml | 4 ++++ src/plugins/dbus3270/service.h | 1 + src/plugins/rx3270/pluginmain.cc | 8 ++++++++ src/plugins/rx3270/remote.cc | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------ src/plugins/rx3270/rx3270.h | 5 +++++ src/plugins/rx3270/rxapimain.cc | 22 ++++++++++++++++++++++ src/plugins/rx3270/sample/remote.rex | 1 + 9 files changed, 109 insertions(+), 12 deletions(-) diff --git a/pw3270.cbp b/pw3270.cbp index 66ff4d2..fce6a3a 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -292,6 +292,7 @@ + diff --git a/src/plugins/dbus3270/gobject.c b/src/plugins/dbus3270/gobject.c index a0e53fe..9883034 100644 --- a/src/plugins/dbus3270/gobject.c +++ b/src/plugins/dbus3270/gobject.c @@ -103,6 +103,13 @@ void pw3270_dbus_get_message_id(PW3270Dbus *object, DBusGMethodInvocation *conte dbus_g_method_return(context,lib3270_get_program_message(pw3270_dbus_get_session_handle(object))); } +void pw3270_dbus_get_connection_state(PW3270Dbus *object, DBusGMethodInvocation *context) +{ + trace("%s object=%p context=%p",__FUNCTION__,object,context); + dbus_g_method_return(context,lib3270_get_connection_state(pw3270_dbus_get_session_handle(object))); +} + + GError * pw3270_dbus_get_error_from_errno(int code) { return g_error_new(ERROR_DOMAIN,code,"%s",g_strerror(code)); diff --git a/src/plugins/dbus3270/pw3270dbus.xml b/src/plugins/dbus3270/pw3270dbus.xml index 0e7e0bd..27aaaf1 100644 --- a/src/plugins/dbus3270/pw3270dbus.xml +++ b/src/plugins/dbus3270/pw3270dbus.xml @@ -22,6 +22,10 @@ + + + + diff --git a/src/plugins/dbus3270/service.h b/src/plugins/dbus3270/service.h index 44242ea..d90afa6 100644 --- a/src/plugins/dbus3270/service.h +++ b/src/plugins/dbus3270/service.h @@ -68,6 +68,7 @@ void pw3270_dbus_connect(PW3270Dbus *object, const gchar *uri, DBusGMethodInvocation *context); void pw3270_dbus_disconnect(PW3270Dbus *object, DBusGMethodInvocation *context); void pw3270_dbus_get_message_id(PW3270Dbus *object, DBusGMethodInvocation *context); + void pw3270_dbus_get_connection_state(PW3270Dbus *object, DBusGMethodInvocation *context); void pw3270_dbus_get_screen_contents(PW3270Dbus *object, DBusGMethodInvocation *context); H3270 * pw3270_dbus_get_session_handle(PW3270Dbus *object); GError * pw3270_dbus_get_error_from_errno(int code); diff --git a/src/plugins/rx3270/pluginmain.cc b/src/plugins/rx3270/pluginmain.cc index d870e90..8a76799 100644 --- a/src/plugins/rx3270/pluginmain.cc +++ b/src/plugins/rx3270/pluginmain.cc @@ -31,6 +31,7 @@ #include #include #include + #include /*--[ Plugin session object ]--------------------------------------------------------------------------------*/ @@ -46,6 +47,8 @@ bool is_connected(void); bool is_ready(void); + void logva(const char *fmt, va_list args); + int iterate(bool wait); int wait(int seconds); int wait_for_ready(int seconds); @@ -184,3 +187,8 @@ { lib3270_set_toggle(hSession,ix,(int) value); } + + void plugin::logva(const char *fmt, va_list args) + { + lib3270_write_va_log(hSession,"REXX",fmt,args); + } diff --git a/src/plugins/rx3270/remote.cc b/src/plugins/rx3270/remote.cc index 75dee58..9469914 100644 --- a/src/plugins/rx3270/remote.cc +++ b/src/plugins/rx3270/remote.cc @@ -18,7 +18,7 @@ * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple * Place, Suite 330, Boston, MA, 02111-1307, USA * - * Este programa está nomeado como local.cc e possui - linhas de código. + * Este programa está nomeado como remote.cc e possui - linhas de código. * * Contatos: * @@ -78,6 +78,7 @@ DBusMessage * create_message(const char *method); DBusMessage * call(DBusMessage *msg); char * query_string(const char *method); + int query_intval(const char *method); #endif @@ -103,7 +104,7 @@ DBusMessage * remote::create_message(const char *method) method); // method if (!msg) - fprintf(stderr, "Error creating message for method %s\n",method); + log("Error creating message for method %s",method); return msg; } @@ -170,13 +171,13 @@ remote::remote(const char *name) if (dbus_error_is_set(&err)) { - fprintf(stderr, "DBUS Connection Error (%s)\n", err.message); + log("DBUS Connection Error (%s)", err.message); dbus_error_free(&err); } if(!conn) { - fprintf(stderr, "%s\n", "DBUS Connection failed"); + log("%s", "DBUS Connection failed"); dbus_connection_close(conn); conn = NULL; return; @@ -186,13 +187,13 @@ remote::remote(const char *name) if (dbus_error_is_set(&err)) { - fprintf(stderr, "Name Error (%s)\n", err.message); + log("Name Error (%s)", err.message); dbus_error_free(&err); } if(rc != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { - fprintf(stderr, "%s\n", "DBUS request name failed"); + log("%s", "DBUS request name failed"); dbus_connection_close(conn); conn = NULL; return; @@ -232,7 +233,7 @@ DBusMessage * remote::call(DBusMessage *msg) if(reply) return reply; - fprintf(stderr,"%s\n",error.message); + log("%s",error.message); dbus_error_free(&error); return NULL; @@ -267,6 +268,35 @@ char * remote::query_string(const char *method) return rc; } +int remote::query_intval(const char *method) +{ + int rc = -1; + + if(conn) + { + DBusMessage * msg = call(create_message(method)); + if(msg) + { + DBusMessageIter iter; + + if(dbus_message_iter_init(msg, &iter)) + { + if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_INT32) + { + dbus_int32_t iSigned; + dbus_message_iter_get_basic(&iter, &iSigned); + rc = (int) iSigned; + } + } + + dbus_message_unref(msg); + } + } + + return rc; +} + + #endif // HAVE_DBUS char * remote::get_revision(void) @@ -293,12 +323,18 @@ LIB3270_CSTATE remote::get_cstate(void) { #if defined(WIN32) + return (LIB3270_CSTATE) -1; + #elif defined(HAVE_DBUS) -#endif + return (LIB3270_CSTATE) query_intval("getConnectionState"); + +#else return (LIB3270_CSTATE) -1; +#endif + } int remote::disconnect(void) @@ -307,9 +343,14 @@ int remote::disconnect(void) #elif defined(HAVE_DBUS) -#endif + return query_intval("disconnect"); + +#else return -1; + +#endif + } int remote::connect(const char *uri, bool wait) @@ -351,8 +392,7 @@ int remote::iterate(bool wait) #elif defined(HAVE_DBUS) - if(wait) - this->wait(1); + return 0; #endif @@ -366,6 +406,7 @@ int remote::wait(int seconds) #elif defined(HAVE_DBUS) sleep(seconds); + return 0; #endif @@ -431,11 +472,18 @@ int remote::enter(void) { #if defined(WIN32) + return -1; + #elif defined(HAVE_DBUS) -#endif + return query_intval("enter"); + +#else return -1; + +#endif + } int remote::pfkey(int key) diff --git a/src/plugins/rx3270/rx3270.h b/src/plugins/rx3270/rx3270.h index f31c0aa..2ef9b4b 100644 --- a/src/plugins/rx3270/rx3270.h +++ b/src/plugins/rx3270/rx3270.h @@ -46,6 +46,7 @@ #include #include #include + #include #ifndef ETIMEDOUT #define ETIMEDOUT -1 @@ -130,10 +131,14 @@ char * get_3270_string(const char *str); char * get_local_string(const char *str); + void log(const char *fmt, ...); + virtual void logva(const char *fmt, va_list arg); + virtual char * get_version(void); virtual char * get_revision(void); virtual LIB3270_CSTATE get_cstate(void) = 0; + virtual int connect(const char *uri, bool wait = true) = 0; virtual int disconnect(void) = 0; virtual bool is_connected(void) = 0; diff --git a/src/plugins/rx3270/rxapimain.cc b/src/plugins/rx3270/rxapimain.cc index 3190143..22e9b08 100644 --- a/src/plugins/rx3270/rxapimain.cc +++ b/src/plugins/rx3270/rxapimain.cc @@ -38,6 +38,10 @@ #include "rx3270.h" #include +#ifdef HAVE_SYSLOG + #include +#endif // HAVE_SYSLOG + #include #if defined WIN32 @@ -162,3 +166,21 @@ LIB3270_EXPORT RexxPackageEntry * RexxEntry RexxGetPackage(void) END_EXTERN_C() +void rx3270::log(const char *fmt, ...) +{ + va_list arg_ptr; + va_start(arg_ptr, fmt); + this->logva(fmt,arg_ptr); + va_end(arg_ptr); +} + +void rx3270::logva(const char *fmt, va_list args) +{ +#ifdef HAVE_SYSLOG + openlog(PACKAGE_NAME, LOG_NDELAY, LOG_USER); + vsyslog(LOG_INFO,fmt,args); + closelog(); +#else + vfprintf(stderr,fmt,args); +#endif +} diff --git a/src/plugins/rx3270/sample/remote.rex b/src/plugins/rx3270/sample/remote.rex index 69f3a79..6bcdc99 100644 --- a/src/plugins/rx3270/sample/remote.rex +++ b/src/plugins/rx3270/sample/remote.rex @@ -4,6 +4,7 @@ use arg uri host = .rx3270~new("pw3270:a") say "PW3270 version is "||host~revision() +say "Connections state is "||rx3270QueryCState() return 0 -- libgit2 0.21.2