From 0b41a8135f9d370b189bcac18be9736c57d89404 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Mon, 7 Jan 2019 15:25:00 -0200 Subject: [PATCH] Working on IPC client module. --- src/lib3270++/Makefile.in | 2 +- src/lib3270++/ipc/session.cc | 1 + src/lib3270++/linux/request.cc | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib3270++/private.h | 12 ++++++++---- src/lib3270++/testprogram/testprogram.cc | 3 ++- 5 files changed, 113 insertions(+), 6 deletions(-) create mode 100644 src/lib3270++/linux/request.cc diff --git a/src/lib3270++/Makefile.in b/src/lib3270++/Makefile.in index d032d09..695112f 100644 --- a/src/lib3270++/Makefile.in +++ b/src/lib3270++/Makefile.in @@ -32,7 +32,7 @@ SOURCES= \ $(wildcard *.cc) \ $(wildcard local/*.cc) \ $(wildcard ipc/*.cc) \ - $(wildcard @OSNAME@/*.c) \ + $(wildcard @OSNAME@/*.cc) \ $(wildcard @OSNAME@/*.rc) TEST_SOURCES= \ diff --git a/src/lib3270++/ipc/session.cc b/src/lib3270++/ipc/session.cc index 6e0a79d..030be5d 100644 --- a/src/lib3270++/ipc/session.cc +++ b/src/lib3270++/ipc/session.cc @@ -89,6 +89,7 @@ this->name += "."; this->name += (sep+1); this->path = "/br/com/bb/tn3270/session"; + this->interface = "br.com.bb.tn3270.session"; debug("D-Bus Object name=\"",this->name,"\" D-Bus Object path=\"",this->path,"\""); diff --git a/src/lib3270++/linux/request.cc b/src/lib3270++/linux/request.cc new file mode 100644 index 0000000..d012d1c --- /dev/null +++ b/src/lib3270++/linux/request.cc @@ -0,0 +1,101 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + +/** + * @file src/lib3270++/linux/request.cc + * + * @brief Implements D-Bus message. + * + * @author perry.werneck@gmail.com + * + */ + + #include "../private.h" + + using std::string; + +/*---[ Implement ]----------------------------------------------------------------------------------*/ + + namespace TN3270 { + + IPC::Request::Request(Session &session, const char *method) { + + this->conn = session.conn; + this->msg.in = nullptr; + + this->msg.out = dbus_message_new_method_call( session.name.c_str(), // Destination + session.path.c_str(), // Path + session.interface.c_str(), // Interface + method // method + ); + + if(!msg.out) { + throw std::runtime_error("Can't create D-Bus Method Call"); + } + + } + + IPC::Request::~Request() { + if(msg.out) { + dbus_message_unref(msg.out); + } + if(msg.in) { + dbus_message_unref(msg.in); + } + } + + IPC::Request & IPC::Request::call() { + + if(msg.in) { + dbus_message_unref(msg.in); + msg.in = nullptr; + } + + DBusError error; + dbus_error_init(&error); + this->msg.in = dbus_connection_send_with_reply_and_block(this->conn,this->msg.out,10000,&error); + + if(!this->msg.in) { + string message = error.message; + dbus_error_free(&error); + throw std::runtime_error(message.c_str()); + } + + return *this; + + } + + IPC::Request & IPC::Request::push(const char *arg) { + dbus_message_append_args(this->msg.out,DBUS_TYPE_STRING,&arg,DBUS_TYPE_INVALID); + return *this; + } + + } + + diff --git a/src/lib3270++/private.h b/src/lib3270++/private.h index 52bdc40..cb6c31a 100644 --- a/src/lib3270++/private.h +++ b/src/lib3270++/private.h @@ -232,14 +232,17 @@ /// @brief Compacta array de argumentos em um bloco de dados. static DWORD pack(std::vector &args, uint8_t * outBuffer, size_t szBuffer); #else - - DBusMessage * msg; + struct { + DBusMessage * in; + DBusMessage * out; + } msg; DBusConnection * conn; #endif // _WIN32 public: Request(Session &session, const char *method); + ~Request(); Request & call(); Request & push(const char *arg); @@ -257,8 +260,9 @@ #else DBusConnection * conn; - std::string name; ///< @brief D-Bus Object name. - std::string path; ///< @brief D-Bus Object path. + std::string name; ///< @brief D-Bus Object name. + std::string path; ///< @brief D-Bus Object path. + std::string interface; ///< @brief D-Bus interface. #endif // _WIN32 diff --git a/src/lib3270++/testprogram/testprogram.cc b/src/lib3270++/testprogram/testprogram.cc index dd795df..4137d10 100644 --- a/src/lib3270++/testprogram/testprogram.cc +++ b/src/lib3270++/testprogram/testprogram.cc @@ -47,8 +47,9 @@ TN3270::Host host("pw3270:a"); - /* host.connect(getenv("LIB3270_DEFAULT_HOST")); + + /* cout << host << endl; host << TN3270::ENTER; -- libgit2 0.21.2