summaryrefslogtreecommitdiff
path: root/TAO/docs/tutorials/Quoter/RTCORBA/Admin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/docs/tutorials/Quoter/RTCORBA/Admin.cpp')
-rw-r--r--TAO/docs/tutorials/Quoter/RTCORBA/Admin.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/TAO/docs/tutorials/Quoter/RTCORBA/Admin.cpp b/TAO/docs/tutorials/Quoter/RTCORBA/Admin.cpp
new file mode 100644
index 00000000000..991719cbddf
--- /dev/null
+++ b/TAO/docs/tutorials/Quoter/RTCORBA/Admin.cpp
@@ -0,0 +1,158 @@
+// $Id$
+
+// ACE header files
+#include "ace/Get_Opt.h"
+#include "ace/OS_NS_stdlib.h"
+#include "orbsvcs/CosNamingC.h"
+// STL strings
+#include <string>
+
+// local header files
+#include "DistributorC.h"
+
+enum Option_Types
+{
+ START,
+ STOP,
+ RATE
+};
+
+// Name of the file that stores the StockDistributor IOR.
+static std::string ior = "file://StockDistributor.ior";
+
+// Name of the StockDistributor registered with the Naming Service.
+static std::string distributor_name = "StockDistributor";
+
+// The default command, which starts the StockDistributor.
+static Option_Types option = START;
+
+// The default rate, which sends data out once per second.
+static std::string rate = "1";
+
+// A flag that indicates use of the Naming Service.
+static bool use_naming = false;
+
+// Parse the command-line arguments and set the global options.
+
+static int
+parse_args (int argc, char *argv[])
+{
+ ACE_Get_Opt get_opts (argc, argv, "o:r:bsc");
+ int c;
+
+ while ((c = get_opts ()) != -1)
+ {
+ switch (c)
+ {
+ case 'o':
+ ior = get_opts.opt_arg ();
+ break;
+ case 'r':
+ option = RATE;
+ rate = get_opts.opt_arg ();
+ break;
+ case 'b':
+ option = START;
+ break;
+ case 's':
+ option = STOP;
+ break;
+ case 'c':
+ use_naming = get_opts.opt_arg ();
+ break;
+
+ case '?':
+ default:
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "usage: %s\n"
+ "-o <Distributor IOR> (the ior file of stock distributor (default is file://StockDistributor.ior)) \n"
+ "-r <rate> (set the distribution rate to 'n' seconds (default is 1)) \n"
+ "-b (start the stock distributor) \n"
+ "-s (stop the stock distributor) \n"
+ "\n",
+ argv [0]),
+ -1);
+ }
+ }
+
+ return 0;
+}
+
+static CORBA::Object_ptr
+get_distributor_reference (CORBA::ORB_ptr orb)
+{
+ if (use_naming)
+ {
+ CORBA::Object_var tmp =
+ orb->resolve_initial_references ("NameService");
+
+ CosNaming::NamingContext_var pns =
+ CosNaming::NamingContext::_narrow (tmp.in ());
+
+ CosNaming::Name name (1);
+ name.length (1);
+ name[0].id = distributor_name.c_str ();
+
+ return pns->resolve (name);
+ }
+ else
+ // Read and destringify the Stock_Distributor object's IOR.
+ return orb->string_to_object (ior.c_str ());
+}
+
+int
+main (int argc, char *argv[])
+{
+ try
+ {
+ // Initialiaze the ORB.
+ CORBA::ORB_var orb = CORBA::ORB_init (argc, argv);
+
+ // This call MUST come after ORB_init(), which may need to
+ // extract -ORB options first.
+ if (parse_args (argc, argv) != 0)
+ return 1;
+
+ CORBA::Object_var obj = get_distributor_reference (orb);
+
+ // Narrow the IOR to a Stock_Distributor object reference.
+ Stock::StockDistributor_var stock_distributor =
+ Stock::StockDistributor::_narrow(obj);
+
+ if (CORBA::is_nil (stock_distributor.in ()))
+ ACE_ERROR_RETURN ((LM_DEBUG,
+ "Nil StockDistributor object reference <%s>\n",
+ ior.c_str ()),
+ 1);
+
+ if (option == STOP)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Stop the stock distributor.\n"));
+ stock_distributor->stop ();
+ }
+ else if (option == RATE)
+ {
+ CORBA::Long notify_rate = ACE_OS::atoi (rate.c_str ());
+ ACE_DEBUG ((LM_DEBUG,
+ "Set the distribution notification rate to %d seconds.\n",
+ notify_rate));
+ stock_distributor->notification_rate (notify_rate);
+ }
+ else // option == START
+ {
+ ACE_DEBUG ((LM_DEBUG, "Start the stock distributor.\n"));
+ stock_distributor->start ();
+ }
+
+ // Since we are a "pure client" we don't need to run the ORB's event loop!
+ // Cleanup the ORB.
+ orb->destroy ();
+ }
+ catch (CORBA::Exception &ex)
+ {
+ ex._tao_print_exception ("Exception caught:");
+ return 1;
+ }
+
+ return 0;
+}