- Implementation of gdi printing support. Work in progress. Losts of updates, including missing functions in the winspool spec file.

svn path=/trunk/; revision=41122
This commit is contained in:
James Tabor 2009-05-26 05:50:15 +00:00
parent 6ec8db72ea
commit bac0137f97
10 changed files with 571 additions and 93 deletions

View file

@ -16,6 +16,8 @@ extern HANDLE CurrentProcessId;
extern DWORD GDI_BatchLimit;
extern PDEVCAPS GdiDevCaps;
extern BOOL gbLpk; // Global bool LanguagePack
extern HANDLE ghSpooler;
extern RTL_CRITICAL_SECTION semLocal;
typedef INT
(CALLBACK* EMFPLAYPROC)(
@ -111,6 +113,38 @@ typedef struct _LOCALFONT
FONT_ATTR lfa[LOCALFONT_COUNT];
} LOCALFONT, *PLOCALFONT;
// sdk/winspool.h
typedef BOOL WINAPI (*ABORTPRINTER) (HANDLE);
typedef BOOL WINAPI (*CLOSEPRINTER) (HANDLE);
typedef BOOL WINAPI (*CLOSESPOOLFILEHANDLE) (HANDLE, HANDLE); // W2k8
typedef HANDLE WINAPI (*COMMITSPOOLDATA) (HANDLE,HANDLE,DWORD); // W2k8
typedef LONG WINAPI (*DOCUMENTPROPERTIESW) (HWND,HANDLE,LPWSTR,PDEVMODEW,PDEVMODEW,DWORD);
typedef BOOL WINAPI (*ENDDOCPRINTER) (HANDLE);
typedef BOOL WINAPI (*ENDPAGEPRINTER) (HANDLE);
typedef BOOL WINAPI (*GETPRINTERW) (HANDLE,DWORD,LPBYTE,DWORD,LPDWORD);
typedef BOOL WINAPI (*GETPRINTERDRIVERW) (HANDLE,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD);
typedef HANDLE WINAPI (*GETSPOOLFILEHANDLE) (HANDLE); // W2k8
typedef BOOL WINAPI (*ISVALIDDEVMODEW) (PDEVMODEW,size_t);
typedef BOOL WINAPI (*OPENPRINTERW) (LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW);
typedef BOOL WINAPI (*READPRINTER) (HANDLE,PVOID,DWORD,PDWORD);
typedef BOOL WINAPI (*RESETPRINTERW) (HANDLE,LPPRINTER_DEFAULTSW);
typedef BOOL WINAPI (*STARTDOCDLGW) (HANDLE,DOCINFOW *);
typedef DWORD WINAPI (*STARTDOCPRINTERW) (HANDLE,DWORD,PBYTE);
typedef BOOL WINAPI (*STARTPAGEPRINTER) (HANDLE);
// ddk/winsplp.h
typedef BOOL WINAPI (*SEEKPRINTER) (HANDLE,LARGE_INTEGER,PLARGE_INTEGER,DWORD,BOOL);
typedef BOOL WINAPI (*SPLREADPRINTER) (HANDLE,LPBYTE *,DWORD);
// Same as ddk/winsplp.h DriverUnloadComplete?
typedef BOOL WINAPI (*SPLDRIVERUNLOADCOMPLETE) (LPWSTR);
// Driver support:
// DrvDocumentEvent api/winddiui.h not W2k8 DocumentEventAW
typedef INT WINAPI (*DOCUMENTEVENT) (HANDLE,HDC,INT,ULONG,PVOID,ULONG,PVOID);
// DrvQueryColorProfile
typedef BOOL WINAPI (*QUERYCOLORPROFILE) (HANDLE,PDEVMODEW,ULONG,VOID*,ULONG,FLONG);
// Unknown:
typedef DWORD WINAPI (*QUERYSPOOLMODE) (HANDLE,DWORD,DWORD);
typedef DWORD WINAPI (*QUERYREMOTEFONTS) (DWORD,DWORD,DWORD);
/* FUNCTIONS *****************************************************************/
PVOID
@ -242,4 +276,7 @@ GdiGetBitmapBitsSize(BITMAPINFO *lpbmi);
VOID GdiSAPCallback(PLDC pldc);
int FASTCALL DocumentEventEx(PVOID,HANDLE,HDC,int,ULONG,PVOID,ULONG,PVOID);
BOOL FASTCALL LoadTheSpoolerDrv(VOID);
/* EOF */

View file

@ -19,6 +19,8 @@
#include <winddi.h>
#include <d3dnthal.h>
#include <prntfont.h>
#include <winddiui.h>
#include <winspool.h>
#include <pseh/pseh2.h>

View file

@ -14,6 +14,7 @@ BOOL SetStockObjects = FALSE;
PDEVCAPS GdiDevCaps = NULL;
PGDIHANDLECACHE GdiHandleCache = NULL;
BOOL gbLpk = FALSE;
RTL_CRITICAL_SECTION semLocal;
/*
* GDI32.DLL does have an entry point for disable threadlibrarycall,. The initialization is done by a call
@ -52,6 +53,7 @@ GdiProcessSetup (VOID)
CurrentProcessId = NtCurrentTeb()->ClientId.UniqueProcess;
GDI_BatchLimit = (DWORD) NtCurrentTeb()->ProcessEnvironmentBlock->GdiDCAttributeList;
GdiHandleCache = (PGDIHANDLECACHE)NtCurrentTeb()->ProcessEnvironmentBlock->GdiHandleBuffer;
RtlInitializeCriticalSection(&semLocal);
}

View file

@ -20,6 +20,15 @@ IntCreateDICW ( LPCWSTR lpwszDriver,
HANDLE hspool = NULL;
if ( !ghSpooler && !LoadTheSpoolerDrv())
{
DPRINT1("WinSpooler.Drv Did not load!\n");
}
else
{
DPRINT("WinSpooler.Drv Loaded! hMod -> 0x%x\n", ghSpooler);
}
if ((!lpwszDevice) && (!lpwszDriver))
{
Default = FALSE; // Ask Win32k to set Default device.

View file

@ -1,8 +1,230 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS Kernel
* PURPOSE: GDI Printing Support
* FILE: dll/win32/gdi32/objects/printdrv.c
* PROGRAMER:
*
*/
// For the wine code:
/*
* Implementation of some printer driver bits
*
* Copyright 1996 John Harvey
* Copyright 1998 Huw Davies
* Copyright 1998 Andreas Mohr
* Copyright 1999 Klaas van Gend
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#include "precomp.h"
#define NDEBUG
#include <debug.h>
/* GLOBALS *******************************************************************/
HANDLE ghSpooler = NULL;
static ABORTPRINTER fpAbortPrinter;
static CLOSEPRINTER fpClosePrinter;
static CLOSESPOOLFILEHANDLE fpCloseSpoolFileHandle;
static COMMITSPOOLDATA fpCommitSpoolData;
//static fpConnectToLd64In32Server;
static DOCUMENTEVENT fpDocumentEvent;
static DOCUMENTPROPERTIESW fpDocumentPropertiesW;
static ENDDOCPRINTER fpEndDocPrinter;
static ENDPAGEPRINTER fpEndPagePrinter;
static GETSPOOLFILEHANDLE fpGetSpoolFileHandle;
static GETPRINTERW fpGetPrinterW;
static GETPRINTERDRIVERW fpGetPrinterDriverW;
static ISVALIDDEVMODEW fpIsValidDevmodeW;
static OPENPRINTERW fpOpenPrinterW;
static QUERYSPOOLMODE fpQuerySpoolMode;
static QUERYREMOTEFONTS fpQueryRemoteFonts;
static QUERYCOLORPROFILE fpQueryColorProfile;
static READPRINTER fpReadPrinter;
static RESETPRINTERW fpResetPrinterW;
static SEEKPRINTER fpSeekPrinter;
static SPLDRIVERUNLOADCOMPLETE fpSplDriverUnloadComplete;
static SPLREADPRINTER fpSplReadPrinter;
static STARTDOCDLGW fpStartDocDlgW;
static STARTDOCPRINTERW fpStartDocPrinterW;
static STARTPAGEPRINTER fpStartPagePrinter;
/* PRIVATE FUNCTIONS *********************************************************/
static
int
FASTCALL
IntEndPage(
HDC hdc,
BOOL Form
)
{
PLDC pldc;
int Ret = SP_ERROR;
ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE)
{
SetLastError(ERROR_INVALID_HANDLE);
return SP_ERROR;
}
pldc = GdiGetLDC(hdc);
if ( !pldc )
{
SetLastError(ERROR_INVALID_HANDLE);
return SP_ERROR;
}
return Ret;
}
/* FUNCTIONS *****************************************************************/
int
FASTCALL
DocumentEventEx(
PVOID pvUMPDev,
HANDLE hPrinter,
HDC hdc,
int iEsc,
ULONG cbIn,
PVOID pvIn,
ULONG cbOut,
PVOID pvOut
)
{
return fpDocumentEvent(hPrinter,hdc,iEsc,cbIn,pvIn,cbOut,pvOut);
}
BOOL
FASTCALL
EndDocPrinterEx(
PVOID pvUMPDev,
HANDLE hPrinter
)
{
return fpEndDocPrinter(hPrinter);
}
BOOL
FASTCALL
EndPagePrinterEx(
PVOID pvUMPDev,
HANDLE hPrinter
)
{
return fpEndPagePrinter(hPrinter);
}
BOOL
FASTCALL
LoadTheSpoolerDrv(VOID)
{
HMODULE hModWinSpoolDrv;
if ( !ghSpooler )
{
RtlEnterCriticalSection(&semLocal);
hModWinSpoolDrv = LoadLibraryW(L"WINSPOOL.DRV");
if (hModWinSpoolDrv)
{
fpAbortPrinter = GetProcAddress(hModWinSpoolDrv, "AbortPrinter");
fpClosePrinter = GetProcAddress(hModWinSpoolDrv, "ClosePrinter");
fpCloseSpoolFileHandle = GetProcAddress(hModWinSpoolDrv, "CloseSpoolFileHandle");
fpCommitSpoolData = (PVOID)GetProcAddress(hModWinSpoolDrv, "CommitSpoolData");
// fpConnectToLd64In32Server = GetProcAddress(hModWinSpoolDrv, (LPCSTR)224);
fpDocumentEvent = (PVOID)GetProcAddress(hModWinSpoolDrv,"DocumentEvent");
fpDocumentPropertiesW = (PVOID)GetProcAddress(hModWinSpoolDrv, "DocumentPropertiesW");
fpEndDocPrinter = GetProcAddress(hModWinSpoolDrv, "EndDocPrinter");
fpEndPagePrinter = GetProcAddress(hModWinSpoolDrv, "EndPagePrinter");
fpGetPrinterW = GetProcAddress( hModWinSpoolDrv,"GetPrinterW");
fpGetPrinterDriverW = GetProcAddress(hModWinSpoolDrv,"GetPrinterDriverW");
fpGetSpoolFileHandle = (PVOID)GetProcAddress(hModWinSpoolDrv, "GetSpoolFileHandle");
fpIsValidDevmodeW = GetProcAddress(hModWinSpoolDrv, "IsValidDevmodeW");
fpOpenPrinterW = GetProcAddress(hModWinSpoolDrv, "OpenPrinterW");
fpQueryColorProfile = GetProcAddress(hModWinSpoolDrv,"QueryColorProfile");
fpQueryRemoteFonts = (PVOID)GetProcAddress(hModWinSpoolDrv, "QueryRemoteFonts");
fpQuerySpoolMode = (PVOID)GetProcAddress(hModWinSpoolDrv, "QuerySpoolMode");
fpReadPrinter = GetProcAddress(hModWinSpoolDrv, "ReadPrinter");
fpResetPrinterW = GetProcAddress(hModWinSpoolDrv, "ResetPrinterW");
fpSeekPrinter = GetProcAddress(hModWinSpoolDrv, "SeekPrinter");
fpSplDriverUnloadComplete = GetProcAddress(hModWinSpoolDrv, "SplDriverUnloadComplete");
fpSplReadPrinter = GetProcAddress(hModWinSpoolDrv, (LPCSTR)205);
fpStartDocDlgW = GetProcAddress(hModWinSpoolDrv, "StartDocDlgW");
fpStartDocPrinterW = (PVOID)GetProcAddress(hModWinSpoolDrv, "StartDocPrinterW");
fpStartPagePrinter = GetProcAddress(hModWinSpoolDrv, "StartPagePrinter");
if ( !fpAbortPrinter ||
!fpClosePrinter ||
!fpCloseSpoolFileHandle ||
!fpCommitSpoolData ||
!fpDocumentEvent ||
!fpDocumentPropertiesW ||
!fpEndDocPrinter ||
!fpEndPagePrinter ||
!fpGetPrinterW ||
!fpGetPrinterDriverW ||
!fpGetSpoolFileHandle ||
!fpIsValidDevmodeW ||
!fpOpenPrinterW ||
!fpQueryColorProfile ||
!fpQueryRemoteFonts ||
!fpQuerySpoolMode ||
!fpReadPrinter ||
!fpResetPrinterW ||
!fpSeekPrinter ||
!fpSplDriverUnloadComplete ||
!fpSplReadPrinter ||
!fpStartDocDlgW ||
!fpStartDocPrinterW ||
!fpStartPagePrinter )
{
FreeLibrary(hModWinSpoolDrv);
hModWinSpoolDrv = NULL;
}
ghSpooler = hModWinSpoolDrv;
}
RtlLeaveCriticalSection(&semLocal);
}
else
return TRUE;
if ( !ghSpooler ) SetLastError(ERROR_NOT_ENOUGH_MEMORY);
return (ghSpooler != NULL);
}
BOOL
FASTCALL
StartPagePrinterEx(
PVOID pvUMPDev,
HANDLE hPrinter
)
{
return fpStartPagePrinter(hPrinter);
}
/* SYSCALLS ******************************************************************/
/*
* @unimplemented
*/
@ -21,16 +243,18 @@ AbortDoc(
SetLastError(ERROR_INVALID_HANDLE);
return SP_ERROR;
}
pldc = GdiGetLDC(hdc);
if ( !pldc )
{
SetLastError(ERROR_INVALID_HANDLE);
return SP_ERROR;
}
if ( !(pldc->Flags & LDC_INIT_DOCUMENT) ) return 1;
/* winspool:DocumentEvent printer driver */
DocumentEventEx(NULL, pldc->hPrinter, hdc, DOCUMENTEVENT_ABORTDOC, 0, NULL, 0, NULL);
((PW32CLIENTINFO)NtCurrentTeb()->Win32ClientInfo)->cSpins = 0;
if ( pldc->Flags & LDC_META_PRINT)
@ -42,13 +266,12 @@ AbortDoc(
if (NtGdiAbortDoc(hdc))
{
/* winspool:AbortPrinter driver */
Ret = 1;
if (fpAbortPrinter(pldc->hPrinter)) Ret = 1;
}
else
Ret = SP_ERROR;
pldc->Flags &= ~(LDC_META_PRINT|LDC_STARTPAGE|LDC_INIT_PAGE|LDC_INIT_DOCUMENT|LDC_SAPCALLBACK);
pldc->Flags &= ~(LDC_ATENDPAGE|LDC_META_PRINT|LDC_STARTPAGE|LDC_INIT_PAGE|LDC_INIT_DOCUMENT|LDC_SAPCALLBACK);
return Ret;
}
@ -62,64 +285,66 @@ EndDoc(
HDC hdc
)
{
PLDC pldc;
int Ret = SP_ERROR;
ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE)
{
SetLastError(ERROR_INVALID_HANDLE);
return SP_ERROR;
}
pldc = GdiGetLDC(hdc);
if ( !pldc )
{
SetLastError(ERROR_INVALID_HANDLE);
return SP_ERROR;
}
if (pldc->Flags & LDC_META_PRINT)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
return Ret;
}
if (pldc->Flags & LDC_INIT_DOCUMENT)
{
BOOL Good;
if (pldc->Flags & LDC_ENDPAGE_MFDC) EndPage(hdc);
DocumentEventEx(NULL, pldc->hPrinter, hdc, DOCUMENTEVENT_ENDDOC, 0, NULL, 0, NULL);
((PW32CLIENTINFO)NtCurrentTeb()->Win32ClientInfo)->cSpins = 0;
Good = NtGdiEndDoc(hdc);
if (Good)
Good = EndDocPrinterEx(NULL,pldc->hPrinter);
if (Good)
{
DocumentEventEx(NULL, pldc->hPrinter, hdc, DOCUMENTEVENT_ENDDOCPOST, 0, NULL, 0, NULL);
Ret = 1;
}
pldc->Flags &= ~(LDC_ATENDPAGE|LDC_STARTPAGE|LDC_INIT_DOCUMENT|LDC_SAPCALLBACK);
}
return Ret;
}
/*
* @unimplemented
*/
HANDLE
WINAPI
GdiGetSpoolFileHandle(LPWSTR pwszPrinterName,
LPDEVMODEW pDevmode,
LPWSTR pwszDocName)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}
/*
* @unimplemented
*/
BOOL
WINAPI
GdiDeleteSpoolFileHandle(HANDLE SpoolFileHandle)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}
/*
* @unimplemented
*/
DWORD
WINAPI
GdiGetPageCount(HANDLE SpoolFileHandle)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}
/*
* @unimplemented
* @implemented
*/
int
WINAPI
EndFormPage(HDC hdc)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
return IntEndPage(hdc,TRUE);
}
/*
* @unimplemented
* @implemented
*/
int
WINAPI
@ -127,9 +352,138 @@ EndPage(
HDC hdc
)
{
return IntEndPage(hdc,FALSE);
}
/*
* @unimplemented
*/
int
WINAPI
StartDocW(
HDC hdc,
CONST DOCINFOW *lpdi
)
{
PLDC pldc;
ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE)
{
SetLastError(ERROR_INVALID_HANDLE);
return SP_ERROR;
}
pldc = GdiGetLDC(hdc);
if ( !pldc )
{
SetLastError(ERROR_INVALID_HANDLE);
return SP_ERROR;
}
return NtGdiStartDoc ( hdc, (DOCINFOW *)lpdi, NULL, 0);
}
/*
* @implemented
*/
int
WINAPI
StartDocA(
HDC hdc,
CONST DOCINFOA *lpdi
)
{
LPWSTR szDocName = NULL, szOutput = NULL, szDatatype = NULL;
DOCINFOW docW;
INT ret, len;
docW.cbSize = lpdi->cbSize;
if (lpdi->lpszDocName)
{
len = MultiByteToWideChar(CP_ACP,0,lpdi->lpszDocName,-1,NULL,0);
szDocName = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP,0,lpdi->lpszDocName,-1,szDocName,len);
}
if (lpdi->lpszOutput)
{
len = MultiByteToWideChar(CP_ACP,0,lpdi->lpszOutput,-1,NULL,0);
szOutput = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP,0,lpdi->lpszOutput,-1,szOutput,len);
}
if (lpdi->lpszDatatype)
{
len = MultiByteToWideChar(CP_ACP,0,lpdi->lpszDatatype,-1,NULL,0);
szDatatype = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
MultiByteToWideChar(CP_ACP,0,lpdi->lpszDatatype,-1,szDatatype,len);
}
docW.lpszDocName = szDocName;
docW.lpszOutput = szOutput;
docW.lpszDatatype = szDatatype;
docW.fwType = lpdi->fwType;
ret = StartDocW(hdc, &docW);
HeapFree( GetProcessHeap(), 0, szDocName );
HeapFree( GetProcessHeap(), 0, szOutput );
HeapFree( GetProcessHeap(), 0, szDatatype );
return ret;
}
/*
* @unimplemented
*/
int
WINAPI
StartPage(
HDC hdc
)
{
PLDC pldc;
ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE)
{
SetLastError(ERROR_INVALID_HANDLE);
return SP_ERROR;
}
pldc = GdiGetLDC(hdc);
if ( !pldc )
{
SetLastError(ERROR_INVALID_HANDLE);
return SP_ERROR;
}
if (pldc->Flags & LDC_META_PRINT)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
return SP_ERROR;
}
pldc->Flags &= ~(LDC_STARTPAGE);
if (pldc->Flags & LDC_ENDPAGE_MFDC) return 1;
if (DocumentEventEx(NULL, pldc->hPrinter, hdc, DOCUMENTEVENT_STARTPAGE, 0, NULL, 0, NULL) != SP_ERROR)
{
pldc->Flags |= LDC_INIT_PAGE;
((PW32CLIENTINFO)NtCurrentTeb()->Win32ClientInfo)->cSpins = 0;
if (StartPagePrinterEx(NULL, pldc->hPrinter))
{
if (NtGdiStartPage(hdc)) return 1;
}
pldc->Flags &= ~(LDC_INIT_PAGE);
EndDoc(hdc);
SetLastError(ERROR_INVALID_HANDLE);
}
return SP_ERROR;
}
/*
@ -172,45 +526,3 @@ SetAbortProc(
return SP_ERROR;
}
/*
* @unimplemented
*/
int
WINAPI
StartDocW(
HDC hdc,
CONST DOCINFOW *a1
)
{
return NtGdiStartDoc ( hdc, (DOCINFOW *)a1, NULL, 0);
}
/*
* @unimplemented
*/
int
WINAPI
StartDocA(
HDC hdc,
CONST DOCINFOA *lpdi
)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}
/*
* @unimplemented
*/
int
WINAPI
StartPage(
HDC hdc
)
{
UNIMPLEMENTED;
SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
return 0;
}

View file

@ -65,11 +65,13 @@
@ stdcall AdvancedDocumentPropertiesW(long long wstr ptr ptr)
@ stub AdvancedSetupDialog
@ stdcall ClosePrinter(long)
@ stub CloseSpoolFileHandle
@ stdcall ConfigurePortA(str long str)
@ stdcall ConfigurePortW(wstr long wstr)
@ stdcall ConnectToPrinterDlg(long long)
@ stub ConvertAnsiDevModeToUnicodeDevMode
@ stub ConvertUnicodeDevModeToAnsiDevMode
@ stub CommitSpoolData
@ stub CreatePrinterIC
@ stub DEVICECAPABILITIES
@ stub DEVICEMODE
@ -147,16 +149,23 @@
@ stdcall GetPrinterW(long long ptr long ptr)
@ stdcall GetPrintProcessorDirectoryA(str str long ptr long ptr)
@ stdcall GetPrintProcessorDirectoryW(wstr wstr long ptr long ptr)
@ stub GetSpoolFileHandle
@ stub IsValidDevmodeA
@ stub IsValidDevmodeW
@ stdcall OpenPrinterA(str ptr ptr)
@ stdcall OpenPrinterW(wstr ptr ptr)
@ stub PlayGdiScriptOnPrinterIC
@ stdcall PrinterMessageBoxA(ptr long ptr str str long)
@ stdcall PrinterMessageBoxW(ptr long ptr wstr wstr long)
@ stdcall PrinterProperties(long long)
@ stub QueryColorProfile
@ stub QuerySpoolMode
@ stub QueryRemoteFonts
@ stdcall ReadPrinter(long ptr long ptr)
@ stdcall ResetPrinterA(long ptr)
@ stdcall ResetPrinterW(long ptr)
@ stdcall ScheduleJob(long long)
@ stub SeekPrinter
@ stub SetAllocFailCount
@ stdcall SetFormA(long str long ptr)
@ stdcall SetFormW(long wstr long ptr)
@ -168,9 +177,12 @@
@ stdcall SetPrinterDataExW(long wstr wstr long ptr long)
@ stdcall SetPrinterDataW(long wstr long ptr long)
@ stdcall SetPrinterW(long long ptr long)
@ stub SplDriverUnloadComplete
@ stub SpoolerDevQueryPrintW
@ stdcall SpoolerInit()
@ stub SpoolerPrinterEvent
@ stub StartDocDlgA
@ stub StartDocDlgW
@ stdcall StartDocPrinterA(long long ptr)
@ stdcall StartDocPrinterW(long long ptr)
@ stdcall StartPagePrinter(long)

View file

@ -27,6 +27,51 @@
extern "C" {
#endif
#define DOCUMENTEVENT_FIRST 1
#define DOCUMENTEVENT_CREATEDCPRE 1
#define DOCUMENTEVENT_CREATEDCPOST 2
#define DOCUMENTEVENT_RESETDCPRE 3
#define DOCUMENTEVENT_RESETDCPOST 4
#define DOCUMENTEVENT_STARTDOC 5
#define DOCUMENTEVENT_STARTDOCPRE 5
#define DOCUMENTEVENT_STARTPAGE 6
#define DOCUMENTEVENT_ENDPAGE 7
#define DOCUMENTEVENT_ENDDOC 8
#define DOCUMENTEVENT_ENDDOCPRE 8
#define DOCUMENTEVENT_ABORTDOC 9
#define DOCUMENTEVENT_DELETEDC 10
#define DOCUMENTEVENT_ESCAPE 11
#define DOCUMENTEVENT_ENDDOCPOST 12
#define DOCUMENTEVENT_STARTDOCPOST 13
#if (NTDDI_VERSION >= NTDDI_VISTA)
#define DOCUMENTEVENT_QUERYFILTER 14
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRE 1
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRE 2
#define DOCUMENTEVENT_XPS_ADDFIXEDPAGEEPRE 3
#define DOCUMENTEVENT_XPS_ADDFIXEDPAGEPOST 4
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPOST 5
#define DOCUMENTEVENT_XPS_CANCELJOB 6
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPRE 7
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPRE 8
#define DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPRE 9
#define DOCUMENTEVENT_XPS_ADDFIXEDPAGEPRINTTICKETPOST 10
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTPRINTTICKETPOST 11
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPRINTTICKETPOST 12
#define DOCUMENTEVENT_XPS_ADDFIXEDDOCUMENTSEQUENCEPOST 13
#define DOCUMENTEVENT_LAST 15
#elif (NTDDI_VERSION >= NTDDI_WINXP)
#define DOCUMENTEVENT_QUERYFILTER 14
#define DOCUMENTEVENT_LAST 15
#else
#define DOCUMENTEVENT_LAST 14
#endif
#define DOCUMENTEVENT_SPOOLED 0x10000
#define DOCUMENTEVENT_SUCCESS 1
#define DOCUMENTEVENT_UNSUPPORTED 0
#define DOCUMENTEVENT_FAILURE -1
int WINAPI DrvDocumentEvent(HANDLE,HDC,int,ULONG,PVOID,ULONG,PVOID);
#define DRIVER_EVENT_INITIALIZE 1
#define DRIVER_EVENT_DELETE 2

View file

@ -845,6 +845,10 @@ BOOL WINAPI GetPrinterDriverDirectoryA(LPSTR,LPSTR,DWORD,LPBYTE,DWORD,LPDWORD);
BOOL WINAPI GetPrinterDriverDirectoryW(LPWSTR,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD);
BOOL WINAPI GetPrintProcessorDirectoryA(LPSTR,LPSTR,DWORD,LPBYTE,DWORD,LPDWORD);
BOOL WINAPI GetPrintProcessorDirectoryW(LPWSTR,LPWSTR,DWORD,LPBYTE,DWORD,LPDWORD);
#if NTDDI_VERSION >= NTDDI_WINXPSP2
BOOL WINAPI IsValidDevmodeA(PDEVMODEA,size_t);
BOOL WINAPI IsValidDevmodeW(PDEVMODEW,size_t);
#endif
BOOL WINAPI OpenPrinterA(LPSTR,PHANDLE,LPPRINTER_DEFAULTSA);
BOOL WINAPI OpenPrinterW(LPWSTR,PHANDLE,LPPRINTER_DEFAULTSW);
DWORD WINAPI PrinterMessageBoxA(HANDLE,DWORD,HWND,LPSTR,LPSTR,DWORD);
@ -934,6 +938,7 @@ typedef LPPROVIDOR_INFO_2W LPPROVIDOR_INFO_2;
#define GetPrinterDriver GetPrinterDriverW
#define GetPrinterDriverDirectory GetPrinterDriverDirectoryW
#define GetPrintProcessorDirectory GetPrintProcessorDirectoryW
#define IsValidDevmode IsValidDevmodeW
#define OpenPrinter OpenPrinterW
#define PrinterMessageBox PrinterMessageBoxW
#define ResetPrinter ResetPrinterW
@ -1003,6 +1008,7 @@ typedef PRINTER_DEFAULTSA PRINTER_DEFAULTS,*PPRINTER_DEFAULTS,*LPPRINTER_DEFAULT
#define GetPrinterDriver GetPrinterDriverA
#define GetPrinterDriverDirectory GetPrinterDriverDirectoryA
#define GetPrintProcessorDirectory GetPrintProcessorDirectoryA
#define IsValidDevmode IsValidDevmodeA
#define OpenPrinter OpenPrinterA
#define PrinterMessageBox PrinterMessageBoxA
#define ResetPrinter ResetPrinterA

View file

@ -185,6 +185,8 @@
#define LDC_META_PRINT 0x00020000
#define LDC_INFODC 0x01000000 /* If CreateIC was passed. */
#define LDC_DEVCAPS 0x02000000
#define LDC_ATENDPAGE 0x10000000
#define LDC_ENDPAGE_MFDC 0x80000000
/* DC_ATTR Xform Flags */
#define METAFILE_TO_WORLD_IDENTITY 0x00000001

View file

@ -0,0 +1,51 @@
/* Definitions for printing
*
* Copyright 1998 Huw Davies, Andreas Mohr
*
* Portions Copyright (c) 1999 Corel Corporation
* (Paul Quinn, Albert Den Haan)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __WINE_WINSPOOL_H
#define __WINE_WINSPOOL_H
#ifdef __cplusplus
extern "C" {
#endif
/*
* Compatibility header
*/
#if !defined(_MSC_VER)
#include_next "winspool.h"
#endif
/* DECLARATIONS */
LONG WINAPI ExtDeviceMode( HWND hWnd, HANDLE hInst, LPDEVMODEA pDevModeOutput,
LPSTR pDeviceName, LPSTR pPort, LPDEVMODEA pDevModeInput, LPSTR pProfile,
DWORD fMode);
LPSTR WINAPI StartDocDlgA(HANDLE hPrinter, DOCINFOA *doc);
LPWSTR WINAPI StartDocDlgW(HANDLE hPrinter, DOCINFOW *doc);
#define StartDocDlg WINELIB_NAME_AW(StartDocDlg)
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* __WINE_WINSPOOL_H */