diff options
Diffstat (limited to 'ace/NT_Service.cpp')
-rw-r--r-- | ace/NT_Service.cpp | 148 |
1 files changed, 0 insertions, 148 deletions
diff --git a/ace/NT_Service.cpp b/ace/NT_Service.cpp deleted file mode 100644 index 9229ed2e219..00000000000 --- a/ace/NT_Service.cpp +++ /dev/null @@ -1,148 +0,0 @@ -// $Id$ - -// NT_Service.cpp - -#include "ace/inc_user_config.h" -#if defined (ACE_HAS_WINNT4) && ACE_HAS_WINNT4 != 0 - -#define ACE_BUILD_DLL -#include "ace/NT_Service.h" -#include "ace/Service_Object.h" - -#if !defined (__ACE_INLINE__) -#include "ace/NT_Service.i" -#endif /* __ACE_INLINE__ */ - -ACE_ALLOC_HOOK_DEFINE(ACE_NT_Service) - -// This default implementation of ACE_NT_Service::open sets the service's -// status to START_PENDING with the estimated time until STARTED set to the -// value given when this object was constructed. Then the svc function is -// called, which implements the guts of the service. Note that this function -// is running in a thread created by the OS, not by ACE_Thread_Manager. -// The thread manager does not know anything about this thread. The service -// can, however, use ACE_Thread_Manager to start more threads if desired. -// When the svc function returns, the service status is set to STOPPED, and -// exit codes set based on errno/GetLastError if the svc function returns -1. -// -// The svc function is expected to set the service status to SERVICE_RUNNING -// after it initializes. -// -// The handle_control function will be called for each time there is a request -// for the service. It is up to that function and svc to cooperate to both -// respond appropriately to the request (by at least updating the service's -// status) and to fulfill the request. - -int -ACE_NT_Service::open (void *args) -{ - -int svc_return; - - report_status(SERVICE_START_PENDING, 0); - - if ((svc_return = this->svc()) == 0) { - this->svc_status_.dwWin32ExitCode = NO_ERROR; - this->svc_status_.dwServiceSpecificExitCode = 0; - } - else { - if (errno == 0) { - this->svc_status_.dwWin32ExitCode = GetLastError(); - } - else { - this->svc_status_.dwWin32ExitCode = ERROR_SERVICE_SPECIFIC_ERROR; - this->svc_status_.dwServiceSpecificExitCode = errno; - } - } - - report_status(SERVICE_STOPPED, 0); - - return svc_return; - -} - -void -ACE_NT_Service::handle_control (DWORD control_code) -{ - - switch(control_code) { - case SERVICE_CONTROL_SHUTDOWN: - case SERVICE_CONTROL_STOP: - report_status(SERVICE_STOP_PENDING); - /* how to cancel? */ - break; - - case SERVICE_CONTROL_PAUSE: - report_status(SERVICE_PAUSE_PENDING); - this->suspend(); - report_status(SERVICE_PAUSED); - break; - - case SERVICE_CONTROL_CONTINUE: - report_status(SERVICE_CONTINUE_PENDING); - this->resume(); - report_status(SERVICE_RUNNING); - break; - - case SERVICE_CONTROL_INTERROGATE: - report_status(0); - break; - } - - return; - -} - - - -// report_status -// -// Reports the current status. If new_status is not 0, it sets the -// status to the new value before reporting. NOTE - this assumes that -// no actual service status values have the value 0. This is true in -// WinNT 4. -// If the status is a 'pending' type, the supplied time hint is used -// unless it's 0, in which case the existing hint is used. The dwWaitHint -// is not updated by this function. The checkpoint is incremented -// by one after a pending report. -// -int -ACE_NT_Service::report_status (DWORD new_status, DWORD time_hint) -{ - -int bump_checkpoint = 0, - retval = 0; -DWORD save_controls = 0; - - - if (new_status != 0) - this->svc_status_.dwCurrentState = new_status; - switch(this->svc_status_.dwCurrentState) { - case SERVICE_START_PENDING: - save_controls = this->svc_status_.dwControlsAccepted; - this->svc_status_.dwControlsAccepted = 0; - /* Fall through */ - case SERVICE_STOP_PENDING: - case SERVICE_CONTINUE_PENDING: - case SERVICE_PAUSE_PENDING: - this->svc_status_.dwWaitHint = time_hint ? time_hint : this->start_time_; - bump_checkpoint = 1; - break; - - default: - this->svc_status_.dwCheckPoint = 0; - } - - retval = SetServiceStatus(this->svc_handle_, &this->svc_status_) ? 0 : -1; - - if (save_controls != 0) - this->svc_status_.dwControlsAccepted = save_controls; - - if (bump_checkpoint) - ++this->svc_status_.dwCheckPoint; - - return retval; - -} - -#endif /* ACE_HAS_WINNT4 */ |