Commit 12c9a65eebe8cb012bf0684d18f27375c625a7e5
1 parent
d980cf95
Exists in
master
and in
1 other branch
Refactoring IPC server.
Showing
15 changed files
with
359 additions
and
256 deletions
Show diff stats
client/src/core/host.cc
client/src/include/ipc-client-internals.h
| ... | ... | @@ -192,6 +192,7 @@ |
| 192 | 192 | std::string getRevision() const override; |
| 193 | 193 | std::string getLUName() const override; |
| 194 | 194 | std::string getHostURL() const override; |
| 195 | + SSLState getSSLState() const override; | |
| 195 | 196 | |
| 196 | 197 | unsigned short getScreenWidth() const override; |
| 197 | 198 | unsigned short getScreenHeight() const override; |
| ... | ... | @@ -373,6 +374,7 @@ |
| 373 | 374 | std::string getRevision() const override; |
| 374 | 375 | std::string getLUName() const override; |
| 375 | 376 | std::string getHostURL() const override; |
| 377 | + SSLState getSSLState() const override; | |
| 376 | 378 | |
| 377 | 379 | unsigned short getScreenWidth() const override; |
| 378 | 380 | unsigned short getScreenHeight() const override; | ... | ... |
client/src/session/local/session.cc
client/src/session/remote/session.cc
| ... | ... | @@ -447,6 +447,15 @@ |
| 447 | 447 | int value; |
| 448 | 448 | getProperty("length",value); |
| 449 | 449 | return (unsigned short) value; |
| 450 | + | |
| 451 | + } | |
| 452 | + | |
| 453 | + TN3270::SSLState Local::Session::getSSLState() const override { | |
| 454 | + | |
| 455 | + int value; | |
| 456 | + getProperty("sslstate",value); | |
| 457 | + return (TN3270::SSLState) value; | |
| 458 | + | |
| 450 | 459 | } |
| 451 | 460 | |
| 452 | 461 | } | ... | ... |
common/src/include/lib3270/ipc-glib.h
| ... | ... | @@ -61,6 +61,25 @@ |
| 61 | 61 | |
| 62 | 62 | G_BEGIN_DECLS |
| 63 | 63 | |
| 64 | + #define GLIB_TYPE_IPC3270_RESPONSE (ipc3270Response_get_type ()) | |
| 65 | + #define IPC3270_RESPONSE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLIB_TYPE_IPC3270_RESPONSE, ipc3270Response)) | |
| 66 | + #define IPC3270_RESPONSE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLIB_TYPE_IPC3270_RESPONSE, ipc3270ResponseClass)) | |
| 67 | + #define IS_IPC3270_RESPONSE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GLIB_TYPE_IPC3270_RESPONSE)) | |
| 68 | + #define IS_IPC3270_RESPONSE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GLIB_TYPE_IPC3270_RESPONSE)) | |
| 69 | + #define IPC3270_RESPONSE_GET_CLASS(obj) G_TYPE_INSTANCE_GET_CLASS ((obj), GLIB_TYPE_IPC3270_RESPONSE, ipc3270ResponseClass)) | |
| 70 | + | |
| 71 | + typedef struct _ipc3270Response ipc3270Response; | |
| 72 | + typedef struct _ipc3270ResponseClass ipc3270ResponseClass; | |
| 73 | + | |
| 74 | + GObject * ipc3270_response_new(); | |
| 75 | + | |
| 76 | + void ipc3270_response_append_int32(GObject *object, gint32 value); | |
| 77 | + void ipc3270_response_append_uint32(GObject *object, guint32 value); | |
| 78 | + void ipc3270_response_append_3270_string(GObject *object, const char *text, GError **error); | |
| 79 | + gboolean ipc3270_response_has_values(GObject *object); | |
| 80 | + GVariant * ipc3270_response_steal_value(GObject *object); | |
| 81 | + | |
| 82 | + | |
| 64 | 83 | #define GLIB_TYPE_IPC3270 (ipc3270_get_type ()) |
| 65 | 84 | #define IPC3270(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GLIB_TYPE_IPC3270, ipc3270)) |
| 66 | 85 | #define IPC3270_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GLIB_TYPE_IPC3270, ipc3270Class)) |
| ... | ... | @@ -121,7 +140,7 @@ |
| 121 | 140 | |
| 122 | 141 | void ipc3270_set_error(GObject *object, int errcode, GError **error); |
| 123 | 142 | |
| 124 | - GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *parameters, GError **error); | |
| 143 | + void ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *request, GObject *response, GError **error); | |
| 125 | 144 | gboolean ipc3270_set_property(GObject *object, const gchar *property_name, GVariant *value, GError **error); |
| 126 | 145 | GVariant * ipc3270_get_property(GObject *object, const gchar *property_name, GError **error); |
| 127 | 146 | ... | ... |
common/src/include/lib3270/ipc.h
| ... | ... | @@ -141,6 +141,14 @@ |
| 141 | 141 | CONNECTED_TN3270E = LIB3270_CONNECTED_TN3270E, ///< @brief connected in TN3270E mode, 3270 mode |
| 142 | 142 | }; |
| 143 | 143 | |
| 144 | + enum SSLState : uint8_t { | |
| 145 | + SSL_UNSECURE = LIB3270_SSL_UNSECURE, ///< @brief No secure connection | |
| 146 | + SSL_SECURE = LIB3270_SSL_SECURE, ///< @brief Connection secure with CA check | |
| 147 | + SSL_NEGOTIATED = LIB3270_SSL_NEGOTIATED, ///< @brief Connection secure, no CA, self-signed or expired CRL | |
| 148 | + SSL_NEGOTIATING = LIB3270_SSL_NEGOTIATING, ///< @brief Negotiating SSL | |
| 149 | + SSL_UNDEFINED = LIB3270_SSL_UNDEFINED ///< @brief Undefined | |
| 150 | + }; | |
| 151 | + | |
| 144 | 152 | /// @brief PF Keys |
| 145 | 153 | enum PFKey : uint8_t { |
| 146 | 154 | PF_1, |
| ... | ... | @@ -270,10 +278,20 @@ |
| 270 | 278 | return getConnectionState(); |
| 271 | 279 | } |
| 272 | 280 | |
| 273 | - inline bool operator==(ConnectionState state) const noexcept { | |
| 281 | + inline bool operator==(ConnectionState state) const { | |
| 274 | 282 | return this->getConnectionState() == state; |
| 275 | 283 | } |
| 276 | 284 | |
| 285 | + virtual SSLState getSSLState() const = 0; | |
| 286 | + | |
| 287 | + inline operator SSLState() const { | |
| 288 | + return getSSLState(); | |
| 289 | + } | |
| 290 | + | |
| 291 | + inline bool operator==(SSLState state) const { | |
| 292 | + return this->getSSLState() == state; | |
| 293 | + } | |
| 294 | + | |
| 277 | 295 | // Set properties. |
| 278 | 296 | virtual void setUnlockDelay(unsigned short delay = 350) = 0; |
| 279 | 297 | void setCharSet(const char *charset); |
| ... | ... | @@ -335,6 +353,19 @@ |
| 335 | 353 | /// @brief Wait for update. |
| 336 | 354 | virtual Session & wait_for_update(unsigned short seconds) = 0; |
| 337 | 355 | |
| 356 | + /// @brief Wait for string. | |
| 357 | + /// | |
| 358 | + /// @return 0 if the string was found, error code if not. | |
| 359 | + int wait(int row, int col, const char *key, unsigned short seconds); | |
| 360 | + int wait(int baddr, const char *key, unsigned short seconds); | |
| 361 | + | |
| 362 | + /// @brief Search | |
| 363 | + size_t find(const char * str, size_t pos = 0) const; | |
| 364 | + | |
| 365 | + /// @brief Compare contents. | |
| 366 | + int compare(size_t baddr, const char* s, size_t len) const; | |
| 367 | + int compare(int row, int col, const char* s, size_t len) const; | |
| 368 | + | |
| 338 | 369 | }; |
| 339 | 370 | |
| 340 | 371 | /// @brief TN3270 Host | ... | ... |
server/Makefile.in
server/pw3270-plugin-ipc.cbp
| ... | ... | @@ -73,13 +73,16 @@ |
| 73 | 73 | <Option compilerVar="CC" /> |
| 74 | 74 | </Unit> |
| 75 | 75 | <Unit filename="src/core/linux/gobject.h" /> |
| 76 | + <Unit filename="src/core/linux/response.c"> | |
| 77 | + <Option compilerVar="CC" /> | |
| 78 | + </Unit> | |
| 76 | 79 | <Unit filename="src/core/linux/start.c"> |
| 77 | 80 | <Option compilerVar="CC" /> |
| 78 | 81 | </Unit> |
| 79 | 82 | <Unit filename="src/core/linux/stop.c"> |
| 80 | 83 | <Option compilerVar="CC" /> |
| 81 | 84 | </Unit> |
| 82 | - <Unit filename="src/core/methods.c"> | |
| 85 | + <Unit filename="src/core/methods/methods.c"> | |
| 83 | 86 | <Option compilerVar="CC" /> |
| 84 | 87 | </Unit> |
| 85 | 88 | <Unit filename="src/core/setproperties.c"> | ... | ... |
server/src/core/linux/gobject.c
| ... | ... | @@ -133,7 +133,7 @@ void ipc3270_add_terminal_introspection(GString *introspection) { |
| 133 | 133 | " <arg type='s' name='text' direction='out' />" \ |
| 134 | 134 | " </method>" \ |
| 135 | 135 | " <method name='setStringAtAddress'>" \ |
| 136 | - " <arg type='u' name='addr' direction='in' />" \ | |
| 136 | + " <arg type='i' name='addr' direction='in' />" \ | |
| 137 | 137 | " <arg type='s' name='text' direction='in' />" \ |
| 138 | 138 | " <arg type='i' name='result' direction='out' />" \ |
| 139 | 139 | " </method>" \ |
| ... | ... | @@ -143,22 +143,14 @@ void ipc3270_add_terminal_introspection(GString *introspection) { |
| 143 | 143 | " <arg type='y' name='lf' direction='in' />" \ |
| 144 | 144 | " <arg type='s' name='text' direction='out' />" \ |
| 145 | 145 | " </method>" \ |
| 146 | - " <method name= 'getFieldAt'>" \ | |
| 147 | - " <arg type='u' name='row' direction='in' />" \ | |
| 148 | - " <arg type='u' name='col' direction='in' />" \ | |
| 149 | - " <arg type='s' name='text' direction='out' />" \ | |
| 150 | - " </method>" \ | |
| 151 | - " <method name= 'getFieldAtAddress'>" \ | |
| 152 | - " <arg type='u' name='addr' direction='in' />" \ | |
| 153 | - " <arg type='s' name='text' direction='out' />" \ | |
| 154 | - " </method>" \ | |
| 155 | - " <method name= 'getFieldAtCursor'>" \ | |
| 156 | - " <arg type='s' name='text' direction='out' />" \ | |
| 157 | - " </method>" \ | |
| 158 | 146 | " <method name= 'waitForReady'>" \ |
| 159 | 147 | " <arg type='u' name='seconds' direction='in' />" \ |
| 160 | 148 | " <arg type='i' name='result' direction='out' />" \ |
| 161 | 149 | " </method>" \ |
| 150 | + " <method name= 'waitForUpdate'>" \ | |
| 151 | + " <arg type='u' name='seconds' direction='in' />" \ | |
| 152 | + " <arg type='i' name='result' direction='out' />" \ | |
| 153 | + " </method>" \ | |
| 162 | 154 | " <method name= 'setCursorAddress'>" \ |
| 163 | 155 | " <arg type='u' name='addr' direction='in' />" \ |
| 164 | 156 | " <arg type='s' name='text' direction='out' />" \ |
| ... | ... | @@ -168,6 +160,15 @@ void ipc3270_add_terminal_introspection(GString *introspection) { |
| 168 | 160 | " <arg type='u' name='col' direction='in' />" \ |
| 169 | 161 | " <arg type='s' name='text' direction='out' />" \ |
| 170 | 162 | " </method>" \ |
| 163 | + " <method name= 'getFieldAttributeAt'>" \ | |
| 164 | + " <arg type='u' name='row' direction='in' />" \ | |
| 165 | + " <arg type='u' name='col' direction='in' />" \ | |
| 166 | + " <arg type='u' name='attribute' direction='out' />" \ | |
| 167 | + " </method>" \ | |
| 168 | + " <method name= 'getFieldAttributeAtAddress'>" \ | |
| 169 | + " <arg type='i' name='addr' direction='in' />" \ | |
| 170 | + " <arg type='u' name='attribute' direction='out' />" \ | |
| 171 | + " </method>" \ | |
| 171 | 172 | " <property type='s' name='version' access='read'/>" \ |
| 172 | 173 | " <property type='s' name='revision' access='read'/>" |
| 173 | 174 | ); | ... | ... |
server/src/core/linux/start.c
| ... | ... | @@ -50,28 +50,25 @@ static void |
| 50 | 50 | GDBusMethodInvocation *invocation, |
| 51 | 51 | gpointer user_data) { |
| 52 | 52 | |
| 53 | - g_autoptr (GError) error = NULL; | |
| 54 | - GVariant * rc; | |
| 53 | + g_autoptr(GError) error = NULL; | |
| 54 | + g_autoptr(GObject) response = ipc3270_response_new(); | |
| 55 | 55 | |
| 56 | 56 | debug("%s(%s,%s)",__FUNCTION__,interface_name,object_path); |
| 57 | 57 | |
| 58 | - rc = ipc3270_method_call(G_OBJECT(user_data), method_name, parameters, &error); | |
| 58 | + ipc3270_method_call(G_OBJECT(user_data), method_name, parameters, response, &error); | |
| 59 | 59 | |
| 60 | 60 | if(error) { |
| 61 | 61 | |
| 62 | - if(rc) { | |
| 63 | - g_variant_unref(rc); | |
| 64 | - } | |
| 65 | - | |
| 66 | 62 | g_dbus_method_invocation_return_gerror(invocation, error); |
| 67 | 63 | |
| 68 | - } else if(rc) { | |
| 64 | + } else if(ipc3270_response_has_values(response)) { | |
| 69 | 65 | |
| 70 | 66 | // Convert rc to tuple. |
| 71 | 67 | // It is an error if parameters is not of the right format: it must be a tuple containing the out-parameters of the D-Bus method. |
| 72 | 68 | // Even if the method has a single out-parameter, it must be contained in a tuple. |
| 73 | 69 | |
| 74 | - g_dbus_method_invocation_return_value(invocation, g_variant_new_tuple(&rc,1)); | |
| 70 | + GVariant *values[] = { ipc3270_response_steal_value(response) }; | |
| 71 | + g_dbus_method_invocation_return_value(invocation, g_variant_new_tuple(values,1)); | |
| 75 | 72 | |
| 76 | 73 | } else { |
| 77 | 74 | ... | ... |
server/src/core/methods.c
| ... | ... | @@ -1,223 +0,0 @@ |
| 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 | - * Referências: | |
| 24 | - * | |
| 25 | - * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | - * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | - * | |
| 28 | - * Contatos: | |
| 29 | - * | |
| 30 | - * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | - * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | - * | |
| 33 | - */ | |
| 34 | - | |
| 35 | -#include <config.h> | |
| 36 | -#include <string.h> | |
| 37 | -#include <lib3270/ipc-glib.h> | |
| 38 | -#include <lib3270.h> | |
| 39 | -#include <lib3270/actions.h> | |
| 40 | -#include <lib3270/trace.h> | |
| 41 | - | |
| 42 | -// #include <dbus/dbus-glib.h> | |
| 43 | -// #include <dbus/dbus-glib-bindings.h> | |
| 44 | - | |
| 45 | -GVariant * ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *parameters, GError **error) | |
| 46 | -{ | |
| 47 | - | |
| 48 | - size_t ix; | |
| 49 | - H3270 * hSession = ipc3270_get_session(object); | |
| 50 | - | |
| 51 | - lib3270_trace_event(hSession,"Method %s called on session %c\n",method_name,lib3270_get_session_id(hSession)); | |
| 52 | - | |
| 53 | - debug("%s(%s)",__FUNCTION__,method_name); | |
| 54 | - | |
| 55 | - if(!g_ascii_strcasecmp(method_name,"getString")) | |
| 56 | - { | |
| 57 | - return ipc3270_GVariant_from_input_string(object, lib3270_get_string_at_address(hSession,0,-1,'\n'), error); | |
| 58 | - } | |
| 59 | - else if(!g_ascii_strcasecmp(method_name,"setString")) | |
| 60 | - { | |
| 61 | - gchar *text = NULL; | |
| 62 | - g_variant_get(parameters, "(&s)", &text); | |
| 63 | - | |
| 64 | - g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 65 | - if(lib3270_input_string(hSession,(const unsigned char *) converted, -1)) | |
| 66 | - { | |
| 67 | - // Failed! | |
| 68 | - debug("%s failed: %s",method_name,strerror(errno)); | |
| 69 | - ipc3270_set_error(object,errno,error); | |
| 70 | - return NULL; | |
| 71 | - } | |
| 72 | - | |
| 73 | - // Suceeded | |
| 74 | - debug("%s Suceeds",method_name); | |
| 75 | - return g_variant_new_int32(0); | |
| 76 | - | |
| 77 | - } | |
| 78 | - else if(!g_ascii_strcasecmp(method_name,"setStringAt")) | |
| 79 | - { | |
| 80 | - guint row,col; | |
| 81 | - gchar *text = NULL; | |
| 82 | - g_variant_get(parameters, "(ii&s)", &row, &col, &text); | |
| 83 | - | |
| 84 | - g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 85 | - if(lib3270_set_string_at(hSession,row,col,(const unsigned char *) converted) < 0) | |
| 86 | - { | |
| 87 | - // Failed! | |
| 88 | - ipc3270_set_error(object,errno,error); | |
| 89 | - return NULL; | |
| 90 | - } | |
| 91 | - | |
| 92 | - // Suceeded | |
| 93 | - return g_variant_new_int32(0); | |
| 94 | - | |
| 95 | - } | |
| 96 | - else if(!g_ascii_strcasecmp(method_name,"getStringAt")) | |
| 97 | - { | |
| 98 | - guint row,col,len; | |
| 99 | - guchar lf; | |
| 100 | - g_variant_get(parameters, "(uuuy)", &row, &col, &len,&lf); | |
| 101 | - | |
| 102 | - return ipc3270_GVariant_from_input_string(object,lib3270_get_string_at(hSession, row, col, len, lf),error); | |
| 103 | - | |
| 104 | - } | |
| 105 | - else if(!g_ascii_strcasecmp(method_name,"setStringAtAddress")) | |
| 106 | - { | |
| 107 | - guint addr; | |
| 108 | - gchar *text = NULL; | |
| 109 | - g_variant_get(parameters, "(i&s)", &addr, &text); | |
| 110 | - | |
| 111 | - g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 112 | - if(lib3270_set_string_at_address(hSession,addr,(unsigned char *) converted, -1) < 0) | |
| 113 | - { | |
| 114 | - // Failed! | |
| 115 | - ipc3270_set_error(object,errno,error); | |
| 116 | - return NULL; | |
| 117 | - } | |
| 118 | - | |
| 119 | - // Suceeded | |
| 120 | - return g_variant_new_int32(0); | |
| 121 | - | |
| 122 | - } | |
| 123 | - else if(!g_ascii_strcasecmp(method_name,"getStringAtAddress")) | |
| 124 | - { | |
| 125 | - guint addr,len; | |
| 126 | - guchar lf; | |
| 127 | - g_variant_get(parameters, "(uuy)", &addr, &len, &lf); | |
| 128 | - | |
| 129 | - debug("lf=%02x",(int) lf); | |
| 130 | - | |
| 131 | - return ipc3270_GVariant_from_input_string(object,lib3270_get_string_at_address(hSession, addr, len, lf),error); | |
| 132 | - | |
| 133 | - } | |
| 134 | - else if(!g_ascii_strcasecmp(method_name,"waitforready")) | |
| 135 | - { | |
| 136 | - guint timeout = 1; | |
| 137 | - if(parameters) { | |
| 138 | - g_variant_get(parameters, "(u)", &timeout); | |
| 139 | - } | |
| 140 | - return g_variant_new_int32((gint) lib3270_wait_for_ready(hSession,timeout)); | |
| 141 | - } | |
| 142 | - else if(!g_ascii_strcasecmp(method_name,"connect")) | |
| 143 | - { | |
| 144 | - gchar *text = NULL; | |
| 145 | - g_variant_get(parameters, "(&s)", &text); | |
| 146 | - | |
| 147 | - g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 148 | - if(lib3270_connect_url(hSession,converted,0)) | |
| 149 | - { | |
| 150 | - // Failed! | |
| 151 | - ipc3270_set_error(object,errno,error); | |
| 152 | - return NULL; | |
| 153 | - } | |
| 154 | - | |
| 155 | - // Suceeded | |
| 156 | - return g_variant_new_int32(0); | |
| 157 | - | |
| 158 | - } | |
| 159 | - else if(!g_ascii_strcasecmp(method_name,"disconnect")) | |
| 160 | - { | |
| 161 | - if(lib3270_disconnect(hSession)) | |
| 162 | - { | |
| 163 | - // Failed! | |
| 164 | - ipc3270_set_error(object,errno,error); | |
| 165 | - return NULL; | |
| 166 | - } | |
| 167 | - | |
| 168 | - // Suceeded | |
| 169 | - return g_variant_new_int32(0); | |
| 170 | - } | |
| 171 | - | |
| 172 | - | |
| 173 | - | |
| 174 | - // Check action table. | |
| 175 | - const LIB3270_ACTION_ENTRY * actions = lib3270_get_action_table(); | |
| 176 | - for(ix = 0; actions[ix].name; ix++) | |
| 177 | - { | |
| 178 | - if(!g_ascii_strcasecmp(actions[ix].name,method_name)) { | |
| 179 | - | |
| 180 | - int rc = actions[ix].call(hSession); | |
| 181 | - if(rc) | |
| 182 | - { | |
| 183 | - // Failed | |
| 184 | - ipc3270_set_error(object,errno,error); | |
| 185 | - return NULL; | |
| 186 | - } | |
| 187 | - | |
| 188 | - // Suceeded | |
| 189 | - return g_variant_new_int32(0); | |
| 190 | - | |
| 191 | - } | |
| 192 | - } | |
| 193 | - | |
| 194 | - // Check int methods | |
| 195 | - const IPC_METHOD_INT_ARG * int_methods = ipc3270_get_int_arg_methods(); | |
| 196 | - | |
| 197 | - for(ix = 0; int_methods[ix].name; ix++) | |
| 198 | - { | |
| 199 | - if(!g_ascii_strcasecmp(int_methods[ix].name,method_name)) { | |
| 200 | - | |
| 201 | - gint value; | |
| 202 | - g_variant_get(parameters, "(i)", &value); | |
| 203 | - | |
| 204 | - int rc = int_methods[ix].call(hSession, value); | |
| 205 | - if(rc) | |
| 206 | - { | |
| 207 | - // Failed | |
| 208 | - ipc3270_set_error(object,errno,error); | |
| 209 | - return NULL; | |
| 210 | - } | |
| 211 | - | |
| 212 | - // Suceeded | |
| 213 | - return g_variant_new_int32(0); | |
| 214 | - | |
| 215 | - } | |
| 216 | - | |
| 217 | - } | |
| 218 | - | |
| 219 | - g_message("Unknown method \"%s\"",method_name); | |
| 220 | - | |
| 221 | - return NULL; | |
| 222 | - | |
| 223 | -} |
| ... | ... | @@ -0,0 +1,258 @@ |
| 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 | + * Referências: | |
| 24 | + * | |
| 25 | + * https://github.com/joprietoe/gdbus/blob/master/gdbus-example-server.c | |
| 26 | + * https://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-export.c | |
| 27 | + * | |
| 28 | + * Contatos: | |
| 29 | + * | |
| 30 | + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) | |
| 31 | + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) | |
| 32 | + * | |
| 33 | + */ | |
| 34 | + | |
| 35 | +#include <config.h> | |
| 36 | +#include <string.h> | |
| 37 | +#include <lib3270/ipc-glib.h> | |
| 38 | +#include <lib3270.h> | |
| 39 | +#include <lib3270/actions.h> | |
| 40 | +#include <lib3270/trace.h> | |
| 41 | + | |
| 42 | +void ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *request, GObject *response, GError **error) { | |
| 43 | + | |
| 44 | + size_t ix; | |
| 45 | + H3270 * hSession = ipc3270_get_session(object); | |
| 46 | + | |
| 47 | + lib3270_trace_event(hSession,"Method %s called on session %c\n",method_name,lib3270_get_session_id(hSession)); | |
| 48 | + | |
| 49 | + debug("%s(%s)",__FUNCTION__,method_name); | |
| 50 | + | |
| 51 | + if(!g_ascii_strcasecmp(method_name,"getString")) | |
| 52 | + { | |
| 53 | + lib3270_autoptr(char) str = lib3270_get_string_at_address(hSession,0,-1,'\n'); | |
| 54 | + ipc3270_response_append_3270_string(response,str,error); | |
| 55 | + return; | |
| 56 | + } | |
| 57 | + else if(!g_ascii_strcasecmp(method_name,"setString")) | |
| 58 | + { | |
| 59 | + gchar *text = NULL; | |
| 60 | + g_variant_get(request, "(&s)", &text); | |
| 61 | + | |
| 62 | + g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 63 | + if(lib3270_input_string(hSession,(const unsigned char *) converted, -1)) | |
| 64 | + { | |
| 65 | + // Failed! | |
| 66 | + debug("%s failed: %s",method_name,strerror(errno)); | |
| 67 | + ipc3270_set_error(object,errno,error); | |
| 68 | + return; | |
| 69 | + } | |
| 70 | + | |
| 71 | + // Suceeded | |
| 72 | + debug("%s Suceeds",method_name); | |
| 73 | + ipc3270_response_append_int32(response, 0); | |
| 74 | + return; | |
| 75 | + | |
| 76 | + } | |
| 77 | + else if(!g_ascii_strcasecmp(method_name,"setStringAt")) | |
| 78 | + { | |
| 79 | + guint row,col; | |
| 80 | + gchar *text = NULL; | |
| 81 | + g_variant_get(request, "(ii&s)", &row, &col, &text); | |
| 82 | + | |
| 83 | + g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 84 | + if(lib3270_set_string_at(hSession,row,col,(const unsigned char *) converted) < 0) | |
| 85 | + { | |
| 86 | + // Failed! | |
| 87 | + ipc3270_set_error(object,errno,error); | |
| 88 | + return; | |
| 89 | + } | |
| 90 | + | |
| 91 | + // Suceeded | |
| 92 | + ipc3270_response_append_int32(response, 0); | |
| 93 | + return; | |
| 94 | + | |
| 95 | + } | |
| 96 | + else if(!g_ascii_strcasecmp(method_name,"getStringAt")) | |
| 97 | + { | |
| 98 | + guint row,col,len; | |
| 99 | + guchar lf; | |
| 100 | + g_variant_get(request, "(uuuy)", &row, &col, &len,&lf); | |
| 101 | + | |
| 102 | + lib3270_autoptr(char) str = lib3270_get_string_at(hSession, row, col, len, lf); | |
| 103 | + ipc3270_response_append_3270_string(response,str,error); | |
| 104 | + return; | |
| 105 | + | |
| 106 | + } | |
| 107 | + else if(!g_ascii_strcasecmp(method_name,"setStringAtAddress")) | |
| 108 | + { | |
| 109 | + gint addr; | |
| 110 | + gchar *text = NULL; | |
| 111 | + g_variant_get(request, "(i&s)", &addr, &text); | |
| 112 | + | |
| 113 | + g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 114 | + if(lib3270_set_string_at_address(hSession,addr,(unsigned char *) converted, -1) < 0) | |
| 115 | + { | |
| 116 | + // Failed! | |
| 117 | + ipc3270_set_error(object,errno,error); | |
| 118 | + return; | |
| 119 | + } | |
| 120 | + | |
| 121 | + // Suceeded | |
| 122 | + ipc3270_response_append_int32(response, 0); | |
| 123 | + return; | |
| 124 | + | |
| 125 | + } | |
| 126 | + else if(!g_ascii_strcasecmp(method_name,"getStringAtAddress")) | |
| 127 | + { | |
| 128 | + gint addr; | |
| 129 | + guint len; | |
| 130 | + guchar lf; | |
| 131 | + g_variant_get(request, "(iuy)", &addr, &len, &lf); | |
| 132 | + | |
| 133 | + debug("lf=%02x",(int) lf); | |
| 134 | + | |
| 135 | + lib3270_autoptr(char) str = lib3270_get_string_at_address(hSession, addr, len, lf); | |
| 136 | + ipc3270_response_append_3270_string(response,str,error); | |
| 137 | + return; | |
| 138 | + | |
| 139 | + } | |
| 140 | + else if(!g_ascii_strcasecmp(method_name,"waitforready")) | |
| 141 | + { | |
| 142 | + guint timeout = 1; | |
| 143 | + if(request) { | |
| 144 | + g_variant_get(request, "(u)", &timeout); | |
| 145 | + } | |
| 146 | + ipc3270_response_append_int32(response, lib3270_wait_for_ready(hSession,timeout)); | |
| 147 | + return; | |
| 148 | + | |
| 149 | + } | |
| 150 | + else if(!g_ascii_strcasecmp(method_name,"connect")) | |
| 151 | + { | |
| 152 | + gchar *text = NULL; | |
| 153 | + g_variant_get(request, "(&s)", &text); | |
| 154 | + | |
| 155 | + g_autofree gchar * converted = ipc3270_convert_output_string(object, text, error); | |
| 156 | + if(lib3270_connect_url(hSession,converted,0)) | |
| 157 | + { | |
| 158 | + // Failed! | |
| 159 | + ipc3270_set_error(object,errno,error); | |
| 160 | + return NULL; | |
| 161 | + } | |
| 162 | + | |
| 163 | + // Suceeded | |
| 164 | + ipc3270_response_append_int32(response, 0); | |
| 165 | + return; | |
| 166 | + | |
| 167 | + } | |
| 168 | + else if(!g_ascii_strcasecmp(method_name,"disconnect")) | |
| 169 | + { | |
| 170 | + if(lib3270_disconnect(hSession)) | |
| 171 | + { | |
| 172 | + // Failed! | |
| 173 | + ipc3270_set_error(object,errno,error); | |
| 174 | + return; | |
| 175 | + } | |
| 176 | + | |
| 177 | + // Suceeded | |
| 178 | + ipc3270_response_append_int32(response, 0); | |
| 179 | + return; | |
| 180 | + | |
| 181 | + } | |
| 182 | + else if(!g_ascii_strcasecmp(method_name,"getFieldAttributeAt")) | |
| 183 | + { | |
| 184 | + guint row,col; | |
| 185 | + g_variant_get(request, "(uu)", &row, &col); | |
| 186 | + ipc3270_response_append_int32(response, lib3270_get_field_attribute(hSession,lib3270_translate_to_address(hSession,row,col))); | |
| 187 | + return; | |
| 188 | + } | |
| 189 | + else if(!g_ascii_strcasecmp(method_name,"getFieldAttributeAtAddress")) | |
| 190 | + { | |
| 191 | + gint addr; | |
| 192 | + g_variant_get(request, "(i)", &addr); | |
| 193 | + | |
| 194 | + ipc3270_response_append_int32(response, lib3270_get_field_attribute(hSession,addr)); | |
| 195 | + return; | |
| 196 | + } | |
| 197 | + else if(!g_ascii_strcasecmp(method_name,"waitForUpdate")) | |
| 198 | + { | |
| 199 | + guint timeout = 1; | |
| 200 | + if(request) { | |
| 201 | + g_variant_get(request, "(u)", &timeout); | |
| 202 | + } | |
| 203 | + | |
| 204 | + ipc3270_response_append_int32(response, lib3270_wait_for_update(hSession,timeout)); | |
| 205 | + return; | |
| 206 | + } | |
| 207 | + | |
| 208 | + // Check action table. | |
| 209 | + const LIB3270_ACTION_ENTRY * actions = lib3270_get_action_table(); | |
| 210 | + for(ix = 0; actions[ix].name; ix++) | |
| 211 | + { | |
| 212 | + if(!g_ascii_strcasecmp(actions[ix].name,method_name)) { | |
| 213 | + | |
| 214 | + int rc = actions[ix].call(hSession); | |
| 215 | + if(rc) | |
| 216 | + { | |
| 217 | + // Failed | |
| 218 | + ipc3270_set_error(object,errno,error); | |
| 219 | + return; | |
| 220 | + } | |
| 221 | + | |
| 222 | + // Suceeded | |
| 223 | + ipc3270_response_append_int32(response, 0); | |
| 224 | + return; | |
| 225 | + | |
| 226 | + } | |
| 227 | + } | |
| 228 | + | |
| 229 | + // Check int methods | |
| 230 | + const IPC_METHOD_INT_ARG * int_methods = ipc3270_get_int_arg_methods(); | |
| 231 | + | |
| 232 | + for(ix = 0; int_methods[ix].name; ix++) | |
| 233 | + { | |
| 234 | + if(!g_ascii_strcasecmp(int_methods[ix].name,method_name)) { | |
| 235 | + | |
| 236 | + gint value; | |
| 237 | + g_variant_get(request, "(i)", &value); | |
| 238 | + | |
| 239 | + int rc = int_methods[ix].call(hSession, value); | |
| 240 | + if(rc) | |
| 241 | + { | |
| 242 | + // Failed | |
| 243 | + ipc3270_set_error(object,errno,error); | |
| 244 | + return; | |
| 245 | + } | |
| 246 | + | |
| 247 | + // Suceeded | |
| 248 | + ipc3270_response_append_int32(response, 0); | |
| 249 | + return; | |
| 250 | + | |
| 251 | + } | |
| 252 | + | |
| 253 | + } | |
| 254 | + | |
| 255 | + g_message("Unknown method \"%s\"",method_name); | |
| 256 | + ipc3270_set_error(object,ENOENT,error); | |
| 257 | + | |
| 258 | +} | ... | ... |
server/src/testprogram/testprogram.c
server/testscripts/introspect-plugin.sh