diff --git a/src/oxt/Makefile.in b/src/oxt/Makefile.in index b51bd44..50d2486 100644 --- a/src/oxt/Makefile.in +++ b/src/oxt/Makefile.in @@ -63,9 +63,13 @@ LIB3270_CFLAGS ?= `pkg-config --cflags lib3270` DLL_CFLAGS=@DLL_CFLAGS@ DLL_FLAGS=-shared -CXXFLAGS=-Wno-strict-aliasing -I$(OBJDIR)/uno/include -I$(OO_SDK_HOME)/include -I$(OBJDIR)/uno/include/br/com/bb $(LIB3270_CFLAGS) -LDFLAGS=-L${OO_SDK_HOME}/lib -L${OO_SDK_URE_HOME}/lib -Wl,-rpath-link=${OO_SDK_URE_HOME}/lib,-rpath=${OO_SDK_URE_HOME}/lib \ - $(CPPULIB) $(CPPUHELPERLIB) $(SALLIB) +CXXFLAGS=-Wno-strict-aliasing -I$(OBJDIR)/uno/include -I$(OO_SDK_HOME)/include \ + -I$(OBJDIR)/uno/include/br/com/bb $(LIB3270_CFLAGS) \ + @DBUS_CFLAGS@ + +LDFLAGS=-L${OO_SDK_HOME}/lib -L${OO_SDK_URE_HOME}/lib \ + -Wl,-rpath-link=${OO_SDK_URE_HOME}/lib,-rpath=${OO_SDK_URE_HOME}/lib \ + $(CPPULIB) $(CPPUHELPERLIB) $(SALLIB) @DBUS_LIBS@ # CC_DEFINES=-DUNX -DGCC -DLINUX -DCPPU_ENV=$(CPPU_ENV) -DGXX_INCLUDE_PATH=$(SDK_GXX_INCLUDE_PATH) -DHAVE_GCC_VISIBILITY_FEATURE diff --git a/src/oxt/globals.hpp b/src/oxt/globals.hpp index 4d90fe0..70c1f88 100644 --- a/src/oxt/globals.hpp +++ b/src/oxt/globals.hpp @@ -13,6 +13,11 @@ #include #include +#if defined(HAVE_DBUS) + #include + #include +#endif // HAVE_DBUS + #include #include @@ -150,6 +155,21 @@ virtual bool in_tn3270e(); virtual void mem_free(void *); + private: + +#if defined(HAVE_DBUS) + + DBusConnection * conn; + char * dest; + char * path; + char * intf; + DBusMessage * create_message(const char *method); + DBusMessage * call(DBusMessage *msg); + char * query_string(const char *method); + int query_intval(const char *method); + +#endif // HAVE_DBUS + }; diff --git a/src/oxt/remote.cxx b/src/oxt/remote.cxx index e3ff8a2..3c45e68 100644 --- a/src/oxt/remote.cxx +++ b/src/oxt/remote.cxx @@ -35,13 +35,224 @@ /*---[ Statics ]-------------------------------------------------------------------------------------------*/ +#if defined(HAVE_DBUS) + static const char * prefix_dest = "br.com.bb."; + static const char * prefix_path = "/br/com/bb/"; +#endif // HAVE_DBUS /*---[ Implement ]-----------------------------------------------------------------------------------------*/ +#if defined(HAVE_DBUS) +DBusMessage * pw3270::ipc3270_session::create_message(const char *method) +{ + DBusMessage * msg = dbus_message_new_method_call( this->dest, // Destination + this->path, // Path + this->intf, // Interface + method); // method + + if (!msg) + log("Error creating message for method %s",method); + + return msg; +} + +DBusMessage * pw3270::ipc3270_session::call(DBusMessage *msg) +{ + DBusMessage * reply; + DBusError error; + + dbus_error_init(&error); + reply = dbus_connection_send_with_reply_and_block(conn,msg,10000,&error); + dbus_message_unref(msg); + + if(!reply) + { + log("%s",error.message); + dbus_error_free(&error); + } + + return reply; + +} + +static char * get_string(DBusMessage * msg) +{ + char *rc = NULL; + if(msg) + { + DBusMessageIter iter; + + if(dbus_message_iter_init(msg, &iter)) + { + if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_STRING) + { + const char * str; + dbus_message_iter_get_basic(&iter, &str); + trace("Response: [%s]",str); + rc = strdup(str); + } +#ifdef DEBUG + else + { + trace("Return type is %c, expecting %c",dbus_message_iter_get_arg_type(&iter),DBUS_TYPE_STRING); + } +#endif + } + + dbus_message_unref(msg); + } + return rc; +} + +char * pw3270::ipc3270_session::query_string(const char *method) +{ + if(conn) + return get_string(call(create_message(method))); + return NULL; +} + +static int get_intval(DBusMessage * msg) +{ + int rc = -1; + + 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; + } +#ifdef DEBUG + else + { + trace("Return type is %c, expecting %c",dbus_message_iter_get_arg_type(&iter),DBUS_TYPE_INT32); + } +#endif + } + + dbus_message_unref(msg); + } + + return rc; +} + +int pw3270::ipc3270_session::query_intval(const char *method) +{ + if(conn) + return get_intval(call(create_message(method))); + return -1; +} + +#endif // HAVE_DBUS + + pw3270::ipc3270_session::ipc3270_session(const char *name) : pw3270::session() { #ifdef HAVE_DBUS + DBusError err; + int rc; + char * str = strdup(name); + char * ptr; + + for(ptr=str;*ptr;ptr++) + *ptr = tolower(*ptr); + + ptr = strchr(str,':'); + + if(ptr) + { + size_t sz; + + *(ptr++) = 0; + + // Build destination + sz = strlen(ptr)+strlen(str)+strlen(prefix_dest)+2; + dest = (char *) malloc(sz+1); + strncpy(dest,prefix_dest,sz); + strncat(dest,str,sz); + strncat(dest,".",sz); + strncat(dest,ptr,sz); + + // Build path + sz = strlen(str)+strlen(prefix_path); + path = (char *) malloc(sz+1); + strncpy(path,prefix_path,sz); + strncat(path,str,sz); + + // Build intf + sz = strlen(str)+strlen(prefix_dest)+1; + intf = (char *) malloc(sz+1); + strncpy(intf,prefix_dest,sz); + strncat(intf,str,sz); + + } + else + { + size_t sz; + + // Build destination + sz = strlen(str)+strlen(prefix_dest)+2; + dest = (char *) malloc(sz+1); + strncpy(dest,prefix_dest,sz); + strncat(dest,str,sz); + + // Build path + sz = strlen(str)+strlen(prefix_path); + path = (char *) malloc(sz+1); + strncpy(path,prefix_path,sz); + strncat(path,str,sz); + + // Build intf + sz = strlen(str)+strlen(prefix_dest)+1; + intf = (char *) malloc(sz+1); + strncpy(intf,prefix_dest,sz); + strncat(intf,str,sz); + + } + + trace("DBUS:\nDestination:\t[%s]\nPath:\t\t[%s]\nInterface:\t[%s]",dest,path,intf); + + free(str); + + dbus_error_init(&err); + + conn = dbus_bus_get(DBUS_BUS_SESSION, &err); + + if (dbus_error_is_set(&err)) + { + log("DBUS Connection Error (%s)", err.message); + dbus_error_free(&err); + } + + if(!conn) + { + log("%s", "DBUS Connection failed"); + return; + } + + rc = dbus_bus_request_name(conn, "br.com.bb." PACKAGE_NAME ".oo", DBUS_NAME_FLAG_REPLACE_EXISTING , &err); + + if (dbus_error_is_set(&err)) + { + log("Name Error (%s)", err.message); + dbus_error_free(&err); + conn = NULL; + return; + } + + if(rc != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) + { + log("%s", "DBUS request name failed"); + conn = NULL; + return; + } + #else #endif // HAVE_DBUS @@ -51,6 +262,10 @@ pw3270::ipc3270_session::~ipc3270_session() { #ifdef HAVE_DBUS + free(dest); + free(path); + free(intf); + #endif // HAVE_DBUS } -- libgit2 0.21.2