Commit e2f2fd02ba00a29bb1c6c9badcdf0cd2ccb656e1
1 parent
509cd479
Exists in
master
and in
5 other branches
Prevenindo erro ao tentar acesso ao bus quando for criado mais de um objeto de acesso
Showing
2 changed files
with
97 additions
and
33 deletions
Show diff stats
src/classlib/remote.cc
| @@ -36,6 +36,7 @@ | @@ -36,6 +36,7 @@ | ||
| 36 | #include <malloc.h> | 36 | #include <malloc.h> |
| 37 | #include <sys/types.h> | 37 | #include <sys/types.h> |
| 38 | #include <unistd.h> | 38 | #include <unistd.h> |
| 39 | + #include <limits.h> | ||
| 39 | 40 | ||
| 40 | #ifndef DBUS_TIMEOUT_INFINITE | 41 | #ifndef DBUS_TIMEOUT_INFINITE |
| 41 | #define DBUS_TIMEOUT_INFINITE ((int) 0x7fffffff) | 42 | #define DBUS_TIMEOUT_INFINITE ((int) 0x7fffffff) |
| @@ -179,6 +180,7 @@ | @@ -179,6 +180,7 @@ | ||
| 179 | char * dest; | 180 | char * dest; |
| 180 | char * path; | 181 | char * path; |
| 181 | char * intf; | 182 | char * intf; |
| 183 | + int sequence; | ||
| 182 | 184 | ||
| 183 | DBusMessage * create_message(const char *method) | 185 | DBusMessage * create_message(const char *method) |
| 184 | { | 186 | { |
| @@ -358,6 +360,45 @@ | @@ -358,6 +360,45 @@ | ||
| 358 | 360 | ||
| 359 | public: | 361 | public: |
| 360 | 362 | ||
| 363 | +#if defined(HAVE_DBUS) | ||
| 364 | + const char * makeBusName(char *buffer, size_t sz) | ||
| 365 | + { | ||
| 366 | + size_t bytes = strlen(buffer); | ||
| 367 | + char * ptr = buffer; | ||
| 368 | + int val; | ||
| 369 | + | ||
| 370 | + sz -= 2; | ||
| 371 | + | ||
| 372 | + // First uses the object ID | ||
| 373 | + val = this->sequence; | ||
| 374 | + while(bytes < sz && val > 0) | ||
| 375 | + { | ||
| 376 | + *(ptr++) = 'a'+(val % 25); | ||
| 377 | + val /= 25; | ||
| 378 | + bytes++; | ||
| 379 | + } | ||
| 380 | + *(ptr++) = '.'; | ||
| 381 | + | ||
| 382 | + // Then the PID | ||
| 383 | + val = (int) getpid(); | ||
| 384 | + while(bytes < sz && val > 0) | ||
| 385 | + { | ||
| 386 | + *(ptr++) = 'a'+(val % 25); | ||
| 387 | + val /= 25; | ||
| 388 | + bytes++; | ||
| 389 | + } | ||
| 390 | + *(ptr++) = '.'; | ||
| 391 | + | ||
| 392 | + // And last, the project info | ||
| 393 | + strncpy(ptr,intf,sz); | ||
| 394 | + | ||
| 395 | + trace("Busname=\"%s\" sequence=%d this=%p",buffer,sequence,this); | ||
| 396 | + | ||
| 397 | + return buffer; | ||
| 398 | + | ||
| 399 | + } | ||
| 400 | +#endif // HAVE_DBUS | ||
| 401 | + | ||
| 361 | remote(const char *session) | 402 | remote(const char *session) |
| 362 | { | 403 | { |
| 363 | #if defined(WIN32) | 404 | #if defined(WIN32) |
| @@ -480,15 +521,16 @@ | @@ -480,15 +521,16 @@ | ||
| 480 | 521 | ||
| 481 | #elif defined(HAVE_DBUS) | 522 | #elif defined(HAVE_DBUS) |
| 482 | 523 | ||
| 524 | + static int sq = 0; | ||
| 483 | DBusError err; | 525 | DBusError err; |
| 484 | int rc; | 526 | int rc; |
| 485 | char * str = strdup(session); | 527 | char * str = strdup(session); |
| 486 | char * ptr; | 528 | char * ptr; |
| 487 | char busname[4096]; | 529 | char busname[4096]; |
| 488 | - char pidname[10]; | ||
| 489 | - int pid = (int) getpid(); | ||
| 490 | 530 | ||
| 491 | - trace("%s str=%p",__FUNCTION__,str); | 531 | + this->sequence = (++sq) + time(0); |
| 532 | + | ||
| 533 | + trace("%s str=%p sequence=%d",__FUNCTION__,str,sequence); | ||
| 492 | 534 | ||
| 493 | for(ptr=str;*ptr;ptr++) | 535 | for(ptr=str;*ptr;ptr++) |
| 494 | *ptr = tolower(*ptr); | 536 | *ptr = tolower(*ptr); |
| @@ -569,19 +611,9 @@ | @@ -569,19 +611,9 @@ | ||
| 569 | return; | 611 | return; |
| 570 | } | 612 | } |
| 571 | 613 | ||
| 572 | - memset(pidname,0,10); | ||
| 573 | - for(int f = 0; f < 9 && pid > 0;f++) | ||
| 574 | - { | ||
| 575 | - pidname[f] = 'a'+(pid % 25); | ||
| 576 | - pid /= 25; | ||
| 577 | - } | ||
| 578 | - | ||
| 579 | - snprintf(busname, 4095, "%s.rx3270.br.com.bb",pidname); | ||
| 580 | 614 | ||
| 581 | - trace("Busname: [%s]",busname); | ||
| 582 | - | ||
| 583 | - rc = dbus_bus_request_name(conn, busname, DBUS_NAME_FLAG_REPLACE_EXISTING , &err); | ||
| 584 | - trace("dbus_bus_request_name rc=%d",rc); | 615 | + rc = dbus_bus_request_name(conn, makeBusName(busname,4095), DBUS_NAME_FLAG_REPLACE_EXISTING , &err); |
| 616 | + trace("dbus_bus_request_name(%s) rc=%d",busname,rc); | ||
| 585 | 617 | ||
| 586 | if (dbus_error_is_set(&err)) | 618 | if (dbus_error_is_set(&err)) |
| 587 | { | 619 | { |
| @@ -632,10 +664,25 @@ | @@ -632,10 +664,25 @@ | ||
| 632 | 664 | ||
| 633 | } | 665 | } |
| 634 | 666 | ||
| 667 | + char busname[4096]; | ||
| 668 | + makeBusName(busname,4096); | ||
| 669 | + | ||
| 635 | free(dest); | 670 | free(dest); |
| 636 | free(path); | 671 | free(path); |
| 637 | free(intf); | 672 | free(intf); |
| 638 | 673 | ||
| 674 | + DBusError err; | ||
| 675 | + | ||
| 676 | + dbus_error_init(&err); | ||
| 677 | + dbus_bus_release_name(conn,busname,&err); | ||
| 678 | + | ||
| 679 | + if (dbus_error_is_set(&err)) | ||
| 680 | + { | ||
| 681 | + exception e = exception("Error when releasing DBUS name (%s)", err.message); | ||
| 682 | + dbus_error_free(&err); | ||
| 683 | + throw e; | ||
| 684 | + } | ||
| 685 | + | ||
| 639 | #else | 686 | #else |
| 640 | 687 | ||
| 641 | #endif | 688 | #endif |
src/classlib/testprogram.cc
| @@ -28,6 +28,7 @@ | @@ -28,6 +28,7 @@ | ||
| 28 | */ | 28 | */ |
| 29 | 29 | ||
| 30 | #include <pw3270/class.h> | 30 | #include <pw3270/class.h> |
| 31 | + #include <unistd.h> | ||
| 31 | #include <iostream> | 32 | #include <iostream> |
| 32 | 33 | ||
| 33 | using namespace std; | 34 | using namespace std; |
| @@ -37,31 +38,47 @@ | @@ -37,31 +38,47 @@ | ||
| 37 | 38 | ||
| 38 | int main(int numpar, char *param[]) | 39 | int main(int numpar, char *param[]) |
| 39 | { | 40 | { |
| 40 | - string *s; | ||
| 41 | - session *session = session::start("pw3270:a"); | ||
| 42 | -// session *session = session::start("new"); | ||
| 43 | 41 | ||
| 44 | - cout << "pw3270 version: " << session->get_version() << endl; | ||
| 45 | - cout << "pw3270 revision: " << session->get_revision() << endl << endl; | 42 | + { |
| 43 | + string *s; | ||
| 44 | + session *session = session::start("pw3270:a"); | ||
| 45 | + // session *session = session::start("new"); | ||
| 46 | 46 | ||
| 47 | - if(session->is_connected()) | ||
| 48 | - cout << "\tConnected to host" << endl; | ||
| 49 | - else | ||
| 50 | - cout << "\tDisconnected" << endl; | 47 | + cout << "pw3270 version: " << session->get_version() << endl; |
| 48 | + cout << "pw3270 revision: " << session->get_revision() << endl << endl; | ||
| 51 | 49 | ||
| 52 | - cout << "\tSession state: " << session->get_cstate() << endl; | 50 | + if(session->is_connected()) |
| 51 | + cout << "\tConnected to host" << endl; | ||
| 52 | + else | ||
| 53 | + cout << "\tDisconnected" << endl; | ||
| 53 | 54 | ||
| 54 | - s = session->get_display_charset(); | ||
| 55 | - cout << "\tDisplay charset: " << s->c_str() << endl; | ||
| 56 | - delete s; | 55 | + cout << "\tSession state: " << session->get_cstate() << endl; |
| 57 | 56 | ||
| 58 | - s = session->get_host_charset(); | ||
| 59 | - cout << "\tHost charset: " << s->c_str() << endl; | ||
| 60 | - delete s; | 57 | + s = session->get_display_charset(); |
| 58 | + cout << "\tDisplay charset: " << s->c_str() << endl; | ||
| 59 | + delete s; | ||
| 60 | + | ||
| 61 | + s = session->get_host_charset(); | ||
| 62 | + cout << "\tHost charset: " << s->c_str() << endl; | ||
| 63 | + delete s; | ||
| 64 | + | ||
| 65 | + session->connect(false); | ||
| 66 | + delete session; | ||
| 67 | + } | ||
| 68 | + | ||
| 69 | + // Waits | ||
| 70 | + sleep(2); | ||
| 71 | + | ||
| 72 | + // Create another session | ||
| 73 | + { | ||
| 74 | + session *session = session::start("pw3270:a"); | ||
| 75 | + | ||
| 76 | + session->disconnect(); | ||
| 77 | + delete session; | ||
| 78 | + | ||
| 79 | + } | ||
| 61 | 80 | ||
| 62 | - session->connect(false); | ||
| 63 | 81 | ||
| 64 | - delete session; | ||
| 65 | return 0; | 82 | return 0; |
| 66 | } | 83 | } |
| 67 | 84 |