diff options
Diffstat (limited to 'trunk/TAO/examples/Callback_Quoter/Notifier_Input_Handler.cpp')
-rw-r--r-- | trunk/TAO/examples/Callback_Quoter/Notifier_Input_Handler.cpp | 276 |
1 files changed, 276 insertions, 0 deletions
diff --git a/trunk/TAO/examples/Callback_Quoter/Notifier_Input_Handler.cpp b/trunk/TAO/examples/Callback_Quoter/Notifier_Input_Handler.cpp new file mode 100644 index 00000000000..7874c0ef56b --- /dev/null +++ b/trunk/TAO/examples/Callback_Quoter/Notifier_Input_Handler.cpp @@ -0,0 +1,276 @@ +// $Id$ + +// =========================================================== +// +// +// = LIBRARY +// TAO/examples/Callback_Quoter +// +// = FILENAME +// Notifier_Input_Handler.cpp +// +// = DESCRIPTION +// Implementation of the callback quoter Notifier_Input_Handler class. +// +// = AUTHOR +// Kirthika Parameswaran <kirthika@cs.wustl.edu> +// +// =========================================================== + +#include "Notifier_Input_Handler.h" +#include "tao/debug.h" +#include "tao/ORB_Core.h" +#include "ace/Get_Opt.h" +#include "ace/OS_NS_unistd.h" +#include "ace/os_include/os_ctype.h" + +// Constructor. + +Notifier_Input_Handler::Notifier_Input_Handler (void) + : ior_output_file_ (0), + argc_ (0), + argv_ (0), + using_naming_service_ (1) +{ + // no-op. +} + +// Destructor. + +Notifier_Input_Handler::~Notifier_Input_Handler (void) +{ + // Make sure to cleanup the STDIN handler. + + if (ACE_Event_Handler::remove_stdin_handler + (this->notifier_i_.orb_->orb_core ()->reactor (), + this->notifier_i_.orb_->orb_core ()->thr_mgr ()) == -1) + ACE_ERROR ((LM_ERROR, + "%p\n", + "remove_stdin_handler")); + +} + +// The naming service is initialized and the naming context as well as +// the object name is bound to the naming server. + +int +Notifier_Input_Handler::init_naming_service (ACE_ENV_SINGLE_ARG_DECL) +{ + + CORBA::ORB_var orb = this->orb_manager_.orb (); + + if (this->naming_server_.init (orb.in ()) == -1) + return -1; + + // create the name for the naming service + CosNaming::Name notifier_obj_name (1); + notifier_obj_name.length (1); + notifier_obj_name[0].id = CORBA::string_dup ("Notifier"); + + // (re)Bind the object. + ACE_TRY + { + Notifier_var notifier_obj = notifier_i_._this (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + this->orb_manager_.activate_poa_manager (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + + naming_server_->rebind (notifier_obj_name, + notifier_obj.in() + ACE_ENV_ARG_PARAMETER); + ACE_TRY_CHECK; + + } + ACE_CATCH (CosNaming::NamingContext::AlreadyBound, ex) + { + ACE_ERROR_RETURN ((LM_ERROR, + "Unable to bind %s \n", + "Notifier"), + -1); + } + ACE_ENDTRY; + ACE_CHECK_RETURN (-1); + + return 0; +} + +// Parse the command-line arguments and set options. +int +Notifier_Input_Handler::parse_args (void) +{ + ACE_Get_Opt get_opts (this->argc_, this->argv_, "df:s "); + int c; + + while ((c = get_opts ()) != -1) + switch (c) + { + case 'd': // debug flag. + TAO_debug_level++; ///***** + break; + + case 'f': // output the IOR toi a file. + this->ior_output_file_ = ACE_OS::fopen (get_opts.opt_arg (), "w"); + if (this->ior_output_file_ == 0) + ACE_ERROR_RETURN ((LM_ERROR, + "Unable to open %s for writing: %p\n", + get_opts.opt_arg ()), + -1); + break; + + case 's': // don't use the naming service + this->using_naming_service_ = 0; + break; + + case '?': // display help for use of the server. + default: + ACE_ERROR_RETURN ((LM_ERROR, + "usage: %s" + " [-d]" + " [-f] <ior_output_file>" + " [-s]" + "\n", + argv_ [0]), + 1); + } + + // Indicates successful parsing of command line. + return 0; +} + +// Initialize the server. + +int +Notifier_Input_Handler::init (int argc, + char *argv[] + ACE_ENV_ARG_DECL) +{ + + // Call the init of <TAO_ORB_Manager> to initialize the ORB and + // create the child poa under the root POA. + + this->argc_ = argc; + this->argv_ = argv; + + if (this->orb_manager_.init_child_poa (this->argc_, + this->argv_, + "child_poa" + ACE_ENV_ARG_PARAMETER) == -1) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "init_child_poa"), + -1); + ACE_CHECK_RETURN (-1); + + int retval = this->parse_args (); + + if (retval != 0) + return retval; + + // Register our <Input_Handler> to handle STDIN events, which will + // trigger the <handle_input> method to process these events. + + CORBA::ORB_var orb = this->orb_manager_.orb (); + + if (ACE_Event_Handler::register_stdin_handler + (this, + orb->orb_core ()->reactor (), + orb->orb_core ()->thr_mgr ()) == -1) + ACE_ERROR_RETURN ((LM_ERROR, + "%p\n", + "register_stdin_handler"), + -1); + + // Stash our ORB pointer for later reference. + this->notifier_i_.orb (orb.in ()); + + // Activate the servant in the POA. + CORBA::String_var str = + this->orb_manager_.activate_under_child_poa ("Notifier", + &this->notifier_i_ + ACE_ENV_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + ACE_DEBUG ((LM_DEBUG, + "The IOR is: <%s>\n", + str.in ())); + + if (this->ior_output_file_) + { + ACE_OS::fprintf (this->ior_output_file_, + "%s", + str.in ()); + ACE_OS::fclose (this->ior_output_file_); + } + + if (this->using_naming_service_) + { + this->init_naming_service (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + } + return 0; +} + +int +Notifier_Input_Handler::run (ACE_ENV_SINGLE_ARG_DECL) +{ + // Run the main event loop for the ORB. + + + ACE_DEBUG ((LM_DEBUG, + " Type \"q\" to quit \n ")); + + int result = this->orb_manager_.run (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_CHECK_RETURN (-1); + + if (result == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + "Notifier_Input_Handler::run"), + -1); + } + + return 0; +} + +int +Notifier_Input_Handler::handle_input (ACE_HANDLE) +{ + char buf[BUFSIZ]; + + ACE_DECLARE_NEW_CORBA_ENV; + + ACE_TRY + { + // The string could read contains \n\0 hence using ACE_OS::read + // which returns the no of bytes read and hence i can manipulate + // and remove the devil from the picture i.e '\n' ! ;) + + ssize_t strlen = ACE_OS::read (ACE_STDIN, + buf, + sizeof buf); + if (buf[strlen -1] == '\n') + buf[strlen -1] = '\0'; + + ACE_DEBUG ((LM_DEBUG, + "%s", + buf)); + + if (tolower(buf[0]) == 'q') + { + // @@ Please remove this call if it's not used. + // (this->notifier_i_.consumer_map_).close(); + this->notifier_i_.shutdown (ACE_ENV_SINGLE_ARG_PARAMETER); + ACE_TRY_CHECK; + } + } + ACE_CATCHANY + { + ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, "Input_Handler::init"); + return -1; + } + ACE_ENDTRY; + ACE_CHECK_RETURN (-1); + + return 0; +} |