Commit f6378bbec50d81d7eea4bac5a0051bef21122676
1 parent
653a7cdc
Exists in
master
and in
1 other branch
Working on dynamic typed attributes.
Showing
4 changed files
with
83 additions
and
37 deletions
Show diff stats
client/src/core/attribute.cc
| ... | ... | @@ -72,28 +72,25 @@ |
| 72 | 72 | return (bool) attr.get.asInt32(attr, worker) != 0; |
| 73 | 73 | }; |
| 74 | 74 | |
| 75 | - } | |
| 75 | + set.asString = [](const Attribute & attr, const void *worker, const char *value) { | |
| 76 | + throw std::system_error(ENOTSUP, std::system_category()); | |
| 77 | + }; | |
| 76 | 78 | |
| 77 | - Attribute::~Attribute() { | |
| 78 | - } | |
| 79 | + set.asInt32 = [](const Attribute & attr, const void *worker, const int32_t value) { | |
| 80 | + throw std::system_error(ENOTSUP, std::system_category()); | |
| 81 | + }; | |
| 79 | 82 | |
| 80 | - /* | |
| 81 | - std::string Attribute::getString() const { | |
| 82 | - printf("*************** %s\n",__FUNCTION__); | |
| 83 | - throw std::system_error(ENOTSUP, std::system_category()); | |
| 84 | - } | |
| 83 | + set.asUint32 = [](const Attribute & attr, const void *worker, const uint32_t value) { | |
| 84 | + attr.set.asInt32(attr,worker,(int32_t) value); | |
| 85 | + }; | |
| 85 | 86 | |
| 86 | - int32_t Attribute::getInt32() const { | |
| 87 | - throw std::system_error(ENOTSUP, std::system_category()); | |
| 88 | - } | |
| 87 | + set.asBoolean = [](const Attribute & attr, const void *worker, const bool value) { | |
| 88 | + attr.set.asInt32(attr,worker,(int32_t) value); | |
| 89 | + }; | |
| 89 | 90 | |
| 90 | - uint32_t Attribute::getUint32() const { | |
| 91 | - throw std::system_error(ENOTSUP, std::system_category()); | |
| 92 | 91 | } |
| 93 | 92 | |
| 94 | - bool Attribute::getBool() const { | |
| 95 | - throw std::system_error(ENOTSUP, std::system_category()); | |
| 93 | + Attribute::~Attribute() { | |
| 96 | 94 | } |
| 97 | - */ | |
| 98 | 95 | |
| 99 | 96 | } | ... | ... |
client/src/include/lib3270/ipc.h
| ... | ... | @@ -272,12 +272,19 @@ |
| 272 | 272 | std::function <bool (const Attribute & attr, const void *worker)> asBoolean; |
| 273 | 273 | } get; |
| 274 | 274 | |
| 275 | + struct { | |
| 276 | + std::function <void (const Attribute & attr, const void *worker, const char *value)> asString; | |
| 277 | + std::function <void (const Attribute & attr, const void *worker, const int32_t value)> asInt32; | |
| 278 | + std::function <void (const Attribute & attr, const void *worker, const uint32_t value)> asUint32; | |
| 279 | + std::function <void (const Attribute & attr, const void *worker, const bool value)> asBoolean; | |
| 280 | + } set; | |
| 281 | + | |
| 275 | 282 | Attribute(H3270 *hSession, Type type, void * worker); |
| 276 | 283 | |
| 277 | 284 | public: |
| 278 | 285 | ~Attribute(); |
| 279 | 286 | |
| 280 | - inline const H3270 * getTN3270Session() const { | |
| 287 | + inline H3270 * getTN3270Session() const { | |
| 281 | 288 | return this->hSession; |
| 282 | 289 | } |
| 283 | 290 | |
| ... | ... | @@ -301,6 +308,42 @@ |
| 301 | 308 | return get.asString(*this, worker); |
| 302 | 309 | } |
| 303 | 310 | |
| 311 | + inline void setString(const char * value) { | |
| 312 | + set.asString(*this,worker,value); | |
| 313 | + } | |
| 314 | + | |
| 315 | + inline void setInt32(const int32_t value) { | |
| 316 | + set.asInt32(*this,worker,value); | |
| 317 | + } | |
| 318 | + | |
| 319 | + inline void setUint32(const uint32_t value) { | |
| 320 | + set.asUint32(*this,worker,value); | |
| 321 | + } | |
| 322 | + | |
| 323 | + inline void setBoolean(const bool value) { | |
| 324 | + set.asBoolean(*this,worker,value); | |
| 325 | + } | |
| 326 | + | |
| 327 | + inline Attribute & operator=(const char * value) { | |
| 328 | + set.asString(*this,worker,value); | |
| 329 | + return *this; | |
| 330 | + } | |
| 331 | + | |
| 332 | + inline Attribute & operator=(const int32_t value) { | |
| 333 | + set.asInt32(*this,worker,value); | |
| 334 | + return *this; | |
| 335 | + } | |
| 336 | + | |
| 337 | + inline Attribute & operator=(const uint32_t value) { | |
| 338 | + set.asUint32(*this,worker,value); | |
| 339 | + return *this; | |
| 340 | + } | |
| 341 | + | |
| 342 | + inline Attribute & operator=(const bool value) { | |
| 343 | + set.asBoolean(*this,worker,value); | |
| 344 | + return *this; | |
| 345 | + } | |
| 346 | + | |
| 304 | 347 | inline bool operator==(Type type) const noexcept { |
| 305 | 348 | return this->type == type; |
| 306 | 349 | } | ... | ... |
client/src/session/local/attribute.cc
| ... | ... | @@ -173,31 +173,40 @@ |
| 173 | 173 | |
| 174 | 174 | } |
| 175 | 175 | |
| 176 | - /* | |
| 177 | - std::string getString() const override { | |
| 178 | - } | |
| 176 | + }; | |
| 179 | 177 | |
| 180 | - int32_t getInt32() const override { | |
| 178 | + // Toggle attribute | |
| 179 | + class ToggleAttribute : public Attribute { | |
| 180 | + public: | |
| 181 | + ToggleAttribute(H3270 *hSession, const LIB3270_TOGGLE_ENTRY *worker) : Attribute(hSession, Attribute::Boolean, (void *) worker) { | |
| 181 | 182 | |
| 182 | - errno = 0; | |
| 183 | - int value = ((const LIB3270_INT_PROPERTY *) worker)->get(hSession); | |
| 183 | + get.asString = [](const Attribute & attr, const void *worker) { | |
| 184 | + return attr.getBoolean() ? "true" : "false"; | |
| 185 | + }; | |
| 184 | 186 | |
| 185 | - if(errno != 0) { | |
| 186 | - throw std::system_error(errno, std::system_category()); | |
| 187 | - } | |
| 187 | + get.asInt32 = [](const Attribute & attr, const void *worker) { | |
| 188 | 188 | |
| 189 | - return ((int32_t) value) != 0; | |
| 189 | + errno = 0; | |
| 190 | 190 | |
| 191 | - } | |
| 191 | + int value = lib3270_get_toggle(attr.getTN3270Session(),((const LIB3270_TOGGLE_ENTRY *) worker)->id); | |
| 192 | 192 | |
| 193 | - uint32_t getUint32() const override { | |
| 194 | - return (uint32_t) descriptor->get(this->hSession); | |
| 195 | - } | |
| 193 | + if(errno != 0) { | |
| 194 | + throw std::system_error(errno, std::system_category()); | |
| 195 | + } | |
| 196 | + | |
| 197 | + return (int32_t) value; | |
| 198 | + | |
| 199 | + }; | |
| 200 | + | |
| 201 | + set.asInt32 = [](const Attribute & attr, const void *worker, const int32_t value) { | |
| 202 | + lib3270_set_toggle(attr.getTN3270Session(),((const LIB3270_TOGGLE_ENTRY *) worker)->id, (int) value); | |
| 203 | + }; | |
| 204 | + | |
| 205 | + set.asBoolean = [](const Attribute & attr, const void *worker, const bool value) { | |
| 206 | + lib3270_set_toggle(attr.getTN3270Session(),((const LIB3270_TOGGLE_ENTRY *) worker)->id, (int) value); | |
| 207 | + }; | |
| 196 | 208 | |
| 197 | - bool getBool() const override { | |
| 198 | - return getInt32() != 0; | |
| 199 | 209 | } |
| 200 | - */ | |
| 201 | 210 | |
| 202 | 211 | }; |
| 203 | 212 | ... | ... |
client/src/testprogram/testprogram.cc
| ... | ... | @@ -98,7 +98,6 @@ |
| 98 | 98 | << "\tConnected: " << host["Connected"] |
| 99 | 99 | << std::endl; |
| 100 | 100 | |
| 101 | - /* | |
| 102 | 101 | host.connect(nullptr); |
| 103 | 102 | |
| 104 | 103 | cout |
| ... | ... | @@ -130,8 +129,6 @@ |
| 130 | 129 | |
| 131 | 130 | host.disconnect(); |
| 132 | 131 | |
| 133 | - */ | |
| 134 | - | |
| 135 | 132 | } catch(const std::exception &e) { |
| 136 | 133 | |
| 137 | 134 | cerr << std::endl << e.what() << std::endl << std::endl; | ... | ... |