2 * PROJECT: ReactOS Spooler API
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Functions related to Print Processors
5 * COPYRIGHT: Copyright 2015-2018 Colin Finck (colin@reactos.org)
9 #include <marshalling/printprocessors.h>
10 #include <prtprocenv.h>
13 AddPrintProcessorA(PSTR pName
, PSTR pEnvironment
, PSTR pPathName
, PSTR pPrintProcessorName
)
15 TRACE("AddPrintProcessorA(%s, %s, %s, %s)\n", pName
, pEnvironment
, pPathName
, pPrintProcessorName
);
21 AddPrintProcessorW(PWSTR pName
, PWSTR pEnvironment
, PWSTR pPathName
, PWSTR pPrintProcessorName
)
23 TRACE("AddPrintProcessorW(%S, %S, %S, %S)\n", pName
, pEnvironment
, pPathName
, pPrintProcessorName
);
29 DeletePrintProcessorA(PSTR pName
, PSTR pEnvironment
, PSTR pPrintProcessorName
)
31 TRACE("DeletePrintProcessorA(%s, %s, %s)\n", pName
, pEnvironment
, pPrintProcessorName
);
37 DeletePrintProcessorW(PWSTR pName
, PWSTR pEnvironment
, PWSTR pPrintProcessorName
)
39 TRACE("DeletePrintProcessorW(%S, %S, %S)\n", pName
, pEnvironment
, pPrintProcessorName
);
45 EnumPrintProcessorDatatypesA(PSTR pName
, LPSTR pPrintProcessorName
, DWORD Level
, PBYTE pDatatypes
, DWORD cbBuf
, PDWORD pcbNeeded
, PDWORD pcReturned
)
47 TRACE("EnumPrintProcessorDatatypesA(%s, %s, %lu, %p, %lu, %p, %p)\n", pName
, pPrintProcessorName
, Level
, pDatatypes
, cbBuf
, pcbNeeded
, pcReturned
);
53 EnumPrintProcessorDatatypesW(PWSTR pName
, LPWSTR pPrintProcessorName
, DWORD Level
, PBYTE pDatatypes
, DWORD cbBuf
, PDWORD pcbNeeded
, PDWORD pcReturned
)
57 TRACE("EnumPrintProcessorDatatypesW(%S, %S, %lu, %p, %lu, %p, %p)\n", pName
, pPrintProcessorName
, Level
, pDatatypes
, cbBuf
, pcbNeeded
, pcReturned
);
62 dwErrorCode
= ERROR_INVALID_LEVEL
;
69 dwErrorCode
= _RpcEnumPrintProcessorDatatypes(pName
, pPrintProcessorName
, Level
, pDatatypes
, cbBuf
, pcbNeeded
, pcReturned
);
71 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
73 dwErrorCode
= RpcExceptionCode();
74 ERR("_RpcEnumPrintProcessorDatatypes failed with exception code %lu!\n", dwErrorCode
);
78 if (dwErrorCode
== ERROR_SUCCESS
)
80 // Replace relative offset addresses in the output by absolute pointers.
81 MarshallUpStructuresArray(cbBuf
, pDatatypes
, *pcReturned
, DatatypesInfo1Marshalling
.pInfo
, DatatypesInfo1Marshalling
.cbStructureSize
, TRUE
);
85 SetLastError(dwErrorCode
);
86 return (dwErrorCode
== ERROR_SUCCESS
);
90 EnumPrintProcessorsA(PSTR pName
, PSTR pEnvironment
, DWORD Level
, PBYTE pPrintProcessorInfo
, DWORD cbBuf
, PDWORD pcbNeeded
, PDWORD pcReturned
)
92 TRACE("EnumPrintProcessorsA(%s, %s, %lu, %p, %lu, %p, %p)\n", pName
, pEnvironment
, Level
, pPrintProcessorInfo
, cbBuf
, pcbNeeded
, pcReturned
);
98 EnumPrintProcessorsW(PWSTR pName
, PWSTR pEnvironment
, DWORD Level
, PBYTE pPrintProcessorInfo
, DWORD cbBuf
, PDWORD pcbNeeded
, PDWORD pcReturned
)
102 TRACE("EnumPrintProcessorsW(%S, %S, %lu, %p, %lu, %p, %p)\n", pName
, pEnvironment
, Level
, pPrintProcessorInfo
, cbBuf
, pcbNeeded
, pcReturned
);
104 // Choose our current environment if the caller didn't give any.
106 pEnvironment
= (PWSTR
)wszCurrentEnvironment
;
111 dwErrorCode
= _RpcEnumPrintProcessors(pName
, pEnvironment
, Level
, pPrintProcessorInfo
, cbBuf
, pcbNeeded
, pcReturned
);
113 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
115 dwErrorCode
= RpcExceptionCode();
119 if (dwErrorCode
== ERROR_SUCCESS
)
121 // Replace relative offset addresses in the output by absolute pointers.
122 MarshallUpStructuresArray(cbBuf
, pPrintProcessorInfo
, *pcReturned
, PrintProcessorInfo1Marshalling
.pInfo
, PrintProcessorInfo1Marshalling
.cbStructureSize
, TRUE
);
125 SetLastError(dwErrorCode
);
126 return (dwErrorCode
== ERROR_SUCCESS
);
130 GetPrintProcessorDirectoryA(PSTR pName
, PSTR pEnvironment
, DWORD Level
, PBYTE pPrintProcessorInfo
, DWORD cbBuf
, PDWORD pcbNeeded
)
132 BOOL bReturnValue
= FALSE
;
134 PWSTR pwszName
= NULL
;
135 PWSTR pwszEnvironment
= NULL
;
136 PWSTR pwszPrintProcessorInfo
= NULL
;
138 TRACE("GetPrintProcessorDirectoryA(%s, %s, %lu, %p, %lu, %p)\n", pName
, pEnvironment
, Level
, pPrintProcessorInfo
, cbBuf
, pcbNeeded
);
142 // Convert pName to a Unicode string pwszName.
145 pwszName
= HeapAlloc(hProcessHeap
, 0, (cch
+ 1) * sizeof(WCHAR
));
148 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
149 ERR("HeapAlloc failed!\n");
153 MultiByteToWideChar(CP_ACP
, 0, pName
, -1, pwszName
, cch
+ 1);
158 // Convert pEnvironment to a Unicode string pwszEnvironment.
159 cch
= strlen(pEnvironment
);
161 pwszEnvironment
= HeapAlloc(hProcessHeap
, 0, (cch
+ 1) * sizeof(WCHAR
));
162 if (!pwszEnvironment
)
164 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
165 ERR("HeapAlloc failed!\n");
169 MultiByteToWideChar(CP_ACP
, 0, pEnvironment
, -1, pwszEnvironment
, cch
+ 1);
172 if (cbBuf
&& pPrintProcessorInfo
)
174 // Allocate a temporary buffer for the Unicode result.
175 // We can just go with cbBuf here. The user should have set it based on pcbNeeded returned in a previous call and our
176 // pcbNeeded is the same for the A and W functions.
177 pwszPrintProcessorInfo
= HeapAlloc(hProcessHeap
, 0, cbBuf
);
178 if (!pwszPrintProcessorInfo
)
180 SetLastError(ERROR_NOT_ENOUGH_MEMORY
);
181 ERR("HeapAlloc failed!\n");
186 bReturnValue
= GetPrintProcessorDirectoryW(pwszName
, pwszEnvironment
, Level
, (PBYTE
)pwszPrintProcessorInfo
, cbBuf
, pcbNeeded
);
190 // Convert pwszPrintProcessorInfo to an ANSI string pPrintProcessorInfo.
191 WideCharToMultiByte(CP_ACP
, 0, pwszPrintProcessorInfo
, -1, (PSTR
)pPrintProcessorInfo
, cbBuf
, NULL
, NULL
);
196 HeapFree(hProcessHeap
, 0, pwszName
);
199 HeapFree(hProcessHeap
, 0, pwszEnvironment
);
201 if (pwszPrintProcessorInfo
)
202 HeapFree(hProcessHeap
, 0, pwszPrintProcessorInfo
);
208 GetPrintProcessorDirectoryW(PWSTR pName
, PWSTR pEnvironment
, DWORD Level
, PBYTE pPrintProcessorInfo
, DWORD cbBuf
, PDWORD pcbNeeded
)
212 TRACE("GetPrintProcessorDirectoryW(%S, %S, %lu, %p, %lu, %p)\n", pName
, pEnvironment
, Level
, pPrintProcessorInfo
, cbBuf
, pcbNeeded
);
217 dwErrorCode
= ERROR_INVALID_LEVEL
;
221 // Choose our current environment if the caller didn't give any.
223 pEnvironment
= (PWSTR
)wszCurrentEnvironment
;
228 dwErrorCode
= _RpcGetPrintProcessorDirectory(pName
, pEnvironment
, Level
, pPrintProcessorInfo
, cbBuf
, pcbNeeded
);
230 RpcExcept(EXCEPTION_EXECUTE_HANDLER
)
232 dwErrorCode
= RpcExceptionCode();
237 SetLastError(dwErrorCode
);
238 return (dwErrorCode
== ERROR_SUCCESS
);