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 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)
... ...