Commit 56fde83fbea652a89a183115700e9f76567e6c9f
1 parent
e279276f
Exists in
master
and in
5 other branches
Melhorando tratamento de erros em windows
Showing
3 changed files
with
97 additions
and
36 deletions
Show diff stats
src/classlib/exception.cc
... | ... | @@ -38,22 +38,63 @@ |
38 | 38 | namespace PW3270_NAMESPACE |
39 | 39 | { |
40 | 40 | |
41 | - exception::exception(int syscode) | |
42 | - { | |
41 | + exception::exception(int syscode) | |
42 | + { | |
43 | 43 | snprintf(this->msg,4095,"%s",strerror(syscode)); |
44 | - } | |
44 | + } | |
45 | 45 | |
46 | - exception::exception(const char *fmt, ...) | |
47 | - { | |
46 | + exception::exception(const char *fmt, ...) | |
47 | + { | |
48 | 48 | va_list arg_ptr; |
49 | 49 | va_start(arg_ptr, fmt); |
50 | 50 | vsnprintf(this->msg,4095,fmt,arg_ptr); |
51 | 51 | va_end(arg_ptr); |
52 | - } | |
52 | + } | |
53 | 53 | |
54 | - const char * exception::what() const throw() | |
55 | - { | |
54 | +#ifdef WIN32 | |
55 | + exception::exception(DWORD error, const char *fmt, ...) | |
56 | + { | |
57 | + LPVOID lpMsgBuf = 0; | |
58 | + char * ptr; | |
59 | + size_t szPrefix; | |
60 | + | |
61 | + va_list arg_ptr; | |
62 | + va_start(arg_ptr, fmt); | |
63 | + vsnprintf(this->msg,4095,fmt,arg_ptr); | |
64 | + va_end(arg_ptr); | |
65 | + | |
66 | + szPrefix = strlen(this->msg); | |
67 | + | |
68 | + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); | |
69 | + | |
70 | + for(ptr= (char *) lpMsgBuf;*ptr && *ptr != '\n';ptr++); | |
71 | + *ptr = 0; | |
72 | + | |
73 | + snprintf(this->msg+szPrefix,4095-szPrefix,": %s (rc=%d)",(char *) lpMsgBuf,(int) error); | |
74 | + | |
75 | + LocalFree(lpMsgBuf); | |
76 | + | |
77 | + } | |
78 | +#else | |
79 | + exception::exception(int error, const char *fmt, ...) | |
80 | + { | |
81 | + size_t szPrefix; | |
82 | + | |
83 | + va_list arg_ptr; | |
84 | + va_start(arg_ptr, fmt); | |
85 | + vsnprintf(this->msg,4095,fmt,arg_ptr); | |
86 | + va_end(arg_ptr); | |
87 | + | |
88 | + szPrefix = strlen(this->msg); | |
89 | + | |
90 | + snprintf(this->msg+szPrefix,4095-szPrefix,": %s (rc=%d)",strerror(error),(int) error); | |
91 | + | |
92 | + } | |
93 | +#endif // WIN32 | |
94 | + | |
95 | + const char * exception::what() const throw() | |
96 | + { | |
56 | 97 | return this->msg; |
57 | - } | |
98 | + } | |
58 | 99 | |
59 | 100 | } | ... | ... |
src/classlib/remote.cc
... | ... | @@ -71,9 +71,36 @@ |
71 | 71 | if(TransactNamedPipe(hPipe,(LPVOID) &query, cbSize, &response, sizeof(response), &cbSize,NULL)) |
72 | 72 | return response.rc; |
73 | 73 | |
74 | - throw exception("Error %d in TransactNamedPipe",GetLastError()); | |
74 | + throw exception(GetLastError(),"%s","Transaction error"); | |
75 | 75 | } |
76 | 76 | |
77 | + string * query_string(void *query, size_t szQuery, size_t len) | |
78 | + { | |
79 | + struct hllapi_packet_text * response; | |
80 | + DWORD cbSize = sizeof(struct hllapi_packet_text)+len; | |
81 | + string * s; | |
82 | + | |
83 | + response = (struct hllapi_packet_text *) malloc(cbSize+2); | |
84 | + memset(response,0,cbSize+2); | |
85 | + | |
86 | + if(TransactNamedPipe(hPipe,(LPVOID) query, szQuery, &response, cbSize, &cbSize,NULL)) | |
87 | + { | |
88 | + if(response->packet_id) | |
89 | + s = new string(""); | |
90 | + else | |
91 | + s = new string(response->text); | |
92 | + } | |
93 | + else | |
94 | + { | |
95 | + s = new string(""); | |
96 | + } | |
97 | + | |
98 | + free(response); | |
99 | + | |
100 | + return s; | |
101 | + } | |
102 | + | |
103 | + | |
77 | 104 | #elif defined(HAVE_DBUS) |
78 | 105 | |
79 | 106 | DBusConnection * conn; |
... | ... | @@ -209,7 +236,9 @@ |
209 | 236 | |
210 | 237 | if(!WaitNamedPipe(buffer,NMPWAIT_USE_DEFAULT_WAIT)) |
211 | 238 | { |
212 | - throw exception("Invalid service instance: %s",name); | |
239 | + exception e = exception(GetLastError(),"Service instance %s unavailable",str); | |
240 | + free(str); | |
241 | + throw e; | |
213 | 242 | return; |
214 | 243 | } |
215 | 244 | |
... | ... | @@ -221,7 +250,7 @@ |
221 | 250 | } |
222 | 251 | else if(!SetNamedPipeHandleState(hPipe,&dwMode,NULL,NULL)) |
223 | 252 | { |
224 | - exception e = exception("%s","Can´t set pipe state"); | |
253 | + exception e = exception(GetLastError(),"%s","Can´t set pipe state"); | |
225 | 254 | CloseHandle(hPipe); |
226 | 255 | hPipe = INVALID_HANDLE_VALUE; |
227 | 256 | throw e; |
... | ... | @@ -309,6 +338,7 @@ |
309 | 338 | exception e = exception("DBUS Connection Error (%s)", err.message); |
310 | 339 | dbus_error_free(&err); |
311 | 340 | throw e; |
341 | + return; | |
312 | 342 | } |
313 | 343 | |
314 | 344 | if(!conn) |
... | ... | @@ -449,12 +479,12 @@ |
449 | 479 | if(TransactNamedPipe(hPipe,(LPVOID) pkt, cbSize, &response, sizeof(response), &cbSize,NULL)) |
450 | 480 | { |
451 | 481 | free(pkt); |
452 | - return response.rc | |
482 | + return response.rc; | |
453 | 483 | } |
454 | 484 | |
455 | 485 | free(pkt); |
456 | 486 | |
457 | - throw exception("Transaction error %d",GetLastError()); | |
487 | + throw exception(GetLastError(),"%s","Transaction error"); | |
458 | 488 | |
459 | 489 | #elif defined(HAVE_DBUS) |
460 | 490 | |
... | ... | @@ -616,29 +646,9 @@ |
616 | 646 | { |
617 | 647 | #if defined(WIN32) |
618 | 648 | |
619 | - struct hllapi_packet_query_at query = { HLLAPI_PACKET_GET_TEXT_AT, (unsigned short) row, (unsigned short) col, (unsigned short) sz }; | |
620 | - struct hllapi_packet_text * response; | |
621 | - DWORD cbSize = sizeof(struct hllapi_packet_text)+sz; | |
622 | - string * s; | |
623 | - | |
624 | - response = (struct hllapi_packet_text *) malloc(cbSize+2); | |
625 | - memset(response,0,cbSize+2); | |
626 | - | |
627 | - if(TransactNamedPipe(hPipe,(LPVOID) &query, sizeof(struct hllapi_packet_query_at), &response, cbSize, &cbSize,NULL)) | |
628 | - { | |
629 | - if(response->packet_id) | |
630 | - s = new string(""); | |
631 | - else | |
632 | - s = new string(response->text); | |
633 | - } | |
634 | - else | |
635 | - { | |
636 | - s = new string(""); | |
637 | - } | |
638 | - | |
639 | - free(response); | |
649 | + struct hllapi_packet_query_at query = { HLLAPI_PACKET_GET_TEXT_AT, (unsigned short) row, (unsigned short) col, (unsigned short) sz }; | |
640 | 650 | |
641 | - return s; | |
651 | + return query_string(&query,sizeof(query),sz); | |
642 | 652 | |
643 | 653 | #elif defined(HAVE_DBUS) |
644 | 654 | |
... | ... | @@ -766,8 +776,13 @@ |
766 | 776 | |
767 | 777 | string * get_text(int baddr, size_t len) |
768 | 778 | { |
779 | +#if defined(WIN32) | |
780 | + struct hllapi_packet_query_offset query = { HLLAPI_PACKET_GET_TEXT_AT_OFFSET, (unsigned short) baddr, (unsigned short) len }; | |
781 | + return query_string(&query,sizeof(query),len); | |
782 | +#else | |
769 | 783 | #warning IMPLEMENTAR |
770 | 784 | return NULL; |
785 | +#endif | |
771 | 786 | } |
772 | 787 | |
773 | 788 | ... | ... |
src/include/pw3270/class.h
... | ... | @@ -64,6 +64,10 @@ |
64 | 64 | exception(int syserror = errno); |
65 | 65 | exception(const char *fmt, ...); |
66 | 66 | |
67 | +#ifdef WIN32 | |
68 | + exception(DWORD error, const char *fmt, ...); | |
69 | +#endif // WIN32 | |
70 | + | |
67 | 71 | virtual const char * what() const throw(); |
68 | 72 | |
69 | 73 | private: |
... | ... | @@ -71,6 +75,7 @@ |
71 | 75 | |
72 | 76 | }; |
73 | 77 | |
78 | + | |
74 | 79 | #if defined (HAVE_GNUC_VISIBILITY) |
75 | 80 | class __attribute__((visibility("default"))) session |
76 | 81 | #elif defined(WIN32) | ... | ... |