Locator_NT_Service.cpp

Go to the documentation of this file.
00001 //=============================================================================
00002 /**
00003  *  @file   Locator_NT_Service.cpp
00004  *
00005  *  Locator_NT_Service.cpp,v 1.5 2006/01/04 16:10:11 giovannd Exp
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 "Locator_NT_Service.h"
00015 
00016 #if defined (ACE_WIN32)
00017 
00018 #include "ImR_Locator_i.h"
00019 #include "Locator_Options.h"
00020 
00021 #include "tao/ORB_Core.h"
00022 #include "tao/corba.h"
00023 #include "ace/Reactor.h"
00024 
00025 /**
00026  * Handles the SERVICE_CONTROL_SHUTDOWN and SERVICE_CONTROL_STOP commands
00027  * by shutting down the ORB.  Otherwise ACE_NT_Service::handle_control
00028  * handles the command.
00029  */
00030 void
00031 Locator_NT_Service::handle_control (DWORD control_code)
00032 {
00033   if (control_code == SERVICE_CONTROL_SHUTDOWN
00034       || control_code == SERVICE_CONTROL_STOP)
00035     {
00036       report_status (SERVICE_STOP_PENDING);
00037       TAO_ORB_Core_instance ()->reactor ()->end_reactor_event_loop ();
00038       TAO_ORB_Core_instance ()->orb ()->shutdown (1);
00039     }
00040   else
00041     {
00042       ACE_NT_Service::handle_control (control_code);
00043     }
00044 }
00045 
00046 
00047 /**
00048  */
00049 int
00050 Locator_NT_Service::handle_exception (ACE_HANDLE)
00051 {
00052   return 0;
00053 }
00054 
00055 
00056 /**
00057  * We do almost the same thing as we do in run_standalone ()
00058  */
00059 int
00060 Locator_NT_Service::svc (void)
00061 {
00062   ImR_Locator_i server;
00063   Options opts;
00064 
00065   if (opts.init_from_registry () != 0)
00066     {
00067       report_status (SERVICE_STOPPED);
00068       return -1;
00069     }
00070 
00071   ACE_DECLARE_NEW_CORBA_ENV;
00072   ACE_TRY
00073     {
00074       int status = server.init (opts ACE_ENV_ARG_PARAMETER);
00075       ACE_TRY_CHECK;
00076 
00077       if (status == -1)
00078         {
00079           report_status (SERVICE_STOPPED);
00080           return -1;
00081         }
00082       else
00083         {
00084           report_status (SERVICE_RUNNING);
00085           server.run (ACE_ENV_SINGLE_ARG_PARAMETER);
00086           ACE_TRY_CHECK;
00087 
00088           status = server.fini (ACE_ENV_SINGLE_ARG_PARAMETER);
00089           ACE_TRY_CHECK;
00090 
00091           report_status (SERVICE_STOPPED);
00092 
00093         }
00094         if (status != -1)
00095             return 0;
00096     }
00097   ACE_CATCH (CORBA::SystemException, sysex)
00098     {
00099       ACE_PRINT_EXCEPTION (sysex, IMR_LOCATOR_DISPLAY_NAME);
00100     }
00101   ACE_CATCH (CORBA::UserException, userex)
00102     {
00103       ACE_PRINT_EXCEPTION (userex, IMR_LOCATOR_DISPLAY_NAME);
00104     }
00105   ACE_CATCHANY
00106     {
00107       ACE_PRINT_EXCEPTION (ACE_ANY_EXCEPTION, IMR_LOCATOR_DISPLAY_NAME);
00108     }
00109   ACE_ENDTRY;
00110 
00111   report_status (SERVICE_STOPPED);
00112 
00113   return -1;
00114 }
00115 
00116 #endif /* ACE_WIN32 */

Generated on Thu Nov 9 13:36:20 2006 for TAO_Implementation_Repository by doxygen 1.3.6