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 36 #include <malloc.h>
37 37 #include <sys/types.h>
38 38 #include <unistd.h>
  39 + #include <limits.h>
39 40  
40 41 #ifndef DBUS_TIMEOUT_INFINITE
41 42 #define DBUS_TIMEOUT_INFINITE ((int) 0x7fffffff)
... ... @@ -179,6 +180,7 @@
179 180 char * dest;
180 181 char * path;
181 182 char * intf;
  183 + int sequence;
182 184  
183 185 DBusMessage * create_message(const char *method)
184 186 {
... ... @@ -358,6 +360,45 @@
358 360  
359 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 402 remote(const char *session)
362 403 {
363 404 #if defined(WIN32)
... ... @@ -480,15 +521,16 @@
480 521  
481 522 #elif defined(HAVE_DBUS)
482 523  
  524 + static int sq = 0;
483 525 DBusError err;
484 526 int rc;
485 527 char * str = strdup(session);
486 528 char * ptr;
487 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 535 for(ptr=str;*ptr;ptr++)
494 536 *ptr = tolower(*ptr);
... ... @@ -569,19 +611,9 @@
569 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 618 if (dbus_error_is_set(&err))
587 619 {
... ... @@ -632,10 +664,25 @@
632 664  
633 665 }
634 666  
  667 + char busname[4096];
  668 + makeBusName(busname,4096);
  669 +
635 670 free(dest);
636 671 free(path);
637 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 686 #else
640 687  
641 688 #endif
... ...
src/classlib/testprogram.cc
... ... @@ -28,6 +28,7 @@
28 28 */
29 29  
30 30 #include <pw3270/class.h>
  31 + #include <unistd.h>
31 32 #include <iostream>
32 33  
33 34 using namespace std;
... ... @@ -37,31 +38,47 @@
37 38  
38 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 82 return 0;
66 83 }
67 84  
... ...