1 /*
2 * PROJECT: ReactOS Spooler API
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Functions related to Print Providers
5 * COPYRIGHT: Copyright 2015-2017 Colin Finck (colin@reactos.org)
6 */
7
8 #include "precomp.h"
9
10 BOOL WINAPI
AddPrintProvidorA(PSTR pName,DWORD Level,PBYTE pProviderInfo)11 AddPrintProvidorA(PSTR pName, DWORD Level, PBYTE pProviderInfo)
12 {
13 LPWSTR nameW = NULL;
14 PROVIDOR_INFO_1W pi1W;
15 PROVIDOR_INFO_2W pi2W;
16 DWORD len;
17 BOOL res;
18 PBYTE pPI = NULL;
19
20 TRACE("AddPrintProvidorA(%s, %lu, %p)\n", pName, Level, pProviderInfo);
21
22 ZeroMemory(&pi1W, sizeof(PROVIDOR_INFO_1W));
23 pi2W.pOrder = NULL;
24
25 switch (Level)
26 {
27 case 1:
28 {
29 PROVIDOR_INFO_1A *pi1A = (PROVIDOR_INFO_1A*)pProviderInfo;
30 if (pi1A->pName)
31 {
32 len = MultiByteToWideChar(CP_ACP, 0, pi1A->pName, -1, NULL, 0);
33 pi1W.pName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
34 MultiByteToWideChar(CP_ACP, 0, pi1A->pName, -1, pi1W.pName, len);
35 }
36 if (pi1A->pEnvironment)
37 {
38 len = MultiByteToWideChar(CP_ACP, 0, pi1A->pEnvironment, -1, NULL, 0);
39 pi1W.pEnvironment = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
40 MultiByteToWideChar(CP_ACP, 0, pi1A->pEnvironment, -1, pi1W.pEnvironment, len);
41 }
42 if (pi1A->pDLLName)
43 {
44 len = MultiByteToWideChar(CP_ACP, 0, pi1A->pDLLName, -1, NULL, 0);
45 pi1W.pDLLName = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
46 MultiByteToWideChar(CP_ACP, 0, pi1A->pDLLName, -1, pi1W.pDLLName, len);
47 }
48 pPI = (PBYTE)&pi1W;
49 }
50 break;
51
52 case 2:
53 {
54 PROVIDOR_INFO_2A *pi2A = (PROVIDOR_INFO_2A*)pProviderInfo;
55 if (pi2A->pOrder)
56 {
57 len = MultiByteToWideChar(CP_ACP, 0, pi2A->pOrder, -1, NULL, 0);
58 pi2W.pOrder = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
59 MultiByteToWideChar(CP_ACP, 0, pi2A->pOrder, -1, pi2W.pOrder, len);
60 }
61 pPI = (PBYTE)&pi2W;
62 }
63 break;
64
65 default:
66 SetLastError(ERROR_INVALID_LEVEL);
67 return FALSE;
68 }
69
70 if (pName)
71 {
72 len = MultiByteToWideChar(CP_ACP, 0, pName, -1, NULL, 0);
73 nameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
74 MultiByteToWideChar(CP_ACP, 0, pName, -1, nameW, len);
75 }
76
77 res = AddPrintProvidorW( nameW, Level, pPI );
78
79 if (pName) HeapFree(GetProcessHeap(), 0, nameW);
80 if (pi1W.pName) HeapFree(GetProcessHeap(), 0, pi1W.pName);
81 if (pi1W.pEnvironment) HeapFree(GetProcessHeap(), 0, pi1W.pEnvironment);
82 if (pi1W.pDLLName) HeapFree(GetProcessHeap(), 0, pi1W.pDLLName);
83 if (pi2W.pOrder) HeapFree(GetProcessHeap(), 0, pi2W.pOrder);
84
85 return res;
86 }
87
88 BOOL WINAPI
AddPrintProvidorW(PWSTR pName,DWORD Level,PBYTE pProviderInfo)89 AddPrintProvidorW(PWSTR pName, DWORD Level, PBYTE pProviderInfo)
90 {
91 DWORD dwErrorCode;
92 WINSPOOL_PROVIDOR_CONTAINER ProvidorContainer;
93
94 TRACE("AddPrintProvidorW(%S, %lu, %p)\n", pName, Level, pProviderInfo);
95
96 if ((Level < 1) || (Level > 2))
97 {
98 SetLastError(ERROR_INVALID_LEVEL);
99 return FALSE;
100 }
101
102 ProvidorContainer.ProvidorInfo.pProvidorInfo1 = (WINSPOOL_PROVIDOR_INFO_1*)pProviderInfo;
103 ProvidorContainer.Level = Level;
104
105 RpcTryExcept
106 {
107 dwErrorCode = _RpcAddPrintProvidor( pName, &ProvidorContainer );
108 }
109 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
110 {
111 dwErrorCode = RpcExceptionCode();
112 ERR("_RpcEnumPorts failed with exception code %lu!\n", dwErrorCode);
113 }
114 RpcEndExcept;
115
116 SetLastError(dwErrorCode);
117 return (dwErrorCode == ERROR_SUCCESS);
118 }
119
120 BOOL WINAPI
DeletePrintProvidorA(PSTR pName,PSTR pEnvironment,PSTR pPrintProviderName)121 DeletePrintProvidorA(PSTR pName, PSTR pEnvironment, PSTR pPrintProviderName)
122 {
123 UNICODE_STRING NameW, EnvW, ProviderW;
124 BOOL Ret;
125
126 TRACE("DeletePrintProvidorW(%s, %s, %s)\n", pName, pEnvironment, pPrintProviderName);
127
128 AsciiToUnicode(&NameW, pName);
129 AsciiToUnicode(&EnvW, pEnvironment);
130 AsciiToUnicode(&ProviderW, pPrintProviderName);
131
132 Ret = DeletePrintProvidorW(NameW.Buffer, EnvW.Buffer, ProviderW.Buffer);
133
134 RtlFreeUnicodeString(&ProviderW);
135 RtlFreeUnicodeString(&EnvW);
136 RtlFreeUnicodeString(&NameW);
137
138 return Ret;
139 }
140
141 BOOL WINAPI
DeletePrintProvidorW(PWSTR pName,PWSTR pEnvironment,PWSTR pPrintProviderName)142 DeletePrintProvidorW(PWSTR pName, PWSTR pEnvironment, PWSTR pPrintProviderName)
143 {
144 DWORD dwErrorCode;
145
146 TRACE("DeletePrintProvidorW(%S, %S, %S)\n", pName, pEnvironment, pPrintProviderName);
147
148 RpcTryExcept
149 {
150 dwErrorCode = _RpcDeletePrintProvidor( pName, pEnvironment, pPrintProviderName );
151 }
152 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
153 {
154 dwErrorCode = RpcExceptionCode();
155 ERR("_RpcEnumPorts failed with exception code %lu!\n", dwErrorCode);
156 }
157 RpcEndExcept;
158
159 SetLastError(dwErrorCode);
160 return (dwErrorCode == ERROR_SUCCESS);
161 }
162