Commit 1721891b3875173da28a46c38f20a292ee5917e5

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

Refactoring D-Bus methods.

client/src/core/linux/request.cc
... ... @@ -46,37 +46,38 @@
46 46  
47 47 IPC::Request::Request(DBusConnection * conn) {
48 48 this->conn = conn;
49   - this->msg.in = nullptr;
50   - this->msg.out = nullptr;
  49 + this->response.msg = nullptr;
  50 + this->request.msg = nullptr;
51 51 }
52 52  
53 53 IPC::Request::~Request() {
54   - if(msg.out) {
55   - dbus_message_unref(msg.out);
  54 + if(request.msg) {
  55 + dbus_message_unref(request.msg);
56 56 }
57   - if(msg.in) {
58   - dbus_message_unref(msg.in);
  57 +
  58 + if(response.msg) {
  59 + dbus_message_unref(response.msg);
59 60 }
60 61 }
61 62  
62 63 IPC::Request & IPC::Request::call() {
63 64  
64   - if(msg.in) {
65   - dbus_message_unref(msg.in);
66   - msg.in = nullptr;
  65 + if(response.msg) {
  66 + dbus_message_unref(response.msg);
  67 + response.msg = nullptr;
67 68 }
68 69  
69 70 DBusError error;
70 71 dbus_error_init(&error);
71   - this->msg.in = dbus_connection_send_with_reply_and_block(this->conn,this->msg.out,10000,&error);
  72 + response.msg = dbus_connection_send_with_reply_and_block(this->conn,request.msg,10000,&error);
72 73  
73   - if(!this->msg.in) {
  74 + if(!response.msg) {
74 75 string message = error.message;
75 76 dbus_error_free(&error);
76 77 throw std::runtime_error(message.c_str());
77 78 }
78 79  
79   - dbus_message_iter_init(msg.in, &msg.iter);
  80 + dbus_message_iter_init(response.msg, &response.iter);
80 81  
81 82 // debug(__FUNCTION__," got a valid response");
82 83  
... ... @@ -84,46 +85,53 @@
84 85  
85 86 }
86 87  
  88 + IPC::Request & IPC::Request::push(int type, const void *value) {
  89 +
  90 + DBusMessageIter iter;
  91 + dbus_message_iter_init_append(request.msg, &iter);
  92 +
  93 + if (!dbus_message_iter_append_basic(&iter,type,value)) {
  94 + throw std::runtime_error("Can't append value");
  95 + }
  96 +
  97 + return *this;
  98 +
  99 + }
  100 +
87 101 IPC::Request & IPC::Request::push(const char *arg) {
88   - dbus_message_append_args(this->msg.out,DBUS_TYPE_STRING,&arg,DBUS_TYPE_INVALID);
89   - return *this;
  102 + return push(DBUS_TYPE_STRING,&arg);
90 103 }
91 104  
92 105 IPC::Request & IPC::Request::push(const bool arg) {
93   - dbus_message_append_args(this->msg.out,DBUS_TYPE_BOOLEAN,&arg,DBUS_TYPE_INVALID);
94   - return *this;
  106 + return push(DBUS_TYPE_BOOLEAN,&arg);
95 107 }
96 108  
97 109 IPC::Request & IPC::Request::push(const uint8_t arg) {
98   - dbus_message_append_args(this->msg.out,DBUS_TYPE_BYTE,&arg,DBUS_TYPE_INVALID);
99   - return *this;
  110 + return push(DBUS_TYPE_BYTE,&arg);
100 111 }
101 112  
102 113 IPC::Request & IPC::Request::push(const int32_t arg) {
103   - dbus_message_append_args(this->msg.out,DBUS_TYPE_INT32,&arg,DBUS_TYPE_INVALID);
104   - return *this;
  114 + return push(DBUS_TYPE_INT32,&arg);
105 115 }
106 116  
107 117 IPC::Request & IPC::Request::push(const uint32_t arg) {
108   - dbus_message_append_args(this->msg.out,DBUS_TYPE_UINT32,&arg,DBUS_TYPE_INVALID);
109   - return *this;
  118 + return push(DBUS_TYPE_UINT32,&arg);
110 119 }
111 120  
112   -
113 121 IPC::Request & IPC::Request::pop(std::string &value) {
114 122  
115 123 const char * str = "";
116 124  
117   - if(dbus_message_iter_get_arg_type(&msg.iter) == DBUS_TYPE_STRING) {
  125 + if(dbus_message_iter_get_arg_type(&response.iter) == DBUS_TYPE_STRING) {
118 126  
119   - dbus_message_iter_get_basic(&msg.iter, &str);
  127 + dbus_message_iter_get_basic(&response.iter, &str);
120 128  
121   - } else if(dbus_message_iter_get_arg_type(&msg.iter) == DBUS_TYPE_VARIANT) {
  129 + } else if(dbus_message_iter_get_arg_type(&response.iter) == DBUS_TYPE_VARIANT) {
122 130  
123 131 DBusMessageIter sub;
124 132 int current_type;
125 133  
126   - dbus_message_iter_recurse(&msg.iter, &sub);
  134 + dbus_message_iter_recurse(&response.iter, &sub);
127 135  
128 136 while ((current_type = dbus_message_iter_get_arg_type(&sub)) != DBUS_TYPE_INVALID) {
129 137  
... ... @@ -136,12 +144,12 @@
136 144  
137 145 } else {
138 146  
139   - debug("Argument type is ", ((char) dbus_message_iter_get_arg_type(&msg.iter)) );
  147 + debug("Argument type is ", ((char) dbus_message_iter_get_arg_type(&response.iter)) );
140 148 throw std::runtime_error("Expected an string data type");
141 149  
142 150 }
143 151  
144   - dbus_message_iter_next(&msg.iter);
  152 + dbus_message_iter_next(&response.iter);
145 153  
146 154 value.assign(str);
147 155  
... ... @@ -304,8 +312,8 @@
304 312  
305 313 IPC::Request & IPC::Request::Request::pop(int &value) {
306 314  
307   - value = getIntValue(msg.iter);
308   - dbus_message_iter_next(&msg.iter);
  315 + value = getIntValue(response.iter);
  316 + dbus_message_iter_next(&response.iter);
309 317 // debug(__FUNCTION__,"= \"",value,"\"");
310 318  
311 319 return *this;
... ... @@ -314,8 +322,8 @@
314 322  
315 323 IPC::Request & IPC::Request::Request::pop(unsigned int &value) {
316 324  
317   - value = getUIntValue(msg.iter);
318   - dbus_message_iter_next(&msg.iter);
  325 + value = getUIntValue(response.iter);
  326 + dbus_message_iter_next(&response.iter);
319 327 // debug(__FUNCTION__,"= \"",value,"\"");
320 328  
321 329 return *this;
... ... @@ -324,8 +332,8 @@
324 332  
325 333 IPC::Request & IPC::Request::Request::pop(bool &value) {
326 334  
327   - value = getBooleanValue(msg.iter);
328   - dbus_message_iter_next(&msg.iter);
  335 + value = getBooleanValue(response.iter);
  336 + dbus_message_iter_next(&response.iter);
329 337 // debug(__FUNCTION__,"= \"",value,"\"");
330 338  
331 339 return *this;
... ...
client/src/include/lib3270/ipc/request.h
... ... @@ -105,12 +105,17 @@
105 105 uint16_t * outvalues;
106 106  
107 107 #else
  108 + /// @brief Message received from server.
108 109 struct {
109   - DBusMessage * in;
110   - DBusMessage * out;
  110 + DBusMessage * msg;
111 111 DBusMessageIter iter;
  112 + } response;
  113 +
  114 + /// @brief Message who will be sent to server.
  115 + struct {
  116 + DBusMessage * msg;
  117 + } request;
112 118  
113   - } msg;
114 119 DBusConnection * conn;
115 120  
116 121 Request(DBusConnection * conn);
... ... @@ -121,6 +126,11 @@
121 126  
122 127 #ifdef _WIN32
123 128 Request(HANDLE hPipe, const char *name, uint16_t type);
  129 +
  130 +#else
  131 +
  132 + IPC::Request & push(int type, const void *value);
  133 +
124 134 #endif // _WIN32
125 135  
126 136 public:
... ...
client/src/session/remote/linux/request.cc
... ... @@ -49,18 +49,14 @@
49 49  
50 50 IPC::Request::Request(const IPC::Session &session, const char *method) : Request(session.conn) {
51 51  
52   -#ifdef DEBUG
53   - clog << "Creating request \"" << method << "\"" << endl;
54   -#endif // DEBUG
55   -
56   - this->msg.out = dbus_message_new_method_call(
  52 + request.msg = dbus_message_new_method_call(
57 53 session.name.c_str(), // Destination
58 54 session.path.c_str(), // Path
59 55 session.interface.c_str(), // Interface
60 56 method // Method
61 57 );
62 58  
63   - if(!msg.out) {
  59 + if(!request.msg) {
64 60 throw std::runtime_error("Can't create D-Bus Method Call");
65 61 }
66 62  
... ... @@ -68,14 +64,14 @@
68 64  
69 65 IPC::Request::Request(const IPC::Session &session, bool isSet, const char *property) : Request(session.conn) {
70 66  
71   - this->msg.out = dbus_message_new_method_call(
  67 + request.msg = dbus_message_new_method_call(
72 68 session.name.c_str(), // Destination
73 69 session.path.c_str(), // Path
74 70 "org.freedesktop.DBus.Properties", // Interface
75 71 (isSet ? "Set" : "Get")
76 72 );
77 73  
78   - if(!msg.out) {
  74 + if(!request.msg) {
79 75 throw std::runtime_error("Can't create D-Bus Property Call");
80 76 }
81 77  
... ... @@ -89,12 +85,8 @@
89 85 //
90 86 const char *interface_name = session.interface.c_str();
91 87  
92   - dbus_message_append_args(
93   - this->msg.out,
94   - DBUS_TYPE_STRING,&interface_name,
95   - DBUS_TYPE_STRING,&property,
96   - DBUS_TYPE_INVALID
97   - );
  88 + push(DBUS_TYPE_STRING,&interface_name);
  89 + push(DBUS_TYPE_STRING,&property);
98 90  
99 91 }
100 92  
... ...
server/testscripts/geturl.sh 0 → 100755
... ... @@ -0,0 +1,24 @@
  1 +#!/bin/bash
  2 +#
  3 +# https://stackoverflow.com/questions/48648952/set-get-property-using-dbus-send
  4 +#
  5 +
  6 +#dbus-send \
  7 +# --session \
  8 +# --dest=br.com.bb.pw3270.a\
  9 +# --print-reply \
  10 +# "/br/com/bb/tn3270/session" \
  11 +# "org.freedesktop.DBus.Properties.Get" \
  12 +# string:br.com.bb.tn3270.session \
  13 +# string:url
  14 +
  15 +
  16 +gdbus \
  17 + call \
  18 + --session \
  19 + --dest "br.com.bb.pw3270.a" \
  20 + --object-path "/br/com/bb/tn3270/session" \
  21 + --method org.freedesktop.DBus.Properties.Get \
  22 + "br.com.bb.tn3270.session" \
  23 + "url"
  24 +
... ...
server/testscripts/seturl.sh 0 → 100755
... ... @@ -0,0 +1,37 @@
  1 +#!/bin/bash
  2 +#
  3 +# https://stackoverflow.com/questions/48648952/set-get-property-using-dbus-send
  4 +#
  5 +
  6 +dbus-send \
  7 + --session \
  8 + --dest=br.com.bb.pw3270.a\
  9 + --print-reply \
  10 + "/br/com/bb/tn3270/session" \
  11 + "org.freedesktop.DBus.Properties.Set" \
  12 + string:br.com.bb.tn3270.session \
  13 + string:url \
  14 + variant:string:${1}
  15 +
  16 +
  17 +#dbus-send --system --dest=$BUS_NAME --print-reply $OBJECT_PATH \
  18 + #org.freedesktop.DBus.Properties.Set string:com.pgaur.GDBUS string:Status variant:uint32:10
  19 +
  20 +#gdbus \
  21 +# introspect \
  22 +# --session \
  23 +# --dest=br.com.bb.pw3270.a \
  24 +# --object-path=/br/com/bb/tn3270/session
  25 +
  26 +#gdbus \
  27 +# call \
  28 +# --session \
  29 +# --dest br.com.bb.pw3270.a \
  30 +# --object-path /br/com/bb/tn3270/session \
  31 +# --method org.freedesktop.DBus.Properties.Set \
  32 +# "br.com.bb.tn3270.session" \
  33 +# "url" \
  34 +# ${1}
  35 +
  36 +
  37 +
... ...