Commit 79de44538306fba990d69dce8fb7b23e18e8e273
1 parent
da64c0f2
Exists in
master
and in
3 other branches
Working on IPC client module.
Showing
8 changed files
with
288 additions
and
11 deletions
Show diff stats
configure.ac
| ... | ... | @@ -427,6 +427,14 @@ AC_SUBST(LIBSSL_LIBS) |
| 427 | 427 | AC_SUBST(LIBSSL_CFLAGS) |
| 428 | 428 | |
| 429 | 429 | dnl --------------------------------------------------------------------------- |
| 430 | +dnl Check for D-Bus | |
| 431 | +dnl --------------------------------------------------------------------------- | |
| 432 | + | |
| 433 | +PKG_CHECK_MODULES( [DBUS], [dbus-1], AC_DEFINE(HAVE_DBUS), AC_MSG_NOTICE([ No DBUS support.]) ) | |
| 434 | +AC_SUBST(DBUS_LIBS) | |
| 435 | +AC_SUBST(DBUS_CFLAGS) | |
| 436 | + | |
| 437 | +dnl --------------------------------------------------------------------------- | |
| 430 | 438 | dnl Check for LDAP |
| 431 | 439 | dnl --------------------------------------------------------------------------- |
| 432 | 440 | ... | ... |
src/include/config.h.in
| ... | ... | @@ -2,18 +2,18 @@ |
| 2 | 2 | * Software pw3270, desenvolvido com base nos códigos fontes do C3270 e X3270 |
| 3 | 3 | * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a |
| 4 | 4 | * aplicativos mainframe. Registro no INPI sob o nome G3270. |
| 5 | - * | |
| 5 | + * | |
| 6 | 6 | * Copyright (C) <2008> <Banco do Brasil S.A.> |
| 7 | - * | |
| 7 | + * | |
| 8 | 8 | * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob |
| 9 | 9 | * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela |
| 10 | 10 | * Free Software Foundation. |
| 11 | - * | |
| 11 | + * | |
| 12 | 12 | * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER |
| 13 | 13 | * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO |
| 14 | 14 | * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para |
| 15 | 15 | * obter mais detalhes. |
| 16 | - * | |
| 16 | + * | |
| 17 | 17 | * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este |
| 18 | 18 | * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple |
| 19 | 19 | * Place, Suite 330, Boston, MA, 02111-1307, USA |
| ... | ... | @@ -41,6 +41,7 @@ |
| 41 | 41 | #undef HAVE_GETADDRINFO |
| 42 | 42 | #undef HAVE_VASPRINTF |
| 43 | 43 | #undef HAVE_INET_NTOP |
| 44 | + #undef HAVE_DBUS | |
| 44 | 45 | |
| 45 | 46 | #undef HAVE_ICONV |
| 46 | 47 | #undef ICONV_CONST | ... | ... |
src/lib3270++/Makefile.in
| ... | ... | @@ -31,6 +31,7 @@ LIBNAME=lib@LIB3270_NAME@++ |
| 31 | 31 | SOURCES= \ |
| 32 | 32 | $(wildcard *.cc) \ |
| 33 | 33 | $(wildcard local/*.cc) \ |
| 34 | + $(wildcard ipc/*.cc) \ | |
| 34 | 35 | $(wildcard @OSNAME@/*.c) \ |
| 35 | 36 | $(wildcard @OSNAME@/*.rc) |
| 36 | 37 | |
| ... | ... | @@ -90,14 +91,16 @@ DEPENDS= \ |
| 90 | 91 | CFLAGS= \ |
| 91 | 92 | @CFLAGS@ \ |
| 92 | 93 | -g \ |
| 93 | - -I../include | |
| 94 | - -DBUILD_DATE=`date +%Y%m%d` | |
| 94 | + -I../include \ | |
| 95 | + -DBUILD_DATE=`date +%Y%m%d` \ | |
| 96 | + @DBUS_CFLAGS@ | |
| 95 | 97 | |
| 96 | 98 | LIBS= \ |
| 97 | 99 | @LIBS@ \ |
| 98 | 100 | @LIBSSL_LIBS@ \ |
| 99 | 101 | @LIBICONV@ \ |
| 100 | - @INTL_LIBS@ | |
| 102 | + @INTL_LIBS@ \ | |
| 103 | + @DBUS_LIBS@ | |
| 101 | 104 | |
| 102 | 105 | |
| 103 | 106 | #---[ Debug Rules ]---------------------------------------------------------------------- | ... | ... |
| ... | ... | @@ -0,0 +1,216 @@ |
| 1 | +/* | |
| 2 | + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 | |
| 3 | + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | |
| 4 | + * aplicativos mainframe. Registro no INPI sob o nome G3270. | |
| 5 | + * | |
| 6 | + * Copyright (C) <2008> <Banco do Brasil S.A.> | |
| 7 | + * | |
| 8 | + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | |
| 9 | + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela | |
| 10 | + * Free Software Foundation. | |
| 11 | + * | |
| 12 | + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | |
| 13 | + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO | |
| 14 | + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para | |
| 15 | + * obter mais detalhes. | |
| 16 | + * | |
| 17 | + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | |
| 18 | + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin | |
| 19 | + * St, Fifth Floor, Boston, MA 02110-1301 USA | |
| 20 | + * | |
| 21 | + * Este programa está nomeado como - e possui - linhas de código. | |
| 22 | + * | |
| 23 | + * Contatos: | |
| 24 | + * | |
| 25 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 26 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 27 | + * | |
| 28 | + */ | |
| 29 | + | |
| 30 | +/** | |
| 31 | + * @file src/lib3270++/ipc/session.cc | |
| 32 | + * | |
| 33 | + * @brief Implements lib3270 access using IPC calls. | |
| 34 | + * | |
| 35 | + * @author perry.werneck@gmail.com | |
| 36 | + * | |
| 37 | + */ | |
| 38 | + | |
| 39 | + #include "../private.h" | |
| 40 | + #include <cstring> | |
| 41 | + | |
| 42 | + using std::string; | |
| 43 | + | |
| 44 | +/*---[ Implement ]----------------------------------------------------------------------------------*/ | |
| 45 | + | |
| 46 | +#ifndef _WIN32 | |
| 47 | + | |
| 48 | + static void throws_if_error(DBusError &err) { | |
| 49 | + | |
| 50 | + if(dbus_error_is_set(&err)) { | |
| 51 | + string message = err.message; | |
| 52 | + dbus_error_free(&err); | |
| 53 | + throw std::runtime_error(message.c_str()); | |
| 54 | + } | |
| 55 | + | |
| 56 | + return; | |
| 57 | + | |
| 58 | + } | |
| 59 | + | |
| 60 | +#endif // _WIN32 | |
| 61 | + | |
| 62 | + namespace TN3270 { | |
| 63 | + | |
| 64 | + IPC::Session::Session(const char *id) : Abstract::Session() { | |
| 65 | + | |
| 66 | +#ifdef _WIN32 | |
| 67 | + | |
| 68 | +#else | |
| 69 | + // Create D-Bus session. | |
| 70 | + DBusError err; | |
| 71 | + | |
| 72 | + dbus_error_init(&err); | |
| 73 | + this->conn = dbus_bus_get(DBUS_BUS_SESSION, &err); | |
| 74 | + | |
| 75 | + debug("dbus_bus_get conn=",conn); | |
| 76 | + | |
| 77 | + throws_if_error(err); | |
| 78 | + | |
| 79 | + if(!conn) | |
| 80 | + throw std::runtime_error("DBUS Connection failed"); | |
| 81 | + | |
| 82 | + auto sep = strchr(id,':'); | |
| 83 | + if(!sep) { | |
| 84 | + throw std::system_error(EINVAL, std::system_category()); | |
| 85 | + } | |
| 86 | + | |
| 87 | + this->name = "br.com.bb."; | |
| 88 | + this->name += string(id,(sep - id)); | |
| 89 | + this->name += "."; | |
| 90 | + this->name += (sep+1); | |
| 91 | + this->path = "/br/com/bb/tn3270/session"; | |
| 92 | + | |
| 93 | + debug("D-Bus Object name=\"",this->name,"\" D-Bus Object path=\"",this->path,"\""); | |
| 94 | + | |
| 95 | +#endif // _WIN32 | |
| 96 | + | |
| 97 | + } | |
| 98 | + | |
| 99 | + IPC::Session::~Session() { | |
| 100 | + | |
| 101 | +#ifdef _WIN32 | |
| 102 | + | |
| 103 | +#else | |
| 104 | + | |
| 105 | +#endif // _WIN32 | |
| 106 | + | |
| 107 | + } | |
| 108 | + | |
| 109 | + /* | |
| 110 | + void IPC::Session::wait(time_t timeout) { | |
| 111 | + | |
| 112 | + | |
| 113 | + } | |
| 114 | + */ | |
| 115 | + | |
| 116 | + void IPC::Session::connect(const char *url) { | |
| 117 | + Request request(*this,"connect"); | |
| 118 | + request.push(url).call(); | |
| 119 | + } | |
| 120 | + | |
| 121 | + void IPC::Session::disconnect() { | |
| 122 | + Request request(*this,"disconnect"); | |
| 123 | + request.call(); | |
| 124 | + } | |
| 125 | + | |
| 126 | + // Wait for session state. | |
| 127 | + void IPC::Session::waitForReady(time_t timeout) throw() { | |
| 128 | + throw std::system_error(EINVAL, std::system_category()); | |
| 129 | + } | |
| 130 | + | |
| 131 | + std::string IPC::Session::toString(int baddr, size_t len, char lf) const { | |
| 132 | + throw std::system_error(EINVAL, std::system_category()); | |
| 133 | + } | |
| 134 | + | |
| 135 | + std::string IPC::Session::toString(int row, int col, size_t sz, char lf) const { | |
| 136 | + throw std::system_error(EINVAL, std::system_category()); | |
| 137 | + } | |
| 138 | + | |
| 139 | + ProgramMessage IPC::Session::getProgramMessage() const { | |
| 140 | + throw std::system_error(EINVAL, std::system_category()); | |
| 141 | + } | |
| 142 | + | |
| 143 | + ConnectionState IPC::Session::getConnectionState() const { | |
| 144 | + throw std::system_error(EINVAL, std::system_category()); | |
| 145 | + } | |
| 146 | + | |
| 147 | + /// @brief Set field at current position, jumps to next writable field. | |
| 148 | + TN3270::Session & IPC::Session::push(const char *text) { | |
| 149 | + throw std::system_error(EINVAL, std::system_category()); | |
| 150 | + } | |
| 151 | + | |
| 152 | + TN3270::Session & IPC::Session::push(int baddr, const std::string &text) { | |
| 153 | + | |
| 154 | + | |
| 155 | + return *this; | |
| 156 | + } | |
| 157 | + | |
| 158 | + TN3270::Session & IPC::Session::push(int row, int col, const std::string &text) { | |
| 159 | + | |
| 160 | + | |
| 161 | + return *this; | |
| 162 | + } | |
| 163 | + | |
| 164 | + TN3270::Session & IPC::Session::push(const PFKey key) { | |
| 165 | + | |
| 166 | + | |
| 167 | + return *this; | |
| 168 | + } | |
| 169 | + | |
| 170 | + TN3270::Session & IPC::Session::push(const PAKey key) { | |
| 171 | + | |
| 172 | + | |
| 173 | + return *this; | |
| 174 | + } | |
| 175 | + | |
| 176 | + TN3270::Session & IPC::Session::push(const Action action) { | |
| 177 | + | |
| 178 | + return *this; | |
| 179 | + } | |
| 180 | + | |
| 181 | + TN3270::Session & IPC::Session::pop(int baddr, std::string &text) { | |
| 182 | + | |
| 183 | + | |
| 184 | + return *this; | |
| 185 | + } | |
| 186 | + | |
| 187 | + TN3270::Session & IPC::Session::pop(int row, int col, std::string &text) { | |
| 188 | + | |
| 189 | + return *this; | |
| 190 | + } | |
| 191 | + | |
| 192 | + TN3270::Session & IPC::Session::pop(std::string &text) { | |
| 193 | + | |
| 194 | + return *this; | |
| 195 | + } | |
| 196 | + | |
| 197 | + /// @brief Set cursor address. | |
| 198 | + /// | |
| 199 | + /// @param addr Cursor address. | |
| 200 | + void IPC::Session::setCursorPosition(unsigned short addr) { | |
| 201 | + | |
| 202 | + | |
| 203 | + } | |
| 204 | + | |
| 205 | + /// @brief Set cursor position. | |
| 206 | + /// | |
| 207 | + /// @param row New cursor row. | |
| 208 | + /// @param col New cursor column. | |
| 209 | + void IPC::Session::setCursorPosition(unsigned short row, unsigned short col) { | |
| 210 | + | |
| 211 | + | |
| 212 | + } | |
| 213 | + | |
| 214 | + } | |
| 215 | + | |
| 216 | + | ... | ... |
src/lib3270++/lib3270++.cbp
| ... | ... | @@ -50,6 +50,7 @@ |
| 50 | 50 | <Unit filename="abstract.cc" /> |
| 51 | 51 | <Unit filename="events.cc" /> |
| 52 | 52 | <Unit filename="host.cc" /> |
| 53 | + <Unit filename="ipc/session.cc" /> | |
| 53 | 54 | <Unit filename="local/events.cc" /> |
| 54 | 55 | <Unit filename="local/session.cc" /> |
| 55 | 56 | <Unit filename="private.h" /> | ... | ... |
src/lib3270++/private.h
| ... | ... | @@ -46,8 +46,11 @@ |
| 46 | 46 | #include <winsock2.h> |
| 47 | 47 | #include <windows.h> |
| 48 | 48 | #include <ws2tcpip.h> |
| 49 | + #else | |
| 50 | + #include <dbus/dbus.h> | |
| 49 | 51 | #endif // WIN32 |
| 50 | 52 | |
| 53 | + #include <iostream> | |
| 51 | 54 | #include <mutex> |
| 52 | 55 | #include <lib3270++.h> |
| 53 | 56 | #include <lib3270/popup.h> |
| ... | ... | @@ -73,6 +76,31 @@ |
| 73 | 76 | #define SYSTEM_CHARSET "UTF-8" |
| 74 | 77 | #endif // WIN32 |
| 75 | 78 | |
| 79 | +#ifdef DEBUG | |
| 80 | + | |
| 81 | + inline void console(std::ostream &out) { | |
| 82 | + out << std::endl; | |
| 83 | + } | |
| 84 | + | |
| 85 | + template<typename T, typename... Targs> | |
| 86 | + void console(std::ostream &out, T value, Targs... Fargs) { | |
| 87 | + out << value; | |
| 88 | + console(out, Fargs...); | |
| 89 | + } | |
| 90 | + | |
| 91 | + template<typename T, typename... Targs> | |
| 92 | + void log(T value, Targs... Fargs) { | |
| 93 | + console(std::clog,value,Fargs...); | |
| 94 | + } | |
| 95 | + | |
| 96 | + #define debug(...) log(__FILE__, "(", __LINE__, ") ", __VA_ARGS__); | |
| 97 | + | |
| 98 | +#else | |
| 99 | + | |
| 100 | + #define debug(...) /* __VA_ARGS__ */ | |
| 101 | + | |
| 102 | +#endif | |
| 103 | + | |
| 76 | 104 | namespace TN3270 { |
| 77 | 105 | |
| 78 | 106 | namespace Abstract { |
| ... | ... | @@ -180,6 +208,8 @@ |
| 180 | 208 | /// @brief IPC Based acess (Access and active instance of pw3270 or pw3270d) |
| 181 | 209 | namespace IPC { |
| 182 | 210 | |
| 211 | + class Session; | |
| 212 | + | |
| 183 | 213 | /// @brief PW3270 IPC Request/Response. |
| 184 | 214 | class Request { |
| 185 | 215 | private: |
| ... | ... | @@ -203,22 +233,37 @@ |
| 203 | 233 | static DWORD pack(std::vector<DataBlock *> &args, uint8_t * outBuffer, size_t szBuffer); |
| 204 | 234 | #else |
| 205 | 235 | |
| 236 | + DBusMessage * msg; | |
| 237 | + DBusConnection * conn; | |
| 238 | + | |
| 206 | 239 | #endif // _WIN32 |
| 207 | 240 | |
| 208 | 241 | public: |
| 209 | - Request(const char *name); | |
| 242 | + Request(Session &session, const char *method); | |
| 243 | + | |
| 244 | + Request & call(); | |
| 245 | + Request & push(const char *arg); | |
| 210 | 246 | |
| 211 | 247 | }; |
| 212 | 248 | |
| 213 | 249 | class TN3270_PRIVATE Session : public TN3270::Abstract::Session { |
| 214 | 250 | private: |
| 251 | + | |
| 252 | + friend class Request; | |
| 253 | + | |
| 215 | 254 | #ifdef _WIN32 |
| 216 | 255 | /// @brief Pipe Handle. |
| 217 | 256 | HANDLE hPipe; |
| 218 | 257 | #else |
| 219 | 258 | |
| 259 | + DBusConnection * conn; | |
| 260 | + std::string name; ///< @brief D-Bus Object name. | |
| 261 | + std::string path; ///< @brief D-Bus Object path. | |
| 262 | + | |
| 220 | 263 | #endif // _WIN32 |
| 221 | 264 | |
| 265 | + void call(Request &request); | |
| 266 | + | |
| 222 | 267 | public: |
| 223 | 268 | |
| 224 | 269 | Session(const char *id); |
| ... | ... | @@ -255,7 +300,8 @@ |
| 255 | 300 | TN3270::Session & pop(int baddr, std::string &text) override; |
| 256 | 301 | TN3270::Session & pop(int row, int col, std::string &text) override; |
| 257 | 302 | TN3270::Session & pop(std::string &text) override; |
| 258 | - } | |
| 303 | + | |
| 304 | + }; | |
| 259 | 305 | |
| 260 | 306 | } |
| 261 | 307 | ... | ... |
src/lib3270++/session.cc
src/lib3270++/testprogram/testprogram.cc
| ... | ... | @@ -45,14 +45,16 @@ |
| 45 | 45 | |
| 46 | 46 | int main(int argc, const char *argv[]) { |
| 47 | 47 | |
| 48 | - TN3270::Host host; | |
| 48 | + TN3270::Host host("pw3270:a"); | |
| 49 | 49 | |
| 50 | + /* | |
| 50 | 51 | host.connect(getenv("LIB3270_DEFAULT_HOST")); |
| 51 | 52 | cout << host << endl; |
| 52 | 53 | |
| 53 | 54 | host << TN3270::ENTER; |
| 54 | 55 | |
| 55 | 56 | cout << host << endl; |
| 57 | + */ | |
| 56 | 58 | |
| 57 | 59 | return 0; |
| 58 | 60 | } | ... | ... |