Commit 47073dedc3d82ac1e624927282d70becc0df0709
1 parent
d3a3a087
Exists in
master
and in
3 other branches
Implementing D-Bus basic request object.
Showing
6 changed files
with
135 additions
and
14 deletions
Show diff stats
src/include/lib3270++.h
@@ -212,6 +212,10 @@ | @@ -212,6 +212,10 @@ | ||
212 | return toString(); | 212 | return toString(); |
213 | } | 213 | } |
214 | 214 | ||
215 | + // Get properties. | ||
216 | + virtual std::string getVersion() const = 0; | ||
217 | + virtual std::string getRevision() const = 0; | ||
218 | + | ||
215 | virtual ProgramMessage getProgramMessage() const = 0; | 219 | virtual ProgramMessage getProgramMessage() const = 0; |
216 | inline operator ProgramMessage() const { | 220 | inline operator ProgramMessage() const { |
217 | return getProgramMessage(); | 221 | return getProgramMessage(); |
@@ -326,6 +330,18 @@ | @@ -326,6 +330,18 @@ | ||
326 | session->setCursorPosition(row,col); | 330 | session->setCursorPosition(row,col); |
327 | } | 331 | } |
328 | 332 | ||
333 | + // Get properties | ||
334 | + | ||
335 | + /// @brief Get lib3270 version. | ||
336 | + inline std::string getVersion() const { | ||
337 | + return session->getVersion(); | ||
338 | + } | ||
339 | + | ||
340 | + /// @brief Get lib3270 revision. | ||
341 | + std::string getRevision() const { | ||
342 | + return session->getRevision(); | ||
343 | + } | ||
344 | + | ||
329 | // Set contents. | 345 | // Set contents. |
330 | 346 | ||
331 | /// @brief Set field at current posicion, jumps to next writable field. | 347 | /// @brief Set field at current posicion, jumps to next writable field. |
src/lib3270++/ipc/session.cc
@@ -120,8 +120,7 @@ | @@ -120,8 +120,7 @@ | ||
120 | } | 120 | } |
121 | 121 | ||
122 | void IPC::Session::disconnect() { | 122 | void IPC::Session::disconnect() { |
123 | - Request request(*this,"disconnect"); | ||
124 | - request.call(); | 123 | + Request(*this,"disconnect").call(); |
125 | } | 124 | } |
126 | 125 | ||
127 | // Wait for session state. | 126 | // Wait for session state. |
@@ -212,6 +211,23 @@ | @@ -212,6 +211,23 @@ | ||
212 | 211 | ||
213 | } | 212 | } |
214 | 213 | ||
214 | + /// @brief Get lib3270 version. | ||
215 | + std::string IPC::Session::getVersion() const { | ||
216 | + | ||
217 | + string rc; | ||
218 | + | ||
219 | + Request request{*this,false,"version"}; | ||
220 | + request.call().pop(rc); | ||
221 | + | ||
222 | + return rc; | ||
223 | + } | ||
224 | + | ||
225 | + /// @brief Get lib3270 revision. | ||
226 | + std::string IPC::Session::getRevision() const { | ||
227 | + throw std::system_error(ENOTSUP, std::system_category()); | ||
228 | + return ""; | ||
229 | + } | ||
230 | + | ||
215 | } | 231 | } |
216 | 232 | ||
217 | 233 |
src/lib3270++/linux/request.cc
@@ -44,13 +44,13 @@ | @@ -44,13 +44,13 @@ | ||
44 | 44 | ||
45 | namespace TN3270 { | 45 | namespace TN3270 { |
46 | 46 | ||
47 | - IPC::Request::Request(Session &session) { | 47 | + IPC::Request::Request(const Session &session) { |
48 | this->conn = session.conn; | 48 | this->conn = session.conn; |
49 | this->msg.in = nullptr; | 49 | this->msg.in = nullptr; |
50 | this->msg.out = nullptr; | 50 | this->msg.out = nullptr; |
51 | } | 51 | } |
52 | 52 | ||
53 | - IPC::Request::Request(Session &session, const char *method) : Request(session) { | 53 | + IPC::Request::Request(const Session &session, const char *method) : Request(session) { |
54 | 54 | ||
55 | this->msg.out = dbus_message_new_method_call( | 55 | this->msg.out = dbus_message_new_method_call( |
56 | session.name.c_str(), // Destination | 56 | session.name.c_str(), // Destination |
@@ -65,13 +65,23 @@ | @@ -65,13 +65,23 @@ | ||
65 | 65 | ||
66 | } | 66 | } |
67 | 67 | ||
68 | - IPC::Request::Request(Session &session, const char *method, const char *property) : Request(session) { | 68 | + IPC::Request::Request(const Session &session, bool isSet, const char *property) : Request(session) { |
69 | 69 | ||
70 | +/* | ||
71 | + dbus-send \ | ||
72 | + --session \ | ||
73 | + --dest=br.com.bb.pw3270.a\ | ||
74 | + --print-reply \ | ||
75 | + "/br/com/bb/tn3270/session" \ | ||
76 | + "org.freedesktop.DBus.Properties.Get" \ | ||
77 | + string:br.com.bb.tn3270.session \ | ||
78 | + string:${1} | ||
79 | +*/ | ||
70 | this->msg.out = dbus_message_new_method_call( | 80 | this->msg.out = dbus_message_new_method_call( |
71 | session.name.c_str(), // Destination | 81 | session.name.c_str(), // Destination |
72 | session.path.c_str(), // Path | 82 | session.path.c_str(), // Path |
73 | "org.freedesktop.DBus.Properties", // Interface | 83 | "org.freedesktop.DBus.Properties", // Interface |
74 | - method // Method | 84 | + (isSet ? "Set" : "Get") |
75 | ); | 85 | ); |
76 | 86 | ||
77 | if(!msg.out) { | 87 | if(!msg.out) { |
@@ -91,7 +101,7 @@ | @@ -91,7 +101,7 @@ | ||
91 | dbus_message_append_args( | 101 | dbus_message_append_args( |
92 | this->msg.out, | 102 | this->msg.out, |
93 | DBUS_TYPE_STRING,&interface_name, | 103 | DBUS_TYPE_STRING,&interface_name, |
94 | - DBUS_TYPE_STRING,&method, | 104 | + DBUS_TYPE_STRING,&property, |
95 | DBUS_TYPE_INVALID | 105 | DBUS_TYPE_INVALID |
96 | ); | 106 | ); |
97 | 107 | ||
@@ -123,6 +133,10 @@ | @@ -123,6 +133,10 @@ | ||
123 | throw std::runtime_error(message.c_str()); | 133 | throw std::runtime_error(message.c_str()); |
124 | } | 134 | } |
125 | 135 | ||
136 | + dbus_message_iter_init(msg.in, &msg.iter); | ||
137 | + | ||
138 | + debug(__FUNCTION__," got a valid response"); | ||
139 | + | ||
126 | return *this; | 140 | return *this; |
127 | 141 | ||
128 | } | 142 | } |
@@ -132,6 +146,45 @@ | @@ -132,6 +146,45 @@ | ||
132 | return *this; | 146 | return *this; |
133 | } | 147 | } |
134 | 148 | ||
149 | + IPC::Request & IPC::Request::pop(std::string &value) { | ||
150 | + | ||
151 | + const char * str = ""; | ||
152 | + | ||
153 | + if(dbus_message_iter_get_arg_type(&msg.iter) == DBUS_TYPE_STRING) { | ||
154 | + | ||
155 | + dbus_message_iter_get_basic(&msg.iter, &str); | ||
156 | + | ||
157 | + } else if(dbus_message_iter_get_arg_type(&msg.iter) == DBUS_TYPE_VARIANT) { | ||
158 | + | ||
159 | + DBusMessageIter sub; | ||
160 | + int current_type; | ||
161 | + | ||
162 | + dbus_message_iter_recurse(&msg.iter, &sub); | ||
163 | + | ||
164 | + while ((current_type = dbus_message_iter_get_arg_type(&sub)) != DBUS_TYPE_INVALID) { | ||
165 | + | ||
166 | + if (current_type == DBUS_TYPE_STRING) { | ||
167 | + dbus_message_iter_get_basic(&sub, &str); | ||
168 | + break; | ||
169 | + } | ||
170 | + dbus_message_iter_next(&sub); | ||
171 | + } | ||
172 | + | ||
173 | + } else { | ||
174 | + | ||
175 | + debug("Argument type is ", ((char) dbus_message_iter_get_arg_type(&msg.iter)) ); | ||
176 | + throw std::runtime_error("Expected an string data type"); | ||
177 | + | ||
178 | + } | ||
179 | + | ||
180 | + value.assign(str); | ||
181 | + | ||
182 | + debug(__FUNCTION__,"= \"",str,"\""); | ||
183 | + | ||
184 | + return *this; | ||
185 | + } | ||
186 | + | ||
187 | + | ||
135 | } | 188 | } |
136 | 189 | ||
137 | 190 |
src/lib3270++/local/session.cc
@@ -298,6 +298,15 @@ | @@ -298,6 +298,15 @@ | ||
298 | 298 | ||
299 | } | 299 | } |
300 | 300 | ||
301 | + // Get properties. | ||
302 | + std::string Local::Session::getVersion() const { | ||
303 | + return lib3270_get_version(); | ||
304 | + } | ||
305 | + | ||
306 | + std::string Local::Session::getRevision() const { | ||
307 | + return lib3270_get_revision(); | ||
308 | + } | ||
309 | + | ||
301 | 310 | ||
302 | } | 311 | } |
303 | 312 |
src/lib3270++/private.h
@@ -176,6 +176,10 @@ | @@ -176,6 +176,10 @@ | ||
176 | // Wait for session state. | 176 | // Wait for session state. |
177 | void waitForReady(time_t timeout = 5) throw() override; | 177 | void waitForReady(time_t timeout = 5) throw() override; |
178 | 178 | ||
179 | + // Get properties. | ||
180 | + std::string getVersion() const override; | ||
181 | + std::string getRevision() const override; | ||
182 | + | ||
179 | // Gets | 183 | // Gets |
180 | std::string toString(int baddr, size_t len, char lf) const override; | 184 | std::string toString(int baddr, size_t len, char lf) const override; |
181 | std::string toString(int row, int col, size_t sz, char lf) const override; | 185 | std::string toString(int row, int col, size_t sz, char lf) const override; |
@@ -233,28 +237,42 @@ | @@ -233,28 +237,42 @@ | ||
233 | static DWORD pack(std::vector<DataBlock *> &args, uint8_t * outBuffer, size_t szBuffer); | 237 | static DWORD pack(std::vector<DataBlock *> &args, uint8_t * outBuffer, size_t szBuffer); |
234 | #else | 238 | #else |
235 | struct { | 239 | struct { |
236 | - DBusMessage * in; | ||
237 | - DBusMessage * out; | 240 | + DBusMessage * in; |
241 | + DBusMessage * out; | ||
242 | + DBusMessageIter iter; | ||
243 | + | ||
238 | } msg; | 244 | } msg; |
239 | DBusConnection * conn; | 245 | DBusConnection * conn; |
240 | 246 | ||
241 | #endif // _WIN32 | 247 | #endif // _WIN32 |
242 | 248 | ||
243 | - Request(Session &session); | 249 | + Request(const Session &session); |
244 | 250 | ||
245 | public: | 251 | public: |
246 | 252 | ||
247 | /// @brief Create a method call. | 253 | /// @brief Create a method call. |
248 | - Request(Session &session, const char *method); | 254 | + Request(const Session &session, const char *method); |
249 | 255 | ||
250 | /// @brief Create a get/set property call. | 256 | /// @brief Create a get/set property call. |
251 | - Request(Session &session, const char *method, const char *property); | 257 | + /// |
258 | + /// @param session Session object. | ||
259 | + /// @param isSet true if this is a setProperty call. | ||
260 | + /// @param property Property name. | ||
261 | + // | ||
262 | + Request(const Session &session, bool isSet, const char *property); | ||
252 | 263 | ||
253 | ~Request(); | 264 | ~Request(); |
254 | 265 | ||
255 | Request & call(); | 266 | Request & call(); |
267 | + | ||
268 | + // Push values | ||
269 | + | ||
256 | Request & push(const char *arg); | 270 | Request & push(const char *arg); |
257 | 271 | ||
272 | + // Pop values | ||
273 | + | ||
274 | + Request & pop(std::string &value); | ||
275 | + | ||
258 | }; | 276 | }; |
259 | 277 | ||
260 | class TN3270_PRIVATE Session : public TN3270::Abstract::Session { | 278 | class TN3270_PRIVATE Session : public TN3270::Abstract::Session { |
@@ -288,6 +306,10 @@ | @@ -288,6 +306,10 @@ | ||
288 | // Wait for session state. | 306 | // Wait for session state. |
289 | void waitForReady(time_t timeout = 5) throw() override; | 307 | void waitForReady(time_t timeout = 5) throw() override; |
290 | 308 | ||
309 | + // Get properties. | ||
310 | + std::string getVersion() const override; | ||
311 | + std::string getRevision() const override; | ||
312 | + | ||
291 | // Gets | 313 | // Gets |
292 | std::string toString(int baddr, size_t len, char lf) const override; | 314 | std::string toString(int baddr, size_t len, char lf) const override; |
293 | std::string toString(int row, int col, size_t sz, char lf) const override; | 315 | std::string toString(int row, int col, size_t sz, char lf) const override; |
src/lib3270++/testprogram/testprogram.cc
@@ -45,9 +45,14 @@ | @@ -45,9 +45,14 @@ | ||
45 | 45 | ||
46 | int main(int argc, const char *argv[]) { | 46 | int main(int argc, const char *argv[]) { |
47 | 47 | ||
48 | - TN3270::Host host("pw3270:a"); | 48 | + TN3270::Host host{"pw3270:a"}; |
49 | 49 | ||
50 | - host.connect(getenv("LIB3270_DEFAULT_HOST")); | 50 | + cout |
51 | + << "Version: " << host.getVersion() | ||
52 | +// << " Revision: " << host.getRevision() | ||
53 | + << std::endl; | ||
54 | + | ||
55 | + // host.connect(getenv("LIB3270_DEFAULT_HOST")); | ||
51 | 56 | ||
52 | /* | 57 | /* |
53 | cout << host << endl; | 58 | cout << host << endl; |