Commit 2906254bbf400c7b9201da953df9a7d35d129cf7
1 parent
63058b28
Exists in
master
and in
1 other branch
Adding methods to get the list of properties.
Showing
7 changed files
with
79 additions
and
5 deletions
Show diff stats
client/src/core/attribute.cc
| @@ -53,6 +53,10 @@ | @@ -53,6 +53,10 @@ | ||
| 53 | this->type = type; | 53 | this->type = type; |
| 54 | this->worker = worker; | 54 | this->worker = worker; |
| 55 | 55 | ||
| 56 | + get.name = [](const void *worker) { | ||
| 57 | + return "unnamed"; | ||
| 58 | + }; | ||
| 59 | + | ||
| 56 | get.asString = [](const Attribute &attr, const void *worker) { | 60 | get.asString = [](const Attribute &attr, const void *worker) { |
| 57 | 61 | ||
| 58 | throw std::system_error(ENOTSUP, std::system_category()); | 62 | throw std::system_error(ENOTSUP, std::system_category()); |
client/src/core/session.cc
| @@ -413,10 +413,16 @@ | @@ -413,10 +413,16 @@ | ||
| 413 | throw std::system_error(ENOTSUP, std::system_category()); | 413 | throw std::system_error(ENOTSUP, std::system_category()); |
| 414 | } | 414 | } |
| 415 | 415 | ||
| 416 | - void Session::getAttributes(std::vector<Attribute> attributes) const { | 416 | + void Session::getAttributes(std::vector<Attribute> & attributes) const { |
| 417 | throw std::system_error(ENOTSUP, std::system_category()); | 417 | throw std::system_error(ENOTSUP, std::system_category()); |
| 418 | } | 418 | } |
| 419 | 419 | ||
| 420 | + std::vector<Attribute> Session::getAttributes() const { | ||
| 421 | + std::vector<Attribute> attributes; | ||
| 422 | + this->getAttributes(attributes); | ||
| 423 | + return attributes; | ||
| 424 | + } | ||
| 425 | + | ||
| 420 | void Session::getAttribute(const char *name, int &value) const { | 426 | void Session::getAttribute(const char *name, int &value) const { |
| 421 | value = getAttribute(name).getInt32(); | 427 | value = getAttribute(name).getInt32(); |
| 422 | } | 428 | } |
client/src/host/properties.cc
| @@ -48,3 +48,14 @@ TN3270::Attribute TN3270::Host::getAttribute(const char *name) const { | @@ -48,3 +48,14 @@ TN3270::Attribute TN3270::Host::getAttribute(const char *name) const { | ||
| 48 | return this->session->getAttribute(name); | 48 | return this->session->getAttribute(name); |
| 49 | 49 | ||
| 50 | } | 50 | } |
| 51 | + | ||
| 52 | +std::vector<TN3270::Attribute> TN3270::Host::getAttributes() const { | ||
| 53 | + | ||
| 54 | + if(!this->session) | ||
| 55 | + throw std::system_error(ENODATA, std::system_category()); | ||
| 56 | + | ||
| 57 | + return this->session->getAttributes(); | ||
| 58 | + | ||
| 59 | +} | ||
| 60 | + | ||
| 61 | + |
client/src/include/lib3270/ipc.h
| @@ -266,6 +266,8 @@ | @@ -266,6 +266,8 @@ | ||
| 266 | protected: | 266 | protected: |
| 267 | 267 | ||
| 268 | struct { | 268 | struct { |
| 269 | + std::function<const char *(const void *worker)> name; | ||
| 270 | + | ||
| 269 | std::function <std::string (const Attribute & attr, const void *worker)> asString; | 271 | std::function <std::string (const Attribute & attr, const void *worker)> asString; |
| 270 | std::function <int32_t (const Attribute & attr, const void *worker)> asInt32; | 272 | std::function <int32_t (const Attribute & attr, const void *worker)> asInt32; |
| 271 | std::function <uint32_t (const Attribute & attr, const void *worker)> asUint32; | 273 | std::function <uint32_t (const Attribute & attr, const void *worker)> asUint32; |
| @@ -288,6 +290,10 @@ | @@ -288,6 +290,10 @@ | ||
| 288 | return this->hSession; | 290 | return this->hSession; |
| 289 | } | 291 | } |
| 290 | 292 | ||
| 293 | + inline const char * getName() const { | ||
| 294 | + return this->get.name(this->worker); | ||
| 295 | + } | ||
| 296 | + | ||
| 291 | inline std::string getString() const { | 297 | inline std::string getString() const { |
| 292 | return get.asString(*this,worker); | 298 | return get.asString(*this,worker); |
| 293 | } | 299 | } |
| @@ -470,7 +476,8 @@ | @@ -470,7 +476,8 @@ | ||
| 470 | 476 | ||
| 471 | // Attributes | 477 | // Attributes |
| 472 | virtual Attribute getAttribute(const char *name) const; | 478 | virtual Attribute getAttribute(const char *name) const; |
| 473 | - virtual void getAttributes(std::vector<Attribute> attributes) const; | 479 | + virtual void getAttributes(std::vector<Attribute> & attributes) const; |
| 480 | + std::vector<Attribute> getAttributes() const; | ||
| 474 | 481 | ||
| 475 | virtual void getAttribute(const char *name, int &value) const; | 482 | virtual void getAttribute(const char *name, int &value) const; |
| 476 | virtual void getAttribute(const char *name, unsigned int &value) const; | 483 | virtual void getAttribute(const char *name, unsigned int &value) const; |
| @@ -705,6 +712,7 @@ | @@ -705,6 +712,7 @@ | ||
| 705 | 712 | ||
| 706 | // Get properties | 713 | // Get properties |
| 707 | Attribute getAttribute(const char *name) const; | 714 | Attribute getAttribute(const char *name) const; |
| 715 | + std::vector<Attribute> getAttributes() const; | ||
| 708 | 716 | ||
| 709 | inline Attribute operator[](const char *name) const { | 717 | inline Attribute operator[](const char *name) const { |
| 710 | return getAttribute(name); | 718 | return getAttribute(name); |
client/src/session/local/attribute.cc
| @@ -51,6 +51,10 @@ | @@ -51,6 +51,10 @@ | ||
| 51 | public: | 51 | public: |
| 52 | IntAttribute(H3270 *hSession, const LIB3270_INT_PROPERTY *worker) : Attribute(hSession, Attribute::Int32, (void *) worker) { | 52 | IntAttribute(H3270 *hSession, const LIB3270_INT_PROPERTY *worker) : Attribute(hSession, Attribute::Int32, (void *) worker) { |
| 53 | 53 | ||
| 54 | + get.name = [](const void *worker) { | ||
| 55 | + return ((const LIB3270_INT_PROPERTY *) worker)->name; | ||
| 56 | + }; | ||
| 57 | + | ||
| 54 | get.asString = [](const Attribute & attr, const void *worker) { | 58 | get.asString = [](const Attribute & attr, const void *worker) { |
| 55 | return std::to_string(attr.getInt32()); | 59 | return std::to_string(attr.getInt32()); |
| 56 | }; | 60 | }; |
| @@ -85,6 +89,10 @@ | @@ -85,6 +89,10 @@ | ||
| 85 | public: | 89 | public: |
| 86 | UnsignedIntAttribute(H3270 *hSession, const LIB3270_UINT_PROPERTY *worker) : Attribute(hSession, Attribute::Uint32, (void *) worker) { | 90 | UnsignedIntAttribute(H3270 *hSession, const LIB3270_UINT_PROPERTY *worker) : Attribute(hSession, Attribute::Uint32, (void *) worker) { |
| 87 | 91 | ||
| 92 | + get.name = [](const void *worker) { | ||
| 93 | + return ((const LIB3270_UINT_PROPERTY *) worker)->name; | ||
| 94 | + }; | ||
| 95 | + | ||
| 88 | get.asString = [](const Attribute & attr, const void *worker) { | 96 | get.asString = [](const Attribute & attr, const void *worker) { |
| 89 | return std::to_string(attr.getUint32()); | 97 | return std::to_string(attr.getUint32()); |
| 90 | }; | 98 | }; |
| @@ -119,6 +127,10 @@ | @@ -119,6 +127,10 @@ | ||
| 119 | public: | 127 | public: |
| 120 | StringAttribute(H3270 *hSession, const LIB3270_STRING_PROPERTY *worker) : Attribute(hSession, Attribute::String, (void *) worker) { | 128 | StringAttribute(H3270 *hSession, const LIB3270_STRING_PROPERTY *worker) : Attribute(hSession, Attribute::String, (void *) worker) { |
| 121 | 129 | ||
| 130 | + get.name = [](const void *worker) { | ||
| 131 | + return ((const LIB3270_STRING_PROPERTY *) worker)->name; | ||
| 132 | + }; | ||
| 133 | + | ||
| 122 | get.asString = [](const Attribute & attr, const void *worker) { | 134 | get.asString = [](const Attribute & attr, const void *worker) { |
| 123 | 135 | ||
| 124 | const char * str = ((const LIB3270_STRING_PROPERTY *) worker)->get(attr.getTN3270Session()); | 136 | const char * str = ((const LIB3270_STRING_PROPERTY *) worker)->get(attr.getTN3270Session()); |
| @@ -152,6 +164,10 @@ | @@ -152,6 +164,10 @@ | ||
| 152 | public: | 164 | public: |
| 153 | BooleanAttribute(H3270 *hSession, const LIB3270_INT_PROPERTY *worker) : Attribute(hSession, Attribute::Boolean, (void *) worker) { | 165 | BooleanAttribute(H3270 *hSession, const LIB3270_INT_PROPERTY *worker) : Attribute(hSession, Attribute::Boolean, (void *) worker) { |
| 154 | 166 | ||
| 167 | + get.name = [](const void *worker) { | ||
| 168 | + return ((const LIB3270_INT_PROPERTY *) worker)->name; | ||
| 169 | + }; | ||
| 170 | + | ||
| 155 | get.asString = [](const Attribute & attr, const void *worker) { | 171 | get.asString = [](const Attribute & attr, const void *worker) { |
| 156 | return attr.getBoolean() ? "true" : "false"; | 172 | return attr.getBoolean() ? "true" : "false"; |
| 157 | }; | 173 | }; |
| @@ -178,6 +194,10 @@ | @@ -178,6 +194,10 @@ | ||
| 178 | public: | 194 | public: |
| 179 | ToggleAttribute(H3270 *hSession, const LIB3270_TOGGLE_ENTRY *worker) : Attribute(hSession, Attribute::Boolean, (void *) worker) { | 195 | ToggleAttribute(H3270 *hSession, const LIB3270_TOGGLE_ENTRY *worker) : Attribute(hSession, Attribute::Boolean, (void *) worker) { |
| 180 | 196 | ||
| 197 | + get.name = [](const void *worker) { | ||
| 198 | + return ((const LIB3270_TOGGLE_ENTRY *) worker)->name; | ||
| 199 | + }; | ||
| 200 | + | ||
| 181 | get.asString = [](const Attribute & attr, const void *worker) { | 201 | get.asString = [](const Attribute & attr, const void *worker) { |
| 182 | return attr.getBoolean() ? "true" : "false"; | 202 | return attr.getBoolean() ? "true" : "false"; |
| 183 | }; | 203 | }; |
| @@ -278,7 +298,7 @@ | @@ -278,7 +298,7 @@ | ||
| 278 | 298 | ||
| 279 | } | 299 | } |
| 280 | 300 | ||
| 281 | - void Local::Session::getAttributes(std::vector<Attribute> attributes) const { | 301 | + void Local::Session::getAttributes(std::vector<Attribute> & attributes) const { |
| 282 | 302 | ||
| 283 | std::lock_guard<std::mutex> lock(const_cast<Local::Session *>(this)->sync); | 303 | std::lock_guard<std::mutex> lock(const_cast<Local::Session *>(this)->sync); |
| 284 | 304 |
client/src/session/local/private.h
| @@ -114,7 +114,7 @@ | @@ -114,7 +114,7 @@ | ||
| 114 | 114 | ||
| 115 | // Attributes | 115 | // Attributes |
| 116 | Attribute getAttribute(const char *name) const override; | 116 | Attribute getAttribute(const char *name) const override; |
| 117 | - void getAttributes(std::vector<Attribute> attributes) const override; | 117 | + void getAttributes(std::vector<Attribute> & attributes) const override; |
| 118 | 118 | ||
| 119 | std::string getVersion() const override; | 119 | std::string getVersion() const override; |
| 120 | std::string getRevision() const override; | 120 | std::string getRevision() const override; |
client/src/testprogram/testprogram.cc
| @@ -85,6 +85,30 @@ | @@ -85,6 +85,30 @@ | ||
| 85 | } | 85 | } |
| 86 | */ | 86 | */ |
| 87 | 87 | ||
| 88 | + // Test Attributes | ||
| 89 | + static void testAttributes(const char *session) { | ||
| 90 | + | ||
| 91 | + TN3270::Host host{session,nullptr,10}; | ||
| 92 | + | ||
| 93 | + for(auto attribute : host.getAttributes()) { | ||
| 94 | + | ||
| 95 | + cout << attribute.getName() << ":\t"; | ||
| 96 | + | ||
| 97 | + try { | ||
| 98 | + | ||
| 99 | + cout << attribute.toString(); | ||
| 100 | + | ||
| 101 | + } catch(const std::exception &e) { | ||
| 102 | + | ||
| 103 | + cout << e.what(); | ||
| 104 | + } | ||
| 105 | + | ||
| 106 | + cout << endl; | ||
| 107 | + | ||
| 108 | + } | ||
| 109 | + | ||
| 110 | + } | ||
| 111 | + | ||
| 88 | // test host object | 112 | // test host object |
| 89 | static void testHost(const char *session) { | 113 | static void testHost(const char *session) { |
| 90 | 114 | ||
| @@ -166,7 +190,8 @@ | @@ -166,7 +190,8 @@ | ||
| 166 | 190 | ||
| 167 | cout << "Session: " << session << endl; | 191 | cout << "Session: " << session << endl; |
| 168 | 192 | ||
| 169 | - testHost(session); | 193 | + // testHost(session); |
| 194 | + testAttributes(session); | ||
| 170 | 195 | ||
| 171 | return 0; | 196 | return 0; |
| 172 | } | 197 | } |