//----------------------------------------------------------
// Win32 Service Class
// Written by Christopher Kohlhoff
//
// Declaration of the TService class, a class that
// encapsulates much of the code needed for writing Win32
// services.
//----------------------------------------------------------
#ifndef service_h
#define service_h
#include <classlib/thread.h>
//
// class TService
// ~~~~~ ~~~~~~~~
// TService is an abstract base class used for implementing
// Win32 services.
//
class TService {
public:
// Construction / destruction.
//
TService();
virtual ~TService();
// Start running as a service.
//
bool Start();
// Start running on the console (for debugging).
//
bool Start(int argc, char* argv[]);
// Add/remove the service to/from the system.
//
virtual bool Register();
virtual bool Unregister();
protected:
// Override this function to modify the args to CreateService.
//
virtual bool CreateService(SC_HANDLE scm);
// Override these to provide the name of the service.
//
virtual const char* GetName() const = 0;
virtual const char* GetDisplayName() const = 0;
// Override this to perform initialisation when service is started.
//
virtual bool Init();
// This function must be overridden to do the service's work.
//
virtual void Run() = 0;
// Override this to perform any cleanup after the service has stopped.
//
virtual void Cleanup();
// Override these to be told when the service is being paused or continued.
//
virtual void PauseBegin();
virtual void PauseEnd();
// Informs the Service Control Manager of how we are.
//
void SetStatus(uint32 status, uint32 error = 0);
// Checks if we have been asked to pause or stop.
//
bool CheckStop();
// Indicates if we want to stop (return true next time CheckStop is called.
//
void SetStop(bool stop);
// Event logging types
//
enum TLogType {
Error = EVENTLOG_ERROR_TYPE,
Warning = EVENTLOG_WARNING_TYPE,
Info = EVENTLOG_INFORMATION_TYPE
};
// Writes an entry to the system's event log.
//
void Log(const char* str, TLogType type = Error);
// Callback functions for windows.
//
virtual void ServiceMain(uint32 argc, char* argv[]);
virtual void ControlHandler(uint32 control);
// Command-line arguments passed to the service.
//
int ArgC;
char** ArgV;
private:
// Implementation data members.
//
TEventSemaphore PauseEvent;
volatile bool StopFlag;
SERVICE_STATUS_HANDLE HStatus;
uint32 StatusCode;
uint32 ErrorCode;
HANDLE HEventLog;
// Disallow assignment and copying.
//
TService(const TService&);
const TService& operator=(const TService&);
// Callback functions for Windows.
//
friend void WINAPI ServiceMain(uint32 argc, char* argv[]);
friend void WINAPI ControlHandler(uint32 control);
};
#endif