Commit a20a64aaf0c47c7d573fcefbd40627e5b0e63ab4

Authored by perry.werneck@gmail.com
1 parent 56a70bc7

Implementando tratamento de excessões em rexx

src/plugins/rx3270/exception.cc
@@ -34,33 +34,34 @@ @@ -34,33 +34,34 @@
34 #endif // HAVE_SYSLOG 34 #endif // HAVE_SYSLOG
35 35
36 #include <string.h> 36 #include <string.h>
  37 + #include <oorexxerrors.h>
37 38
38 /*--[ Implement ]------------------------------------------------------------------------------------*/ 39 /*--[ Implement ]------------------------------------------------------------------------------------*/
39 40
40 rx3270::exception::exception(const char *fmt, ...) 41 rx3270::exception::exception(const char *fmt, ...)
41 { 42 {
42 - char buffer[4096];  
43 va_list arg_ptr; 43 va_list arg_ptr;
44 44
45 va_start(arg_ptr, fmt); 45 va_start(arg_ptr, fmt);
46 - vsnprintf(buffer,4095,fmt,arg_ptr); 46 + vsnprintf(this->msg,4095,fmt,arg_ptr);
47 va_end(arg_ptr); 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 const char * rx3270::exception::getMessage(void) 65 const char * rx3270::exception::getMessage(void)
65 { 66 {
66 return this->msg; 67 return this->msg;
@@ -79,8 +80,21 @@ void rx3270::exception::logMessage(void) @@ -79,8 +80,21 @@ void rx3270::exception::logMessage(void)
79 80
80 void rx3270::exception::RaiseException(RexxMethodContext *context) 81 void rx3270::exception::RaiseException(RexxMethodContext *context)
81 { 82 {
82 - // TODO: Raise rexx exception  
83 trace("%s: %s",__FUNCTION__,this->getMessage()); 83 trace("%s: %s",__FUNCTION__,this->getMessage());
84 logMessage(); 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,6 +104,9 @@
104 char * query_string(const char *method); 104 char * query_string(const char *method);
105 int query_intval(const char *method); 105 int query_intval(const char *method);
106 106
  107 + char * get_string(DBusMessage * msg);
  108 + int get_intval(DBusMessage * msg);
  109 +
107 #endif 110 #endif
108 111
109 112
@@ -127,7 +130,7 @@ DBusMessage * remote::create_message(const char *method) @@ -127,7 +130,7 @@ DBusMessage * remote::create_message(const char *method)
127 method); // method 130 method); // method
128 131
129 if (!msg) 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 return msg; 135 return msg;
133 } 136 }
@@ -167,7 +170,7 @@ remote::remote(const char *name) @@ -167,7 +170,7 @@ remote::remote(const char *name)
167 170
168 if(!WaitNamedPipe(buffer,NMPWAIT_USE_DEFAULT_WAIT)) 171 if(!WaitNamedPipe(buffer,NMPWAIT_USE_DEFAULT_WAIT))
169 { 172 {
170 - log("%s","Invalid service instance"); 173 + throw exception("%s","Invalid service instance");
171 return; 174 return;
172 } 175 }
173 176
@@ -175,13 +178,13 @@ remote::remote(const char *name) @@ -175,13 +178,13 @@ remote::remote(const char *name)
175 178
176 if(hPipe == INVALID_HANDLE_VALUE) 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 return; 182 return;
180 } 183 }
181 184
182 if(!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL)) 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 CloseHandle(hPipe); 188 CloseHandle(hPipe);
186 hPipe = INVALID_HANDLE_VALUE; 189 hPipe = INVALID_HANDLE_VALUE;
187 return; 190 return;
@@ -267,13 +270,13 @@ remote::remote(const char *name) @@ -267,13 +270,13 @@ remote::remote(const char *name)
267 270
268 if (dbus_error_is_set(&err)) 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 dbus_error_free(&err); 274 dbus_error_free(&err);
272 } 275 }
273 276
274 if(!conn) 277 if(!conn)
275 { 278 {
276 - log("%s", "DBUS Connection failed"); 279 + throw exception("%s", "DBUS Connection failed");
277 return; 280 return;
278 } 281 }
279 282
@@ -293,7 +296,7 @@ remote::remote(const char *name) @@ -293,7 +296,7 @@ remote::remote(const char *name)
293 296
294 if (dbus_error_is_set(&err)) 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 dbus_error_free(&err); 300 dbus_error_free(&err);
298 conn = NULL; 301 conn = NULL;
299 return; 302 return;
@@ -302,7 +305,7 @@ remote::remote(const char *name) @@ -302,7 +305,7 @@ remote::remote(const char *name)
302 if(rc != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) 305 if(rc != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
303 { 306 {
304 trace("%s: DBUS request for name %s failed",__FUNCTION__, busname); 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 conn = NULL; 309 conn = NULL;
307 return; 310 return;
308 } 311 }
@@ -345,7 +348,7 @@ DBusMessage * remote::call(DBusMessage *msg) @@ -345,7 +348,7 @@ DBusMessage * remote::call(DBusMessage *msg)
345 348
346 if(!reply) 349 if(!reply)
347 { 350 {
348 - log("%s",error.message); 351 + throw exception("%s",error.message);
349 dbus_error_free(&error); 352 dbus_error_free(&error);
350 } 353 }
351 354
@@ -353,7 +356,7 @@ DBusMessage * remote::call(DBusMessage *msg) @@ -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 char *rc = NULL; 361 char *rc = NULL;
359 if(msg) 362 if(msg)
@@ -369,12 +372,12 @@ char * get_string(DBusMessage * msg) @@ -369,12 +372,12 @@ char * get_string(DBusMessage * msg)
369 trace("Response: [%s]",str); 372 trace("Response: [%s]",str);
370 rc = strdup(str); 373 rc = strdup(str);
371 } 374 }
372 -#ifdef DEBUG  
373 else 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 dbus_message_unref(msg); 383 dbus_message_unref(msg);
@@ -389,7 +392,7 @@ char * remote::query_string(const char *method) @@ -389,7 +392,7 @@ char * remote::query_string(const char *method)
389 return NULL; 392 return NULL;
390 } 393 }
391 394
392 -int get_intval(DBusMessage * msg) 395 +int remote::get_intval(DBusMessage * msg)
393 { 396 {
394 int rc = -1; 397 int rc = -1;
395 398
@@ -405,12 +408,12 @@ int get_intval(DBusMessage * msg) @@ -405,12 +408,12 @@ int get_intval(DBusMessage * msg)
405 dbus_message_iter_get_basic(&iter, &iSigned); 408 dbus_message_iter_get_basic(&iter, &iSigned);
406 rc = (int) iSigned; 409 rc = (int) iSigned;
407 } 410 }
408 -#ifdef DEBUG  
409 else 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 dbus_message_unref(msg); 419 dbus_message_unref(msg);
@@ -447,7 +450,6 @@ char * remote::get_revision(void) @@ -447,7 +450,6 @@ char * remote::get_revision(void)
447 450
448 } 451 }
449 452
450 -  
451 LIB3270_CSTATE remote::get_cstate(void) 453 LIB3270_CSTATE remote::get_cstate(void)
452 { 454 {
453 #if defined(WIN32) 455 #if defined(WIN32)
src/plugins/rx3270/rexx_methods.cc
@@ -125,10 +125,19 @@ RexxMethod2(int, rx3270_method_sleep, CSELF, sessionPtr, int, seconds) @@ -125,10 +125,19 @@ RexxMethod2(int, rx3270_method_sleep, CSELF, sessionPtr, int, seconds)
125 125
126 RexxMethod1(logical_t, rx3270_method_is_connected, CSELF, sessionPtr) 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 RexxMethod1(logical_t, rx3270_method_is_ready, CSELF, sessionPtr) 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,18 +118,9 @@ char * rx3270::get_revision(void)
118 118
119 rx3270 * rx3270::get_default() 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 void rx3270::log(const char *fmt, ...) 126 void rx3270::log(const char *fmt, ...)
src/plugins/rx3270/rx3270.h
@@ -147,16 +147,18 @@ @@ -147,16 +147,18 @@
147 class exception 147 class exception
148 { 148 {
149 public: 149 public:
  150 + exception(int code, const char *fmt, ...);
150 exception(const char *fmt, ...); 151 exception(const char *fmt, ...);
151 - ~exception();  
152 152
153 const char * getMessage(void); 153 const char * getMessage(void);
154 void logMessage(void); 154 void logMessage(void);
155 155
156 void RaiseException(RexxMethodContext *context); 156 void RaiseException(RexxMethodContext *context);
  157 + void RaiseException(RexxCallContext *context);
157 158
158 private: 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,7 +35,16 @@
35 35
36 RexxRoutine0(CSTRING, rx3270version) 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 RexxRoutine0(CSTRING, rx3270QueryCState) 50 RexxRoutine0(CSTRING, rx3270QueryCState)
@@ -184,7 +193,16 @@ RexxRoutine3(int, rx3270queryStringAt, int, row, int, col, CSTRING, key) @@ -184,7 +193,16 @@ RexxRoutine3(int, rx3270queryStringAt, int, row, int, col, CSTRING, key)
184 193
185 RexxRoutine2(int, rx3270SetCursorPosition, int, row, int, col) 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 RexxRoutine3(int, rx3270SetStringAt, int, row, int, col, CSTRING, text) 208 RexxRoutine3(int, rx3270SetStringAt, int, row, int, col, CSTRING, text)