Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenprintdrv.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
1.7.6.1
|