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
;
168 PWSTR pwszPrinterName
= NULL
;
169 PWSTR pwszDatatype
= NULL
;
170 PRINTER_DEFAULTSW wDefault
= { 0 };
175 // Convert pPrinterName to a Unicode string pwszPrinterName
176 StringLength
= strlen(pPrinterName
) + 1;
178 pwszPrinterName
= HeapAlloc(GetProcessHeap(), 0, StringLength
* sizeof(WCHAR
));
179 if (!pwszPrinterName
)
181 ERR("HeapAlloc failed for pwszPrinterName with last error %u!\n", GetLastError());
185 MultiByteToWideChar(CP_ACP
, 0, pPrinterName
, -1, pwszPrinterName
, StringLength
);
190 wDefault
.DesiredAccess
= pDefault
->DesiredAccess
;
192 if (pDefault
->pDatatype
)
194 // Convert pDefault->pDatatype to a Unicode string pwszDatatype that later becomes wDefault.pDatatype
195 StringLength
= strlen(pDefault
->pDatatype
) + 1;
197 pwszDatatype
= HeapAlloc(GetProcessHeap(), 0, StringLength
* sizeof(WCHAR
));
200 ERR("HeapAlloc failed for pwszDatatype with last error %u!\n", GetLastError());
204 MultiByteToWideChar(CP_ACP
, 0, pDefault
->pDatatype
, -1, pwszDatatype
, StringLength
);
205 wDefault
.pDatatype
= pwszDatatype
;
208 if (pDefault
->pDevMode
)
209 wDefault
.pDevMode
= GdiConvertToDevmodeW(pDefault
->pDevMode
);
212 ReturnValue
= OpenPrinterW(pwszPrinterName
, phPrinter
, &wDefault
);
215 if (wDefault
.pDevMode
)
216 HeapFree(GetProcessHeap(), 0, wDefault
.pDevMode
);
219 HeapFree(GetProcessHeap(), 0, pwszPrinterName
);
222 HeapFree(GetProcessHeap(), 0, pwszDatatype
);
228 OpenPrinterW(LPWSTR pPrinterName
, LPHANDLE phPrinter
, LPPRINTER_DEFAULTSW pDefault
)
230 BOOL ReturnValue
= FALSE
;
232 PWSTR pDatatype
= NULL
;
233 WINSPOOL_DEVMODE_CONTAINER DevModeContainer
;
234 WINSPOOL_DEVMODE_CONTAINER
* pDevModeContainer
= NULL
;
235 ACCESS_MASK AccessRequired
= 0;
237 // Prepare the additional parameters in the format required by _RpcOpenPrinter
240 pDatatype
= pDefault
->pDatatype
;
241 DevModeContainer
.cbBuf
= sizeof(DEVMODEW
);
242 DevModeContainer
.pDevMode
= (BYTE
*)pDefault
->pDevMode
;
243 pDevModeContainer
= &DevModeContainer
;
244 AccessRequired
= pDefault
->DesiredAccess
;
250 ErrorCode
= _RpcOpenPrinter(pPrinterName
, phPrinter
, pDatatype
, pDevModeContainer
, AccessRequired
);
253 ERR("_RpcOpenPrinter failed with error %u!\n", ErrorCode
);
256 ReturnValue
= (ErrorCode
== ERROR_SUCCESS
);
258 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
260 ERR("_RpcOpenPrinter failed with exception code %u!\n", RpcExceptionCode());
270 BOOL ReturnValue
= FALSE
;
273 // Nothing to initialize here yet, but pass this call to the Spool Service as well.
276 ErrorCode
= _RpcSpoolerInit();
279 ERR("_RpcSpoolerInit failed with error %u!\n", ErrorCode
);
282 ReturnValue
= (ErrorCode
== ERROR_SUCCESS
);
284 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
286 ERR("_RpcSpoolerInit failed with exception code %u!\n", RpcExceptionCode());
294 StartDocPrinterW(HANDLE hPrinter
, DWORD Level
, LPBYTE pDocInfo
)
300 StartPagePrinter(HANDLE hPrinter
)
306 WritePrinter(HANDLE hPrinter
, LPVOID pBuf
, DWORD cbBuf
, LPDWORD pcWritten
)
312 XcvDataW(HANDLE hXcv
, PCWSTR pszDataName
, PBYTE pInputData
, DWORD cbInputData
, PBYTE pOutputData
, DWORD cbOutputData
, PDWORD pcbOutputNeeded
, PDWORD pdwStatus
)