Commit a20a64aaf0c47c7d573fcefbd40627e5b0e63ab4
1 parent
56a70bc7
Exists in
master
and in
5 other branches
Implementando tratamento de excessões em rexx
Showing
6 changed files
with
87 additions
and
51 deletions
Show diff stats
src/plugins/rx3270/exception.cc
| ... | ... | @@ -34,33 +34,34 @@ |
| 34 | 34 | #endif // HAVE_SYSLOG |
| 35 | 35 | |
| 36 | 36 | #include <string.h> |
| 37 | + #include <oorexxerrors.h> | |
| 37 | 38 | |
| 38 | 39 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
| 39 | 40 | |
| 40 | 41 | rx3270::exception::exception(const char *fmt, ...) |
| 41 | 42 | { |
| 42 | - char buffer[4096]; | |
| 43 | 43 | va_list arg_ptr; |
| 44 | 44 | |
| 45 | 45 | va_start(arg_ptr, fmt); |
| 46 | - vsnprintf(buffer,4095,fmt,arg_ptr); | |
| 46 | + vsnprintf(this->msg,4095,fmt,arg_ptr); | |
| 47 | 47 | va_end(arg_ptr); |
| 48 | 48 | |
| 49 | - msg = strdup(buffer); | |
| 49 | + this->code = Rexx_Error_Application_error; | |
| 50 | 50 | } |
| 51 | 51 | |
| 52 | -extern "C" { | |
| 53 | - static void memfree(void *ptr) | |
| 54 | - { | |
| 55 | - free(ptr); | |
| 56 | - } | |
| 57 | -} | |
| 58 | - | |
| 59 | -rx3270::exception::~exception() | |
| 52 | +rx3270::exception::exception(int code, const char *fmt, ...) | |
| 60 | 53 | { |
| 61 | - memfree(msg); | |
| 54 | + va_list arg_ptr; | |
| 55 | + | |
| 56 | + va_start(arg_ptr, fmt); | |
| 57 | + vsnprintf(this->msg,4095,fmt,arg_ptr); | |
| 58 | + va_end(arg_ptr); | |
| 59 | + | |
| 60 | + this->code = code; | |
| 61 | + | |
| 62 | 62 | } |
| 63 | 63 | |
| 64 | + | |
| 64 | 65 | const char * rx3270::exception::getMessage(void) |
| 65 | 66 | { |
| 66 | 67 | return this->msg; |
| ... | ... | @@ -79,8 +80,21 @@ void rx3270::exception::logMessage(void) |
| 79 | 80 | |
| 80 | 81 | void rx3270::exception::RaiseException(RexxMethodContext *context) |
| 81 | 82 | { |
| 82 | - // TODO: Raise rexx exception | |
| 83 | 83 | trace("%s: %s",__FUNCTION__,this->getMessage()); |
| 84 | 84 | logMessage(); |
| 85 | + | |
| 86 | + context->RaiseException1( this->code, | |
| 87 | + context->NewStringFromAsciiz(this->msg) | |
| 88 | + ); | |
| 89 | +} | |
| 90 | + | |
| 91 | +void rx3270::exception::RaiseException(RexxCallContext *context) | |
| 92 | +{ | |
| 93 | + trace("%s: %s",__FUNCTION__,this->getMessage()); | |
| 94 | + logMessage(); | |
| 95 | + | |
| 96 | + context->RaiseException1( this->code, | |
| 97 | + context->NewStringFromAsciiz(this->msg) | |
| 98 | + ); | |
| 85 | 99 | } |
| 86 | 100 | ... | ... |
src/plugins/rx3270/remote.cc
| ... | ... | @@ -104,6 +104,9 @@ |
| 104 | 104 | char * query_string(const char *method); |
| 105 | 105 | int query_intval(const char *method); |
| 106 | 106 | |
| 107 | + char * get_string(DBusMessage * msg); | |
| 108 | + int get_intval(DBusMessage * msg); | |
| 109 | + | |
| 107 | 110 | #endif |
| 108 | 111 | |
| 109 | 112 | |
| ... | ... | @@ -127,7 +130,7 @@ DBusMessage * remote::create_message(const char *method) |
| 127 | 130 | method); // method |
| 128 | 131 | |
| 129 | 132 | if (!msg) |
| 130 | - log("Error creating message for method %s",method); | |
| 133 | + throw exception("Error creating message for method %s",method); | |
| 131 | 134 | |
| 132 | 135 | return msg; |
| 133 | 136 | } |
| ... | ... | @@ -167,7 +170,7 @@ remote::remote(const char *name) |
| 167 | 170 | |
| 168 | 171 | if(!WaitNamedPipe(buffer,NMPWAIT_USE_DEFAULT_WAIT)) |
| 169 | 172 | { |
| 170 | - log("%s","Invalid service instance"); | |
| 173 | + throw exception("%s","Invalid service instance"); | |
| 171 | 174 | return; |
| 172 | 175 | } |
| 173 | 176 | |
| ... | ... | @@ -175,13 +178,13 @@ remote::remote(const char *name) |
| 175 | 178 | |
| 176 | 179 | if(hPipe == INVALID_HANDLE_VALUE) |
| 177 | 180 | { |
| 178 | - log("%s","Can´t create service pipe"); | |
| 181 | + throw exception("%s","Can´t create service pipe"); | |
| 179 | 182 | return; |
| 180 | 183 | } |
| 181 | 184 | |
| 182 | 185 | if(!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL)) |
| 183 | 186 | { |
| 184 | - log("%s","Can´t set pipe state"); | |
| 187 | + throw exception("%s","Can´t set pipe state"); | |
| 185 | 188 | CloseHandle(hPipe); |
| 186 | 189 | hPipe = INVALID_HANDLE_VALUE; |
| 187 | 190 | return; |
| ... | ... | @@ -267,13 +270,13 @@ remote::remote(const char *name) |
| 267 | 270 | |
| 268 | 271 | if (dbus_error_is_set(&err)) |
| 269 | 272 | { |
| 270 | - log("DBUS Connection Error (%s)", err.message); | |
| 273 | + throw exception("DBUS Connection Error (%s)", err.message); | |
| 271 | 274 | dbus_error_free(&err); |
| 272 | 275 | } |
| 273 | 276 | |
| 274 | 277 | if(!conn) |
| 275 | 278 | { |
| 276 | - log("%s", "DBUS Connection failed"); | |
| 279 | + throw exception("%s", "DBUS Connection failed"); | |
| 277 | 280 | return; |
| 278 | 281 | } |
| 279 | 282 | |
| ... | ... | @@ -293,7 +296,7 @@ remote::remote(const char *name) |
| 293 | 296 | |
| 294 | 297 | if (dbus_error_is_set(&err)) |
| 295 | 298 | { |
| 296 | - log("Name Error (%s)", err.message); | |
| 299 | + throw exception("Name Error (%s)", err.message); | |
| 297 | 300 | dbus_error_free(&err); |
| 298 | 301 | conn = NULL; |
| 299 | 302 | return; |
| ... | ... | @@ -302,7 +305,7 @@ remote::remote(const char *name) |
| 302 | 305 | if(rc != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) |
| 303 | 306 | { |
| 304 | 307 | trace("%s: DBUS request for name %s failed",__FUNCTION__, busname); |
| 305 | - log("DBUS for \"%s\" failed",name); | |
| 308 | + throw exception("DBUS request for \"%s\" failed",name); | |
| 306 | 309 | conn = NULL; |
| 307 | 310 | return; |
| 308 | 311 | } |
| ... | ... | @@ -345,7 +348,7 @@ DBusMessage * remote::call(DBusMessage *msg) |
| 345 | 348 | |
| 346 | 349 | if(!reply) |
| 347 | 350 | { |
| 348 | - log("%s",error.message); | |
| 351 | + throw exception("%s",error.message); | |
| 349 | 352 | dbus_error_free(&error); |
| 350 | 353 | } |
| 351 | 354 | |
| ... | ... | @@ -353,7 +356,7 @@ DBusMessage * remote::call(DBusMessage *msg) |
| 353 | 356 | |
| 354 | 357 | } |
| 355 | 358 | |
| 356 | -char * get_string(DBusMessage * msg) | |
| 359 | +char * remote::get_string(DBusMessage * msg) | |
| 357 | 360 | { |
| 358 | 361 | char *rc = NULL; |
| 359 | 362 | if(msg) |
| ... | ... | @@ -369,12 +372,12 @@ char * get_string(DBusMessage * msg) |
| 369 | 372 | trace("Response: [%s]",str); |
| 370 | 373 | rc = strdup(str); |
| 371 | 374 | } |
| 372 | -#ifdef DEBUG | |
| 373 | 375 | else |
| 374 | 376 | { |
| 375 | - trace("Return type is %c, expecting %c",dbus_message_iter_get_arg_type(&iter),DBUS_TYPE_STRING); | |
| 377 | + dbus_message_unref(msg); | |
| 378 | + throw exception("DBUS Return type was %c, expecting %c",dbus_message_iter_get_arg_type(&iter),DBUS_TYPE_INT32); | |
| 379 | + return NULL; | |
| 376 | 380 | } |
| 377 | -#endif | |
| 378 | 381 | } |
| 379 | 382 | |
| 380 | 383 | dbus_message_unref(msg); |
| ... | ... | @@ -389,7 +392,7 @@ char * remote::query_string(const char *method) |
| 389 | 392 | return NULL; |
| 390 | 393 | } |
| 391 | 394 | |
| 392 | -int get_intval(DBusMessage * msg) | |
| 395 | +int remote::get_intval(DBusMessage * msg) | |
| 393 | 396 | { |
| 394 | 397 | int rc = -1; |
| 395 | 398 | |
| ... | ... | @@ -405,12 +408,12 @@ int get_intval(DBusMessage * msg) |
| 405 | 408 | dbus_message_iter_get_basic(&iter, &iSigned); |
| 406 | 409 | rc = (int) iSigned; |
| 407 | 410 | } |
| 408 | -#ifdef DEBUG | |
| 409 | 411 | else |
| 410 | 412 | { |
| 411 | - trace("Return type is %c, expecting %c",dbus_message_iter_get_arg_type(&iter),DBUS_TYPE_INT32); | |
| 413 | + dbus_message_unref(msg); | |
| 414 | + throw exception("DBUS Return type was %c, expecting %c",dbus_message_iter_get_arg_type(&iter),DBUS_TYPE_INT32); | |
| 415 | + return -1; | |
| 412 | 416 | } |
| 413 | -#endif | |
| 414 | 417 | } |
| 415 | 418 | |
| 416 | 419 | dbus_message_unref(msg); |
| ... | ... | @@ -447,7 +450,6 @@ char * remote::get_revision(void) |
| 447 | 450 | |
| 448 | 451 | } |
| 449 | 452 | |
| 450 | - | |
| 451 | 453 | LIB3270_CSTATE remote::get_cstate(void) |
| 452 | 454 | { |
| 453 | 455 | #if defined(WIN32) | ... | ... |
src/plugins/rx3270/rexx_methods.cc
| ... | ... | @@ -125,10 +125,19 @@ RexxMethod2(int, rx3270_method_sleep, CSELF, sessionPtr, int, seconds) |
| 125 | 125 | |
| 126 | 126 | RexxMethod1(logical_t, rx3270_method_is_connected, CSELF, sessionPtr) |
| 127 | 127 | { |
| 128 | - rx3270 *hSession = (rx3270 *) sessionPtr; | |
| 129 | - if(!hSession) | |
| 130 | - return false; | |
| 131 | - return hSession->is_connected(); | |
| 128 | + try | |
| 129 | + { | |
| 130 | + rx3270 *hSession = (rx3270 *) sessionPtr; | |
| 131 | + if(!hSession) | |
| 132 | + return false; | |
| 133 | + return hSession->is_connected(); | |
| 134 | + } | |
| 135 | + catch(rx3270::exception e) | |
| 136 | + { | |
| 137 | + e.RaiseException(context); | |
| 138 | + } | |
| 139 | + | |
| 140 | + return 0; | |
| 132 | 141 | } |
| 133 | 142 | |
| 134 | 143 | RexxMethod1(logical_t, rx3270_method_is_ready, CSELF, sessionPtr) | ... | ... |
src/plugins/rx3270/rx3270.cc
| ... | ... | @@ -118,18 +118,9 @@ char * rx3270::get_revision(void) |
| 118 | 118 | |
| 119 | 119 | rx3270 * rx3270::get_default() |
| 120 | 120 | { |
| 121 | - try | |
| 122 | - { | |
| 123 | - if(defSession) | |
| 124 | - return defSession; | |
| 125 | - return create_local(); | |
| 126 | - } | |
| 127 | - catch(exception e) | |
| 128 | - { | |
| 129 | - e.logMessage(); | |
| 130 | - } | |
| 131 | - | |
| 132 | - return NULL; | |
| 121 | + if(defSession) | |
| 122 | + return defSession; | |
| 123 | + return create_local(); | |
| 133 | 124 | } |
| 134 | 125 | |
| 135 | 126 | void rx3270::log(const char *fmt, ...) | ... | ... |
src/plugins/rx3270/rx3270.h
| ... | ... | @@ -147,16 +147,18 @@ |
| 147 | 147 | class exception |
| 148 | 148 | { |
| 149 | 149 | public: |
| 150 | + exception(int code, const char *fmt, ...); | |
| 150 | 151 | exception(const char *fmt, ...); |
| 151 | - ~exception(); | |
| 152 | 152 | |
| 153 | 153 | const char * getMessage(void); |
| 154 | 154 | void logMessage(void); |
| 155 | 155 | |
| 156 | 156 | void RaiseException(RexxMethodContext *context); |
| 157 | + void RaiseException(RexxCallContext *context); | |
| 157 | 158 | |
| 158 | 159 | private: |
| 159 | - char *msg; | |
| 160 | + int code; | |
| 161 | + char msg[4096]; | |
| 160 | 162 | |
| 161 | 163 | }; |
| 162 | 164 | ... | ... |
src/plugins/rx3270/typed_routines.cc
| ... | ... | @@ -35,7 +35,16 @@ |
| 35 | 35 | |
| 36 | 36 | RexxRoutine0(CSTRING, rx3270version) |
| 37 | 37 | { |
| 38 | - return rx3270::get_default()->get_version(); | |
| 38 | + try | |
| 39 | + { | |
| 40 | + return rx3270::get_default()->get_version(); | |
| 41 | + } | |
| 42 | + catch(rx3270::exception e) | |
| 43 | + { | |
| 44 | + e.RaiseException(context); | |
| 45 | + } | |
| 46 | + | |
| 47 | + return NULL; | |
| 39 | 48 | } |
| 40 | 49 | |
| 41 | 50 | RexxRoutine0(CSTRING, rx3270QueryCState) |
| ... | ... | @@ -184,7 +193,16 @@ RexxRoutine3(int, rx3270queryStringAt, int, row, int, col, CSTRING, key) |
| 184 | 193 | |
| 185 | 194 | RexxRoutine2(int, rx3270SetCursorPosition, int, row, int, col) |
| 186 | 195 | { |
| 187 | - return rx3270::get_default()->set_cursor_position(row,col); | |
| 196 | + try | |
| 197 | + { | |
| 198 | + return rx3270::get_default()->set_cursor_position(row,col); | |
| 199 | + } | |
| 200 | + catch(rx3270::exception e) | |
| 201 | + { | |
| 202 | + e.RaiseException(context); | |
| 203 | + } | |
| 204 | + | |
| 205 | + return -1; | |
| 188 | 206 | } |
| 189 | 207 | |
| 190 | 208 | RexxRoutine3(int, rx3270SetStringAt, int, row, int, col, CSTRING, text) | ... | ... |