Commit 75c9305c792b1f828519b8b265fe9f4809ac35ee
1 parent
47073ded
Exists in
master
and in
3 other branches
Implementing getters for the C++ base library used for language
bindings.
Showing
6 changed files
with
113 additions
and
10 deletions
Show diff stats
src/include/lib3270++.h
| @@ -213,6 +213,9 @@ | @@ -213,6 +213,9 @@ | ||
| 213 | } | 213 | } |
| 214 | 214 | ||
| 215 | // Get properties. | 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 | virtual std::string getVersion() const = 0; | 219 | virtual std::string getVersion() const = 0; |
| 217 | virtual std::string getRevision() const = 0; | 220 | virtual std::string getRevision() const = 0; |
| 218 | 221 |
src/lib3270++/ipc/session.cc
| @@ -137,11 +137,19 @@ | @@ -137,11 +137,19 @@ | ||
| 137 | } | 137 | } |
| 138 | 138 | ||
| 139 | ProgramMessage IPC::Session::getProgramMessage() const { | 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 | ConnectionState IPC::Session::getConnectionState() const { | 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 | /// @brief Set field at current position, jumps to next writable field. | 155 | /// @brief Set field at current position, jumps to next writable field. |
| @@ -211,21 +219,38 @@ | @@ -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 | /// @brief Get lib3270 version. | 238 | /// @brief Get lib3270 version. |
| 215 | std::string IPC::Session::getVersion() const { | 239 | std::string IPC::Session::getVersion() const { |
| 216 | 240 | ||
| 217 | string rc; | 241 | string rc; |
| 218 | - | ||
| 219 | - Request request{*this,false,"version"}; | ||
| 220 | - request.call().pop(rc); | ||
| 221 | - | 242 | + getProperty("version",rc); |
| 222 | return rc; | 243 | return rc; |
| 244 | + | ||
| 223 | } | 245 | } |
| 224 | 246 | ||
| 225 | /// @brief Get lib3270 revision. | 247 | /// @brief Get lib3270 revision. |
| 226 | std::string IPC::Session::getRevision() const { | 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,6 +177,8 @@ | ||
| 177 | 177 | ||
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | + dbus_message_iter_next(&msg.iter); | ||
| 181 | + | ||
| 180 | value.assign(str); | 182 | value.assign(str); |
| 181 | 183 | ||
| 182 | debug(__FUNCTION__,"= \"",str,"\""); | 184 | debug(__FUNCTION__,"= \"",str,"\""); |
| @@ -184,6 +186,60 @@ | @@ -184,6 +186,60 @@ | ||
| 184 | return *this; | 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,6 +148,14 @@ | ||
| 148 | return rc; | 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 | ProgramMessage Local::Session::getProgramMessage() const { | 159 | ProgramMessage Local::Session::getProgramMessage() const { |
| 152 | std::lock_guard<std::mutex> lock(const_cast<Local::Session *>(this)->sync); | 160 | std::lock_guard<std::mutex> lock(const_cast<Local::Session *>(this)->sync); |
| 153 | return (ProgramMessage) lib3270_get_program_message(this->hSession); | 161 | return (ProgramMessage) lib3270_get_program_message(this->hSession); |
src/lib3270++/private.h
| @@ -177,6 +177,9 @@ | @@ -177,6 +177,9 @@ | ||
| 177 | void waitForReady(time_t timeout = 5) throw() override; | 177 | void waitForReady(time_t timeout = 5) throw() override; |
| 178 | 178 | ||
| 179 | // Get properties. | 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 | std::string getVersion() const override; | 183 | std::string getVersion() const override; |
| 181 | std::string getRevision() const override; | 184 | std::string getRevision() const override; |
| 182 | 185 | ||
| @@ -270,8 +273,8 @@ | @@ -270,8 +273,8 @@ | ||
| 270 | Request & push(const char *arg); | 273 | Request & push(const char *arg); |
| 271 | 274 | ||
| 272 | // Pop values | 275 | // Pop values |
| 273 | - | ||
| 274 | Request & pop(std::string &value); | 276 | Request & pop(std::string &value); |
| 277 | + Request & pop(int &value); | ||
| 275 | 278 | ||
| 276 | }; | 279 | }; |
| 277 | 280 | ||
| @@ -307,6 +310,9 @@ | @@ -307,6 +310,9 @@ | ||
| 307 | void waitForReady(time_t timeout = 5) throw() override; | 310 | void waitForReady(time_t timeout = 5) throw() override; |
| 308 | 311 | ||
| 309 | // Get properties. | 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 | std::string getVersion() const override; | 316 | std::string getVersion() const override; |
| 311 | std::string getRevision() const override; | 317 | std::string getRevision() const override; |
| 312 | 318 |
src/lib3270++/testprogram/testprogram.cc
| @@ -49,7 +49,12 @@ | @@ -49,7 +49,12 @@ | ||
| 49 | 49 | ||
| 50 | cout | 50 | cout |
| 51 | << "Version: " << host.getVersion() | 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 | << std::endl; | 58 | << std::endl; |
| 54 | 59 | ||
| 55 | // host.connect(getenv("LIB3270_DEFAULT_HOST")); | 60 | // host.connect(getenv("LIB3270_DEFAULT_HOST")); |