--- /dev/null
+/*
+ * PROJECT: ReactOS Spooler API
+ * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
+ * PURPOSE: Functions related to Spool Files and printing
+ * COPYRIGHT: Copyright 1998-2020 ReactOS
+ */
+
+#include "precomp.h"
+
+
+HANDLE WINAPI
+GetSpoolFileHandle( HANDLE hPrinter )
+{
+ DWORD dwErrorCode, cpid;
+ WINSPOOL_FILE_INFO_CONTAINER FileInfoContainer;
+ WINSPOOL_FILE_INFO_1 wsplfi;
+ PSPOOLER_HANDLE pHandle = (PSPOOLER_HANDLE)hPrinter;
+ HANDLE hHandle = NULL;
+
+ FIXME("GetSpoolFileHandle(%p)\n", hPrinter);
+
+ if ( IntProtectHandle( hPrinter, FALSE ) )
+ {
+ dwErrorCode = ERROR_INVALID_HANDLE;
+ }
+ else
+ {
+ if ( pHandle->hSpoolFileHandle != INVALID_HANDLE_VALUE )
+ {
+ hHandle = pHandle->hSpoolFileHandle;
+ }
+ else
+ {
+ cpid = GetCurrentProcessId();
+
+ FileInfoContainer.Level = 1;
+ FileInfoContainer.FileInfo.pFileInfo1 = &wsplfi;
+
+ // Do the RPC call.
+ RpcTryExcept
+ {
+ dwErrorCode = _RpcGetSpoolFileInfo2( &pHandle->hPrinter, cpid, 1, &FileInfoContainer );
+ }
+ RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+ {
+ dwErrorCode = RpcExceptionCode();
+ ERR("_RpcGetSpoolFileInfo failed with exception code %lu!\n", dwErrorCode);
+ }
+ RpcEndExcept;
+
+ if (dwErrorCode == ERROR_SUCCESS)
+ {
+ pHandle->hSpoolFileHandle = wsplfi.hSpoolFileHandle;
+ pHandle->dwOptions = wsplfi.dwOptions;
+ hHandle = pHandle->hSpoolFileHandle;
+ }
+ }
+ IntUnprotectHandle(pHandle);
+ }
+ SetLastError(dwErrorCode);
+ return hHandle;
+}
+
+HANDLE WINAPI
+CommitSpoolData( HANDLE hPrinter, HANDLE hSpoolFile, DWORD cbCommit )
+{
+ DWORD dwErrorCode, cpid;
+ WINSPOOL_FILE_INFO_CONTAINER FileInfoContainer;
+ WINSPOOL_FILE_INFO_1 wsplfi;
+ PSPOOLER_HANDLE pHandle = (PSPOOLER_HANDLE)hPrinter;
+ HANDLE hHandle = INVALID_HANDLE_VALUE;
+
+ FIXME("CommitSpoolData(%p, %p, %d)\n", hPrinter,hSpoolFile,cbCommit);
+
+ if ( IntProtectHandle( hPrinter, FALSE ) )
+ {
+ return hHandle;
+ }
+
+ if ( pHandle->hSpoolFileHandle == INVALID_HANDLE_VALUE || pHandle->hSpoolFileHandle != hSpoolFile )
+ {
+ dwErrorCode = ERROR_INVALID_HANDLE;
+ }
+ else
+ {
+ cpid = GetCurrentProcessId();
+
+ FileInfoContainer.Level = 1;
+ FileInfoContainer.FileInfo.pFileInfo1 = &wsplfi;
+
+ // Do the RPC call.
+ RpcTryExcept
+ {
+ dwErrorCode = _RpcCommitSpoolData2( &pHandle->hPrinter, cpid, cbCommit, 1, &FileInfoContainer );
+ }
+ RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+ {
+ dwErrorCode = RpcExceptionCode();
+ ERR("_RpcCommitSpoolData failed with exception code %lu!\n", dwErrorCode);
+ }
+ RpcEndExcept;
+
+ if (dwErrorCode == ERROR_SUCCESS)
+ {
+ if ( wsplfi.hSpoolFileHandle != INVALID_HANDLE_VALUE )
+ {
+ CloseHandle( pHandle->hSpoolFileHandle );
+ pHandle->hSpoolFileHandle = wsplfi.hSpoolFileHandle;
+ }
+ hHandle = pHandle->hSpoolFileHandle;
+ }
+ IntUnprotectHandle(pHandle);
+ }
+ SetLastError(dwErrorCode);
+ return hHandle;
+}
+
+BOOL WINAPI
+CloseSpoolFileHandle( HANDLE hPrinter, HANDLE hSpoolFile )
+{
+ DWORD dwErrorCode;
+ PSPOOLER_HANDLE pHandle = (PSPOOLER_HANDLE)hPrinter;
+
+ FIXME("CloseSpoolFileHandle(%p, %p)\n", hPrinter,hSpoolFile);
+
+ if ( IntProtectHandle( hPrinter, FALSE ) )
+ {
+ return FALSE;
+ }
+ if ( pHandle->hSpoolFileHandle == hSpoolFile )
+ {
+ CloseHandle( pHandle->hSpoolFileHandle );
+ pHandle->hSpoolFileHandle = INVALID_HANDLE_VALUE;
+
+ // Do the RPC call.
+ RpcTryExcept
+ {
+ dwErrorCode = _RpcCloseSpoolFileHandle( &pHandle->hPrinter );
+ }
+ RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+ {
+ dwErrorCode = RpcExceptionCode();
+ ERR("_RpcloseSpoolFileHandle failed with exception code %lu!\n", dwErrorCode);
+ }
+ RpcEndExcept;
+ }
+ else
+ {
+ dwErrorCode = ERROR_INVALID_HANDLE;
+ }
+ IntUnprotectHandle(pHandle);
+ SetLastError(dwErrorCode);
+ return (dwErrorCode == ERROR_SUCCESS);
+}