2 * PROJECT: ReactOS Spooler Router
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Functions related to Print Monitors
5 * COPYRIGHT: Copyright 2015-2017 Colin Finck (colin@reactos.org)
11 AddMonitorW(PWSTR pName
, DWORD Level
, PBYTE pMonitors
)
13 BOOL bReturnValue
= TRUE
;
14 DWORD dwErrorCode
= MAXDWORD
;
15 PSPOOLSS_PRINT_PROVIDER pPrintProvider
;
18 // Loop through all Print Provider.
19 for (pEntry
= PrintProviderList
.Flink
; pEntry
!= &PrintProviderList
; pEntry
= pEntry
->Flink
)
21 pPrintProvider
= CONTAINING_RECORD(pEntry
, SPOOLSS_PRINT_PROVIDER
, Entry
);
23 // Check if this Print Provider provides the function.
24 if (!pPrintProvider
->PrintProvider
.fpAddMonitor
)
27 bReturnValue
= pPrintProvider
->PrintProvider
.fpAddMonitor(pName
, Level
, pMonitors
);
31 dwErrorCode
= GetLastError();
34 // dwErrorCode shall not be overwritten if a previous call already succeeded.
35 if (dwErrorCode
!= ERROR_SUCCESS
)
36 dwErrorCode
= GetLastError();
39 SetLastError(dwErrorCode
);
40 return (dwErrorCode
== ERROR_SUCCESS
);
44 DeleteMonitorW(PWSTR pName
, PWSTR pEnvironment
, PWSTR pMonitorName
)
46 BOOL bReturnValue
= TRUE
;
47 DWORD dwErrorCode
= MAXDWORD
;
48 PSPOOLSS_PRINT_PROVIDER pPrintProvider
;
51 // Loop through all Print Provider.
52 for (pEntry
= PrintProviderList
.Flink
; pEntry
!= &PrintProviderList
; pEntry
= pEntry
->Flink
)
54 pPrintProvider
= CONTAINING_RECORD(pEntry
, SPOOLSS_PRINT_PROVIDER
, Entry
);
56 // Check if this Print Provider provides the function.
57 if (!pPrintProvider
->PrintProvider
.fpDeleteMonitor
)
60 bReturnValue
= pPrintProvider
->PrintProvider
.fpDeleteMonitor(pName
, pEnvironment
, pMonitorName
);
64 dwErrorCode
= GetLastError();
67 // dwErrorCode shall not be overwritten if a previous call already succeeded.
68 if (dwErrorCode
!= ERROR_SUCCESS
)
69 dwErrorCode
= GetLastError();
72 SetLastError(dwErrorCode
);
73 return (dwErrorCode
== ERROR_SUCCESS
);
77 EnumMonitorsW(PWSTR pName
, DWORD Level
, PBYTE pMonitors
, DWORD cbBuf
, PDWORD pcbNeeded
, PDWORD pcReturned
)
79 BOOL bReturnValue
= TRUE
;
83 DWORD dwErrorCode
= MAXDWORD
;
85 PSPOOLSS_PRINT_PROVIDER pPrintProvider
;
89 if (cbBuf
&& !pMonitors
)
91 SetLastError(ERROR_INVALID_USER_BUFFER
);
99 // At the beginning, we have the full buffer available.
100 cbCallBuffer
= cbBuf
;
101 pCallBuffer
= pMonitors
;
103 // Loop through all Print Provider.
104 for (pEntry
= PrintProviderList
.Flink
; pEntry
!= &PrintProviderList
; pEntry
= pEntry
->Flink
)
106 pPrintProvider
= CONTAINING_RECORD(pEntry
, SPOOLSS_PRINT_PROVIDER
, Entry
);
108 // Check if this Print Provider provides an EnumMonitors function.
109 if (!pPrintProvider
->PrintProvider
.fpEnumMonitors
)
112 // Call the EnumMonitors function of this Print Provider.
115 bReturnValue
= pPrintProvider
->PrintProvider
.fpEnumMonitors(pName
, Level
, pCallBuffer
, cbCallBuffer
, &cbNeeded
, &dwReturned
);
119 dwErrorCode
= GetLastError();
122 // Add the returned counts to the total values.
123 *pcbNeeded
+= cbNeeded
;
124 *pcReturned
+= dwReturned
;
126 // Reduce the available buffer size for the next call without risking an underflow.
127 if (cbNeeded
< cbCallBuffer
)
128 cbCallBuffer
-= cbNeeded
;
132 // Advance the buffer if the caller provided it.
134 pCallBuffer
+= cbNeeded
;
136 // dwErrorCode shall not be overwritten if a previous EnumPrinters call already succeeded.
137 if (dwErrorCode
!= ERROR_SUCCESS
)
138 dwErrorCode
= GetLastError();
141 SetLastError(dwErrorCode
);
142 return (dwErrorCode
== ERROR_SUCCESS
);