Files
Work/service/GenericService.hpp
2024-08-07 09:16:27 -04:00

104 lines
2.5 KiB
C++

#ifndef _SERVICE_GENERICSERVICE_HPP_
#define _SERVICE_GENERICSERVICE_HPP_
#ifndef _COMMON_STRING_HPP_
#include <common/string.hpp>
#endif
#ifndef _COMMON_WINSVC_HPP_
#include <common/winsvc.hpp>
#endif
#ifndef _SERVICE_SERVICEHOOK_HPP_
#include <service/ServiceHook.hpp>
#endif
#ifndef _SERVICE_SERVICESTATUS_HPP_
#include <service/ServiceStatus.hpp>
#endif
#ifndef _SERVICE_EVENTLOG_HPP_
#include <service/EventLog.hpp>
#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