Commit 1721891b3875173da28a46c38f20a292ee5917e5
1 parent
58a91031
Exists in
master
and in
1 other branch
Refactoring D-Bus methods.
Showing
5 changed files
with
123 additions
and
52 deletions
Show diff stats
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 |
@@ -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 | + |
@@ -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 | + |