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,37 +46,38 @@
46 46
47 IPC::Request::Request(DBusConnection * conn) { 47 IPC::Request::Request(DBusConnection * conn) {
48 this->conn = conn; 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 IPC::Request::~Request() { 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 IPC::Request & IPC::Request::call() { 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 DBusError error; 70 DBusError error;
70 dbus_error_init(&error); 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 string message = error.message; 75 string message = error.message;
75 dbus_error_free(&error); 76 dbus_error_free(&error);
76 throw std::runtime_error(message.c_str()); 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 // debug(__FUNCTION__," got a valid response"); 82 // debug(__FUNCTION__," got a valid response");
82 83
@@ -84,46 +85,53 @@ @@ -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 IPC::Request & IPC::Request::push(const char *arg) { 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 IPC::Request & IPC::Request::push(const bool arg) { 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 IPC::Request & IPC::Request::push(const uint8_t arg) { 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 IPC::Request & IPC::Request::push(const int32_t arg) { 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 IPC::Request & IPC::Request::push(const uint32_t arg) { 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 IPC::Request & IPC::Request::pop(std::string &value) { 121 IPC::Request & IPC::Request::pop(std::string &value) {
114 122
115 const char * str = ""; 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 DBusMessageIter sub; 131 DBusMessageIter sub;
124 int current_type; 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 while ((current_type = dbus_message_iter_get_arg_type(&sub)) != DBUS_TYPE_INVALID) { 136 while ((current_type = dbus_message_iter_get_arg_type(&sub)) != DBUS_TYPE_INVALID) {
129 137
@@ -136,12 +144,12 @@ @@ -136,12 +144,12 @@
136 144
137 } else { 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 throw std::runtime_error("Expected an string data type"); 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 value.assign(str); 154 value.assign(str);
147 155
@@ -304,8 +312,8 @@ @@ -304,8 +312,8 @@
304 312
305 IPC::Request & IPC::Request::Request::pop(int &value) { 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 // debug(__FUNCTION__,"= \"",value,"\""); 317 // debug(__FUNCTION__,"= \"",value,"\"");
310 318
311 return *this; 319 return *this;
@@ -314,8 +322,8 @@ @@ -314,8 +322,8 @@
314 322
315 IPC::Request & IPC::Request::Request::pop(unsigned int &value) { 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 // debug(__FUNCTION__,"= \"",value,"\""); 327 // debug(__FUNCTION__,"= \"",value,"\"");
320 328
321 return *this; 329 return *this;
@@ -324,8 +332,8 @@ @@ -324,8 +332,8 @@
324 332
325 IPC::Request & IPC::Request::Request::pop(bool &value) { 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 // debug(__FUNCTION__,"= \"",value,"\""); 337 // debug(__FUNCTION__,"= \"",value,"\"");
330 338
331 return *this; 339 return *this;
client/src/include/lib3270/ipc/request.h
@@ -105,12 +105,17 @@ @@ -105,12 +105,17 @@
105 uint16_t * outvalues; 105 uint16_t * outvalues;
106 106
107 #else 107 #else
  108 + /// @brief Message received from server.
108 struct { 109 struct {
109 - DBusMessage * in;  
110 - DBusMessage * out; 110 + DBusMessage * msg;
111 DBusMessageIter iter; 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 DBusConnection * conn; 119 DBusConnection * conn;
115 120
116 Request(DBusConnection * conn); 121 Request(DBusConnection * conn);
@@ -121,6 +126,11 @@ @@ -121,6 +126,11 @@
121 126
122 #ifdef _WIN32 127 #ifdef _WIN32
123 Request(HANDLE hPipe, const char *name, uint16_t type); 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 #endif // _WIN32 134 #endif // _WIN32
125 135
126 public: 136 public:
client/src/session/remote/linux/request.cc
@@ -49,18 +49,14 @@ @@ -49,18 +49,14 @@
49 49
50 IPC::Request::Request(const IPC::Session &session, const char *method) : Request(session.conn) { 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 session.name.c_str(), // Destination 53 session.name.c_str(), // Destination
58 session.path.c_str(), // Path 54 session.path.c_str(), // Path
59 session.interface.c_str(), // Interface 55 session.interface.c_str(), // Interface
60 method // Method 56 method // Method
61 ); 57 );
62 58
63 - if(!msg.out) { 59 + if(!request.msg) {
64 throw std::runtime_error("Can't create D-Bus Method Call"); 60 throw std::runtime_error("Can't create D-Bus Method Call");
65 } 61 }
66 62
@@ -68,14 +64,14 @@ @@ -68,14 +64,14 @@
68 64
69 IPC::Request::Request(const IPC::Session &session, bool isSet, const char *property) : Request(session.conn) { 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 session.name.c_str(), // Destination 68 session.name.c_str(), // Destination
73 session.path.c_str(), // Path 69 session.path.c_str(), // Path
74 "org.freedesktop.DBus.Properties", // Interface 70 "org.freedesktop.DBus.Properties", // Interface
75 (isSet ? "Set" : "Get") 71 (isSet ? "Set" : "Get")
76 ); 72 );
77 73
78 - if(!msg.out) { 74 + if(!request.msg) {
79 throw std::runtime_error("Can't create D-Bus Property Call"); 75 throw std::runtime_error("Can't create D-Bus Property Call");
80 } 76 }
81 77
@@ -89,12 +85,8 @@ @@ -89,12 +85,8 @@
89 // 85 //
90 const char *interface_name = session.interface.c_str(); 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 @@ @@ -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 @@ @@ -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 +