1 /*
2 * PROJECT: ReactOS Spooler API
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Functions related to Spool Files and printing
5 * COPYRIGHT: Copyright 1998-2020 ReactOS
6 */
7
8 #include "precomp.h"
9
10
11 HANDLE WINAPI
GetSpoolFileHandle(HANDLE hPrinter)12 GetSpoolFileHandle( HANDLE hPrinter )
13 {
14 DWORD dwErrorCode, cpid;
15 WINSPOOL_FILE_INFO_CONTAINER FileInfoContainer;
16 WINSPOOL_FILE_INFO_1 wsplfi;
17 PSPOOLER_HANDLE pHandle = (PSPOOLER_HANDLE)hPrinter;
18 HANDLE hHandle = NULL;
19
20 FIXME("GetSpoolFileHandle(%p)\n", hPrinter);
21
22 if ( IntProtectHandle( hPrinter, FALSE ) )
23 {
24 dwErrorCode = ERROR_INVALID_HANDLE;
25 }
26 else
27 {
28 if ( pHandle->hSpoolFileHandle != INVALID_HANDLE_VALUE )
29 {
30 hHandle = pHandle->hSpoolFileHandle;
31 }
32 else
33 {
34 cpid = GetCurrentProcessId();
35
36 FileInfoContainer.Level = 1;
37 FileInfoContainer.FileInfo.pFileInfo1 = &wsplfi;
38
39 // Do the RPC call.
40 RpcTryExcept
41 {
42 dwErrorCode = _RpcGetSpoolFileInfo2( &pHandle->hPrinter, cpid, 1, &FileInfoContainer );
43 }
44 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
45 {
46 dwErrorCode = RpcExceptionCode();
47 ERR("_RpcGetSpoolFileInfo failed with exception code %lu!\n", dwErrorCode);
48 }
49 RpcEndExcept;
50
51 if (dwErrorCode == ERROR_SUCCESS)
52 {
53 pHandle->hSpoolFileHandle = wsplfi.hSpoolFileHandle;
54 pHandle->dwOptions = wsplfi.dwOptions;
55 hHandle = pHandle->hSpoolFileHandle;
56 }
57 }
58 IntUnprotectHandle(pHandle);
59 }
60 SetLastError(dwErrorCode);
61 return hHandle;
62 }
63
64 HANDLE WINAPI
CommitSpoolData(HANDLE hPrinter,HANDLE hSpoolFile,DWORD cbCommit)65 CommitSpoolData( HANDLE hPrinter, HANDLE hSpoolFile, DWORD cbCommit )
66 {
67 DWORD dwErrorCode, cpid;
68 WINSPOOL_FILE_INFO_CONTAINER FileInfoContainer;
69 WINSPOOL_FILE_INFO_1 wsplfi;
70 PSPOOLER_HANDLE pHandle = (PSPOOLER_HANDLE)hPrinter;
71 HANDLE hHandle = INVALID_HANDLE_VALUE;
72
73 FIXME("CommitSpoolData(%p, %p, %d)\n", hPrinter,hSpoolFile,cbCommit);
74
75 if ( IntProtectHandle( hPrinter, FALSE ) )
76 {
77 return hHandle;
78 }
79
80 if ( pHandle->hSpoolFileHandle == INVALID_HANDLE_VALUE || pHandle->hSpoolFileHandle != hSpoolFile )
81 {
82 dwErrorCode = ERROR_INVALID_HANDLE;
83 }
84 else
85 {
86 cpid = GetCurrentProcessId();
87
88 FileInfoContainer.Level = 1;
89 FileInfoContainer.FileInfo.pFileInfo1 = &wsplfi;
90
91 // Do the RPC call.
92 RpcTryExcept
93 {
94 dwErrorCode = _RpcCommitSpoolData2( &pHandle->hPrinter, cpid, cbCommit, 1, &FileInfoContainer );
95 }
96 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
97 {
98 dwErrorCode = RpcExceptionCode();
99 ERR("_RpcCommitSpoolData failed with exception code %lu!\n", dwErrorCode);
100 }
101 RpcEndExcept;
102
103 if (dwErrorCode == ERROR_SUCCESS)
104 {
105 if ( wsplfi.hSpoolFileHandle != INVALID_HANDLE_VALUE )
106 {
107 CloseHandle( pHandle->hSpoolFileHandle );
108 pHandle->hSpoolFileHandle = wsplfi.hSpoolFileHandle;
109 }
110 hHandle = pHandle->hSpoolFileHandle;
111 }
112 IntUnprotectHandle(pHandle);
113 }
114 SetLastError(dwErrorCode);
115 return hHandle;
116 }
117
118 BOOL WINAPI
CloseSpoolFileHandle(HANDLE hPrinter,HANDLE hSpoolFile)119 CloseSpoolFileHandle( HANDLE hPrinter, HANDLE hSpoolFile )
120 {
121 DWORD dwErrorCode;
122 PSPOOLER_HANDLE pHandle = (PSPOOLER_HANDLE)hPrinter;
123
124 FIXME("CloseSpoolFileHandle(%p, %p)\n", hPrinter,hSpoolFile);
125
126 if ( IntProtectHandle( hPrinter, FALSE ) )
127 {
128 return FALSE;
129 }
130 if ( pHandle->hSpoolFileHandle == hSpoolFile )
131 {
132 CloseHandle( pHandle->hSpoolFileHandle );
133 pHandle->hSpoolFileHandle = INVALID_HANDLE_VALUE;
134
135 // Do the RPC call.
136 RpcTryExcept
137 {
138 dwErrorCode = _RpcCloseSpoolFileHandle( &pHandle->hPrinter );
139 }
140 RpcExcept(EXCEPTION_EXECUTE_HANDLER)
141 {
142 dwErrorCode = RpcExceptionCode();
143 ERR("_RpcloseSpoolFileHandle failed with exception code %lu!\n", dwErrorCode);
144 }
145 RpcEndExcept;
146 }
147 else
148 {
149 dwErrorCode = ERROR_INVALID_HANDLE;
150 }
151 IntUnprotectHandle(pHandle);
152 SetLastError(dwErrorCode);
153 return (dwErrorCode == ERROR_SUCCESS);
154 }
155