Commit 9167ba7281d1267147ffdb7ebbf4978c6e76c551

Authored by Perry Werneck
1 parent dcf0fc2c
Exists in master and in 1 other branch develop

Adding get cursor position method.

client/src/include/lib3270/ipc.h
@@ -116,27 +116,26 @@ @@ -116,27 +116,26 @@
116 template<typename T> 116 template<typename T>
117 class lib3270_ptr { 117 class lib3270_ptr {
118 private: 118 private:
119 - T *data; 119 + T *ptr;
120 120
121 public: 121 public:
122 - lib3270_ptr(T *data) {  
123 - this->data = data; 122 + lib3270_ptr(T *d) : ptr(d) {
124 } 123 }
125 124
126 ~lib3270_ptr() { 125 ~lib3270_ptr() {
127 - lib3270_free((void *) this->data); 126 + lib3270_free((void *) this->ptr);
128 } 127 }
129 128
130 operator bool() const noexcept { 129 operator bool() const noexcept {
131 - return this->data != NULL; 130 + return this->ptr != NULL;
132 } 131 }
133 132
134 T * operator->() { 133 T * operator->() {
135 - return this->data; 134 + return this->ptr;
136 } 135 }
137 136
138 operator T *() const noexcept { 137 operator T *() const noexcept {
139 - return this->data; 138 + return this->ptr;
140 } 139 }
141 140
142 }; 141 };
@@ -230,6 +229,7 @@ @@ -230,6 +229,7 @@
230 SSL_SECURE = LIB3270_SSL_SECURE, ///< @brief Connection secure with CA check 229 SSL_SECURE = LIB3270_SSL_SECURE, ///< @brief Connection secure with CA check
231 SSL_NEGOTIATED = LIB3270_SSL_NEGOTIATED, ///< @brief Connection secure, no CA, self-signed or expired CRL 230 SSL_NEGOTIATED = LIB3270_SSL_NEGOTIATED, ///< @brief Connection secure, no CA, self-signed or expired CRL
232 SSL_NEGOTIATING = LIB3270_SSL_NEGOTIATING, ///< @brief Negotiating SSL 231 SSL_NEGOTIATING = LIB3270_SSL_NEGOTIATING, ///< @brief Negotiating SSL
  232 + SSL_VERIFYING = LIB3270_SSL_VERIFYING, ///< @brief Verifying SSL (Getting CRL)
233 SSL_UNDEFINED = LIB3270_SSL_UNDEFINED ///< @brief Undefined 233 SSL_UNDEFINED = LIB3270_SSL_UNDEFINED ///< @brief Undefined
234 }; 234 };
235 235
@@ -451,6 +451,15 @@ @@ -451,6 +451,15 @@
451 451
452 public: 452 public:
453 453
  454 + struct Cursor {
  455 + unsigned short row;
  456 + unsigned short col;
  457 +
  458 + Cursor(unsigned short r, unsigned short c) : row(r), col(c) {
  459 + }
  460 +
  461 + };
  462 +
454 /// @brief Get an instance of the TN3270 session based on the supplied ID. 463 /// @brief Get an instance of the TN3270 session based on the supplied ID.
455 static Session * getInstance(const char *id = nullptr, const char *charset = nullptr); 464 static Session * getInstance(const char *id = nullptr, const char *charset = nullptr);
456 virtual ~Session(); 465 virtual ~Session();
@@ -586,6 +595,9 @@ @@ -586,6 +595,9 @@
586 /// @brief Get cursor address 595 /// @brief Get cursor address
587 virtual unsigned short getCursorAddress() = 0; 596 virtual unsigned short getCursorAddress() = 0;
588 597
  598 + /// @brief Get cursor position.
  599 + virtual struct Cursor getCursorPosition() = 0;
  600 +
589 /// @brief Set local charset. 601 /// @brief Set local charset.
590 virtual void setCharSet(const char *charset = NULL) = 0; 602 virtual void setCharSet(const char *charset = NULL) = 0;
591 603
@@ -783,6 +795,10 @@ @@ -783,6 +795,10 @@
783 return session->getCursorAddress(); 795 return session->getCursorAddress();
784 } 796 }
785 797
  798 + inline Session::Cursor getCursorPosition() {
  799 + return session->getCursorPosition();
  800 + }
  801 +
786 inline void setHostURL(const char *url) { 802 inline void setHostURL(const char *url) {
787 session->setHostURL(url); 803 session->setHostURL(url);
788 } 804 }
client/src/session/local/attribute.cc
@@ -527,6 +527,18 @@ @@ -527,6 +527,18 @@
527 return rc; 527 return rc;
528 } 528 }
529 529
  530 + struct Session::Cursor Local::Session::getCursorPosition() {
  531 +
  532 + std::lock_guard<std::recursive_mutex> lock(sync);
  533 +
  534 + unsigned short row = 0, col = 0;
  535 +
  536 +
  537 + return Session::Cursor(row,col);
  538 +
  539 + };
  540 +
  541 +
530 std::string Local::Session::getVersion() const { 542 std::string Local::Session::getVersion() const {
531 543
532 std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync); 544 std::lock_guard<std::recursive_mutex> lock(const_cast<Local::Session *>(this)->sync);
client/src/session/local/private.h
@@ -161,7 +161,7 @@ @@ -161,7 +161,7 @@
161 unsigned short setCursor(int addr) override; 161 unsigned short setCursor(int addr) override;
162 unsigned short setCursor(unsigned short row, unsigned short col) override; 162 unsigned short setCursor(unsigned short row, unsigned short col) override;
163 unsigned short getCursorAddress() override; 163 unsigned short getCursorAddress() override;
164 - 164 + Session::Cursor getCursorPosition() override;
165 165
166 }; 166 };
167 167
client/src/session/remote/private.h
@@ -166,6 +166,7 @@ @@ -166,6 +166,7 @@
166 unsigned short setCursor(int addr) override; 166 unsigned short setCursor(int addr) override;
167 unsigned short setCursor(unsigned short row, unsigned short col) override; 167 unsigned short setCursor(unsigned short row, unsigned short col) override;
168 unsigned short getCursorAddress() override; 168 unsigned short getCursorAddress() override;
  169 + Session::Cursor getCursorPosition() override;
169 170
170 }; 171 };
171 172
client/src/testprogram/testprogram.cc
@@ -103,7 +103,7 @@ @@ -103,7 +103,7 @@
103 103
104 TN3270::Host host{session}; 104 TN3270::Host host{session};
105 105
106 - name="url"; 106 + // name="url";
107 107
108 cout << endl << endl; 108 cout << endl << endl;
109 for(auto attribute : host.getAttributes()) { 109 for(auto attribute : host.getAttributes()) {
server/pw3270-plugin-ipc.cbp
@@ -68,9 +68,6 @@ @@ -68,9 +68,6 @@
68 <Option compilerVar="CC" /> 68 <Option compilerVar="CC" />
69 </Unit> 69 </Unit>
70 <Unit filename="src/core/linux/gobject.h" /> 70 <Unit filename="src/core/linux/gobject.h" />
71 - <Unit filename="src/core/linux/response.c">  
72 - <Option compilerVar="CC" />  
73 - </Unit>  
74 <Unit filename="src/core/linux/start.c"> 71 <Unit filename="src/core/linux/start.c">
75 <Option compilerVar="CC" /> 72 <Option compilerVar="CC" />
76 </Unit> 73 </Unit>
@@ -102,6 +99,9 @@ @@ -102,6 +99,9 @@
102 <Unit filename="src/core/methods/wait.c"> 99 <Unit filename="src/core/methods/wait.c">
103 <Option compilerVar="CC" /> 100 <Option compilerVar="CC" />
104 </Unit> 101 </Unit>
  102 + <Unit filename="src/core/response.c">
  103 + <Option compilerVar="CC" />
  104 + </Unit>
105 <Unit filename="src/core/setproperties.c"> 105 <Unit filename="src/core/setproperties.c">
106 <Option compilerVar="CC" /> 106 <Option compilerVar="CC" />
107 </Unit> 107 </Unit>
@@ -161,9 +161,6 @@ @@ -161,9 +161,6 @@
161 <Option compilerVar="CC" /> 161 <Option compilerVar="CC" />
162 </Unit> 162 </Unit>
163 <Extensions> 163 <Extensions>
164 - <code_completion />  
165 - <envvars />  
166 - <debugger />  
167 <lib_finder disable_auto="1" /> 164 <lib_finder disable_auto="1" />
168 </Extensions> 165 </Extensions>
169 </Project> 166 </Project>
server/src/core/linux/gobject.c
@@ -197,6 +197,10 @@ void ipc3270_add_terminal_introspection(GString *introspection) { @@ -197,6 +197,10 @@ void ipc3270_add_terminal_introspection(GString *introspection) {
197 " <arg type='i' name='addr' direction='in' />" \ 197 " <arg type='i' name='addr' direction='in' />" \
198 " <arg type='i' name='old' direction='out' />" \ 198 " <arg type='i' name='old' direction='out' />" \
199 " </method>" \ 199 " </method>" \
  200 + " <method name= 'getCursorPosition'>" \
  201 + " <arg type='u' name='row' direction='out' />" \
  202 + " <arg type='u' name='col' direction='out' />" \
  203 + " </method>" \
200 " <method name= 'getFieldAttribute'>" \ 204 " <method name= 'getFieldAttribute'>" \
201 " <arg type='u' name='attribute' direction='out' />" \ 205 " <arg type='u' name='attribute' direction='out' />" \
202 " </method>" \ 206 " </method>" \
server/src/core/linux/response.c
@@ -1,149 +0,0 @@ @@ -1,149 +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 "gobject.h"  
36 -#include <lib3270.h>  
37 -#include <lib3270/actions.h>  
38 -#include <lib3270/properties.h>  
39 -#include <lib3270/toggle.h>  
40 -#include <v3270.h>  
41 -  
42 -#include <dbus/dbus-glib.h>  
43 -#include <dbus/dbus-glib-bindings.h>  
44 -  
45 -/*--[ Widget definition ]----------------------------------------------------------------------------*/  
46 -  
47 -struct _ipc3270Response {  
48 - GObject parent;  
49 - GVariant * value;  
50 -};  
51 -  
52 -struct _ipc3270ResponseClass {  
53 -  
54 - GObjectClass parent;  
55 - int dummy;  
56 -  
57 -};  
58 -  
59 -  
60 -G_DEFINE_TYPE(ipc3270Response, ipc3270Response, G_TYPE_OBJECT)  
61 -  
62 -/*--[ Implement ]------------------------------------------------------------------------------------*/  
63 -  
64 -static void ipc3270Response_finalize(GObject *object) {  
65 -  
66 - ipc3270Response * response = IPC3270_RESPONSE(object);  
67 -  
68 - debug("%s value=%p",__FUNCTION__,response->value);  
69 -  
70 - if(response->value)  
71 - g_variant_unref(response->value);  
72 -  
73 -}  
74 -  
75 -  
76 -static void ipc3270Response_class_init(ipc3270ResponseClass *klass) {  
77 -  
78 - debug("%s",__FUNCTION__);  
79 -  
80 - GObjectClass *object_class;  
81 - object_class = G_OBJECT_CLASS (klass);  
82 - object_class->finalize = ipc3270Response_finalize;  
83 -  
84 -}  
85 -  
86 -static void ipc3270Response_init(ipc3270Response *object) {  
87 -  
88 - object->value = NULL;  
89 -  
90 -}  
91 -  
92 -GObject * ipc3270_response_new() {  
93 - return g_object_new(GLIB_TYPE_IPC3270_RESPONSE, NULL);  
94 -}  
95 -  
96 -void ipc3270_response_append_int32(GObject *object, gint32 value) {  
97 -  
98 - ipc3270Response * response = IPC3270_RESPONSE(object);  
99 -  
100 - if(response->value)  
101 - g_variant_unref(response->value);  
102 -  
103 - response->value = g_variant_new_int32(value);  
104 -}  
105 -  
106 -void ipc3270_response_append_uint32(GObject *object, guint32 value) {  
107 -  
108 - ipc3270Response * response = IPC3270_RESPONSE(object);  
109 -  
110 - if(response->value)  
111 - g_variant_unref(response->value);  
112 -  
113 - response->value = g_variant_new_uint32(value);  
114 -}  
115 -  
116 -void ipc3270_response_append_string(GObject *object, const gchar *text) {  
117 -  
118 - ipc3270Response * response = IPC3270_RESPONSE(object);  
119 -  
120 - if(response->value)  
121 - g_variant_unref(response->value);  
122 -  
123 - response->value = g_variant_new_string(text);  
124 -  
125 -}  
126 -  
127 -void ipc3270_response_append_boolean(GObject *object, gboolean value) {  
128 -  
129 - ipc3270Response * response = IPC3270_RESPONSE(object);  
130 -  
131 - if(response->value)  
132 - g_variant_unref(response->value);  
133 -  
134 - response->value = g_variant_new_boolean(value);  
135 -}  
136 -  
137 -GVariant * ipc3270_response_steal_value(GObject *object) {  
138 -  
139 - ipc3270Response * response = IPC3270_RESPONSE(object);  
140 -  
141 - GVariant * value = response->value;  
142 - response->value = NULL;  
143 -  
144 - return value;  
145 -}  
146 -  
147 -gboolean ipc3270_response_has_values(GObject *object) {  
148 - return IPC3270_RESPONSE(object)->value != NULL;  
149 -}  
server/src/core/linux/start.c
@@ -67,8 +67,16 @@ static void @@ -67,8 +67,16 @@ static void
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. 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.
68 // Even if the method has a single out-parameter, it must be contained in a tuple. 68 // Even if the method has a single out-parameter, it must be contained in a tuple.
69 69
70 - GVariant *values[] = { ipc3270_response_steal_value(response) };  
71 - g_dbus_method_invocation_return_value(invocation, g_variant_new_tuple(values,1)); 70 + guint ix;
  71 + guint length = ipc3270_response_length(response);
  72 +
  73 + g_autofree GVariant ** values = g_new0(GVariant *, length);
  74 +
  75 + for(ix = 0; ix < length; ix++) {
  76 + values[ix] = ipc3270_response_steal_value(response);
  77 + }
  78 +
  79 + g_dbus_method_invocation_return_value(invocation, g_variant_new_tuple(values,length));
72 80
73 } else { 81 } else {
74 82
server/src/core/methods/cursor.c
@@ -66,3 +66,22 @@ int ipc3270_method_set_cursor(GObject *session, GVariant *request, GObject *resp @@ -66,3 +66,22 @@ int ipc3270_method_set_cursor(GObject *session, GVariant *request, GObject *resp
66 return 0; 66 return 0;
67 } 67 }
68 68
  69 +int ipc3270_method_get_cursor_position(GObject *session, GVariant G_GNUC_UNUSED(*request), GObject *response, GError **error) {
  70 +
  71 + H3270 *hSession = ipc3270_get_session(session);
  72 +
  73 + if(*error)
  74 + return 0;
  75 +
  76 + unsigned short row, col;
  77 +
  78 + int rc = lib3270_get_cursor_position(hSession,&row,&col);
  79 + if(rc)
  80 + return rc;
  81 +
  82 + ipc3270_response_append_uint32(response, (guint32) row);
  83 + ipc3270_response_append_uint32(response, (guint32) col);
  84 +
  85 + return 0;
  86 +}
  87 +
server/src/core/methods/methods.c
@@ -71,6 +71,7 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req @@ -71,6 +71,7 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req
71 71
72 { "setCursorAddress", ipc3270_method_set_cursor }, 72 { "setCursorAddress", ipc3270_method_set_cursor },
73 { "setCursorPosition", ipc3270_method_set_cursor }, 73 { "setCursorPosition", ipc3270_method_set_cursor },
  74 + { "getCursorPosition", ipc3270_method_get_cursor_position },
74 75
75 { "action", ipc3270_method_action }, 76 { "action", ipc3270_method_action },
76 { "activatable", ipc3270_method_activatable }, 77 { "activatable", ipc3270_method_activatable },
server/src/core/methods/private.h
@@ -57,6 +57,7 @@ @@ -57,6 +57,7 @@
57 G_GNUC_INTERNAL int ipc3270_method_wait_for_keyboard_unlock(GObject *session, GVariant *request, GObject *response, GError **error); 57 G_GNUC_INTERNAL int ipc3270_method_wait_for_keyboard_unlock(GObject *session, GVariant *request, GObject *response, GError **error);
58 58
59 G_GNUC_INTERNAL int ipc3270_method_set_cursor(GObject *session, GVariant *request, GObject *response, GError **error); 59 G_GNUC_INTERNAL int ipc3270_method_set_cursor(GObject *session, GVariant *request, GObject *response, GError **error);
  60 + G_GNUC_INTERNAL int ipc3270_method_get_cursor_position(GObject *session, GVariant *request, GObject *response, GError **error);
60 61
61 G_GNUC_INTERNAL int ipc3270_method_action(GObject *session, GVariant *request, GObject *response, GError **error); 62 G_GNUC_INTERNAL int ipc3270_method_action(GObject *session, GVariant *request, GObject *response, GError **error);
62 G_GNUC_INTERNAL int ipc3270_method_activatable(GObject *session, GVariant *request, GObject *response, GError **error); 63 G_GNUC_INTERNAL int ipc3270_method_activatable(GObject *session, GVariant *request, GObject *response, GError **error);
server/src/core/response.c 0 → 100644
@@ -0,0 +1,139 @@ @@ -0,0 +1,139 @@
  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 <internals.h>
  36 +
  37 +#include <glib.h>
  38 +#include <gio/gio.h>
  39 +
  40 +#include <ipc-glib.h>
  41 +#include <lib3270.h>
  42 +
  43 +#include <lib3270/actions.h>
  44 +#include <lib3270/properties.h>
  45 +#include <lib3270/toggle.h>
  46 +#include <v3270.h>
  47 +
  48 +#include <dbus/dbus-glib.h>
  49 +#include <dbus/dbus-glib-bindings.h>
  50 +
  51 +/*--[ Widget definition ]----------------------------------------------------------------------------*/
  52 +
  53 +struct _ipc3270Response {
  54 + GObject parent;
  55 + GList * values;
  56 +};
  57 +
  58 +struct _ipc3270ResponseClass {
  59 +
  60 + GObjectClass parent;
  61 + int dummy;
  62 +
  63 +};
  64 +
  65 +
  66 +G_DEFINE_TYPE(ipc3270Response, ipc3270Response, G_TYPE_OBJECT)
  67 +
  68 +/*--[ Implement ]------------------------------------------------------------------------------------*/
  69 +
  70 +static void ipc3270Response_finalize(GObject *object) {
  71 +
  72 + ipc3270Response * response = IPC3270_RESPONSE(object);
  73 +
  74 + if(response->values)
  75 + g_list_free_full(response->values,(GDestroyNotify) g_variant_unref);
  76 +
  77 +}
  78 +
  79 +
  80 +static void ipc3270Response_class_init(ipc3270ResponseClass *klass) {
  81 +
  82 + debug("%s",__FUNCTION__);
  83 +
  84 + GObjectClass *object_class;
  85 + object_class = G_OBJECT_CLASS (klass);
  86 + object_class->finalize = ipc3270Response_finalize;
  87 +
  88 +}
  89 +
  90 +static void ipc3270Response_init(ipc3270Response *object) {
  91 +
  92 + object->values = NULL;
  93 +
  94 +}
  95 +
  96 +GObject * ipc3270_response_new() {
  97 + return g_object_new(GLIB_TYPE_IPC3270_RESPONSE, NULL);
  98 +}
  99 +
  100 +void ipc3270_response_append(GObject *object, GVariant *value) {
  101 + ipc3270Response * response = IPC3270_RESPONSE(object);
  102 + response->values = g_list_append(response->values,value);
  103 +}
  104 +
  105 +void ipc3270_response_append_int32(GObject *object, gint32 value) {
  106 + ipc3270_response_append(object,g_variant_new_int32(value));
  107 +}
  108 +
  109 +void ipc3270_response_append_uint32(GObject *object, guint32 value) {
  110 + ipc3270_response_append(object,g_variant_new_uint32(value));
  111 +}
  112 +
  113 +void ipc3270_response_append_string(GObject *object, const gchar *text) {
  114 + ipc3270_response_append(object,g_variant_new_string(text));
  115 +}
  116 +
  117 +void ipc3270_response_append_boolean(GObject *object, gboolean value) {
  118 + ipc3270_response_append(object,g_variant_new_boolean(value));
  119 +}
  120 +
  121 +GVariant * ipc3270_response_steal_value(GObject *object) {
  122 +
  123 + ipc3270Response * response = IPC3270_RESPONSE(object);
  124 +
  125 + GList *first = g_list_first(response->values);
  126 + GVariant * value = first->data;
  127 +
  128 + response->values = g_list_remove(response->values,value);
  129 +
  130 + return value;
  131 +}
  132 +
  133 +guint ipc3270_response_length(GObject *object) {
  134 + return g_list_length(IPC3270_RESPONSE(object)->values);
  135 +}
  136 +
  137 +gboolean ipc3270_response_has_values(GObject *object) {
  138 + return IPC3270_RESPONSE(object)->values != NULL;
  139 +}
server/src/core/windows/response.c
@@ -1,150 +0,0 @@ @@ -1,150 +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 "gobject.h"  
36 -#include <lib3270.h>  
37 -#include <lib3270/actions.h>  
38 -#include <lib3270/properties.h>  
39 -#include <lib3270/toggle.h>  
40 -#include <lib3270/log.h>  
41 -#include <v3270.h>  
42 -  
43 -/*--[ Widget definition ]----------------------------------------------------------------------------*/  
44 -  
45 -struct _ipc3270Response {  
46 - GObject parent;  
47 - GVariant * value;  
48 -};  
49 -  
50 -struct _ipc3270ResponseClass {  
51 -  
52 - GObjectClass parent;  
53 - int dummy;  
54 -  
55 -};  
56 -  
57 -  
58 -G_DEFINE_TYPE(ipc3270Response, ipc3270Response, G_TYPE_OBJECT)  
59 -  
60 -/*--[ Implement ]------------------------------------------------------------------------------------*/  
61 -  
62 -static void ipc3270Response_finalize(GObject *object) {  
63 -  
64 - ipc3270Response * response = IPC3270_RESPONSE(object);  
65 -  
66 - debug("%s value=%p",__FUNCTION__,response->value);  
67 -  
68 - if(response->value)  
69 - g_variant_unref(response->value);  
70 -  
71 -}  
72 -  
73 -  
74 -static void ipc3270Response_class_init(ipc3270ResponseClass *klass) {  
75 -  
76 - debug("%s",__FUNCTION__);  
77 -  
78 - GObjectClass *object_class;  
79 - object_class = G_OBJECT_CLASS (klass);  
80 - object_class->finalize = ipc3270Response_finalize;  
81 -  
82 -}  
83 -  
84 -static void ipc3270Response_init(ipc3270Response *object) {  
85 -  
86 - object->value = NULL;  
87 -  
88 -}  
89 -  
90 -GObject * ipc3270_response_new() {  
91 - return g_object_new(GLIB_TYPE_IPC3270_RESPONSE, NULL);  
92 -}  
93 -  
94 -void ipc3270_response_append_int32(GObject *object, gint32 value) {  
95 -  
96 - debug("%s(%d)",__FUNCTION__,value);  
97 -  
98 - ipc3270Response * response = IPC3270_RESPONSE(object);  
99 -  
100 - if(response->value)  
101 - g_variant_unref(response->value);  
102 -  
103 - response->value = g_variant_new_int32(value);  
104 -}  
105 -  
106 -void ipc3270_response_append_uint32(GObject *object, guint32 value) {  
107 -  
108 - ipc3270Response * response = IPC3270_RESPONSE(object);  
109 -  
110 - if(response->value)  
111 - g_variant_unref(response->value);  
112 -  
113 - response->value = g_variant_new_uint32(value);  
114 -}  
115 -  
116 -void ipc3270_response_append_string(GObject *object, const gchar *text) {  
117 -  
118 - ipc3270Response * response = IPC3270_RESPONSE(object);  
119 -  
120 - if(response->value)  
121 - g_variant_unref(response->value);  
122 -  
123 - response->value = g_variant_new_string(text);  
124 -  
125 -}  
126 -  
127 -void ipc3270_response_append_boolean(GObject *object, gboolean value) {  
128 -  
129 - ipc3270Response * response = IPC3270_RESPONSE(object);  
130 -  
131 - if(response->value)  
132 - g_variant_unref(response->value);  
133 -  
134 - response->value = g_variant_new_boolean(value);  
135 -}  
136 -  
137 -  
138 -GVariant * ipc3270_response_steal_value(GObject *object) {  
139 -  
140 - ipc3270Response * response = IPC3270_RESPONSE(object);  
141 -  
142 - GVariant * value = response->value;  
143 - response->value = NULL;  
144 -  
145 - return value;  
146 -}  
147 -  
148 -gboolean ipc3270_response_has_values(GObject *object) {  
149 - return IPC3270_RESPONSE(object)->value != NULL;  
150 -}  
server/src/include/ipc-glib.h
@@ -113,6 +113,8 @@ @@ -113,6 +113,8 @@
113 void ipc3270_response_append_boolean(GObject *object, gboolean value); 113 void ipc3270_response_append_boolean(GObject *object, gboolean value);
114 114
115 gboolean ipc3270_response_has_values(GObject *object); 115 gboolean ipc3270_response_has_values(GObject *object);
  116 + guint ipc3270_response_length(GObject *object);
  117 +
116 GVariant * ipc3270_response_steal_value(GObject *object); 118 GVariant * ipc3270_response_steal_value(GObject *object);
117 119
118 120
server/src/testprogram/testprogram.c
@@ -43,6 +43,7 @@ @@ -43,6 +43,7 @@
43 #include <glib.h> 43 #include <glib.h>
44 #include <glib/gstdio.h> 44 #include <glib/gstdio.h>
45 #include <lib3270/toggle.h> 45 #include <lib3270/toggle.h>
  46 + #include <lib3270/ssl.h>
46 47
47 /*---[ Globals ]------------------------------------------------------------------------------------*/ 48 /*---[ Globals ]------------------------------------------------------------------------------------*/
48 49
@@ -106,6 +107,9 @@ @@ -106,6 +107,9 @@
106 GtkWidget * notebook = gtk_notebook_new(); 107 GtkWidget * notebook = gtk_notebook_new();
107 GModule * module = NULL; 108 GModule * module = NULL;
108 109
  110 + // Hack to speed up the tests.
  111 + lib3270_ssl_set_crl_download(v3270_get_session(terminal),0);
  112 +
109 gtk_widget_set_name(window,session_name); 113 gtk_widget_set_name(window,session_name);
110 v3270_set_session_name(terminal,session_name); 114 v3270_set_session_name(terminal,session_name);
111 115
server/testscripts/dbus.conf 0 → 100644
@@ -0,0 +1,6 @@ @@ -0,0 +1,6 @@
  1 +
  2 +PRODUCT_NAME=$(pkg-config --variable=product_name lib3270)
  3 +
  4 +DBUS_DEST=br.com.bb.${PRODUCT_NAME}.a
  5 +DBUS_PATH="/br/com/bb/${PRODUCT_NAME}/a"
  6 +DBUS_INTERFACE="br.com.bb.tn3270.session"
server/testscripts/getcursorposition.sh 0 → 100755
@@ -0,0 +1,14 @@ @@ -0,0 +1,14 @@
  1 +#!/bin/bash
  2 +#
  3 +# https://stackoverflow.com/questions/48648952/set-get-property-using-dbus-send
  4 +#
  5 +
  6 +. ./dbus.conf
  7 +
  8 +dbus-send \
  9 + --session \
  10 + --dest=${DBUS_DEST} \
  11 + --print-reply \
  12 + "${DBUS_PATH}" \
  13 + "${DBUS_INTERFACE}.getCursorPosition"
  14 +
server/testscripts/introspect.sh
1 #!/bin/bash 1 #!/bin/bash
2 2
3 -PRODUCT_NAME=$(pkg-config --variable=product_name lib3270) 3 +. ./dbus.conf
4 4
5 gdbus \ 5 gdbus \
6 introspect \ 6 introspect \
7 --session \ 7 --session \
8 - --dest=br.com.bb.${PRODUCT_NAME}.a \  
9 - --object-path=/br/com/bb/${PRODUCT_NAME}/a 8 + --dest=${DBUS_DEST} \
  9 + --object-path="${DBUS_PATH}"
10 10