Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members  

eventc.cc

Go to the documentation of this file.
00001 // -*- Mode: C++; -*-
00002 //                            Package   : omniEvents
00003 // eventc.cc                  Created   : 1/4/98
00004 //                            Author    : Paul Nader (pwn)
00005 //
00006 //    Copyright (C) 1998 Paul Nader.
00007 //
00008 //    This file is part of the omniEvents application.
00009 //
00010 //    omniEvents is free software; you can redistribute it and/or
00011 //    modify it under the terms of the GNU Lesser General Public
00012 //    License as published by the Free Software Foundation; either
00013 //    version 2.1 of the License, or (at your option) any later version.
00014 //
00015 //    omniEvents is distributed in the hope that it will be useful,
00016 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00017 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018 //    Lesser General Public License for more details.
00019 //
00020 //    You should have received a copy of the GNU Lesser General Public
00021 //    License along with this library; if not, write to the Free Software
00022 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00023 //
00024 // Description:
00025 //    Client to the event channel factory. Requests creation of an event
00026 //    channel and registers it with the Naming service.
00027 //      
00028 
00029 /*
00030   $Log: eventc.cc,v $
00031   Revision 1.4.2.1  2004/11/01 12:27:12  alextingle
00032   New EventChannel parameter `PullRetryPeriod_ms' supercedes `PullRetryPeriod'.
00033   The new parameter is set by `eventc -R'. The old parameter and its `-r'
00034   option still work as before, for backwards compatibility.
00035 
00036   Revision 1.4  2004/10/08 09:06:19  alextingle
00037   More robust exception minor code handling.
00038 
00039   Revision 1.3  2004/08/06 16:16:40  alextingle
00040   Simplified call to ORB_init().
00041 
00042   Revision 1.2  2004/08/04 21:52:52  alextingle
00043   'n' & 'N' options now take a full name path. No more 'k' or 'K' options.
00044 
00045   Revision 1.1  2004/05/31 10:29:37  alextingle
00046   New 'tools' directory. Contains useful command line tools that previously lived in the 'examples' directory.
00047 
00048   Revision 1.14  2004/05/28 10:38:23  alextingle
00049   Now uses new omniEvents.idl header. Properly this time!
00050 
00051   Revision 1.13  2004/05/28 10:16:54  alextingle
00052   Now uses new omniEvents.idl header.
00053 
00054   Revision 1.12  2004/04/30 17:48:02  alextingle
00055   New 'real time push' feature: -t option.
00056 
00057   Revision 1.11  2004/04/21 10:23:46  alextingle
00058   If there is no Naming Service, eventc only issues a warning unless it is needed to find the factory, or options -n or -k are set.
00059 
00060   Revision 1.10  2004/04/20 16:51:59  alextingle
00061   All examples updated for latest version on omniEvents. Server may now be
00062   specified as a 'corbaloc' string or IOR, instead of as naming service id/kind.
00063 
00064   Revision 1.9  2004/03/28 00:58:05  alextingle
00065   New options. -c sets CyclePeriod_ns. -i sets the Channel's InsName.
00066 
00067   Revision 1.8  2004/03/26 16:06:30  alextingle
00068   Added verbose (-v) option that prints the new channel's IOR to standard out.
00069 
00070   Revision 1.7  2004/02/20 17:41:40  alextingle
00071   Moved 'endl;' to the actual end!!
00072 
00073   Revision 1.6  2004/02/20 14:01:54  alextingle
00074   New param: -p sets MaxNumProxies for omniEvents 2.5+.
00075   No longer sends parameters that are not explicitly set on
00076   the command line. This leaves the server to decide upon
00077   default values.
00078 
00079   Revision 1.5  2004/02/04 22:29:55  alextingle
00080   Reworked all C++ examples.
00081   Removed catch(...) as it tends to make it harder to see what's going on.
00082   Now uses POA instead of BOA.
00083   Uses omniORB4's Exception name probing.
00084   No longer uses 'naming.h/cc' utility code.
00085 
00086   Revision 1.4  2003/12/21 11:12:01  alextingle
00087   Most exceptions are now caught by a unified catch block.
00088 
00089   Revision 1.3  2003/11/03 22:21:21  alextingle
00090   Removed all platform specific switches. Now uses autoconf, config.h.
00091   Removed stub header in order to allow makefile dependency checking to work
00092   correctly.
00093 
00094   Revision 1.1.1.1.2.1  2002/09/28 22:20:51  shamus13
00095   Added ifdefs to enable omniEvents to compile
00096   with both omniORB3 and omniORB4. If __OMNIORB4__
00097   is defined during compilation, omniORB4 headers
00098   and command line option syntax is used, otherwise
00099   fall back to omniORB3 style.
00100 
00101   Revision 1.1.1.1  2002/09/25 19:00:25  shamus13
00102   Import of OmniEvents source tree from release 2.1.1
00103 
00104   Revision 1.6  2000/09/05 01:05:38  naderp
00105   Added MaxQueueLength QOS.
00106 
00107   Revision 1.5  2000/08/30 04:39:20  naderp
00108   Port to omniORB 3.0.1.
00109 
00110   Revision 1.4  2000/03/16 05:34:30  naderp
00111   Added stdlib.h for solaris getopt()
00112 
00113   Revision 1.3  2000/03/16 02:44:13  naderp
00114   Added iostream and signal headers.
00115 
00116   Revision 1.2  2000/03/06 13:23:50  naderp
00117   Using util getRootNamingContext function.
00118   Using stub headers.
00119 
00120   Revision 1.1  1999/11/01 20:37:42  naderp
00121   Updated usage statement.
00122 
00123 Revision 1.0  99/11/01  17:05:13  17:05:13  naderp (Paul Nader)
00124 omniEvents 2.0.
00125 Added -m switch to support MaxEventsPerConsumer criteria.
00126 
00127 Revision 0.6  99/08/27  11:48:22  11:48:22  naderp (Paul Nader)
00128 Partitioned EventChannelFactory_i from CosEvent_i.
00129 
00130 Revision 0.5  99/05/10  11:27:50  11:27:50  naderp (Paul Nader)
00131 Initialised rootContext.
00132 
00133 Revision 0.4  99/04/23  16:02:22  16:02:22  naderp (Paul Nader)
00134 gcc port.
00135 
00136 Revision 0.3  99/04/23  09:32:58  09:32:58  naderp (Paul Nader)
00137 Windows Port.
00138 
00139 Revision 0.2  99/04/21  18:06:23  18:06:23  naderp (Paul Nader)
00140 *** empty log message ***
00141 
00142 Revision 0.1.1.1  98/11/27  17:01:51  17:01:51  naderp (Paul Nader)
00143 Enclosed supports call in try block to avoid core dump.
00144 Added information messages for exceptions.
00145 
00146 Revision 0.1  98/11/25  14:07:22  14:07:22  naderp (Paul Nader)
00147 Initial Revision
00148 
00149 */
00150 
00151 //
00152 //
00153 
00154 #ifdef HAVE_CONFIG_H
00155 #  include "config.h"
00156 #endif
00157 
00158 #ifdef HAVE_GETOPT
00159 #  include <unistd.h>
00160 extern char* optarg;
00161 extern int optind;
00162 #else
00163 #  include "getopt.h"
00164 #endif
00165 
00166 #ifdef HAVE_IOSTREAM
00167 #  include <iostream>
00168 #else
00169 #  include <iostream.h>
00170 #endif
00171 
00172 #ifdef HAVE_STD_IOSTREAM
00173 using namespace std;
00174 #endif
00175 
00176 #ifdef HAVE_STDLIB_H
00177 #  include <stdlib.h>
00178 #endif
00179 
00180 #ifdef HAVE_SIGNAL_H
00181 #  include <signal.h>
00182 #endif
00183 
00184 #include "omniEvents.hh"
00185 #include "naming.h"
00186 
00187 static void usage(int argc, char **argv);
00188 static void appendCriterion(   CosLifeCycle::Criteria&,const char*,const char*);
00189 static void appendCriterionStr(CosLifeCycle::Criteria&,const char*,const char*);
00190 
00191 int
00192 main(int argc, char **argv)
00193 {
00194   int result =1;
00195 
00196   //
00197   // Start orb.
00198   CORBA::ORB_ptr orb = CORBA::ORB_init(argc,argv);
00199 
00200   // Process Options
00201   bool verbose =false;
00202   bool needNameService =false;
00203   const char* channelName ="EventChannel";
00204   const char* factoryName ="EventChannelFactory";
00205   CosLifeCycle::Criteria criteria;
00206 
00207   int c;
00208   while ((c = getopt(argc,argv,"n:N:m:c:i:p:q:R:r:t:vh")) != EOF)
00209   {
00210      switch (c)
00211      {
00212      case 'n':
00213        channelName=optarg;
00214        needNameService=true;       
00215        break;
00216 
00217      case 'N':
00218        factoryName=optarg;
00219        break;
00220 
00221      case 'm': // OLD OPTION
00222        appendCriterion(criteria,"MaxEventsPerConsumer",optarg);
00223        break;
00224 
00225      case 'c':
00226        appendCriterion(criteria,"CyclePeriod_ns",optarg);
00227        break;
00228 
00229      case 'i':
00230        appendCriterionStr(criteria,"InsName",optarg);
00231        break;
00232 
00233      case 'p':
00234        appendCriterion(criteria,"MaxNumProxies",optarg);
00235        break;
00236 
00237      case 'q':
00238        appendCriterion(criteria,"MaxQueueLength",optarg);
00239        break;
00240 
00241      case 'R':
00242        appendCriterion(criteria,"PullRetryPeriod_ms",optarg);
00243        break;
00244 
00245      case 'r': // This option is deprecated in favour of -R:
00246        appendCriterion(criteria,"PullRetryPeriod",optarg);
00247        break;
00248 
00249      case 't':
00250        appendCriterionStr(criteria,"FilterId",optarg);
00251        break;
00252 
00253      case 'v':
00254        verbose=true;
00255        break;
00256 
00257      case 'h':
00258        usage(argc,argv);
00259        exit(0);
00260 
00261      default :
00262        usage(argc,argv);
00263        exit(-1);
00264      }
00265   }
00266   // Need the naming service to find the factory if there is no URI argument.
00267   needNameService=(needNameService || optind>=argc);
00268 
00269   //
00270   // Use one big try...catch block.
00271   // 'action' variable keeps track of what we're doing.
00272   const char* action ="start";
00273   try
00274   {
00275     CORBA::Object_var obj;
00276 
00277     //
00278     // Get Name Service root context.(we can carry on without it though)
00279     CosNaming::NamingContext_var rootContext=CosNaming::NamingContext::_nil();
00280     try {
00281       action="resolve initial reference 'NameService'";
00282       obj=orb->resolve_initial_references("NameService");
00283       rootContext=CosNaming::NamingContext::_narrow(obj);
00284       if(CORBA::is_nil(rootContext))
00285           throw CORBA::OBJECT_NOT_EXIST();
00286     }
00287     catch (CORBA::Exception& ex) {
00288        if(needNameService)
00289            throw;
00290        else
00291            cerr<<"Warning - failed to "<<action<<"."<<endl;
00292     }
00293 
00294     //
00295     // Obtain reference to the Event Channel Factory implementation.
00296     // (from command-line argument or from the Naming Service).
00297     if(optind<argc)
00298     {
00299       action="convert URI from command line into object reference";
00300       obj=orb->string_to_object(argv[optind]);
00301     }
00302     else
00303     {
00304       action="find Event Channel Factory in naming service";
00305       obj=rootContext->resolve(str2name(factoryName));
00306     }
00307 
00308     action="narrow object reference to event channel factory";
00309     omniEvents::EventChannelFactory_var factory =
00310       omniEvents::EventChannelFactory::_narrow(obj);
00311     if(CORBA::is_nil(factory))
00312     {
00313        cerr << "Failed to narrow Event Channel Factory reference." << endl;
00314        exit(1);
00315     }
00316 
00317     // Check that the factory is of the right type
00318     action="check factory supports EventChannel object interface";
00319     CosLifeCycle::Key key;
00320     key.length (1);
00321     key[0].id = CORBA::string_dup("EventChannel");
00322     key[0].kind = CORBA::string_dup("object interface");
00323 
00324     if(!factory->supports(key))
00325     {
00326       cerr << "Factory does not support Event Channel Interface! [\""
00327            << factoryName << "\"]" << endl;
00328       exit(1);
00329     }
00330 
00331     //
00332     // Create Event Channel Object.
00333     action="create EventChannel object";
00334     CORBA::Object_var channelObj =factory->create_object(key, criteria);
00335     if (CORBA::is_nil(channelObj))
00336     {
00337        cerr << "Channel Factory returned nil reference! [\""
00338             << channelName << "\"]" << endl;
00339        exit(1);
00340     }
00341 
00342     // Narrow object returned to an Event Channel
00343     CosEventChannelAdmin::EventChannel_var channel =
00344       CosEventChannelAdmin::EventChannel::_narrow(channelObj);
00345     if (CORBA::is_nil(channel))
00346     {
00347        cerr << "Failed to narrow Event Channel! [\""
00348             << channelName << "\"]" << endl;
00349        exit(1);
00350     }
00351     
00352     // Print the new EventChannel's IOR to standard output.
00353     if(verbose)
00354     {
00355       CORBA::String_var sior =orb->object_to_string(channel);
00356       cout<<sior.in()<<endl;
00357     }
00358 
00359     //
00360     // Register event channel with naming service
00361     if(!CORBA::is_nil(rootContext))
00362     {
00363       CosNaming::Name name =str2name(channelName);
00364       try{
00365         action="register (bind) EventChannel with the naming service";
00366         rootContext->bind(name,channel.in());
00367       }
00368       catch(CosNaming::NamingContext::AlreadyBound& ex) {
00369         action="register (rebind) EventChannel with the naming service";
00370         rootContext->rebind(name,channel.in());
00371       }
00372     }
00373     
00374     //
00375     // If we get here, then everything has worked OK.
00376     result=0;
00377 
00378   }
00379   catch (CosLifeCycle::NoFactory& ex) /* create_object() */ {
00380      cerr<<"Failed to create Event Channel: NoFactory"
00381        " (interface not supported) "<<endl;
00382   }
00383   catch (CosLifeCycle::CannotMeetCriteria& ex) /* create_object() */ {
00384      cerr<<"Failed to create Event Channel: CannotMeetCriteria "<<endl;
00385   }
00386   catch (CosLifeCycle::InvalidCriteria& ex) /* create_object() */ {
00387      cerr<<"Failed to create Event Channel: InvalidCriteria "<<endl;
00388   }
00389   catch (CORBA::COMM_FAILURE& ex) {
00390      cerr<<"System exception, unable to "<<action<<": COMM_FAILURE"<<endl;
00391   }
00392   catch (CORBA::SystemException& ex) {
00393      cerr<<"System exception, unable to "<<action;
00394 #if defined(HAVE_OMNIORB4)
00395      cerr<<" "<<ex._name();
00396      if(ex.NP_minorString())
00397          cerr<<" ("<<ex.NP_minorString()<<")";
00398 #endif
00399      cerr<<endl;
00400   }
00401   catch (CORBA::Exception& ex) {
00402      cerr<<"CORBA exception, unable to "<<action
00403 #ifdef HAVE_OMNIORB4
00404          <<": "<<ex._name()
00405 #endif
00406          << endl;
00407   }
00408   catch (omniORB::fatalException& ex) {
00409      cerr<<"Fatal Exception, unable to "<<action<<endl;
00410   }
00411 
00412   return result;
00413 }
00414 
00415 static void
00416 usage(int argc, char **argv)
00417 {
00418   cerr<<
00419 "\nCreate an EventChannel and register it in the naming service.\n"
00420 "syntax: "<<(argc?argv[0]:"eventc")<<" OPTIONS [FACTORY_URI]\n"
00421 "\n"
00422 "FACTORY_URI: The factory may be specified as a URI.\n"
00423 " This may be an IOR, or a corbaloc::: or corbaname::: URI.\n"
00424 " For example: corbaloc::localhost:11169/omniEvents\n"
00425 "\n"
00426 "OPTIONS:                                         DEFAULT:\n"
00427 " -n channel name                                  [\"EventChannel\"]\n"
00428 " -N factory name (if URI is not specified)        [\"EventChannelFactory\"]\n"
00429 " -c override default CyclePeriod_ns of new channel (nanoseconds)\n"
00430 " -i set the InsName of new channel, to enable access via corbaloc\n"
00431 " -p override default MaxNumProxies of new channel\n"
00432 " -q override default MaxQueueLength of new channel\n"
00433 " -R override default PullRetryPeriod_ms for new channel (milliseconds)\n"
00434 " -t set an event type filter, FilterId=<RepositoryId>\n"
00435 " -v print the IOR of the new EventChannel to standard output.\n"
00436 " -h display this help text\n"
00437 "OLD OPTIONS: (only used by omniEvents v2.4 and earlier)\n"
00438 " -m override default MaxEventsPerConsumer for new channel\n" << endl;
00439 }
00440 
00441 static void appendCriterion(
00442   CosLifeCycle::Criteria& criteria,
00443   const char* name,
00444   const char* value
00445 )
00446 {
00447   CORBA::ULong criteriaLen =criteria.length();
00448   ++criteriaLen;
00449   criteria.length(criteriaLen);
00450   criteria[criteriaLen-1].name=CORBA::string_dup(name);
00451   criteria[criteriaLen-1].value<<=CORBA::ULong(atol(value));
00452 }
00453 
00454 static void appendCriterionStr(
00455   CosLifeCycle::Criteria& criteria,
00456   const char* name,
00457   const char* value
00458 )
00459 {
00460   CORBA::ULong criteriaLen =criteria.length();
00461   ++criteriaLen;
00462   criteria.length(criteriaLen);
00463   criteria[criteriaLen-1].name=CORBA::string_dup(name);
00464   criteria[criteriaLen-1].value<<=value;
00465 }

Generated on Fri Nov 19 17:42:20 2004 for OmniEvents by doxygen1.2.15