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