ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

printdrv.c
Go to the documentation of this file.
00001 /*
00002  *  COPYRIGHT:        See COPYING in the top level directory
00003  *  PROJECT:          ReactOS Kernel
00004  *  PURPOSE:          GDI Printing Support
00005  *  FILE:             dll/win32/gdi32/objects/printdrv.c
00006  *  PROGRAMER:
00007  *
00008  */
00009 
00010 // For the wine code:
00011 /*
00012  * Implementation of some printer driver bits
00013  *
00014  * Copyright 1996 John Harvey
00015  * Copyright 1998 Huw Davies
00016  * Copyright 1998 Andreas Mohr
00017  * Copyright 1999 Klaas van Gend
00018  *
00019  * This library is free software; you can redistribute it and/or
00020  * modify it under the terms of the GNU Lesser General Public
00021  * License as published by the Free Software Foundation; either
00022  * version 2.1 of the License, or (at your option) any later version.
00023  *
00024  * This library is distributed in the hope that it will be useful,
00025  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00026  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00027  * Lesser General Public License for more details.
00028  *
00029  * You should have received a copy of the GNU Lesser General Public
00030  * License along with this library; if not, write to the Free Software
00031  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00032  */
00033 
00034 #include "precomp.h"
00035 
00036 #define NDEBUG
00037 #include <debug.h>
00038 
00039 /* GLOBALS *******************************************************************/
00040 HANDLE ghSpooler = NULL;
00041 
00042 static ABORTPRINTER fpAbortPrinter;
00043 CLOSEPRINTER fpClosePrinter;
00044 static CLOSESPOOLFILEHANDLE fpCloseSpoolFileHandle;
00045 static COMMITSPOOLDATA fpCommitSpoolData;
00046 //static fpConnectToLd64In32Server;
00047 static DOCUMENTEVENT fpDocumentEvent;
00048 static DOCUMENTPROPERTIESW fpDocumentPropertiesW;
00049 static ENDDOCPRINTER fpEndDocPrinter;
00050 static ENDPAGEPRINTER fpEndPagePrinter;
00051 static GETSPOOLFILEHANDLE fpGetSpoolFileHandle;
00052 static GETPRINTERW fpGetPrinterW;
00053 static GETPRINTERDRIVERW fpGetPrinterDriverW;
00054 static ISVALIDDEVMODEW fpIsValidDevmodeW;
00055 OPENPRINTERW fpOpenPrinterW;
00056 static QUERYSPOOLMODE fpQuerySpoolMode;
00057 static QUERYREMOTEFONTS fpQueryRemoteFonts;
00058 static QUERYCOLORPROFILE fpQueryColorProfile;
00059 static READPRINTER fpReadPrinter;
00060 static RESETPRINTERW fpResetPrinterW;
00061 static SEEKPRINTER fpSeekPrinter;
00062 static SPLDRIVERUNLOADCOMPLETE fpSplDriverUnloadComplete;
00063 static SPLREADPRINTER fpSplReadPrinter;
00064 static STARTDOCDLGW fpStartDocDlgW;
00065 static STARTDOCPRINTERW fpStartDocPrinterW;
00066 static STARTPAGEPRINTER fpStartPagePrinter;
00067 
00068 /* PRIVATE FUNCTIONS *********************************************************/
00069 
00070 static
00071 int
00072 FASTCALL
00073 IntEndPage(
00074     HDC hdc,
00075     BOOL Form
00076 )
00077 {
00078     PLDC pldc;
00079     int Ret = SP_ERROR;
00080     ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
00081 
00082     if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE)
00083     {
00084         SetLastError(ERROR_INVALID_HANDLE);
00085         return SP_ERROR;
00086     }
00087 
00088     pldc = GdiGetLDC(hdc);
00089     if ( !pldc )
00090     {
00091         SetLastError(ERROR_INVALID_HANDLE);
00092         return SP_ERROR;
00093     }
00094 
00095     if (pldc->Flags & LDC_ATENDPAGE) return 1;
00096 
00097     if (pldc->Flags & LDC_META_PRINT)
00098     {
00099         if ( Form )
00100         {
00101             // Do MF EndPageForm
00102         }
00103         else
00104         {
00105             // Do MF EndPage
00106         }
00107         return Ret;
00108     }
00109 
00110     if (pldc->Flags & LDC_KILL_DOCUMENT || pldc->Flags & LDC_INIT_PAGE)
00111     {
00112         SetLastError(ERROR_INVALID_PARAMETER);
00113         return SP_ERROR;
00114     }
00115 
00116     if (pldc->Flags & LDC_SAPCALLBACK) GdiSAPCallback(pldc);
00117 
00118     pldc->Flags &= ~LDC_INIT_PAGE;
00119 
00120     DocumentEventEx(NULL, pldc->hPrinter, hdc, DOCUMENTEVENT_ENDPAGE, 0, NULL, 0, NULL);
00121 
00122     ((PW32CLIENTINFO)NtCurrentTeb()->Win32ClientInfo)->cSpins = 0;
00123 
00124     if ( NtGdiEndPage(hdc) )
00125     {
00126         BOOL Good;
00127 //      if (pldc->pUMPDev)
00128         Good = EndPagePrinterEx(NULL,pldc->hPrinter);
00129 
00130         if (Good) pldc->Flags |= LDC_STARTPAGE;
00131         Ret = 1;
00132     }
00133     else
00134         SetLastError(ERROR_INVALID_PARAMETER);
00135     return Ret;
00136 }
00137 
00138 /* FUNCTIONS *****************************************************************/
00139 
00140 BOOL
00141 FASTCALL
00142 AbortPrinterEx(
00143     PVOID   pvUMPDev,
00144     HANDLE  hPrinter
00145 )
00146 {
00147     return fpAbortPrinter(hPrinter);
00148 }
00149 
00150 int
00151 FASTCALL
00152 DocumentEventEx(
00153     PVOID   pvUMPDev,
00154     HANDLE  hPrinter,
00155     HDC     hdc,
00156     int     iEsc,
00157     ULONG   cbIn,
00158     PVOID   pvIn,
00159     ULONG   cbOut,
00160     PVOID   pvOut
00161 )
00162 {
00163     return fpDocumentEvent(hPrinter,hdc,iEsc,cbIn,pvIn,cbOut,pvOut);
00164 }
00165 
00166 BOOL
00167 FASTCALL
00168 EndDocPrinterEx(
00169     PVOID   pvUMPDev,
00170     HANDLE  hPrinter
00171 )
00172 {
00173     return fpEndDocPrinter(hPrinter);
00174 }
00175 
00176 BOOL
00177 FASTCALL
00178 EndPagePrinterEx(
00179     PVOID   pvUMPDev,
00180     HANDLE  hPrinter
00181 )
00182 {
00183     return fpEndPagePrinter(hPrinter);
00184 }
00185 
00186 BOOL
00187 FASTCALL
00188 LoadTheSpoolerDrv(VOID)
00189 {
00190     HMODULE hModWinSpoolDrv;
00191 
00192     if ( !ghSpooler )
00193     {
00194         RtlEnterCriticalSection(&semLocal);
00195 
00196         hModWinSpoolDrv = LoadLibraryW(L"WINSPOOL.DRV");
00197 
00198         if (hModWinSpoolDrv)
00199         {
00200             fpAbortPrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "AbortPrinter");
00201             fpClosePrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "ClosePrinter");
00202             fpCloseSpoolFileHandle = (PVOID)GetProcAddress(hModWinSpoolDrv, "CloseSpoolFileHandle");
00203             fpCommitSpoolData = (PVOID)GetProcAddress(hModWinSpoolDrv, "CommitSpoolData");
00204             // fpConnectToLd64In32Server = (PVOID)GetProcAddress(hModWinSpoolDrv, (LPCSTR)224);
00205             fpDocumentEvent = (PVOID)GetProcAddress(hModWinSpoolDrv,"DocumentEvent");
00206             fpDocumentPropertiesW = (PVOID)GetProcAddress(hModWinSpoolDrv, "DocumentPropertiesW");
00207             fpEndDocPrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "EndDocPrinter");
00208             fpEndPagePrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "EndPagePrinter");
00209             fpGetPrinterW = (PVOID)GetProcAddress( hModWinSpoolDrv,"GetPrinterW");
00210             fpGetPrinterDriverW = (PVOID)GetProcAddress(hModWinSpoolDrv,"GetPrinterDriverW");
00211             fpGetSpoolFileHandle = (PVOID)GetProcAddress(hModWinSpoolDrv, "GetSpoolFileHandle");
00212             fpIsValidDevmodeW = (PVOID)GetProcAddress(hModWinSpoolDrv, "IsValidDevmodeW");
00213             fpOpenPrinterW = (PVOID)GetProcAddress(hModWinSpoolDrv, "OpenPrinterW");
00214             fpQueryColorProfile = (PVOID)GetProcAddress(hModWinSpoolDrv,"QueryColorProfile");
00215             fpQueryRemoteFonts = (PVOID)GetProcAddress(hModWinSpoolDrv, "QueryRemoteFonts");
00216             fpQuerySpoolMode = (PVOID)GetProcAddress(hModWinSpoolDrv, "QuerySpoolMode");
00217             fpReadPrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "ReadPrinter");
00218             fpResetPrinterW = (PVOID)GetProcAddress(hModWinSpoolDrv, "ResetPrinterW");
00219             fpSeekPrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "SeekPrinter");
00220             fpSplDriverUnloadComplete = (PVOID)GetProcAddress(hModWinSpoolDrv, "SplDriverUnloadComplete");
00221             fpSplReadPrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, (LPCSTR)205);
00222             fpStartDocDlgW = (PVOID)GetProcAddress(hModWinSpoolDrv, "StartDocDlgW");
00223             fpStartDocPrinterW = (PVOID)GetProcAddress(hModWinSpoolDrv, "StartDocPrinterW");
00224             fpStartPagePrinter = (PVOID)GetProcAddress(hModWinSpoolDrv, "StartPagePrinter");
00225 
00226             if ( !fpAbortPrinter ||
00227                     !fpClosePrinter ||
00228                     !fpCloseSpoolFileHandle ||
00229                     !fpCommitSpoolData ||
00230                     !fpDocumentEvent ||
00231                     !fpDocumentPropertiesW ||
00232                     !fpEndDocPrinter ||
00233                     !fpEndPagePrinter ||
00234                     !fpGetPrinterW ||
00235                     !fpGetPrinterDriverW ||
00236                     !fpGetSpoolFileHandle ||
00237                     !fpIsValidDevmodeW ||
00238                     !fpOpenPrinterW ||
00239                     !fpQueryColorProfile ||
00240                     !fpQueryRemoteFonts ||
00241                     !fpQuerySpoolMode ||
00242                     !fpReadPrinter ||
00243                     !fpResetPrinterW ||
00244                     !fpSeekPrinter ||
00245                     !fpSplDriverUnloadComplete ||
00246                     !fpSplReadPrinter ||
00247                     !fpStartDocDlgW ||
00248                     !fpStartDocPrinterW ||
00249                     !fpStartPagePrinter )
00250             {
00251                 FreeLibrary(hModWinSpoolDrv);
00252                 hModWinSpoolDrv = NULL;
00253             }
00254             ghSpooler = hModWinSpoolDrv;
00255         }
00256         RtlLeaveCriticalSection(&semLocal);
00257     }
00258     else
00259         return TRUE;
00260 
00261     if ( !ghSpooler ) SetLastError(ERROR_NOT_ENOUGH_MEMORY);
00262 
00263     return (ghSpooler != NULL);
00264 }
00265 
00266 /*
00267   Note from msdn:
00268 
00269    The sequence for a print job is as follows:
00270 
00271    1. To begin a print job, call StartDocPrinter.
00272    2. To begin each page, call StartPagePrinter.
00273    3. To write data to a page, call WritePrinter.
00274    4. To end each page, call EndPagePrinter.
00275    5. Repeat 2, 3, and 4 for as many pages as necessary.
00276    6. To end the print job, call EndDocPrinter.
00277 
00278  */
00279 DWORD
00280 FASTCALL
00281 StartDocPrinterWEx(
00282     PVOID   pvUMPDev,
00283     HANDLE  hPrinter,
00284     DWORD   Level,
00285     LPBYTE  pDocInfo
00286 )
00287 {
00288     return fpStartDocPrinterW(hPrinter,Level,pDocInfo);
00289 }
00290 
00291 BOOL
00292 FASTCALL
00293 StartPagePrinterEx(
00294     PVOID   pvUMPDev,
00295     HANDLE  hPrinter
00296 )
00297 {
00298     return fpStartPagePrinter(hPrinter);
00299 }
00300 
00301 /* SYSCALLS ******************************************************************/
00302 
00303 /*
00304  * @unimplemented
00305  */
00306 int
00307 WINAPI
00308 AbortDoc(
00309     HDC hdc
00310 )
00311 {
00312     PLDC pldc;
00313     int Ret = SP_ERROR;
00314     ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
00315 
00316     if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE)
00317     {
00318         SetLastError(ERROR_INVALID_HANDLE);
00319         return SP_ERROR;
00320     }
00321 
00322     pldc = GdiGetLDC(hdc);
00323     if ( !pldc )
00324     {
00325         SetLastError(ERROR_INVALID_HANDLE);
00326         return SP_ERROR;
00327     }
00328 
00329     if ( !(pldc->Flags & LDC_INIT_DOCUMENT) ) return 1;
00330 
00331     DocumentEventEx(NULL, pldc->hPrinter, hdc, DOCUMENTEVENT_ABORTDOC, 0, NULL, 0, NULL);
00332 
00333     ((PW32CLIENTINFO)NtCurrentTeb()->Win32ClientInfo)->cSpins = 0;
00334 
00335     if ( pldc->Flags & LDC_META_PRINT)
00336     {
00337         UNIMPLEMENTED;
00338         SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00339         return Ret;
00340     }
00341 
00342     if (NtGdiAbortDoc(hdc))
00343     {
00344         if (fpAbortPrinter(pldc->hPrinter)) Ret = 1;
00345     }
00346     else
00347         Ret = SP_ERROR;
00348 
00349     pldc->Flags &= ~(LDC_ATENDPAGE|LDC_META_PRINT|LDC_STARTPAGE|LDC_INIT_PAGE|LDC_INIT_DOCUMENT|LDC_SAPCALLBACK);
00350 
00351     return Ret;
00352 }
00353 
00354 /*
00355  * @unimplemented
00356  */
00357 int
00358 WINAPI
00359 EndDoc(
00360     HDC hdc
00361 )
00362 {
00363     PLDC pldc;
00364     int Ret = SP_ERROR;
00365     ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
00366 
00367     if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE)
00368     {
00369         SetLastError(ERROR_INVALID_HANDLE);
00370         return SP_ERROR;
00371     }
00372 
00373     pldc = GdiGetLDC(hdc);
00374     if ( !pldc )
00375     {
00376         SetLastError(ERROR_INVALID_HANDLE);
00377         return SP_ERROR;
00378     }
00379 
00380     if (pldc->Flags & LDC_META_PRINT)
00381     {
00382         UNIMPLEMENTED;
00383         SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00384         return Ret;
00385     }
00386 
00387     if (pldc->Flags & LDC_INIT_DOCUMENT)
00388     {
00389         BOOL Good;
00390         if (pldc->Flags & LDC_INIT_PAGE) EndPage(hdc);
00391 
00392         DocumentEventEx(NULL, pldc->hPrinter, hdc, DOCUMENTEVENT_ENDDOC, 0, NULL, 0, NULL);
00393 
00394         ((PW32CLIENTINFO)NtCurrentTeb()->Win32ClientInfo)->cSpins = 0;
00395 
00396         Good = NtGdiEndDoc(hdc);
00397 
00398 //      if (pldc->pUMPDev)
00399         Good = EndDocPrinterEx(NULL,pldc->hPrinter);
00400 
00401         if (Good)
00402         {
00403             DocumentEventEx(NULL, pldc->hPrinter, hdc, DOCUMENTEVENT_ENDDOCPOST, 0, NULL, 0, NULL);
00404             Ret = 1;
00405         }
00406         pldc->Flags &= ~(LDC_ATENDPAGE|LDC_STARTPAGE|LDC_INIT_DOCUMENT|LDC_SAPCALLBACK);
00407     }
00408     return Ret;
00409 }
00410 
00411 /*
00412  * @implemented
00413  */
00414 int
00415 WINAPI
00416 EndFormPage(HDC hdc)
00417 {
00418     return IntEndPage(hdc,TRUE);
00419 }
00420 
00421 /*
00422  * @implemented
00423  */
00424 int
00425 WINAPI
00426 EndPage(HDC hdc )
00427 {
00428     return IntEndPage(hdc,FALSE);
00429 }
00430 
00431 /*
00432  * @unimplemented
00433  */
00434 HANDLE
00435 WINAPI
00436 GdiGetSpoolFileHandle(LPWSTR pwszPrinterName,
00437                       LPDEVMODEW pDevmode,
00438                       LPWSTR pwszDocName)
00439 {
00440     UNIMPLEMENTED;
00441     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00442     return 0;
00443 }
00444 
00445 /*
00446  * @unimplemented
00447  */
00448 BOOL
00449 WINAPI
00450 GdiDeleteSpoolFileHandle(HANDLE SpoolFileHandle)
00451 {
00452     UNIMPLEMENTED;
00453     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00454     return 0;
00455 }
00456 
00457 /*
00458  * @unimplemented
00459  */
00460 DWORD
00461 WINAPI
00462 GdiGetPageCount(HANDLE SpoolFileHandle)
00463 {
00464     UNIMPLEMENTED;
00465     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00466     return 0;
00467 }
00468 
00469 /*
00470  * @unimplemented
00471  */
00472 int
00473 WINAPI
00474 StartDocW(
00475     HDC     hdc,
00476     CONST DOCINFOW  *lpdi
00477 )
00478 {
00479     PLDC pldc;
00480     DOCINFOW diW;
00481     DOC_INFO_1W di1W;
00482     LPWSTR lpwstrRet = NULL;
00483     BOOL Banding;
00484     int PrnJobNo, Ret = SP_ERROR;
00485     ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
00486 
00487     if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE)
00488         return SP_ERROR;
00489 
00490     pldc = GdiGetLDC(hdc);
00491     if ( !pldc || pldc->Flags & LDC_ATENDPAGE)
00492     {
00493         SetLastError(ERROR_INVALID_HANDLE);
00494         return SP_ERROR;
00495     }
00496 
00497     if (!pldc->hPrinter) return SP_ERROR;
00498 
00499     pldc->Flags &= ~LDC_KILL_DOCUMENT;
00500 
00501     if (lpdi)
00502         RtlCopyMemory(&diW, lpdi, sizeof(DOCINFOW));
00503     else
00504     {
00505         diW.cbSize = sizeof(DOCINFOW);
00506         diW.lpszDocName  = NULL;
00507         diW.lpszOutput   = NULL;
00508         diW.lpszDatatype = NULL;
00509         diW.fwType = 0;
00510     }
00511 
00512     if (!diW.lpszOutput)
00513         if (pldc->pwszPort) diW.lpszOutput = pldc->pwszPort;
00514 
00515     lpwstrRet = fpStartDocDlgW(pldc->hPrinter, &diW);
00516     if (lpwstrRet == (LPWSTR)SP_APPABORT)
00517     {
00518         pldc->Flags |= LDC_KILL_DOCUMENT;
00519         return SP_ERROR;
00520     }
00521     if (lpwstrRet == (LPWSTR)SP_ERROR) return SP_ERROR;
00522 
00523     if (lpwstrRet != 0) diW.lpszOutput = lpwstrRet;
00524 
00525     Ret = DocumentEventEx( NULL,
00526                            pldc->hPrinter,
00527                            hdc,
00528                            DOCUMENTEVENT_STARTDOC,
00529                            sizeof(ULONG),
00530                            &diW,
00531                            0,
00532                            NULL);
00533 
00534     if (Ret == SP_APPABORT)
00535     {
00536         pldc->Flags |= LDC_KILL_DOCUMENT;
00537         Ret = SP_ERROR;
00538     }
00539     if (Ret == SP_ERROR)
00540     {
00541         if (lpwstrRet) LocalFree(lpwstrRet);
00542         return Ret;
00543     }
00544 
00545     di1W.pDocName    = (LPWSTR)diW.lpszDocName;
00546     di1W.pOutputFile = (LPWSTR)diW.lpszOutput;
00547     di1W.pDatatype   = (LPWSTR)diW.lpszDatatype;
00548 
00549     Ret = SP_ERROR;
00550 
00551     PrnJobNo = StartDocPrinterWEx(NULL, pldc->hPrinter, 1, (LPBYTE)&di1W);
00552     if (PrnJobNo <= 0)
00553     {
00554         Ret = NtGdiStartDoc( hdc, &diW, &Banding, PrnJobNo);
00555         if (Ret)
00556         {
00557             if (pldc->pAbortProc)
00558             {
00559                 GdiSAPCallback(pldc);
00560                 pldc->Flags |= LDC_SAPCALLBACK;
00561                 pldc->CallBackTick = GetTickCount();
00562             }
00563             pldc->Flags |= LDC_INIT_DOCUMENT;
00564             if (!Banding) pldc->Flags |= LDC_STARTPAGE;
00565         }
00566     }
00567     if (Ret == SP_ERROR)
00568     {
00569         //if ( pldc->pUMPDev  )
00570         AbortPrinterEx(NULL, pldc->hPrinter);
00571         DPRINT1("StartDoc Died!!!\n");
00572     }
00573     else
00574     {
00575         if ( DocumentEventEx( NULL,
00576                               pldc->hPrinter,
00577                               hdc,
00578                               DOCUMENTEVENT_STARTDOCPOST,
00579                               sizeof(ULONG),
00580                               &Ret,
00581                               0,
00582                               NULL) == SP_ERROR)
00583         {
00584             AbortDoc(hdc);
00585             Ret = SP_ERROR;
00586         }
00587     }
00588     if (lpwstrRet) LocalFree(lpwstrRet);
00589     return Ret;
00590 }
00591 
00592 /*
00593  * @implemented
00594  */
00595 int
00596 WINAPI
00597 StartDocA(
00598     HDC     hdc,
00599     CONST DOCINFOA  *lpdi
00600 )
00601 {
00602     LPWSTR szDocName = NULL, szOutput = NULL, szDatatype = NULL;
00603     DOCINFOW docW;
00604     INT ret, len;
00605 
00606     docW.cbSize = lpdi->cbSize;
00607     if (lpdi->lpszDocName)
00608     {
00609         len = MultiByteToWideChar(CP_ACP,0,lpdi->lpszDocName,-1,NULL,0);
00610         szDocName = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
00611         MultiByteToWideChar(CP_ACP,0,lpdi->lpszDocName,-1,szDocName,len);
00612     }
00613     if (lpdi->lpszOutput)
00614     {
00615         len = MultiByteToWideChar(CP_ACP,0,lpdi->lpszOutput,-1,NULL,0);
00616         szOutput = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
00617         MultiByteToWideChar(CP_ACP,0,lpdi->lpszOutput,-1,szOutput,len);
00618     }
00619     if (lpdi->lpszDatatype)
00620     {
00621         len = MultiByteToWideChar(CP_ACP,0,lpdi->lpszDatatype,-1,NULL,0);
00622         szDatatype = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
00623         MultiByteToWideChar(CP_ACP,0,lpdi->lpszDatatype,-1,szDatatype,len);
00624     }
00625 
00626     docW.lpszDocName = szDocName;
00627     docW.lpszOutput = szOutput;
00628     docW.lpszDatatype = szDatatype;
00629     docW.fwType = lpdi->fwType;
00630 
00631     ret = StartDocW(hdc, &docW);
00632 
00633     HeapFree( GetProcessHeap(), 0, szDocName );
00634     HeapFree( GetProcessHeap(), 0, szOutput );
00635     HeapFree( GetProcessHeap(), 0, szDatatype );
00636 
00637     return ret;
00638 }
00639 
00640 /*
00641  * @unimplemented
00642  */
00643 int
00644 WINAPI
00645 StartPage(
00646     HDC hdc
00647 )
00648 {
00649     PLDC pldc;
00650     ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
00651 
00652     if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE)
00653     {
00654         SetLastError(ERROR_INVALID_HANDLE);
00655         return SP_ERROR;
00656     }
00657 
00658     pldc = GdiGetLDC(hdc);
00659     if ( !pldc )
00660     {
00661         SetLastError(ERROR_INVALID_HANDLE);
00662         return SP_ERROR;
00663     }
00664 
00665     if (pldc->Flags & LDC_META_PRINT)
00666     {
00667         UNIMPLEMENTED;
00668         SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00669         return SP_ERROR;
00670     }
00671 
00672     pldc->Flags &= ~(LDC_ATENDPAGE|LDC_STARTPAGE);
00673 
00674     if (pldc->Flags & LDC_INIT_PAGE) return 1;
00675 
00676     if (DocumentEventEx(NULL, pldc->hPrinter, hdc, DOCUMENTEVENT_STARTPAGE, 0, NULL, 0, NULL) != SP_ERROR)
00677     {
00678         pldc->Flags |= LDC_INIT_PAGE;
00679 
00680         ((PW32CLIENTINFO)NtCurrentTeb()->Win32ClientInfo)->cSpins = 0;
00681 
00682         if (StartPagePrinterEx(NULL, pldc->hPrinter))
00683         {
00684             if (NtGdiStartPage(hdc)) return 1;
00685         }
00686 
00687         pldc->Flags &= ~(LDC_INIT_PAGE);
00688         EndDoc(hdc);
00689         SetLastError(ERROR_INVALID_HANDLE);
00690     }
00691     return SP_ERROR;
00692 }
00693 
00694 /*
00695  * @implemented
00696  */
00697 int
00698 WINAPI
00699 SetAbortProc(
00700     HDC hdc,
00701     ABORTPROC lpAbortProc)
00702 {
00703     PLDC pldc;
00704     ULONG hType = GDI_HANDLE_GET_TYPE(hdc);
00705 
00706     if (hType == GDILoObjType_LO_DC_TYPE || hType == GDILoObjType_LO_METADC16_TYPE)
00707         return SP_ERROR;
00708 
00709     pldc = GdiGetLDC(hdc);
00710     if ( pldc )
00711     {
00712         if ( lpAbortProc )
00713         {
00714             if ( pldc->Flags & LDC_INIT_DOCUMENT )
00715             {
00716                 pldc->Flags |= LDC_SAPCALLBACK;
00717                 pldc->CallBackTick = GetTickCount();
00718             }
00719         }
00720         else
00721         {
00722             pldc->Flags &= ~LDC_SAPCALLBACK;
00723         }
00724         pldc->pAbortProc = lpAbortProc;
00725         return 1;
00726     }
00727     else
00728     {
00729         SetLastError(ERROR_INVALID_HANDLE);
00730     }
00731     return SP_ERROR;
00732 }
00733 

Generated on Sat May 26 2012 04:37:12 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.