2 * PROJECT: ReactOS Spooler Router
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Functions related to Ports of the Print Monitors
5 * COPYRIGHT: Copyright 2015-2017 Colin Finck (colin@reactos.org)
11 AddPortExW(PWSTR pName
, DWORD Level
, PBYTE lpBuffer
, PWSTR lpMonitorName
)
13 BOOL bReturnValue
= TRUE
;
14 DWORD dwErrorCode
= MAXDWORD
;
15 PSPOOLSS_PRINT_PROVIDER pPrintProvider
;
18 FIXME("AddPortEx(%S, %lu, %p, %s)\n", pName
, Level
, lpBuffer
, debugstr_w(lpMonitorName
));
20 // Loop through all Print Provider.
21 for (pEntry
= PrintProviderList
.Flink
; pEntry
!= &PrintProviderList
; pEntry
= pEntry
->Flink
)
23 pPrintProvider
= CONTAINING_RECORD(pEntry
, SPOOLSS_PRINT_PROVIDER
, Entry
);
25 // Check if this Print Provider provides the function.
26 if (!pPrintProvider
->PrintProvider
.fpAddPortEx
)
29 bReturnValue
= pPrintProvider
->PrintProvider
.fpAddPortEx(pName
, Level
, lpBuffer
, lpMonitorName
);
33 dwErrorCode
= GetLastError();
36 // dwErrorCode shall not be overwritten if a previous call already succeeded.
37 if (dwErrorCode
!= ERROR_SUCCESS
)
38 dwErrorCode
= GetLastError();
41 SetLastError(dwErrorCode
);
42 return (dwErrorCode
== ERROR_SUCCESS
);
46 AddPortW(PWSTR pName
, HWND hWnd
, PWSTR pMonitorName
)
48 BOOL bReturnValue
= TRUE
;
49 DWORD dwErrorCode
= MAXDWORD
;
50 PSPOOLSS_PRINT_PROVIDER pPrintProvider
;
53 FIXME("AddPort(%S, %p, %s)\n", pName
, hWnd
, debugstr_w(pMonitorName
));
55 // Loop through all Print Provider.
56 for (pEntry
= PrintProviderList
.Flink
; pEntry
!= &PrintProviderList
; pEntry
= pEntry
->Flink
)
58 pPrintProvider
= CONTAINING_RECORD(pEntry
, SPOOLSS_PRINT_PROVIDER
, Entry
);
60 // Check if this Print Provider provides the function.
61 if (!pPrintProvider
->PrintProvider
.fpAddPort
)
64 bReturnValue
= pPrintProvider
->PrintProvider
.fpAddPort(pName
, hWnd
, pMonitorName
);
68 dwErrorCode
= GetLastError();
71 // dwErrorCode shall not be overwritten if a previous call already succeeded.
72 if (dwErrorCode
!= ERROR_SUCCESS
)
73 dwErrorCode
= GetLastError();
76 SetLastError(dwErrorCode
);
77 return (dwErrorCode
== ERROR_SUCCESS
);
81 ConfigurePortW(PWSTR pName
, HWND hWnd
, PWSTR pPortName
)
83 BOOL bReturnValue
= TRUE
;
84 DWORD dwErrorCode
= MAXDWORD
;
85 PSPOOLSS_PRINT_PROVIDER pPrintProvider
;
88 // Loop through all Print Provider.
89 for (pEntry
= PrintProviderList
.Flink
; pEntry
!= &PrintProviderList
; pEntry
= pEntry
->Flink
)
91 pPrintProvider
= CONTAINING_RECORD(pEntry
, SPOOLSS_PRINT_PROVIDER
, Entry
);
93 // Check if this Print Provider provides the function.
94 if (!pPrintProvider
->PrintProvider
.fpConfigurePort
)
97 bReturnValue
= pPrintProvider
->PrintProvider
.fpConfigurePort(pName
, hWnd
, pPortName
);
101 dwErrorCode
= GetLastError();
104 // dwErrorCode shall not be overwritten if a previous call already succeeded.
105 if (dwErrorCode
!= ERROR_SUCCESS
)
106 dwErrorCode
= GetLastError();
109 SetLastError(dwErrorCode
);
110 return (dwErrorCode
== ERROR_SUCCESS
);
114 DeletePortW(PWSTR pName
, HWND hWnd
, PWSTR pPortName
)
116 BOOL bReturnValue
= TRUE
;
117 DWORD dwErrorCode
= MAXDWORD
;
118 PSPOOLSS_PRINT_PROVIDER pPrintProvider
;
121 // Loop through all Print Provider.
122 for (pEntry
= PrintProviderList
.Flink
; pEntry
!= &PrintProviderList
; pEntry
= pEntry
->Flink
)
124 pPrintProvider
= CONTAINING_RECORD(pEntry
, SPOOLSS_PRINT_PROVIDER
, Entry
);
126 // Check if this Print Provider provides the function.
127 if (!pPrintProvider
->PrintProvider
.fpDeletePort
)
130 bReturnValue
= pPrintProvider
->PrintProvider
.fpDeletePort(pName
, hWnd
, pPortName
);
134 dwErrorCode
= GetLastError();
137 // dwErrorCode shall not be overwritten if a previous call already succeeded.
138 if (dwErrorCode
!= ERROR_SUCCESS
)
139 dwErrorCode
= GetLastError();
142 SetLastError(dwErrorCode
);
143 return (dwErrorCode
== ERROR_SUCCESS
);
147 EnumPortsW(PWSTR pName
, DWORD Level
, PBYTE pPorts
, DWORD cbBuf
, PDWORD pcbNeeded
, PDWORD pcReturned
)
149 BOOL bReturnValue
= TRUE
;
153 DWORD dwErrorCode
= MAXDWORD
;
155 PSPOOLSS_PRINT_PROVIDER pPrintProvider
;
159 if (cbBuf
&& !pPorts
)
161 SetLastError(ERROR_INVALID_USER_BUFFER
);
169 // At the beginning, we have the full buffer available.
170 cbCallBuffer
= cbBuf
;
171 pCallBuffer
= pPorts
;
173 // Loop through all Print Provider.
174 for (pEntry
= PrintProviderList
.Flink
; pEntry
!= &PrintProviderList
; pEntry
= pEntry
->Flink
)
176 pPrintProvider
= CONTAINING_RECORD(pEntry
, SPOOLSS_PRINT_PROVIDER
, Entry
);
178 // Check if this Print Provider provides an EnumPorts function.
179 if (!pPrintProvider
->PrintProvider
.fpEnumPorts
)
182 // Call the EnumPorts function of this Print Provider.
185 bReturnValue
= pPrintProvider
->PrintProvider
.fpEnumPorts(pName
, Level
, pCallBuffer
, cbCallBuffer
, &cbNeeded
, &dwReturned
);
189 dwErrorCode
= GetLastError();
192 // Add the returned counts to the total values.
193 *pcbNeeded
+= cbNeeded
;
194 *pcReturned
+= dwReturned
;
196 // Reduce the available buffer size for the next call without risking an underflow.
197 if (cbNeeded
< cbCallBuffer
)
198 cbCallBuffer
-= cbNeeded
;
202 // Advance the buffer if the caller provided it.
204 pCallBuffer
+= cbNeeded
;
206 // dwErrorCode shall not be overwritten if a previous EnumPrinters call already succeeded.
207 if (dwErrorCode
!= ERROR_SUCCESS
)
208 dwErrorCode
= GetLastError();
211 SetLastError(dwErrorCode
);
212 return (dwErrorCode
== ERROR_SUCCESS
);
216 SetPortW(PWSTR pName
, PWSTR pPortName
, DWORD dwLevel
, PBYTE pPortInfo
)
218 BOOL bReturnValue
= TRUE
;
219 DWORD dwErrorCode
= MAXDWORD
;
220 PSPOOLSS_PRINT_PROVIDER pPrintProvider
;
223 // Loop through all Print Provider.
224 for (pEntry
= PrintProviderList
.Flink
; pEntry
!= &PrintProviderList
; pEntry
= pEntry
->Flink
)
226 pPrintProvider
= CONTAINING_RECORD(pEntry
, SPOOLSS_PRINT_PROVIDER
, Entry
);
228 // Check if this Print Provider provides the function.
229 if (!pPrintProvider
->PrintProvider
.fpSetPort
)
232 bReturnValue
= pPrintProvider
->PrintProvider
.fpSetPort(pName
, pPortName
, dwLevel
, pPortInfo
);
236 dwErrorCode
= GetLastError();
239 // dwErrorCode shall not be overwritten if a previous call already succeeded.
240 if (dwErrorCode
!= ERROR_SUCCESS
)
241 dwErrorCode
= GetLastError();
244 SetLastError(dwErrorCode
);
245 return (dwErrorCode
== ERROR_SUCCESS
);