Commit 95897d64d66ba8707c73220f67e62018bc8a8910

Authored by perry.werneck@gmail.com
1 parent a20a64aa

Implementando tratamento de excessões na extensão rexx

src/plugins/rx3270/exception.cc
@@ -98,3 +98,7 @@ void rx3270::exception::RaiseException(RexxCallContext *context) @@ -98,3 +98,7 @@ void rx3270::exception::RaiseException(RexxCallContext *context)
98 ); 98 );
99 } 99 }
100 100
  101 +const char * rx3270::exception::what() const throw()
  102 +{
  103 + return this->msg;
  104 +}
src/plugins/rx3270/local.cc
@@ -330,7 +330,7 @@ dynamic::dynamic() @@ -330,7 +330,7 @@ dynamic::dynamic()
330 FreeLibrary(kernel); 330 FreeLibrary(kernel);
331 331
332 if(!hModule) 332 if(!hModule)
333 - return; 333 + throw exception("Can't load %s",dllname);
334 334
335 335
336 #else 336 #else
@@ -339,8 +339,7 @@ dynamic::dynamic() @@ -339,8 +339,7 @@ dynamic::dynamic()
339 hModule = dlopen("lib3270.so." PACKAGE_VERSION, RTLD_NOW); 339 hModule = dlopen("lib3270.so." PACKAGE_VERSION, RTLD_NOW);
340 if(!hModule) 340 if(!hModule)
341 { 341 {
342 - fprintf(stderr,"Can't load lib3270\n%s\n",dlerror());  
343 - fflush(stderr); 342 + throw exception("Can't load lib3270: %s",dlerror());
344 return; 343 return;
345 } 344 }
346 345
@@ -358,10 +357,10 @@ dynamic::dynamic() @@ -358,10 +357,10 @@ dynamic::dynamic()
358 if(!*call[f].entry) 357 if(!*call[f].entry)
359 { 358 {
360 #ifndef WIN32 359 #ifndef WIN32
361 - fprintf(stderr,"Can't load lib3270::%s\n%s\n",call[f].name,dlerror());  
362 - fflush(stderr); 360 + throw exception("Error \"%s\" loading lib3270::%s",dlerror(),call[f].name);
363 dlclose(hModule); 361 dlclose(hModule);
364 #else 362 #else
  363 + throw exception("Error loading lib3270::%s",call[f].name);
365 FreeLibrary(hModule); 364 FreeLibrary(hModule);
366 #endif // !WIN32 365 #endif // !WIN32
367 hModule = NULL; 366 hModule = NULL;
src/plugins/rx3270/remote.cc
@@ -170,7 +170,7 @@ remote::remote(const char *name) @@ -170,7 +170,7 @@ remote::remote(const char *name)
170 170
171 if(!WaitNamedPipe(buffer,NMPWAIT_USE_DEFAULT_WAIT)) 171 if(!WaitNamedPipe(buffer,NMPWAIT_USE_DEFAULT_WAIT))
172 { 172 {
173 - throw exception("%s","Invalid service instance"); 173 + throw exception("Invalid service instance: %s",name);
174 return; 174 return;
175 } 175 }
176 176
@@ -178,7 +178,7 @@ remote::remote(const char *name) @@ -178,7 +178,7 @@ remote::remote(const char *name)
178 178
179 if(hPipe == INVALID_HANDLE_VALUE) 179 if(hPipe == INVALID_HANDLE_VALUE)
180 { 180 {
181 - throw exception("%s","Can´t create service pipe"); 181 + throw exception("Can´t create service pipe %s",buffer);
182 return; 182 return;
183 } 183 }
184 184
@@ -312,6 +312,15 @@ remote::remote(const char *name) @@ -312,6 +312,15 @@ remote::remote(const char *name)
312 312
313 trace("%s: Using DBUS name %s",__FUNCTION__,busname); 313 trace("%s: Using DBUS name %s",__FUNCTION__,busname);
314 314
  315 + DBusMessage * msg = create_message("setScript");
  316 +
  317 + if(msg)
  318 + {
  319 + const char * id = "r";
  320 + static const dbus_int32_t flag = 1;
  321 + dbus_message_append_args(msg, DBUS_TYPE_STRING, &id, DBUS_TYPE_INT32, &flag, DBUS_TYPE_INVALID);
  322 + get_intval(call(msg));
  323 + }
315 324
316 #else 325 #else
317 326
@@ -327,6 +336,21 @@ remote::~remote() @@ -327,6 +336,21 @@ remote::~remote()
327 336
328 #elif defined(HAVE_DBUS) 337 #elif defined(HAVE_DBUS)
329 338
  339 + try
  340 + {
  341 + DBusMessage * msg = create_message("setScript");
  342 + if(msg)
  343 + {
  344 + const char * id = "r";
  345 + static const dbus_int32_t flag = 0;
  346 + dbus_message_append_args(msg, DBUS_TYPE_STRING, &id, DBUS_TYPE_INT32, &flag, DBUS_TYPE_INVALID);
  347 + get_intval(call(msg));
  348 + }
  349 + }
  350 + catch(rx3270::exception e)
  351 + {
  352 + }
  353 +
330 free(dest); 354 free(dest);
331 free(path); 355 free(path);
332 free(intf); 356 free(intf);
src/plugins/rx3270/rx3270.h
@@ -64,6 +64,7 @@ @@ -64,6 +64,7 @@
64 #define REXX_DEFAULT_CHARSET "UTF-8" 64 #define REXX_DEFAULT_CHARSET "UTF-8"
65 #endif // WIN32 65 #endif // WIN32
66 66
  67 +#include <exception>
67 68
68 /*---[ Rexx entry points ]-----------------------------------------------------------------------------------*/ 69 /*---[ Rexx entry points ]-----------------------------------------------------------------------------------*/
69 70
@@ -144,7 +145,7 @@ @@ -144,7 +145,7 @@
144 145
145 public: 146 public:
146 147
147 - class exception 148 + class exception : public std::exception
148 { 149 {
149 public: 150 public:
150 exception(int code, const char *fmt, ...); 151 exception(int code, const char *fmt, ...);
@@ -156,6 +157,8 @@ @@ -156,6 +157,8 @@
156 void RaiseException(RexxMethodContext *context); 157 void RaiseException(RexxMethodContext *context);
157 void RaiseException(RexxCallContext *context); 158 void RaiseException(RexxCallContext *context);
158 159
  160 + virtual const char * what() const throw();
  161 +
159 private: 162 private:
160 int code; 163 int code;
161 char msg[4096]; 164 char msg[4096];
@@ -186,7 +189,6 @@ @@ -186,7 +189,6 @@
186 virtual char * get_revision(void); 189 virtual char * get_revision(void);
187 virtual LIB3270_CSTATE get_cstate(void) = 0; 190 virtual LIB3270_CSTATE get_cstate(void) = 0;
188 191
189 -  
190 virtual int connect(const char *uri, bool wait = true) = 0; 192 virtual int connect(const char *uri, bool wait = true) = 0;
191 virtual int disconnect(void) = 0; 193 virtual int disconnect(void) = 0;
192 virtual bool is_connected(void) = 0; 194 virtual bool is_connected(void) = 0;
src/plugins/rx3270/sample/clipboard.rex
@@ -5,8 +5,6 @@ @@ -5,8 +5,6 @@
5 * 5 *
6 */ 6 */
7 7
8 -trace "?R"  
9 -  
10 host = .rx3270~new("pw3270:a") 8 host = .rx3270~new("pw3270:a")
11 9
12 if host~connected() = 0 then 10 if host~connected() = 0 then