00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 #ifdef HAVE_CONFIG_H
00099 # include "config.h"
00100 #endif
00101
00102 #ifdef HAVE_GETOPT
00103 # include <unistd.h>
00104 extern char* optarg;
00105 extern int optind;
00106 #else
00107 # include "getopt.h"
00108 #endif
00109
00110 #ifdef HAVE_IOSTREAM
00111 # include <iostream>
00112 #else
00113 # include <iostream.h>
00114 #endif
00115
00116 #ifdef HAVE_STD_IOSTREAM
00117 using namespace std;
00118 #endif
00119
00120 #ifdef HAVE_STDLIB_H
00121 # include <stdlib.h>
00122 #endif
00123
00124 #ifdef HAVE_SIGNAL_H
00125 # include <signal.h>
00126 #endif
00127
00128 #include "naming.h"
00129
00130 #include "CosEventComm.hh"
00131 #include "CosEventChannelAdmin.hh"
00132
00133 static void usage();
00134
00135 class Supplier_i : virtual public CosEventComm::_sk_PushSupplier {
00136 public:
00137 Supplier_i () {};
00138 void disconnect_push_supplier ();
00139 };
00140
00141 void
00142 Supplier_i::disconnect_push_supplier () {
00143 cout << "EventSupplier: disconnected." << endl;
00144 }
00145
00146 int main (int argc, char** argv)
00147 {
00148 long l = 0;
00149 #if defined(HAVE_OMNIORB4)
00150 CORBA::ORB_ptr orb = CORBA::ORB_init(argc,argv,"omniORB4");
00151 CORBA::BOA_ptr boa = orb->BOA_init(argc,argv,"omniORB4_BOA");
00152 #else
00153 CORBA::ORB_var orb = CORBA::ORB_init (argc, argv, "omniORB3");
00154 CORBA::BOA_var boa = orb->BOA_init (argc, argv, "omniORB3_BOA");
00155 #endif
00156
00157
00158 int c;
00159 int discnum = 0;
00160 bool refnil = false;
00161 int sleepInterval = 0;
00162 char *channelName = (char *) "EventChannel";
00163 char *channelKind = (char *) "EventChannel";
00164 while ((c = getopt(argc,argv,"d:rs:n:k:h")) != EOF)
00165 {
00166 switch (c)
00167 {
00168 case 'd': discnum = atoi(optarg);
00169 break;
00170
00171 case 'r': refnil = true;
00172 break;
00173
00174 case 's': sleepInterval = atoi(optarg);
00175 break;
00176
00177 case 'n': channelName = optarg;
00178 break;
00179
00180 case 'k': channelKind = optarg;
00181 break;
00182
00183 case 'h':
00184 default : usage();
00185 exit(-1);
00186 break;
00187 }
00188 }
00189
00190 #ifdef HAVE_SIGNAL_H
00191
00192 signal(SIGPIPE, SIG_IGN);
00193 #endif
00194
00195 Supplier_i* supplier = new Supplier_i ();
00196 supplier->_obj_is_ready(boa);
00197
00198
00199
00200
00201
00202 if (! refnil)
00203 {
00204 boa->impl_is_ready(0,1);
00205 }
00206
00207 CosNaming::NamingContext_var rootContext;
00208 rootContext = getRootNamingContext(orb);
00209
00210
00211 CosNaming::Name name;
00212 name.length (1);
00213 name[0].id = CORBA::string_dup (channelName);
00214 name[0].kind = CORBA::string_dup (channelKind);
00215
00216 cout << "Looking for EventChannel" << endl;
00217 CosEventChannelAdmin::EventChannel_var event_channel;
00218 try {
00219 CORBA::Object_var obj = rootContext->resolve (name);
00220 event_channel = CosEventChannelAdmin::EventChannel::_narrow (obj);
00221 if (CORBA::is_nil (event_channel))
00222 {
00223 cerr << "Failed to narrow Event Channel !" << endl;
00224 exit(1);
00225 }
00226 }
00227 catch (CORBA::ORB::InvalidName& ex) {
00228 cerr << "Service required is invalid [does not exist]. !" << endl;
00229 exit(1);
00230 }
00231 catch (CORBA::COMM_FAILURE& ex) {
00232 cerr << "Caught COMM_FAILURE exception. "
00233 << "Unable to contact the naming service !"
00234 << endl;
00235 exit(1);
00236 }
00237 catch (omniORB::fatalException& ex) {
00238 cerr << "Caught Fatal Exception !" << endl;
00239 throw;
00240 }
00241 catch (...) {
00242 cerr << "Cannot find event channel ! [\""
00243 << channelName << "\", \"" << channelKind << "\"]"
00244 << endl;
00245 exit(1);
00246 }
00247
00248
00249
00250 CosEventChannelAdmin::SupplierAdmin_var supplier_admin;
00251 while (1)
00252 {
00253 try {
00254 supplier_admin = event_channel->for_suppliers ();
00255 if (CORBA::is_nil(supplier_admin))
00256 {
00257 cerr << "Event Channel returned nil Supplier Admin !."
00258 << endl;
00259 exit(1);
00260 }
00261 break;
00262 }
00263 catch (CORBA::COMM_FAILURE& ex) {
00264 cerr << "Caught COMM_FAILURE Exception "
00265 << "obtaining Supplier Admin !. Retrying..."
00266 << endl;
00267 continue;
00268 }
00269 catch (...) {
00270 cerr << "Unexpected System Exeption. "
00271 << "Failed to obtain Supplier Admin !"
00272 << endl;
00273 exit(1);
00274 }
00275 }
00276 cerr << "Obtained SupplierAdmin." << endl;
00277
00278 while (1)
00279 {
00280
00281
00282 CosEventChannelAdmin::ProxyPushConsumer_var proxy_consumer;
00283 while (1)
00284 {
00285 try {
00286 proxy_consumer = supplier_admin->obtain_push_consumer ();
00287 if (CORBA::is_nil(proxy_consumer))
00288 {
00289 cerr << "Supplier Admin return nil proxy_consumer !."
00290 << endl;
00291 exit(1);
00292 }
00293 break;
00294 }
00295 catch (CORBA::COMM_FAILURE& ex) {
00296 cerr << "Caught COMM_FAILURE Exception "
00297 << "obtaining Push Consumer !. Retrying..."
00298 << endl;
00299 continue;
00300 }
00301 catch (...) {
00302 cerr << "Unexpected System Exeption. "
00303 << "Failed to obtain Proxy Consumer !"
00304 << endl;
00305 exit(1);
00306 }
00307 }
00308 cerr << "Obtained ProxyPushConsumer." << endl;
00309
00310
00311
00312 CosEventComm::PushSupplier_ptr sptr;
00313 sptr = supplier->_this();
00314 sptr = (! refnil) ? CosEventComm::PushSupplier::_duplicate(sptr)
00315 : CosEventComm::PushSupplier::_nil();
00316 while (1)
00317 {
00318 try {
00319 proxy_consumer->connect_push_supplier(sptr);
00320 break;
00321 }
00322 catch (CORBA::BAD_PARAM& ex) {
00323 cerr << "Caught BAD_PARAM Exception connecting Push Supplier !"
00324 << endl;
00325 exit (1);
00326 }
00327 catch (CosEventChannelAdmin::AlreadyConnected& ex) {
00328 cerr << "Pull Supplier already connected !"
00329 << endl;
00330 break;
00331 }
00332 catch (CORBA::COMM_FAILURE& ex) {
00333 cerr << "Caught COMM_FAILURE Exception "
00334 << "connecting Push Supplier !. Retrying..."
00335 << endl;
00336 continue;
00337 }
00338 catch (...) {
00339 cerr << "Unexpected System Exception. "
00340 << "Failed to connect Push Supplier !"
00341 << endl;
00342 exit (1);
00343 }
00344 }
00345 cerr << "Connected Push Supplier." << endl;
00346
00347
00348 for (int i=0; (discnum == 0) || (i < discnum); i++)
00349 {
00350 CORBA::Any any;
00351 any <<= (CORBA::ULong) l++;
00352 try {
00353 cout << "Push Supplier: push() called. ";
00354 proxy_consumer->push(any);
00355 cout << "Data : " << l-1 << endl;
00356 }
00357 catch (...) {
00358 cout << "Failed !" << endl;
00359 }
00360 }
00361
00362
00363 while (1)
00364 {
00365 try {
00366 proxy_consumer->disconnect_push_consumer();
00367 break;
00368 }
00369 catch (CORBA::COMM_FAILURE& ex) {
00370 cerr << "Caught COMM_FAILURE Exception "
00371 << "disconnecting Push Supplier!. Retrying..."
00372 << endl;
00373 continue;
00374 }
00375 catch (...) {
00376 cerr << "Unexpected System Exception. "
00377 << "Failed to disconnect Push Supplier!"
00378 << endl;
00379 exit(1);
00380 }
00381 }
00382 cerr << "ProxyPushConsumer disconnected." << endl;
00383
00384
00385 cerr << "Sleeping " << sleepInterval << " Seconds." << endl;
00386 omni_thread::sleep(sleepInterval);
00387 }
00388
00389
00390 return 0;
00391 }
00392
00393 static void
00394 usage()
00395 {
00396 cerr << "\nusage: pushsupp [-d n [-s n]] [-n name] [-k kind] [-h]\n" << endl;
00397 cerr << " -d n disconnect after n pushes" << endl;
00398 cerr << " -r connect using nil reference" << endl;
00399 cerr << " -s n sleep n seconds after disconnecting" << endl;
00400 cerr << " -n name specify channel name [\"EventChannel\"]" << endl;
00401 cerr << " -k kind specify channel kind [\"EventChannel\"]" << endl;
00402 cerr << " -h display usage" << endl;
00403 cerr << endl;
00404 }