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")); |