1 #include <echo_callback.hh>
2 
3 #ifdef HAVE_STD
4 #  include <iostream>
5    using namespace std;
6 #else
7 #  include <iostream.h>
8 #endif
9 #include <stdlib.h>
10 
11 
12 // Implementation of cb::CallBack.
13 
14 class cb_i : public virtual POA_cb::CallBack
15 {
16 public:
cb_i()17   inline cb_i() {}
~cb_i()18   virtual ~cb_i() {}
19 
call_back(const char * mesg)20   virtual void call_back(const char* mesg) {
21     cout << "cb_client: call_back(\"" << mesg << "\")" << endl;
22   }
23 };
24 
25 //////////////////////////////////////////////////////////////////////
26 
do_single(cb::Server_ptr server,cb::CallBack_ptr cb)27 static void do_single(cb::Server_ptr server, cb::CallBack_ptr cb)
28 {
29   if (CORBA::is_nil(server)) {
30     cerr << "cb_client: The server reference is nil!" << endl;
31     return;
32   }
33 
34   cout << "cb_client: server->one_time(call_back, \"Hello!\")" << endl;
35   server->one_time(cb, "Hello!");
36   cout << "cb_client: Returned." << endl;
37 }
38 
39 
do_register(cb::Server_ptr server,cb::CallBack_ptr cb,int period,int time_to_shutdown)40 static void do_register(cb::Server_ptr server, cb::CallBack_ptr cb,
41 			int period, int time_to_shutdown)
42 {
43   if (CORBA::is_nil(server)) {
44     cerr << "cb_client: The server reference is nil!" << endl;
45     return;
46   }
47 
48   cout << "cb_client: server->register(call_back, \"Hello!\", "
49        << period << ")" << endl;
50   server->_cxx_register(cb, "Hello!", period);
51   cout << "cb_client: Returned." << endl;
52 
53   omni_thread::sleep(time_to_shutdown);
54   cout << "cb_client: Finished." << endl;
55 }
56 
57 //////////////////////////////////////////////////////////////////////
58 
main(int argc,char ** argv)59 int main(int argc, char** argv)
60 {
61   try {
62     CORBA::ORB_var orb = CORBA::ORB_init(argc, argv);
63 
64     if (argc != 2 && argc != 4) {
65       cerr << "usage:  cb_client <object reference> [<call-back period>"
66 	" <time to shutdown>]" << endl;
67       return 1;
68     }
69 
70     {
71       // Get the reference the server.
72       CORBA::Object_var obj = orb->string_to_object(argv[1]);
73       cb::Server_var server = cb::Server::_narrow(obj);
74 
75       // Initialise the POA.
76       obj = orb->resolve_initial_references("RootPOA");
77       PortableServer::POA_var poa = PortableServer::POA::_narrow(obj);
78       PortableServer::POAManager_var pman = poa->the_POAManager();
79       pman->activate();
80 
81       // Register a CallBack object in this process.
82       cb_i* mycallback = new cb_i();
83       cb::CallBack_var callback = mycallback->_this();  // *implicit activation*
84       mycallback->_remove_ref();
85 
86       if (argc == 2)
87         do_single(server, callback);
88       else
89         do_register(server, callback, atoi(argv[2]),
90                     atoi(argv[3]));
91 
92     }
93     // Clean-up.  This also destroys the call-back object.
94     orb->destroy();
95   }
96   catch (CORBA::TRANSIENT&) {
97     cerr << "Caught system exception TRANSIENT -- unable to contact the "
98          << "server." << endl;
99   }
100   catch (CORBA::SystemException& ex) {
101     cerr << "Caught a CORBA::" << ex._name() << endl;
102   }
103   catch (CORBA::Exception& ex) {
104     cerr << "Caught CORBA::Exception: " << ex._name() << endl;
105   }
106   return 0;
107 }
108