2 * PROJECT: ReactOS Spooler API
3 * LICENSE: GNU LGPL v2.1 or any later version as published by the Free Software Foundation
4 * PURPOSE: Main functions
5 * COPYRIGHT: Copyright 2015 Colin Finck <colin@reactos.org>
11 WINSPOOL_HANDLE_bind(WINSPOOL_HANDLE wszName
)
14 PWSTR wszStringBinding
;
17 // Get us a string binding handle from the supplied connection information
18 Status
= RpcStringBindingComposeW(NULL
, L
"ncacn_np", wszName
, L
"\\pipe\\spoolss", NULL
, &wszStringBinding
);
19 if (Status
!= RPC_S_OK
)
21 ERR("RpcStringBindingComposeW failed with status %u!\n", Status
);
25 // Get a handle_t binding handle from the string binding handle
26 Status
= RpcBindingFromStringBindingW(wszStringBinding
, &hBinding
);
27 if (Status
!= RPC_S_OK
)
29 ERR("RpcBindingFromStringBindingW failed with status %u!\n", Status
);
33 // Free the string binding handle
34 Status
= RpcStringFreeW(&wszStringBinding
);
35 if (Status
!= RPC_S_OK
)
37 ERR("RpcStringFreeW failed with status %u!\n", Status
);
45 WINSPOOL_HANDLE_unbind(WINSPOOL_HANDLE wszName
, handle_t hBinding
)
49 Status
= RpcBindingFree(&hBinding
);
50 if (Status
!= RPC_S_OK
)
52 ERR("RpcBindingFree failed with status %u!\n", Status
);
56 void __RPC_FAR
* __RPC_USER
57 midl_user_allocate(SIZE_T len
)
59 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
63 midl_user_free(void __RPC_FAR
* ptr
)
65 HeapFree(GetProcessHeap(), 0, ptr
);
69 ClosePrinter(HANDLE hPrinter
)
75 DeviceCapabilitiesA(LPCSTR pDevice
, LPCSTR pPort
, WORD fwCapability
, LPSTR pOutput
, const DEVMODEA
* pDevMode
)
81 DeviceCapabilitiesW(LPCWSTR pDevice
, LPCWSTR pPort
, WORD fwCapability
, LPWSTR pOutput
, const DEVMODEW
* pDevMode
)
87 DocumentPropertiesA(HWND hWnd
, HANDLE hPrinter
, LPSTR pDeviceName
, PDEVMODEA pDevModeOutput
, PDEVMODEA pDevModeInput
, DWORD fMode
)
93 DocumentPropertiesW(HWND hWnd
, HANDLE hPrinter
, LPWSTR pDeviceName
, PDEVMODEW pDevModeOutput
, PDEVMODEW pDevModeInput
, DWORD fMode
)
99 EndDocPrinter(HANDLE hPrinter
)
105 EndPagePrinter(HANDLE hPrinter
)
111 EnumPrintersA(DWORD Flags
, LPSTR Name
, DWORD Level
, LPBYTE pPrinterEnum
, DWORD cbBuf
, LPDWORD pcbNeeded
, LPDWORD pcReturned
)
117 EnumPrintersW(DWORD Flags
, LPWSTR Name
, DWORD Level
, LPBYTE pPrinterEnum
, DWORD cbBuf
, LPDWORD pcbNeeded
, LPDWORD pcReturned
)
123 GetDefaultPrinterA(LPSTR pszBuffer
, LPDWORD pcchBuffer
)
129 GetDefaultPrinterW(LPWSTR pszBuffer
, LPDWORD pcchBuffer
)
135 GetPrinterA(HANDLE hPrinter
, DWORD Level
, LPBYTE pPrinter
, DWORD cbBuf
, LPDWORD pcbNeeded
)
141 GetPrinterDriverA(HANDLE hPrinter
, LPSTR pEnvironment
, DWORD Level
, LPBYTE pDriverInfo
, DWORD cbBuf
, LPDWORD pcbNeeded
)
147 GetPrinterDriverW(HANDLE hPrinter
, LPWSTR pEnvironment
, DWORD Level
, LPBYTE pDriverInfo
, DWORD cbBuf
, LPDWORD pcbNeeded
)
153 GetPrinterW(HANDLE hPrinter
, DWORD Level
, LPBYTE pPrinter
, DWORD cbBuf
, LPDWORD pcbNeeded
)
159 GetPrintProcessorDirectoryW(LPWSTR pName
, LPWSTR pEnvironment
, DWORD Level
, LPBYTE pPrintProcessorInfo
, DWORD cbBuf
, LPDWORD pcbNeeded
)
165 OpenPrinterA(LPSTR pPrinterName
, LPHANDLE phPrinter
, LPPRINTER_DEFAULTSA pDefault
)
167 BOOL ReturnValue
= FALSE
;
169 PWSTR pwszPrinterName
= NULL
;
170 PWSTR pwszDatatype
= NULL
;
171 PRINTER_DEFAULTSW wDefault
= { 0 };
176 // Convert pPrinterName to a Unicode string pwszPrinterName
177 StringLength
= strlen(pPrinterName
) + 1;
179 pwszPrinterName
= HeapAlloc(GetProcessHeap(), 0, StringLength
* sizeof(WCHAR
));
180 if (!pwszPrinterName
)
182 ERR("HeapAlloc failed for pwszPrinterName with last error %u!\n", GetLastError());
186 MultiByteToWideChar(CP_ACP
, 0, pPrinterName
, -1, pwszPrinterName
, StringLength
);
191 wDefault
.DesiredAccess
= pDefault
->DesiredAccess
;
193 if (pDefault
->pDatatype
)
195 // Convert pDefault->pDatatype to a Unicode string pwszDatatype that later becomes wDefault.pDatatype
196 StringLength
= strlen(pDefault
->pDatatype
) + 1;
198 pwszDatatype
= HeapAlloc(GetProcessHeap(), 0, StringLength
* sizeof(WCHAR
));
201 ERR("HeapAlloc failed for pwszDatatype with last error %u!\n", GetLastError());
205 MultiByteToWideChar(CP_ACP
, 0, pDefault
->pDatatype
, -1, pwszDatatype
, StringLength
);
206 wDefault
.pDatatype
= pwszDatatype
;
209 if (pDefault
->pDevMode
)
211 // Fixed size strings, so no additional memory needs to be allocated
212 MultiByteToWideChar(CP_ACP
, 0, (LPCSTR
)pDefault
->pDevMode
->dmDeviceName
, -1, wDevMode
.dmDeviceName
, sizeof(wDevMode
.dmDeviceName
) / sizeof(WCHAR
));
213 MultiByteToWideChar(CP_ACP
, 0, (LPCSTR
)pDefault
->pDevMode
->dmFormName
, -1, wDevMode
.dmFormName
, sizeof(wDevMode
.dmFormName
) / sizeof(WCHAR
));
215 // Use CopyMemory to copy over several structure values in one step
216 CopyMemory(&wDevMode
.dmSpecVersion
, &pDefault
->pDevMode
->dmSpecVersion
, (ULONG_PTR
)&wDevMode
.dmCollate
- (ULONG_PTR
)&wDevMode
.dmSpecVersion
+ sizeof(wDevMode
.dmCollate
));
217 CopyMemory(&wDevMode
.dmLogPixels
, &pDefault
->pDevMode
->dmLogPixels
, (ULONG_PTR
)&wDevMode
.dmPanningHeight
- (ULONG_PTR
)&wDevMode
.dmLogPixels
+ sizeof(wDevMode
.dmPanningHeight
));
219 wDefault
.pDevMode
= &wDevMode
;
223 ReturnValue
= OpenPrinterW(pwszPrinterName
, phPrinter
, &wDefault
);
227 HeapFree(GetProcessHeap(), 0, pwszPrinterName
);
230 HeapFree(GetProcessHeap(), 0, pwszDatatype
);
236 OpenPrinterW(LPWSTR pPrinterName
, LPHANDLE phPrinter
, LPPRINTER_DEFAULTSW pDefault
)
238 BOOL ReturnValue
= FALSE
;
240 PWSTR pDatatype
= NULL
;
241 WINSPOOL_DEVMODE_CONTAINER DevModeContainer
;
242 WINSPOOL_DEVMODE_CONTAINER
* pDevModeContainer
= NULL
;
243 ACCESS_MASK AccessRequired
= 0;
245 // Prepare the additional parameters in the format required by _RpcOpenPrinter
248 pDatatype
= pDefault
->pDatatype
;
249 DevModeContainer
.cbBuf
= sizeof(DEVMODEW
);
250 DevModeContainer
.pDevMode
= (BYTE
*)pDefault
->pDevMode
;
251 pDevModeContainer
= &DevModeContainer
;
252 AccessRequired
= pDefault
->DesiredAccess
;
258 ErrorCode
= _RpcOpenPrinter(pPrinterName
, phPrinter
, pDatatype
, pDevModeContainer
, AccessRequired
);
261 ERR("_RpcOpenPrinter failed with error %u!\n", ErrorCode
);
264 ReturnValue
= (ErrorCode
== ERROR_SUCCESS
);
266 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
268 ERR("_RpcOpenPrinter failed with exception code %u!\n", RpcExceptionCode());
278 BOOL ReturnValue
= FALSE
;
281 // Nothing to initialize here yet, but pass this call to the Spool Service as well.
284 ErrorCode
= _RpcSpoolerInit();
287 ERR("_RpcSpoolerInit failed with error %u!\n", ErrorCode
);
290 ReturnValue
= (ErrorCode
== ERROR_SUCCESS
);
292 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
294 ERR("_RpcSpoolerInit failed with exception code %u!\n", RpcExceptionCode());
302 StartDocPrinterW(HANDLE hPrinter
, DWORD Level
, LPBYTE pDocInfo
)
308 StartPagePrinter(HANDLE hPrinter
)
314 WritePrinter(HANDLE hPrinter
, LPVOID pBuf
, DWORD cbBuf
, LPDWORD pcWritten
)
320 XcvDataW(HANDLE hXcv
, PCWSTR pszDataName
, PBYTE pInputData
, DWORD cbInputData
, PBYTE pOutputData
, DWORD cbOutputData
, PDWORD pcbOutputNeeded
, PDWORD pdwStatus
)