Commit e2f2fd02ba00a29bb1c6c9badcdf0cd2ccb656e1

Authored by perry.werneck@gmail.com
1 parent 509cd479

Prevenindo erro ao tentar acesso ao bus quando for criado mais de um objeto de acesso

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