9 #include "Raym/Log.h"
\r
10 #include "Raym/Raym.h"
\r
15 static Service *sharedService_ = NULL;
\r
17 DWORD WINAPI _HandlerEx(DWORD dwControl, DWORD dwEventType, LPVOID lpEventData, LPVOID lpContext)
\r
19 DebugLog2("%s() start.", __FUNCTION__);
\r
21 DWORD result = ERROR_CALL_NOT_IMPLEMENTED;
\r
23 Service *service = (Service *)lpContext;
\r
28 case SERVICE_CONTROL_STOP:
\r
29 case SERVICE_CONTROL_PRESHUTDOWN:
\r
31 ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
\r
32 ss.dwWin32ExitCode = NO_ERROR;
\r
33 ss.dwServiceSpecificExitCode = 0;
\r
34 ss.dwCheckPoint = 1;
\r
35 ss.dwWaitHint = 50000;
\r
36 ss.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PRESHUTDOWN;
\r
37 ss.dwCurrentState = SERVICE_STOP_PENDING;
\r
39 if (service->setServiceStatus(&ss))
\r
41 DebugLog2("call stop()");
\r
44 ss.dwCurrentState = SERVICE_STOPPED;
\r
45 ss.dwCheckPoint = 0;
\r
48 if (!service->setServiceStatus(&ss))
\r
50 DebugLog0("error: SetServiceStatus(): %u", GetLastError());
\r
55 DebugLog0("error: SetServiceStatus(): %u", GetLastError());
\r
62 DebugLog2("%s() end.", __FUNCTION__);
\r
67 VOID WINAPI _ServiceMain(DWORD dwArgc, PTSTR* pszArgv)
\r
69 if (sharedService_ != NULL)
\r
71 sharedService_->serviceMain(dwArgc, pszArgv);
\r
75 void Service::serviceMain(DWORD dwArgc, PTSTR* pszArgv)
\r
77 DebugLog2("%s() start.", __FUNCTION__);
\r
79 _serviceStatus = RegisterServiceCtrlHandlerEx(_serviceName, _HandlerEx, this);
\r
80 if (_serviceStatus == NULL)
\r
82 DebugLog0("error: RegisterServiceCtrlHandler(): %u", GetLastError());
\r
87 ss.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
\r
88 ss.dwWin32ExitCode = NO_ERROR;
\r
89 ss.dwServiceSpecificExitCode = 0;
\r
90 ss.dwCheckPoint = 1;
\r
91 ss.dwWaitHint = 15000;
\r
92 ss.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PRESHUTDOWN;
\r
93 ss.dwCurrentState = SERVICE_START_PENDING;
\r
95 if (!SetServiceStatus(_serviceStatus, &ss))
\r
97 DebugLog0("error: SetServiceStatus(): %u", GetLastError());
\r
104 DebugLog2("%s() end.", __FUNCTION__);
\r
109 DebugLog2("%s", __FUNCTION__);
\r
112 Service::~Service()
\r
114 DebugLog2("%s", __FUNCTION__);
\r
117 int Service::main(Service *(*allocator)(), LPWSTR serviceName, int argc, char *argv[])
\r
121 #ifdef RAYM_MEMORY_CHECK
\r
123 DebugLog0("Service::main() global_raym_count_ = %d", Raym::global_raym_count_);
\r
127 AutoreleasePool *pool = AutoreleasePool::alloc()->init();
\r
131 WSAStartup(MAKEWORD(2,2), &wsaData);
\r
133 SERVICE_TABLE_ENTRY ServiceTable[] =
\r
135 {serviceName, _ServiceMain},
\r
139 sharedService_ = allocator();
\r
141 if (sharedService_ != NULL)
\r
143 if (sharedService_->init(serviceName))
\r
145 StartServiceCtrlDispatcher(ServiceTable);
\r
149 sharedService_->release();
\r
157 #ifdef RAYM_MEMORY_CHECK
\r
158 DebugLog0("Service::main() global_raym_count_ = %d", Raym::global_raym_count_);
\r
164 Service *Service::init(LPWSTR serviceName)
\r
166 _serviceName = serviceName;
\r
167 _serviceStatus = NULL;
\r
171 bool Service::setServiceStatus(SERVICE_STATUS *ss)
\r
173 return SetServiceStatus(_serviceStatus, ss) ? true : false;
\r
176 void Service::start()
\r
178 DebugLog2("%s", __FUNCTION__);
\r
181 void Service::stop()
\r
183 DebugLog2("%s", __FUNCTION__);
\r
186 void Service::sleep()
\r
188 DebugLog2("%s", __FUNCTION__);
\r
191 void Service::shutdown()
\r
193 DebugLog2("%s", __FUNCTION__);
\r
194 system("shutdown /s /t 180");
\r
197 void Service::cancelShutdown()
\r
199 DebugLog2("%s", __FUNCTION__);
\r
200 system("shutdown /a");
\r
203 bool Service::setWakeSchedule(int year, int month, int day, int hour, int min)
\r
208 void Service::resetWakeSchedule()
\r
213 // remark: This function is not thread safe.
\r
215 const char *Service::GetHomeDirectory(void)
\r
217 static char home_directory_[MAX_PATH + 1];
\r
219 memset(home_directory_, 0x00, sizeof(home_directory_));
\r
221 TCHAR strbuf[MAX_PATH + 1];
\r
222 size_t len = GetEnvironmentVariable(L"USERPROFILE", strbuf, sizeof(strbuf));
\r
226 size_t returnValue;
\r
227 e = wcstombs_s(&returnValue, home_directory_, sizeof(home_directory_), strbuf, _TRUNCATE);
\r
230 return home_directory_;
\r
237 // remark: This function is not thread safe.
\r
239 const char *Service::GetExecutePath(void)
\r
241 static char execute_path_[MAX_PATH + 1];
\r
242 memset(execute_path_, 0x00, sizeof(execute_path_));
\r
244 TCHAR strbuf[MAX_PATH + 1];
\r
245 if (GetModuleFileName(NULL, strbuf, MAX_PATH) != 0)
\r
248 size_t returnValue;
\r
249 e = wcstombs_s(&returnValue, execute_path_, sizeof(execute_path_), strbuf, _TRUNCATE);
\r
252 return execute_path_;
\r
259 // remark: This function is not thread safe.
\r
261 const char *Service::GetPublicDirectory(void)
\r
263 static char public_directory_[MAX_PATH + 1];
\r
265 memset(public_directory_, 0x00, sizeof(public_directory_));
\r
267 TCHAR strbuf[MAX_PATH + 1];
\r
268 size_t len = GetEnvironmentVariable(L"PUBLIC", strbuf, sizeof(strbuf));
\r
272 size_t returnValue;
\r
273 e = wcstombs_s(&returnValue, public_directory_, sizeof(public_directory_), strbuf, _TRUNCATE);
\r
276 return public_directory_;
\r