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,6 +427,14 @@ AC_SUBST(LIBSSL_LIBS) | ||
427 | AC_SUBST(LIBSSL_CFLAGS) | 427 | AC_SUBST(LIBSSL_CFLAGS) |
428 | 428 | ||
429 | dnl --------------------------------------------------------------------------- | 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 | dnl Check for LDAP | 438 | dnl Check for LDAP |
431 | dnl --------------------------------------------------------------------------- | 439 | dnl --------------------------------------------------------------------------- |
432 | 440 |
src/include/config.h.in
@@ -2,18 +2,18 @@ | @@ -2,18 +2,18 @@ | ||
2 | * Software pw3270, desenvolvido com base nos códigos fontes do C3270 e X3270 | 2 | * Software pw3270, desenvolvido com base nos códigos fontes do C3270 e X3270 |
3 | * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a | 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. | 4 | * aplicativos mainframe. Registro no INPI sob o nome G3270. |
5 | - * | 5 | + * |
6 | * Copyright (C) <2008> <Banco do Brasil S.A.> | 6 | * Copyright (C) <2008> <Banco do Brasil S.A.> |
7 | - * | 7 | + * |
8 | * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob | 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 | 9 | * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela |
10 | * Free Software Foundation. | 10 | * Free Software Foundation. |
11 | - * | 11 | + * |
12 | * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER | 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 | 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 | 14 | * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para |
15 | * obter mais detalhes. | 15 | * obter mais detalhes. |
16 | - * | 16 | + * |
17 | * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este | 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., 59 Temple | 18 | * programa; se não, escreva para a Free Software Foundation, Inc., 59 Temple |
19 | * Place, Suite 330, Boston, MA, 02111-1307, USA | 19 | * Place, Suite 330, Boston, MA, 02111-1307, USA |
@@ -41,6 +41,7 @@ | @@ -41,6 +41,7 @@ | ||
41 | #undef HAVE_GETADDRINFO | 41 | #undef HAVE_GETADDRINFO |
42 | #undef HAVE_VASPRINTF | 42 | #undef HAVE_VASPRINTF |
43 | #undef HAVE_INET_NTOP | 43 | #undef HAVE_INET_NTOP |
44 | + #undef HAVE_DBUS | ||
44 | 45 | ||
45 | #undef HAVE_ICONV | 46 | #undef HAVE_ICONV |
46 | #undef ICONV_CONST | 47 | #undef ICONV_CONST |
src/lib3270++/Makefile.in
@@ -31,6 +31,7 @@ LIBNAME=lib@LIB3270_NAME@++ | @@ -31,6 +31,7 @@ LIBNAME=lib@LIB3270_NAME@++ | ||
31 | SOURCES= \ | 31 | SOURCES= \ |
32 | $(wildcard *.cc) \ | 32 | $(wildcard *.cc) \ |
33 | $(wildcard local/*.cc) \ | 33 | $(wildcard local/*.cc) \ |
34 | + $(wildcard ipc/*.cc) \ | ||
34 | $(wildcard @OSNAME@/*.c) \ | 35 | $(wildcard @OSNAME@/*.c) \ |
35 | $(wildcard @OSNAME@/*.rc) | 36 | $(wildcard @OSNAME@/*.rc) |
36 | 37 | ||
@@ -90,14 +91,16 @@ DEPENDS= \ | @@ -90,14 +91,16 @@ DEPENDS= \ | ||
90 | CFLAGS= \ | 91 | CFLAGS= \ |
91 | @CFLAGS@ \ | 92 | @CFLAGS@ \ |
92 | -g \ | 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 | LIBS= \ | 98 | LIBS= \ |
97 | @LIBS@ \ | 99 | @LIBS@ \ |
98 | @LIBSSL_LIBS@ \ | 100 | @LIBSSL_LIBS@ \ |
99 | @LIBICONV@ \ | 101 | @LIBICONV@ \ |
100 | - @INTL_LIBS@ | 102 | + @INTL_LIBS@ \ |
103 | + @DBUS_LIBS@ | ||
101 | 104 | ||
102 | 105 | ||
103 | #---[ Debug Rules ]---------------------------------------------------------------------- | 106 | #---[ Debug Rules ]---------------------------------------------------------------------- |
@@ -0,0 +1,216 @@ | @@ -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,6 +50,7 @@ | ||
50 | <Unit filename="abstract.cc" /> | 50 | <Unit filename="abstract.cc" /> |
51 | <Unit filename="events.cc" /> | 51 | <Unit filename="events.cc" /> |
52 | <Unit filename="host.cc" /> | 52 | <Unit filename="host.cc" /> |
53 | + <Unit filename="ipc/session.cc" /> | ||
53 | <Unit filename="local/events.cc" /> | 54 | <Unit filename="local/events.cc" /> |
54 | <Unit filename="local/session.cc" /> | 55 | <Unit filename="local/session.cc" /> |
55 | <Unit filename="private.h" /> | 56 | <Unit filename="private.h" /> |
src/lib3270++/private.h
@@ -46,8 +46,11 @@ | @@ -46,8 +46,11 @@ | ||
46 | #include <winsock2.h> | 46 | #include <winsock2.h> |
47 | #include <windows.h> | 47 | #include <windows.h> |
48 | #include <ws2tcpip.h> | 48 | #include <ws2tcpip.h> |
49 | + #else | ||
50 | + #include <dbus/dbus.h> | ||
49 | #endif // WIN32 | 51 | #endif // WIN32 |
50 | 52 | ||
53 | + #include <iostream> | ||
51 | #include <mutex> | 54 | #include <mutex> |
52 | #include <lib3270++.h> | 55 | #include <lib3270++.h> |
53 | #include <lib3270/popup.h> | 56 | #include <lib3270/popup.h> |
@@ -73,6 +76,31 @@ | @@ -73,6 +76,31 @@ | ||
73 | #define SYSTEM_CHARSET "UTF-8" | 76 | #define SYSTEM_CHARSET "UTF-8" |
74 | #endif // WIN32 | 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 | namespace TN3270 { | 104 | namespace TN3270 { |
77 | 105 | ||
78 | namespace Abstract { | 106 | namespace Abstract { |
@@ -180,6 +208,8 @@ | @@ -180,6 +208,8 @@ | ||
180 | /// @brief IPC Based acess (Access and active instance of pw3270 or pw3270d) | 208 | /// @brief IPC Based acess (Access and active instance of pw3270 or pw3270d) |
181 | namespace IPC { | 209 | namespace IPC { |
182 | 210 | ||
211 | + class Session; | ||
212 | + | ||
183 | /// @brief PW3270 IPC Request/Response. | 213 | /// @brief PW3270 IPC Request/Response. |
184 | class Request { | 214 | class Request { |
185 | private: | 215 | private: |
@@ -203,22 +233,37 @@ | @@ -203,22 +233,37 @@ | ||
203 | static DWORD pack(std::vector<DataBlock *> &args, uint8_t * outBuffer, size_t szBuffer); | 233 | static DWORD pack(std::vector<DataBlock *> &args, uint8_t * outBuffer, size_t szBuffer); |
204 | #else | 234 | #else |
205 | 235 | ||
236 | + DBusMessage * msg; | ||
237 | + DBusConnection * conn; | ||
238 | + | ||
206 | #endif // _WIN32 | 239 | #endif // _WIN32 |
207 | 240 | ||
208 | public: | 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 | class TN3270_PRIVATE Session : public TN3270::Abstract::Session { | 249 | class TN3270_PRIVATE Session : public TN3270::Abstract::Session { |
214 | private: | 250 | private: |
251 | + | ||
252 | + friend class Request; | ||
253 | + | ||
215 | #ifdef _WIN32 | 254 | #ifdef _WIN32 |
216 | /// @brief Pipe Handle. | 255 | /// @brief Pipe Handle. |
217 | HANDLE hPipe; | 256 | HANDLE hPipe; |
218 | #else | 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 | #endif // _WIN32 | 263 | #endif // _WIN32 |
221 | 264 | ||
265 | + void call(Request &request); | ||
266 | + | ||
222 | public: | 267 | public: |
223 | 268 | ||
224 | Session(const char *id); | 269 | Session(const char *id); |
@@ -255,7 +300,8 @@ | @@ -255,7 +300,8 @@ | ||
255 | TN3270::Session & pop(int baddr, std::string &text) override; | 300 | TN3270::Session & pop(int baddr, std::string &text) override; |
256 | TN3270::Session & pop(int row, int col, std::string &text) override; | 301 | TN3270::Session & pop(int row, int col, std::string &text) override; |
257 | TN3270::Session & pop(std::string &text) override; | 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,14 +45,16 @@ | ||
45 | 45 | ||
46 | int main(int argc, const char *argv[]) { | 46 | int main(int argc, const char *argv[]) { |
47 | 47 | ||
48 | - TN3270::Host host; | 48 | + TN3270::Host host("pw3270:a"); |
49 | 49 | ||
50 | + /* | ||
50 | host.connect(getenv("LIB3270_DEFAULT_HOST")); | 51 | host.connect(getenv("LIB3270_DEFAULT_HOST")); |
51 | cout << host << endl; | 52 | cout << host << endl; |
52 | 53 | ||
53 | host << TN3270::ENTER; | 54 | host << TN3270::ENTER; |
54 | 55 | ||
55 | cout << host << endl; | 56 | cout << host << endl; |
57 | + */ | ||
56 | 58 | ||
57 | return 0; | 59 | return 0; |
58 | } | 60 | } |