Commit 75c9305c792b1f828519b8b265fe9f4809ac35ee

Authored by Perry Werneck
1 parent 47073ded

Implementing getters for the C++ base library used for language

bindings.
src/include/lib3270++.h
... ... @@ -213,6 +213,9 @@
213 213 }
214 214  
215 215 // Get properties.
  216 + virtual void getProperty(const char *name, int &value) const = 0;
  217 + virtual void getProperty(const char *name, std::string &value) const = 0;
  218 +
216 219 virtual std::string getVersion() const = 0;
217 220 virtual std::string getRevision() const = 0;
218 221  
... ...
src/lib3270++/ipc/session.cc
... ... @@ -137,11 +137,19 @@
137 137 }
138 138  
139 139 ProgramMessage IPC::Session::getProgramMessage() const {
140   - throw std::system_error(EINVAL, std::system_category());
  140 +
  141 + int program_message;
  142 + getProperty("program_message",program_message);
  143 + return (ProgramMessage) program_message;
  144 +
141 145 }
142 146  
143 147 ConnectionState IPC::Session::getConnectionState() const {
144   - throw std::system_error(EINVAL, std::system_category());
  148 +
  149 + int cstate;
  150 + getProperty("cstate",cstate);
  151 + return (ConnectionState) cstate;
  152 +
145 153 }
146 154  
147 155 /// @brief Set field at current position, jumps to next writable field.
... ... @@ -211,21 +219,38 @@
211 219  
212 220 }
213 221  
  222 + void IPC::Session::getProperty(const char *name, int &value) const {
  223 +
  224 + Request(*this,false,name)
  225 + .call()
  226 + .pop(value);
  227 +
  228 + }
  229 +
  230 + void IPC::Session::getProperty(const char *name, std::string &value) const {
  231 +
  232 + Request(*this,false,name)
  233 + .call()
  234 + .pop(value);
  235 +
  236 + }
  237 +
214 238 /// @brief Get lib3270 version.
215 239 std::string IPC::Session::getVersion() const {
216 240  
217 241 string rc;
218   -
219   - Request request{*this,false,"version"};
220   - request.call().pop(rc);
221   -
  242 + getProperty("version",rc);
222 243 return rc;
  244 +
223 245 }
224 246  
225 247 /// @brief Get lib3270 revision.
226 248 std::string IPC::Session::getRevision() const {
227   - throw std::system_error(ENOTSUP, std::system_category());
228   - return "";
  249 +
  250 + string rc;
  251 + getProperty("revision",rc);
  252 + return rc;
  253 +
229 254 }
230 255  
231 256 }
... ...
src/lib3270++/linux/request.cc
... ... @@ -177,6 +177,8 @@
177 177  
178 178 }
179 179  
  180 + dbus_message_iter_next(&msg.iter);
  181 +
180 182 value.assign(str);
181 183  
182 184 debug(__FUNCTION__,"= \"",str,"\"");
... ... @@ -184,6 +186,60 @@
184 186 return *this;
185 187 }
186 188  
  189 + static int getIntValue(DBusMessageIter &iter) {
  190 +
  191 + if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_INT32) {
  192 +
  193 + dbus_int32_t rc = 0;
  194 + dbus_message_iter_get_basic(&iter, &rc);
  195 + return (int) rc;
  196 +
  197 + } else if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_INT16) {
  198 +
  199 + dbus_int16_t rc = 0;
  200 + dbus_message_iter_get_basic(&iter, &rc);
  201 + return (int) rc;
  202 +
  203 + } else if(dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_VARIANT) {
  204 +
  205 + DBusMessageIter sub;
  206 + int current_type;
  207 +
  208 + dbus_message_iter_recurse(&iter, &sub);
  209 +
  210 + while ((current_type = dbus_message_iter_get_arg_type(&sub)) != DBUS_TYPE_INVALID) {
  211 +
  212 + if (current_type == DBUS_TYPE_INT32) {
  213 +
  214 + dbus_int32_t rc = 0;
  215 + dbus_message_iter_get_basic(&sub, &rc);
  216 + return (int) rc;
  217 +
  218 + } else if (current_type == DBUS_TYPE_INT16) {
  219 + dbus_int16_t rc = 0;
  220 + dbus_message_iter_get_basic(&sub, &rc);
  221 + return (int) rc;
  222 +
  223 + }
  224 + dbus_message_iter_next(&sub);
  225 + }
  226 +
  227 + }
  228 +
  229 + debug("Argument type is ", ((char) dbus_message_iter_get_arg_type(&iter)) );
  230 + throw std::runtime_error("Expected an integer data type");
  231 +
  232 + }
  233 +
  234 + IPC::Request & IPC::Request::Request::pop(int &value) {
  235 +
  236 + value = getIntValue(msg.iter);
  237 + dbus_message_iter_next(&msg.iter);
  238 + debug(__FUNCTION__,"= \"",value,"\"");
  239 +
  240 + return *this;
  241 +
  242 + }
187 243  
188 244 }
189 245  
... ...
src/lib3270++/local/session.cc
... ... @@ -148,6 +148,14 @@
148 148 return rc;
149 149 }
150 150  
  151 + void Local::Session::getProperty(const char *name, int &value) const {
  152 + throw std::system_error(ENOTSUP, std::system_category());
  153 + }
  154 +
  155 + void Local::Session::getProperty(const char *name, std::string &value) const {
  156 + throw std::system_error(ENOTSUP, std::system_category());
  157 + }
  158 +
151 159 ProgramMessage Local::Session::getProgramMessage() const {
152 160 std::lock_guard<std::mutex> lock(const_cast<Local::Session *>(this)->sync);
153 161 return (ProgramMessage) lib3270_get_program_message(this->hSession);
... ...
src/lib3270++/private.h
... ... @@ -177,6 +177,9 @@
177 177 void waitForReady(time_t timeout = 5) throw() override;
178 178  
179 179 // Get properties.
  180 + void getProperty(const char *name, int &value) const override;
  181 + void getProperty(const char *name, std::string &value) const override;
  182 +
180 183 std::string getVersion() const override;
181 184 std::string getRevision() const override;
182 185  
... ... @@ -270,8 +273,8 @@
270 273 Request & push(const char *arg);
271 274  
272 275 // Pop values
273   -
274 276 Request & pop(std::string &value);
  277 + Request & pop(int &value);
275 278  
276 279 };
277 280  
... ... @@ -307,6 +310,9 @@
307 310 void waitForReady(time_t timeout = 5) throw() override;
308 311  
309 312 // Get properties.
  313 + void getProperty(const char *name, int &value) const override;
  314 + void getProperty(const char *name, std::string &value) const override;
  315 +
310 316 std::string getVersion() const override;
311 317 std::string getRevision() const override;
312 318  
... ...
src/lib3270++/testprogram/testprogram.cc
... ... @@ -49,7 +49,12 @@
49 49  
50 50 cout
51 51 << "Version: " << host.getVersion()
52   -// << " Revision: " << host.getRevision()
  52 + << "\tRevision: " << host.getRevision()
  53 + << std::endl;
  54 +
  55 + cout
  56 + << "Connection state is " << host.getConnectionState()
  57 + << "\tProgram message is " << host.getProgramMessage()
53 58 << std::endl;
54 59  
55 60 // host.connect(getenv("LIB3270_DEFAULT_HOST"));
... ...