Activator_NT_Service.cpp

Go to the documentation of this file.
00001 //=============================================================================
00002 /**
00003  *  @file   Activator_NT_Service.cpp
00004  *
00005  *  $Id: Activator_NT_Service.cpp 77504 2007-03-02 21:06:18Z shuston $
00006  *
00007  *  @author Darrell Brunsch <brunsch@cs.wustl.edu>
00008  *  @author Jeff Parsons <parsons@cs.wustl.edu>
00009  *  @author John Tucker <jtucker@infoglide.com>
00010  *  @author Mike Vitalo <mvitalo@infoglide.com>
00011  */
00012 //=============================================================================
00013 
00014 #include "Activator_NT_Service.h"
00015 
00016 #if defined (ACE_WIN32) && !defined (ACE_LACKS_WIN32_SERVICES)
00017 
00018 #include "ImR_Activator_i.h"
00019 #include "Activator_Options.h"
00020 
00021 #include "tao/ORB_Core.h"
00022 
00023 #include "ace/Reactor.h"
00024 /**
00025  * Handles the SERVICE_CONTROL_SHUTDOWN and SERVICE_CONTROL_STOP commands
00026  * by shutting down the ORB.  Otherwise ACE_NT_Service::handle_control
00027  * handles the command.
00028  */
00029 void
00030 Activator_NT_Service::handle_control (DWORD control_code)
00031 {
00032   if (control_code == SERVICE_CONTROL_SHUTDOWN
00033       || control_code == SERVICE_CONTROL_STOP)
00034     {
00035       report_status (SERVICE_STOP_PENDING);
00036       TAO_ORB_Core_instance ()->reactor ()->end_reactor_event_loop ();
00037       TAO_ORB_Core_instance ()->orb ()->shutdown (1);
00038     }
00039   else
00040     {
00041       ACE_NT_Service::handle_control (control_code);
00042     }
00043 }
00044 
00045 
00046 /**
00047  */
00048 int
00049 Activator_NT_Service::handle_exception (ACE_HANDLE)
00050 {
00051   return 0;
00052 }
00053 
00054 
00055 /**
00056  * We do almost the same thing as we do in run_standalone () except that
00057  * we update the report_status after init.
00058  */
00059 int
00060 Activator_NT_Service::svc (void)
00061 {
00062   ImR_Activator_i server;
00063   Activator_Options opts;
00064 
00065   if (opts.init_from_registry() != 0)
00066     {
00067       report_status (SERVICE_STOPPED);
00068       return -1;
00069     }
00070 
00071   try
00072     {
00073       int status = server.init (opts);
00074 
00075       if (status == -1)
00076         {
00077           report_status (SERVICE_STOPPED);
00078           return -1;
00079         }
00080       else
00081         {
00082           report_status (SERVICE_RUNNING);
00083           server.run ();
00084 
00085           status = server.fini ();
00086 
00087           report_status (SERVICE_STOPPED);
00088 
00089         }
00090         if (status != -1)
00091             return 0;
00092     }
00093   catch (const CORBA::SystemException& sysex)
00094     {
00095       sysex._tao_print_exception (IMR_ACTIVATOR_DISPLAY_NAME);
00096     }
00097   catch (const CORBA::UserException& userex)
00098     {
00099       userex._tao_print_exception (IMR_ACTIVATOR_DISPLAY_NAME);
00100     }
00101   catch (const CORBA::Exception& ex)
00102     {
00103       ex._tao_print_exception (IMR_ACTIVATOR_DISPLAY_NAME);
00104     }
00105 
00106   report_status (SERVICE_STOPPED);
00107   return -1;
00108 }
00109 
00110 #endif /* ACE_WIN32 && !ACE_LACKS_WIN32_SERVICES */

Generated on Sun Jan 27 15:54:50 2008 for TAO_Implementation_Repository by doxygen 1.3.6