diff options
author | Sameeh Jubran <sameeh@daynix.com> | 2017-05-29 15:16:15 +0300 |
---|---|---|
committer | Dmitry Fleytman <dfleytma@redhat.com> | 2017-05-29 16:45:32 +0300 |
commit | e7b4fd2391bd07d3a38169668d122684888a535b (patch) | |
tree | 16aaa7a06f614c80150a5ee346e56351a59207a8 | |
parent | 2214163c4ec541648ae4c5fbe82e49abec8db7f6 (diff) |
ServiceManager: Add Start and Stop methods
Signed-off-by: Sameeh Jubran <sameeh@daynix.com>
Signed-off-by: Dmitry Fleytman <dfleytma@redhat.com>
-rw-r--r-- | UsbDkHelper/ServiceManager.cpp | 44 | ||||
-rw-r--r-- | UsbDkHelper/ServiceManager.h | 3 |
2 files changed, 34 insertions, 13 deletions
diff --git a/UsbDkHelper/ServiceManager.cpp b/UsbDkHelper/ServiceManager.cpp index 7265464..1145775 100644 --- a/UsbDkHelper/ServiceManager.cpp +++ b/UsbDkHelper/ServiceManager.cpp @@ -47,19 +47,7 @@ void ServiceManager::CreateServiceObject(const tstring &ServiceName, const tstri void ServiceManager::DeleteServiceObject(const tstring &ServiceName) { - assert(m_schSCManager); - - SCMHandleHolder schService(OpenService(m_schSCManager, ServiceName.c_str(), SERVICE_ALL_ACCESS)); - if (!schService) - { - auto err = GetLastError(); - if (err != ERROR_SERVICE_DOES_NOT_EXIST) - { - throw UsbDkServiceManagerFailedException(TEXT("OpenService failed with error "), err); - } - return; - } - + SCMHandleHolder schService(OpenServiceObject(ServiceName)); WaitForServiceStop(schService); if (!DeleteService(schService)) { @@ -67,6 +55,23 @@ void ServiceManager::DeleteServiceObject(const tstring &ServiceName) } } +void ServiceManager::StartServiceObject(const tstring &ServiceName) +{ + SCMHandleHolder schService(OpenServiceObject(ServiceName)); + + if (!StartService(SC_HANDLE(schService), 0, NULL)) + { + throw UsbDkServiceManagerFailedException(TEXT("StartService failed")); + } + return; +} + +void ServiceManager::StopServiceObject(const tstring & ServiceName) +{ + SCMHandleHolder schService(OpenServiceObject(ServiceName)); + WaitForServiceStop(schService); +} + void ServiceManager::WaitForServiceStop(const SCMHandleHolder &schService) { static const DWORD SERVICE_STOP_WAIT_QUANTUM = 50; @@ -86,3 +91,16 @@ void ServiceManager::WaitForServiceStop(const SCMHandleHolder &schService) } } while ((ssp.dwCurrentState != SERVICE_STOPPED) && (iterationNumber++ < SERVICE_STOP_ITERATIONS)); } + +SC_HANDLE ServiceManager::OpenServiceObject(const tstring & ServiceName) +{ + assert(m_schSCManager); + + SC_HANDLE sch = OpenService(m_schSCManager, ServiceName.c_str(), SERVICE_ALL_ACCESS); + if (!sch) + { + auto err = GetLastError(); + throw UsbDkServiceManagerFailedException(TEXT("OpenService failed"), err); + } + return sch; +} diff --git a/UsbDkHelper/ServiceManager.h b/UsbDkHelper/ServiceManager.h index 7cae9f9..cb29d50 100644 --- a/UsbDkHelper/ServiceManager.h +++ b/UsbDkHelper/ServiceManager.h @@ -42,11 +42,14 @@ public: void CreateServiceObject(const tstring &ServiceName, const tstring &ServicePath); void DeleteServiceObject(const tstring &ServiceName); + void StartServiceObject(const tstring &ServiceName); + void StopServiceObject(const tstring &ServiceName); private: typedef UsbDkHandleHolder<SC_HANDLE> SCMHandleHolder; static void WaitForServiceStop(const SCMHandleHolder &schService); + SC_HANDLE OpenServiceObject(const tstring & ServiceName); SCMHandleHolder m_schSCManager; }; |