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 | 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 | 219 | virtual ProgramMessage getProgramMessage() const = 0; |
216 | 220 | inline operator ProgramMessage() const { |
217 | 221 | return getProgramMessage(); |
... | ... | @@ -326,6 +330,18 @@ |
326 | 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 | 345 | // Set contents. |
330 | 346 | |
331 | 347 | /// @brief Set field at current posicion, jumps to next writable field. | ... | ... |
src/lib3270++/ipc/session.cc
... | ... | @@ -120,8 +120,7 @@ |
120 | 120 | } |
121 | 121 | |
122 | 122 | void IPC::Session::disconnect() { |
123 | - Request request(*this,"disconnect"); | |
124 | - request.call(); | |
123 | + Request(*this,"disconnect").call(); | |
125 | 124 | } |
126 | 125 | |
127 | 126 | // Wait for session state. |
... | ... | @@ -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 | 44 | |
45 | 45 | namespace TN3270 { |
46 | 46 | |
47 | - IPC::Request::Request(Session &session) { | |
47 | + IPC::Request::Request(const Session &session) { | |
48 | 48 | this->conn = session.conn; |
49 | 49 | this->msg.in = nullptr; |
50 | 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 | 55 | this->msg.out = dbus_message_new_method_call( |
56 | 56 | session.name.c_str(), // Destination |
... | ... | @@ -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 | 80 | this->msg.out = dbus_message_new_method_call( |
71 | 81 | session.name.c_str(), // Destination |
72 | 82 | session.path.c_str(), // Path |
73 | 83 | "org.freedesktop.DBus.Properties", // Interface |
74 | - method // Method | |
84 | + (isSet ? "Set" : "Get") | |
75 | 85 | ); |
76 | 86 | |
77 | 87 | if(!msg.out) { |
... | ... | @@ -91,7 +101,7 @@ |
91 | 101 | dbus_message_append_args( |
92 | 102 | this->msg.out, |
93 | 103 | DBUS_TYPE_STRING,&interface_name, |
94 | - DBUS_TYPE_STRING,&method, | |
104 | + DBUS_TYPE_STRING,&property, | |
95 | 105 | DBUS_TYPE_INVALID |
96 | 106 | ); |
97 | 107 | |
... | ... | @@ -123,6 +133,10 @@ |
123 | 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 | 140 | return *this; |
127 | 141 | |
128 | 142 | } |
... | ... | @@ -132,6 +146,45 @@ |
132 | 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 | 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 | 176 | // Wait for session state. |
177 | 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 | 183 | // Gets |
180 | 184 | std::string toString(int baddr, size_t len, char lf) const override; |
181 | 185 | std::string toString(int row, int col, size_t sz, char lf) const override; |
... | ... | @@ -233,28 +237,42 @@ |
233 | 237 | static DWORD pack(std::vector<DataBlock *> &args, uint8_t * outBuffer, size_t szBuffer); |
234 | 238 | #else |
235 | 239 | struct { |
236 | - DBusMessage * in; | |
237 | - DBusMessage * out; | |
240 | + DBusMessage * in; | |
241 | + DBusMessage * out; | |
242 | + DBusMessageIter iter; | |
243 | + | |
238 | 244 | } msg; |
239 | 245 | DBusConnection * conn; |
240 | 246 | |
241 | 247 | #endif // _WIN32 |
242 | 248 | |
243 | - Request(Session &session); | |
249 | + Request(const Session &session); | |
244 | 250 | |
245 | 251 | public: |
246 | 252 | |
247 | 253 | /// @brief Create a method call. |
248 | - Request(Session &session, const char *method); | |
254 | + Request(const Session &session, const char *method); | |
249 | 255 | |
250 | 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 | 264 | ~Request(); |
254 | 265 | |
255 | 266 | Request & call(); |
267 | + | |
268 | + // Push values | |
269 | + | |
256 | 270 | Request & push(const char *arg); |
257 | 271 | |
272 | + // Pop values | |
273 | + | |
274 | + Request & pop(std::string &value); | |
275 | + | |
258 | 276 | }; |
259 | 277 | |
260 | 278 | class TN3270_PRIVATE Session : public TN3270::Abstract::Session { |
... | ... | @@ -288,6 +306,10 @@ |
288 | 306 | // Wait for session state. |
289 | 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 | 313 | // Gets |
292 | 314 | std::string toString(int baddr, size_t len, char lf) const override; |
293 | 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 | 45 | |
46 | 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 | 58 | cout << host << endl; | ... | ... |