summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSameeh Jubran <sameeh@daynix.com>2017-05-29 15:16:15 +0300
committerDmitry Fleytman <dfleytma@redhat.com>2017-05-29 16:45:32 +0300
commite7b4fd2391bd07d3a38169668d122684888a535b (patch)
tree16aaa7a06f614c80150a5ee346e56351a59207a8
parent2214163c4ec541648ae4c5fbe82e49abec8db7f6 (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.cpp44
-rw-r--r--UsbDkHelper/ServiceManager.h3
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;
};