Commit 17909801f97bbe0cb2de0603a3218d0c5e278bc5
Exists in
master
and in
1 other branch
Merge branch 'develop' of https://github.com/PerryWerneck/libipc3270 into develop
Showing
17 changed files
with
104 additions
and
56 deletions
Show diff stats
client/src/core/session.cc
| @@ -93,10 +93,7 @@ | @@ -93,10 +93,7 @@ | ||
| 93 | sz = (size_t) (ptr-text); | 93 | sz = (size_t) (ptr-text); |
| 94 | if(sz) { | 94 | if(sz) { |
| 95 | 95 | ||
| 96 | - // Wait for unlock, insert text. | ||
| 97 | - if( (rc = waitForKeyboardUnlock()) != 0) { | ||
| 98 | - return rc; | ||
| 99 | - } | 96 | + // Insert text. |
| 100 | push(text,sz); | 97 | push(text,sz); |
| 101 | } | 98 | } |
| 102 | 99 | ||
| @@ -107,7 +104,6 @@ | @@ -107,7 +104,6 @@ | ||
| 107 | 104 | ||
| 108 | case 'E': // Enter | 105 | case 'E': // Enter |
| 109 | push(ENTER); | 106 | push(ENTER); |
| 110 | - rc = waitForKeyboardUnlock(); | ||
| 111 | break; | 107 | break; |
| 112 | 108 | ||
| 113 | case 'F': // Erase EOF | 109 | case 'F': // Erase EOF |
| @@ -116,122 +112,98 @@ | @@ -116,122 +112,98 @@ | ||
| 116 | 112 | ||
| 117 | case '1': // PF1 | 113 | case '1': // PF1 |
| 118 | push(PF_1); | 114 | push(PF_1); |
| 119 | - rc = waitForKeyboardUnlock(); | ||
| 120 | break; | 115 | break; |
| 121 | 116 | ||
| 122 | case '2': // PF2 | 117 | case '2': // PF2 |
| 123 | push(PF_2); | 118 | push(PF_2); |
| 124 | - rc = waitForKeyboardUnlock(); | ||
| 125 | break; | 119 | break; |
| 126 | 120 | ||
| 127 | case '3': // PF3 | 121 | case '3': // PF3 |
| 128 | push(PF_3); | 122 | push(PF_3); |
| 129 | - rc = waitForKeyboardUnlock(); | ||
| 130 | break; | 123 | break; |
| 131 | 124 | ||
| 132 | case '4': // PF4 | 125 | case '4': // PF4 |
| 133 | push(PF_4); | 126 | push(PF_4); |
| 134 | - rc = waitForKeyboardUnlock(); | ||
| 135 | break; | 127 | break; |
| 136 | 128 | ||
| 137 | case '5': // PF5 | 129 | case '5': // PF5 |
| 138 | push(PF_5); | 130 | push(PF_5); |
| 139 | - rc = waitForKeyboardUnlock(); | ||
| 140 | break; | 131 | break; |
| 141 | 132 | ||
| 142 | case '6': // PF6 | 133 | case '6': // PF6 |
| 143 | push(PF_6); | 134 | push(PF_6); |
| 144 | - rc = waitForKeyboardUnlock(); | ||
| 145 | break; | 135 | break; |
| 146 | 136 | ||
| 147 | case '7': // PF7 | 137 | case '7': // PF7 |
| 148 | push(PF_7); | 138 | push(PF_7); |
| 149 | - rc = waitForKeyboardUnlock(); | ||
| 150 | break; | 139 | break; |
| 151 | 140 | ||
| 152 | case '8': // PF8 | 141 | case '8': // PF8 |
| 153 | push(PF_8); | 142 | push(PF_8); |
| 154 | - rc = waitForKeyboardUnlock(); | ||
| 155 | break; | 143 | break; |
| 156 | 144 | ||
| 157 | case '9': // PF9 | 145 | case '9': // PF9 |
| 158 | push(PF_9); | 146 | push(PF_9); |
| 159 | - rc = waitForKeyboardUnlock(); | ||
| 160 | break; | 147 | break; |
| 161 | 148 | ||
| 162 | case 'a': // PF10 | 149 | case 'a': // PF10 |
| 163 | push(PF_10); | 150 | push(PF_10); |
| 164 | - rc = waitForKeyboardUnlock(); | ||
| 165 | break; | 151 | break; |
| 166 | 152 | ||
| 167 | case 'b': // PF11 | 153 | case 'b': // PF11 |
| 168 | push(PF_11); | 154 | push(PF_11); |
| 169 | - rc = waitForKeyboardUnlock(); | ||
| 170 | break; | 155 | break; |
| 171 | 156 | ||
| 172 | case 'c': // PF12 | 157 | case 'c': // PF12 |
| 173 | push(PF_12); | 158 | push(PF_12); |
| 174 | - rc = waitForKeyboardUnlock(); | ||
| 175 | break; | 159 | break; |
| 176 | 160 | ||
| 177 | case 'd': // PF13 | 161 | case 'd': // PF13 |
| 178 | push(PF_13); | 162 | push(PF_13); |
| 179 | - rc = waitForKeyboardUnlock(); | ||
| 180 | break; | 163 | break; |
| 181 | 164 | ||
| 182 | case 'e': // PF14 | 165 | case 'e': // PF14 |
| 183 | push(PF_14); | 166 | push(PF_14); |
| 184 | - rc = waitForKeyboardUnlock(); | ||
| 185 | break; | 167 | break; |
| 186 | 168 | ||
| 187 | case 'f': // PF15 | 169 | case 'f': // PF15 |
| 188 | push(PF_15); | 170 | push(PF_15); |
| 189 | - rc = waitForKeyboardUnlock(); | ||
| 190 | break; | 171 | break; |
| 191 | 172 | ||
| 192 | case 'g': // PF16 | 173 | case 'g': // PF16 |
| 193 | push(PF_16); | 174 | push(PF_16); |
| 194 | - rc = waitForKeyboardUnlock(); | ||
| 195 | break; | 175 | break; |
| 196 | 176 | ||
| 197 | case 'h': // PF17 | 177 | case 'h': // PF17 |
| 198 | push(PF_17); | 178 | push(PF_17); |
| 199 | - rc = waitForKeyboardUnlock(); | ||
| 200 | break; | 179 | break; |
| 201 | 180 | ||
| 202 | case 'i': // PF18 | 181 | case 'i': // PF18 |
| 203 | push(PF_18); | 182 | push(PF_18); |
| 204 | - rc = waitForKeyboardUnlock(); | ||
| 205 | break; | 183 | break; |
| 206 | 184 | ||
| 207 | case 'j': // PF19 | 185 | case 'j': // PF19 |
| 208 | push(PF_19); | 186 | push(PF_19); |
| 209 | - rc = waitForKeyboardUnlock(); | ||
| 210 | break; | 187 | break; |
| 211 | 188 | ||
| 212 | case 'k': // PF20 | 189 | case 'k': // PF20 |
| 213 | push(PF_20); | 190 | push(PF_20); |
| 214 | - rc = waitForKeyboardUnlock(); | ||
| 215 | break; | 191 | break; |
| 216 | 192 | ||
| 217 | case 'l': // PF21 | 193 | case 'l': // PF21 |
| 218 | push(PF_21); | 194 | push(PF_21); |
| 219 | - rc = waitForKeyboardUnlock(); | ||
| 220 | break; | 195 | break; |
| 221 | 196 | ||
| 222 | case 'm': // PF22 | 197 | case 'm': // PF22 |
| 223 | push(PF_22); | 198 | push(PF_22); |
| 224 | - rc = waitForKeyboardUnlock(); | ||
| 225 | break; | 199 | break; |
| 226 | 200 | ||
| 227 | case 'n': // PF23 | 201 | case 'n': // PF23 |
| 228 | push(PF_23); | 202 | push(PF_23); |
| 229 | - rc = waitForKeyboardUnlock(); | ||
| 230 | break; | 203 | break; |
| 231 | 204 | ||
| 232 | case 'o': // PF24 | 205 | case 'o': // PF24 |
| 233 | push(PF_24); | 206 | push(PF_24); |
| 234 | - rc = waitForKeyboardUnlock(); | ||
| 235 | break; | 207 | break; |
| 236 | 208 | ||
| 237 | case '@': // Send '@' character | 209 | case '@': // Send '@' character |
| @@ -240,17 +212,14 @@ | @@ -240,17 +212,14 @@ | ||
| 240 | 212 | ||
| 241 | case 'x': // PA1 | 213 | case 'x': // PA1 |
| 242 | push(PA_1); | 214 | push(PA_1); |
| 243 | - rc = waitForKeyboardUnlock(); | ||
| 244 | break; | 215 | break; |
| 245 | 216 | ||
| 246 | case 'y': // PA2 | 217 | case 'y': // PA2 |
| 247 | push(PA_2); | 218 | push(PA_2); |
| 248 | - rc = waitForKeyboardUnlock(); | ||
| 249 | break; | 219 | break; |
| 250 | 220 | ||
| 251 | case 'z': // PA3 | 221 | case 'z': // PA3 |
| 252 | push(PA_3); | 222 | push(PA_3); |
| 253 | - rc = waitForKeyboardUnlock(); | ||
| 254 | break; | 223 | break; |
| 255 | 224 | ||
| 256 | case 'B': // PC_LEFTTAB = "@B" | 225 | case 'B': // PC_LEFTTAB = "@B" |
| @@ -369,9 +338,6 @@ | @@ -369,9 +338,6 @@ | ||
| 369 | 338 | ||
| 370 | sz = strlen(text); | 339 | sz = strlen(text); |
| 371 | if(sz) { | 340 | if(sz) { |
| 372 | - if( (rc = waitForKeyboardUnlock()) != 0) { | ||
| 373 | - return rc; | ||
| 374 | - } | ||
| 375 | push(text,sz); | 341 | push(text,sz); |
| 376 | } | 342 | } |
| 377 | 343 |
client/src/core/windows/request.cc
| @@ -152,7 +152,22 @@ | @@ -152,7 +152,22 @@ | ||
| 152 | // It´s an error, extract message | 152 | // It´s an error, extract message |
| 153 | in.block[in.used] = 0; | 153 | in.block[in.used] = 0; |
| 154 | debug("Error was ",rc," (\"",(const char *) (in.block + in.current),"\")"); | 154 | debug("Error was ",rc," (\"",(const char *) (in.block + in.current),"\")"); |
| 155 | - throw std::system_error(std::error_code(rc,std::system_category()),(const char *) (in.block + in.current)); | 155 | + |
| 156 | + // Overload system error mostly because of the lack of ENOTCONN message on windows. | ||
| 157 | + class Error : public std::system_error { | ||
| 158 | + private: | ||
| 159 | + std::string message; | ||
| 160 | + | ||
| 161 | + public: | ||
| 162 | + Error(int rc, const char *msg) : std::system_error((int) rc, std::generic_category()), message(msg) { | ||
| 163 | + } | ||
| 164 | + | ||
| 165 | + const char *what() const noexcept override { | ||
| 166 | + return message.c_str(); | ||
| 167 | + } | ||
| 168 | + }; | ||
| 169 | + | ||
| 170 | + throw Error(rc, (const char *) (in.block + in.current)); | ||
| 156 | 171 | ||
| 157 | } | 172 | } |
| 158 | 173 |
client/src/host/properties.cc
| @@ -58,4 +58,10 @@ std::vector<TN3270::Attribute> TN3270::Host::getAttributes() const { | @@ -58,4 +58,10 @@ std::vector<TN3270::Attribute> TN3270::Host::getAttributes() const { | ||
| 58 | 58 | ||
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | +void TN3270::Host::setTimeout(time_t timeout) noexcept { | ||
| 62 | + this->timeout = timeout; | ||
| 63 | + this->session->setWaitMode(timeout != 0); | ||
| 64 | +} | ||
| 65 | + | ||
| 66 | + | ||
| 61 | 67 |
client/src/include/lib3270/ipc.h
| @@ -569,6 +569,7 @@ | @@ -569,6 +569,7 @@ | ||
| 569 | virtual void setHostURL(const char *url) = 0; | 569 | virtual void setHostURL(const char *url) = 0; |
| 570 | 570 | ||
| 571 | virtual void setUnlockDelay(unsigned short delay = 350) = 0; | 571 | virtual void setUnlockDelay(unsigned short delay = 350) = 0; |
| 572 | + virtual void setWaitMode(bool mode) = 0; | ||
| 572 | virtual void setLockOnOperatorError(bool lock = true) = 0; | 573 | virtual void setLockOnOperatorError(bool lock = true) = 0; |
| 573 | 574 | ||
| 574 | virtual unsigned short getScreenWidth() const = 0; | 575 | virtual unsigned short getScreenWidth() const = 0; |
| @@ -835,9 +836,7 @@ | @@ -835,9 +836,7 @@ | ||
| 835 | } | 836 | } |
| 836 | 837 | ||
| 837 | // Set properties | 838 | // Set properties |
| 838 | - inline void setTimeout(time_t timeout = DEFAULT_TIMEOUT) noexcept { | ||
| 839 | - this->timeout = timeout; | ||
| 840 | - } | 839 | + void setTimeout(time_t timeout = DEFAULT_TIMEOUT) noexcept; |
| 841 | 840 | ||
| 842 | inline void setUnlockDelay(unsigned short delay = 350) { | 841 | inline void setUnlockDelay(unsigned short delay = 350) { |
| 843 | session->setUnlockDelay(delay); | 842 | session->setUnlockDelay(delay); |
client/src/session/local/attribute.cc
| @@ -484,6 +484,11 @@ | @@ -484,6 +484,11 @@ | ||
| 484 | chkResponse(lib3270_set_unlock_delay(hSession,delay)); | 484 | chkResponse(lib3270_set_unlock_delay(hSession,delay)); |
| 485 | } | 485 | } |
| 486 | 486 | ||
| 487 | + void Local::Session::setWaitMode(bool mode) { | ||
| 488 | + std::lock_guard<std::mutex> lock(sync); | ||
| 489 | + chkResponse(ENOTSUP); | ||
| 490 | + } | ||
| 491 | + | ||
| 487 | void Local::Session::setLockOnOperatorError(bool lock) { | 492 | void Local::Session::setLockOnOperatorError(bool lock) { |
| 488 | std::lock_guard<std::mutex> guard(sync); | 493 | std::lock_guard<std::mutex> guard(sync); |
| 489 | chkResponse(lib3270_set_lock_on_operator_error(hSession,lock ? 1 : 0)); | 494 | chkResponse(lib3270_set_lock_on_operator_error(hSession,lock ? 1 : 0)); |
client/src/session/local/private.h
| @@ -152,6 +152,7 @@ | @@ -152,6 +152,7 @@ | ||
| 152 | unsigned short getScreenHeight() const override; | 152 | unsigned short getScreenHeight() const override; |
| 153 | unsigned short getScreenLength() const override; | 153 | unsigned short getScreenLength() const override; |
| 154 | void setUnlockDelay(unsigned short delay) override; | 154 | void setUnlockDelay(unsigned short delay) override; |
| 155 | + void setWaitMode(bool mode) override; | ||
| 155 | void setLockOnOperatorError(bool lock) override; | 156 | void setLockOnOperatorError(bool lock) override; |
| 156 | void setCharSet(const char *charset = NULL) override; | 157 | void setCharSet(const char *charset = NULL) override; |
| 157 | unsigned short setCursor(int addr) override; | 158 | unsigned short setCursor(int addr) override; |
client/src/session/remote/private.h
| @@ -160,6 +160,7 @@ | @@ -160,6 +160,7 @@ | ||
| 160 | unsigned short getScreenHeight() const override; | 160 | unsigned short getScreenHeight() const override; |
| 161 | unsigned short getScreenLength() const override; | 161 | unsigned short getScreenLength() const override; |
| 162 | void setUnlockDelay(unsigned short delay) override; | 162 | void setUnlockDelay(unsigned short delay) override; |
| 163 | + void setWaitMode(bool mode) override; | ||
| 163 | void setLockOnOperatorError(bool lock) override; | 164 | void setLockOnOperatorError(bool lock) override; |
| 164 | void setCharSet(const char *charset = NULL) override; | 165 | void setCharSet(const char *charset = NULL) override; |
| 165 | unsigned short setCursor(int addr) override; | 166 | unsigned short setCursor(int addr) override; |
client/src/session/remote/properties.cc
| @@ -160,6 +160,19 @@ | @@ -160,6 +160,19 @@ | ||
| 160 | 160 | ||
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | + void IPC::Session::setWaitMode(bool mode) { | ||
| 164 | + | ||
| 165 | + int32_t rc; | ||
| 166 | + | ||
| 167 | + Request(*this,"setWaitMode") | ||
| 168 | + .push(mode) | ||
| 169 | + .call() | ||
| 170 | + .pop(rc); | ||
| 171 | + | ||
| 172 | + chkResponse(rc); | ||
| 173 | + | ||
| 174 | + } | ||
| 175 | + | ||
| 163 | unsigned short IPC::Session::setCursor(unsigned short row, unsigned short col) { | 176 | unsigned short IPC::Session::setCursor(unsigned short row, unsigned short col) { |
| 164 | 177 | ||
| 165 | int32_t rc; | 178 | int32_t rc; |
client/src/testprogram/testprogram.cc
| @@ -38,13 +38,14 @@ | @@ -38,13 +38,14 @@ | ||
| 38 | 38 | ||
| 39 | #include <ctime> | 39 | #include <ctime> |
| 40 | 40 | ||
| 41 | -#ifndef _WIN32 | ||
| 42 | #include <getopt.h> | 41 | #include <getopt.h> |
| 43 | - #pragma GCC diagnostic ignored "-Wunused-function" | ||
| 44 | -#endif // _WIN32 | ||
| 45 | 42 | ||
| 46 | #if defined(_MSC_VER) | 43 | #if defined(_MSC_VER) |
| 47 | #pragma comment(lib,"ipc3270.lib") | 44 | #pragma comment(lib,"ipc3270.lib") |
| 45 | +#else | ||
| 46 | + #pragma GCC diagnostic ignored "-Wunused-function" | ||
| 47 | + #pragma GCC diagnostic ignored "-Wunused-parameter" | ||
| 48 | + #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" | ||
| 48 | #endif // _MSC_VER | 49 | #endif // _MSC_VER |
| 49 | 50 | ||
| 50 | #include <cstdlib> | 51 | #include <cstdlib> |
| @@ -170,11 +171,12 @@ | @@ -170,11 +171,12 @@ | ||
| 170 | 171 | ||
| 171 | TN3270::Host host{session}; | 172 | TN3270::Host host{session}; |
| 172 | 173 | ||
| 173 | - // host.connect(); | 174 | + host.setTimeout(10); |
| 175 | + | ||
| 176 | + host.connect(); | ||
| 177 | + host.push(TN3270::ENTER); | ||
| 174 | 178 | ||
| 175 | - cout << endl << "------------------------" << endl; | ||
| 176 | host.toString(14,1,75,0); | 179 | host.toString(14,1,75,0); |
| 177 | - cout << endl << "------------------------" << endl; | ||
| 178 | 180 | ||
| 179 | // host.disconnect(); | 181 | // host.disconnect(); |
| 180 | 182 | ||
| @@ -186,7 +188,6 @@ | @@ -186,7 +188,6 @@ | ||
| 186 | << std::endl; | 188 | << std::endl; |
| 187 | 189 | ||
| 188 | host.setUnlockDelay(0); | 190 | host.setUnlockDelay(0); |
| 189 | - host.setTimeout(10); | ||
| 190 | host.connect(nullptr); | 191 | host.connect(nullptr); |
| 191 | 192 | ||
| 192 | cout | 193 | cout |
| @@ -237,15 +238,12 @@ | @@ -237,15 +238,12 @@ | ||
| 237 | 238 | ||
| 238 | const char * session = ":A"; | 239 | const char * session = ":A"; |
| 239 | 240 | ||
| 240 | -#ifndef _WIN32 | ||
| 241 | - #pragma GCC diagnostic push | ||
| 242 | - #pragma GCC diagnostic ignored "-Wzero-as-null-pointer-constant" | ||
| 243 | static struct option options[] = { | 241 | static struct option options[] = { |
| 244 | { "session", required_argument, 0, 's' }, | 242 | { "session", required_argument, 0, 's' }, |
| 243 | + { "perftest", no_argument, 0, 'P' }, | ||
| 245 | { 0, 0, 0, 0} | 244 | { 0, 0, 0, 0} |
| 246 | 245 | ||
| 247 | }; | 246 | }; |
| 248 | - #pragma GCC diagnostic pop | ||
| 249 | 247 | ||
| 250 | int long_index =0; | 248 | int long_index =0; |
| 251 | int opt; | 249 | int opt; |
| @@ -256,10 +254,13 @@ | @@ -256,10 +254,13 @@ | ||
| 256 | session = optarg; | 254 | session = optarg; |
| 257 | break; | 255 | break; |
| 258 | 256 | ||
| 257 | + case 'P': | ||
| 258 | + testPerformance(session); | ||
| 259 | + return 0; | ||
| 260 | + | ||
| 259 | } | 261 | } |
| 260 | 262 | ||
| 261 | } | 263 | } |
| 262 | -#endif // _WIN32 | ||
| 263 | 264 | ||
| 264 | cout << "Session: " << session << endl; | 265 | cout << "Session: " << session << endl; |
| 265 | 266 |
server/src/core/linux/gobject.c
| @@ -120,6 +120,10 @@ void ipc3270_add_terminal_introspection(GString *introspection) { | @@ -120,6 +120,10 @@ void ipc3270_add_terminal_introspection(GString *introspection) { | ||
| 120 | " <arg type='s' name='name' direction='in' />" \ | 120 | " <arg type='s' name='name' direction='in' />" \ |
| 121 | " <arg type='b' name='result' direction='out' />" \ | 121 | " <arg type='b' name='result' direction='out' />" \ |
| 122 | " </method>" | 122 | " </method>" |
| 123 | + " <method name='setwaitmode'>" | ||
| 124 | + " <arg type='b' name='mode' direction='in' />" \ | ||
| 125 | + " <arg type='i' name='result' direction='out' />" \ | ||
| 126 | + " </method>" | ||
| 123 | " <method name='pfkey'>" \ | 127 | " <method name='pfkey'>" \ |
| 124 | " <arg type='i' name='keycode' direction='in'/>" \ | 128 | " <arg type='i' name='keycode' direction='in'/>" \ |
| 125 | " <arg type='i' name='result' direction='out' />" \ | 129 | " <arg type='i' name='result' direction='out' />" \ |
| @@ -313,3 +317,12 @@ gchar * ipc3270_convert_to_3270(GObject *object, const gchar *string, GError **e | @@ -313,3 +317,12 @@ gchar * ipc3270_convert_to_3270(GObject *object, const gchar *string, GError **e | ||
| 313 | gchar * ipc3270_convert_from_3270(GObject *object, const gchar *string, GError **error) { | 317 | gchar * ipc3270_convert_from_3270(GObject *object, const gchar *string, GError **error) { |
| 314 | return g_convert_with_fallback(string,-1,IPC3270(object)->charset,lib3270_get_display_charset(IPC3270(object)->hSession),"?",NULL,NULL,error); | 318 | return g_convert_with_fallback(string,-1,IPC3270(object)->charset,lib3270_get_display_charset(IPC3270(object)->hSession),"?",NULL,NULL,error); |
| 315 | } | 319 | } |
| 320 | + | ||
| 321 | +int ipc3270_set_wait(GObject *object, gboolean wait) { | ||
| 322 | + IPC3270(object)->wait = wait; | ||
| 323 | + return 0; | ||
| 324 | +} | ||
| 325 | + | ||
| 326 | +gboolean ipc3270_get_wait(GObject *object) { | ||
| 327 | + return IPC3270(object)->wait; | ||
| 328 | +} |
server/src/core/linux/gobject.h
| @@ -62,6 +62,7 @@ | @@ -62,6 +62,7 @@ | ||
| 62 | H3270 * hSession; | 62 | H3270 * hSession; |
| 63 | gchar * charset; | 63 | gchar * charset; |
| 64 | GtkWidget * terminal; | 64 | GtkWidget * terminal; |
| 65 | + gboolean wait; ///< @brief If true enable automatic call of "wait for ready". | ||
| 65 | GQuark error_domain; | 66 | GQuark error_domain; |
| 66 | }; | 67 | }; |
| 67 | 68 |
server/src/core/methods/methods.c
| @@ -74,6 +74,7 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req | @@ -74,6 +74,7 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req | ||
| 74 | 74 | ||
| 75 | { "action", ipc3270_method_action }, | 75 | { "action", ipc3270_method_action }, |
| 76 | { "activatable", ipc3270_method_activatable }, | 76 | { "activatable", ipc3270_method_activatable }, |
| 77 | + { "setwaitmode", ipc3270_method_set_wait_mode }, | ||
| 77 | 78 | ||
| 78 | }; | 79 | }; |
| 79 | 80 | ||
| @@ -88,18 +89,16 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req | @@ -88,18 +89,16 @@ int ipc3270_method_call(GObject *object, const gchar *method_name, GVariant *req | ||
| 88 | 89 | ||
| 89 | if(!g_ascii_strcasecmp(methods[ix].name,method_name)) { | 90 | if(!g_ascii_strcasecmp(methods[ix].name,method_name)) { |
| 90 | 91 | ||
| 91 | -#ifdef _DEBUG_ | ||
| 92 | - g_message("Calling %s",methods[ix].name); | ||
| 93 | -#endif // _DEBUG_ | ||
| 94 | - | 92 | + g_message("Running method %s",method_name); |
| 95 | int rc = methods[ix].call(object,request,response,error); | 93 | int rc = methods[ix].call(object,request,response,error); |
| 96 | 94 | ||
| 97 | debug("rc=%d error=%p",rc,*error); | 95 | debug("rc=%d error=%p",rc,*error); |
| 98 | 96 | ||
| 99 | if(rc) | 97 | if(rc) |
| 100 | { | 98 | { |
| 99 | + g_message("Method %s failed with rc=%d (%s)",method_name,rc,ipc3270_get_error_message(rc)); | ||
| 101 | debug("%s exits with rc=%d (%s)",methods[ix].name,rc,ipc3270_get_error_message(rc)); | 100 | debug("%s exits with rc=%d (%s)",methods[ix].name,rc,ipc3270_get_error_message(rc)); |
| 102 | - g_message("%s exits with rc=%d (%s)",methods[ix].name,rc,ipc3270_get_error_message(rc)); | 101 | + lib3270_write_log(hSession,"IPC","%s exits with rc=%d (%s)",methods[ix].name,rc,ipc3270_get_error_message(rc)); |
| 103 | ipc3270_set_error(object,rc,error); | 102 | ipc3270_set_error(object,rc,error); |
| 104 | debug("Error Message was set to %s",(*error)->message); | 103 | debug("Error Message was set to %s",(*error)->message); |
| 105 | } | 104 | } |
server/src/core/methods/private.h
| @@ -60,6 +60,7 @@ | @@ -60,6 +60,7 @@ | ||
| 60 | 60 | ||
| 61 | G_GNUC_INTERNAL int ipc3270_method_action(GObject *session, GVariant *request, GObject *response, GError **error); | 61 | G_GNUC_INTERNAL int ipc3270_method_action(GObject *session, GVariant *request, GObject *response, GError **error); |
| 62 | G_GNUC_INTERNAL int ipc3270_method_activatable(GObject *session, GVariant *request, GObject *response, GError **error); | 62 | G_GNUC_INTERNAL int ipc3270_method_activatable(GObject *session, GVariant *request, GObject *response, GError **error); |
| 63 | + G_GNUC_INTERNAL int ipc3270_method_set_wait_mode(GObject *session, GVariant *request, GObject *response, GError **error); | ||
| 63 | 64 | ||
| 64 | G_GNUC_INTERNAL int ipc3270_method_get_field_attribute(GObject *session, GVariant *request, GObject *response, GError **error); | 65 | G_GNUC_INTERNAL int ipc3270_method_get_field_attribute(GObject *session, GVariant *request, GObject *response, GError **error); |
| 65 | 66 |
server/src/core/setproperties.c
| @@ -185,3 +185,19 @@ gboolean ipc3270_set_property(GObject *object, const gchar *property_name, GVari | @@ -185,3 +185,19 @@ gboolean ipc3270_set_property(GObject *object, const gchar *property_name, GVari | ||
| 185 | 185 | ||
| 186 | return FALSE; | 186 | return FALSE; |
| 187 | } | 187 | } |
| 188 | + | ||
| 189 | +int ipc3270_method_set_wait_mode(GObject *session, GVariant *request, GObject *response, GError G_GNUC_UNUSED(**error)) { | ||
| 190 | + | ||
| 191 | + if(g_variant_n_children(request) != 1) { | ||
| 192 | + g_message("set wait was called with %u arguments.",(unsigned int) g_variant_n_children(request)); | ||
| 193 | + ipc3270_response_append_int32(response, EINVAL); | ||
| 194 | + } | ||
| 195 | + | ||
| 196 | + GVariant *value = g_variant_get_child_value(request,0); | ||
| 197 | + | ||
| 198 | + ipc3270_response_append_int32(response, ipc3270_set_wait(session,g_variant_get_boolean(value))); | ||
| 199 | + | ||
| 200 | + g_variant_unref(value); | ||
| 201 | + | ||
| 202 | + return 0; | ||
| 203 | +} |
server/src/core/windows/gobject.c
| @@ -124,4 +124,11 @@ gchar * ipc3270_convert_from_3270(GObject *object, const gchar *string, GError * | @@ -124,4 +124,11 @@ gchar * ipc3270_convert_from_3270(GObject *object, const gchar *string, GError * | ||
| 124 | return g_convert_with_fallback(string,-1,IPC3270(object)->charset,lib3270_get_display_charset(IPC3270(object)->hSession),"?",NULL,NULL,error); | 124 | return g_convert_with_fallback(string,-1,IPC3270(object)->charset,lib3270_get_display_charset(IPC3270(object)->hSession),"?",NULL,NULL,error); |
| 125 | } | 125 | } |
| 126 | 126 | ||
| 127 | +int ipc3270_set_wait(GObject *object, gboolean wait) { | ||
| 128 | + IPC3270(object)->wait = wait; | ||
| 129 | + return 0; | ||
| 130 | +} | ||
| 127 | 131 | ||
| 132 | +gboolean ipc3270_get_wait(GObject *object) { | ||
| 133 | + return IPC3270(object)->wait; | ||
| 134 | +} |
server/src/core/windows/gobject.h
| @@ -82,6 +82,7 @@ | @@ -82,6 +82,7 @@ | ||
| 82 | H3270 * hSession; | 82 | H3270 * hSession; |
| 83 | GtkWidget * terminal; | 83 | GtkWidget * terminal; |
| 84 | gchar * charset; | 84 | gchar * charset; |
| 85 | + gboolean wait; ///< @brief If true enable automatic call of "wait for ready". | ||
| 85 | IPC3270_PIPE_SOURCE * source; | 86 | IPC3270_PIPE_SOURCE * source; |
| 86 | GQuark error_domain; | 87 | GQuark error_domain; |
| 87 | }; | 88 | }; |
server/src/include/ipc-glib.h
| @@ -131,6 +131,9 @@ | @@ -131,6 +131,9 @@ | ||
| 131 | void ipc3270_set_terminal_widget(GObject *object, GtkWidget *widget); | 131 | void ipc3270_set_terminal_widget(GObject *object, GtkWidget *widget); |
| 132 | void ipc3270_export_object(GObject *object, const char *name, GError **error); | 132 | void ipc3270_export_object(GObject *object, const char *name, GError **error); |
| 133 | 133 | ||
| 134 | + int ipc3270_set_wait(GObject *object, gboolean wait); | ||
| 135 | + gboolean ipc3270_get_wait(GObject *object); | ||
| 136 | + | ||
| 134 | void ipc3270_add_terminal_introspection(GString *string); | 137 | void ipc3270_add_terminal_introspection(GString *string); |
| 135 | 138 | ||
| 136 | const gchar * ipc3270_get_display_charset(GObject *object); | 139 | const gchar * ipc3270_get_display_charset(GObject *object); |