#ifndef _SERVICE_GENERICSERVICE_HPP_ #define _SERVICE_GENERICSERVICE_HPP_ #ifndef _COMMON_STRING_HPP_ #include #endif #ifndef _COMMON_WINSVC_HPP_ #include #endif #ifndef _SERVICE_SERVICEHOOK_HPP_ #include #endif #ifndef _SERVICE_SERVICESTATUS_HPP_ #include #endif #ifndef _SERVICE_EVENTLOG_HPP_ #include #endif class GenericService : private ServiceHook { public: enum State{Paused,Running,Stopped}; GenericService(void); virtual ~GenericService(); bool setServiceStatus(const ServiceStatus &serviceStatus); bool startService(const String &strServiceName); bool isOkay(void)const; bool isPaused(void)const; bool isRunning(void)const; bool isStopped(void)const; State state(void)const; bool reportEvent(const String &strMessage,EventLog::EventType eventType,DWORD eventID=0,DWORD category=0,PSID userSID=0); protected: virtual void serviceMain(DWORD dwArgc,LPTSTR *lpszArg); virtual void ctrlStop(void); virtual void ctrlPause(void); virtual void ctrlContinue(void); virtual void ctrlInterrogate(void); virtual void ctrlShutdown(void); private: enum{WaitHint=5000}; GenericService(const GenericService &someGenericService); GenericService &operator=(const GenericService &someGenericService); virtual void svcMain(DWORD dwArg,LPTSTR *lpszArg); virtual void svcHandler(DWORD dwControl); void state(State state); SERVICE_STATUS_HANDLE mhServiceHandle; String mServiceName; EventLog mEventLog; State mState; }; inline bool GenericService::isOkay(void)const { return mhServiceHandle?true:false; } inline GenericService::State GenericService::state(void)const { return mState; } inline void GenericService::state(State state) { mState=state; } inline bool GenericService::isPaused(void)const { return Paused==state(); } inline bool GenericService::isRunning(void)const { return Running==state(); } inline bool GenericService::isStopped(void)const { return Stopped==state(); } inline bool GenericService::setServiceStatus(const ServiceStatus &serviceStatus) { if(!isOkay())return false; state(State(serviceStatus.currentState())); return ::SetServiceStatus(mhServiceHandle,&((ServiceStatus&)serviceStatus).getSERVICESTATUS())?true:false; } inline bool GenericService::reportEvent(const String &strMessage,EventLog::EventType eventType,DWORD eventID,DWORD category,PSID userSID) { return mEventLog.reportEvent(strMessage,eventType,eventID,category,userSID); } #endif