Commit 47073dedc3d82ac1e624927282d70becc0df0709

Authored by Perry Werneck
1 parent d3a3a087

Implementing D-Bus basic request object.

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;
... ...