Synchronize with trunk.
[reactos.git] / base / services / spoolsv / spoolsv.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: services/spoolsv/spoolsv.c
5 * PURPOSE: Printer spooler
6 * PROGRAMMER: Eric Kohl
7 */
8
9 /* INCLUDES *****************************************************************/
10
11 #include <windef.h>
12 #include <winsvc.h>
13 #include <wine/debug.h>
14
15 WINE_DEFAULT_DEBUG_CHANNEL(spoolsv);
16
17
18 /* GLOBALS ******************************************************************/
19
20 static VOID CALLBACK ServiceMain(DWORD argc, LPWSTR *argv);
21 static WCHAR ServiceName[] = L"Spooler";
22 static SERVICE_TABLE_ENTRYW ServiceTable[] =
23 {
24 {ServiceName, ServiceMain},
25 {NULL, NULL}
26 };
27
28 SERVICE_STATUS_HANDLE ServiceStatusHandle;
29 SERVICE_STATUS ServiceStatus;
30
31
32 /* FUNCTIONS *****************************************************************/
33
34 static VOID
35 UpdateServiceStatus(DWORD dwState)
36 {
37 ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
38 ServiceStatus.dwCurrentState = dwState;
39
40 if (dwState == SERVICE_RUNNING)
41 ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_PAUSE_CONTINUE | SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
42 else if (dwState == SERVICE_PAUSED)
43 ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_PAUSE_CONTINUE;
44 else
45 ServiceStatus.dwControlsAccepted = 0;
46
47 ServiceStatus.dwWin32ExitCode = 0;
48 ServiceStatus.dwServiceSpecificExitCode = 0;
49 ServiceStatus.dwCheckPoint = 0;
50
51 if (dwState == SERVICE_START_PENDING ||
52 dwState == SERVICE_STOP_PENDING ||
53 dwState == SERVICE_PAUSE_PENDING ||
54 dwState == SERVICE_CONTINUE_PENDING)
55 ServiceStatus.dwWaitHint = 10000;
56 else
57 ServiceStatus.dwWaitHint = 0;
58
59 SetServiceStatus(ServiceStatusHandle,
60 &ServiceStatus);
61 }
62
63
64 static DWORD WINAPI
65 ServiceControlHandler(DWORD dwControl,
66 DWORD dwEventType,
67 LPVOID lpEventData,
68 LPVOID lpContext)
69 {
70 TRACE("ServiceControlHandler() called\n");
71
72 switch (dwControl)
73 {
74 case SERVICE_CONTROL_STOP:
75 TRACE(" SERVICE_CONTROL_STOP received\n");
76 UpdateServiceStatus(SERVICE_STOPPED);
77 return ERROR_SUCCESS;
78
79 case SERVICE_CONTROL_PAUSE:
80 TRACE(" SERVICE_CONTROL_PAUSE received\n");
81 UpdateServiceStatus(SERVICE_PAUSED);
82 return ERROR_SUCCESS;
83
84 case SERVICE_CONTROL_CONTINUE:
85 TRACE(" SERVICE_CONTROL_CONTINUE received\n");
86 UpdateServiceStatus(SERVICE_RUNNING);
87 return ERROR_SUCCESS;
88
89 case SERVICE_CONTROL_INTERROGATE:
90 TRACE(" SERVICE_CONTROL_INTERROGATE received\n");
91 SetServiceStatus(ServiceStatusHandle,
92 &ServiceStatus);
93 return ERROR_SUCCESS;
94
95 case SERVICE_CONTROL_SHUTDOWN:
96 TRACE(" SERVICE_CONTROL_SHUTDOWN received\n");
97 UpdateServiceStatus(SERVICE_STOPPED);
98 return ERROR_SUCCESS;
99
100 default :
101 TRACE(" Control %lu received\n");
102 return ERROR_CALL_NOT_IMPLEMENTED;
103 }
104 }
105
106
107 static VOID CALLBACK
108 ServiceMain(DWORD argc, LPWSTR *argv)
109 {
110 UNREFERENCED_PARAMETER(argc);
111 UNREFERENCED_PARAMETER(argv);
112
113 TRACE("ServiceMain() called\n");
114
115 ServiceStatusHandle = RegisterServiceCtrlHandlerExW(ServiceName,
116 ServiceControlHandler,
117 NULL);
118
119 TRACE("Calling SetServiceStatus()\n");
120 UpdateServiceStatus(SERVICE_RUNNING);
121 TRACE("SetServiceStatus() called\n");
122
123
124 TRACE("ServiceMain() done\n");
125 }
126
127
128 int
129 wmain(int argc, WCHAR *argv[])
130 {
131 UNREFERENCED_PARAMETER(argc);
132 UNREFERENCED_PARAMETER(argv);
133
134 TRACE("Spoolsv: main() started\n");
135
136 StartServiceCtrlDispatcher(ServiceTable);
137
138 TRACE("Spoolsv: main() done\n");
139
140 return 0;
141 }
142
143 /* EOF */