Missing WINAPI.
[wine] / misc / printdrv.c
1 /* 
2  * Implementation of some printer driver bits
3  * 
4  * Copyright 1996 John Harvey
5  * Copyright 1998 Andreas Mohr
6  */
7
8 #include <stdlib.h>
9 #include <string.h>
10 #include <ctype.h>
11 #include "windows.h"
12 #include "win.h"
13 #include "winerror.h"
14 #include "winreg.h"
15 #include "debug.h"
16 #include "print.h"
17
18 static char PrinterModel[]      = "Printer Model";
19 static char DefaultDevMode[]    = "Default DevMode";
20 static char PrinterDriverData[] = "PrinterDriverData";
21 static char Printers[]          = "System\\CurrentControlSet\\Control\\Print\\Printers\\";
22
23 /******************************************************************
24  *                  StartDoc16  [GDI.377]
25  *
26  */
27 INT16 WINAPI StartDoc16( HDC16 hdc, const DOCINFO16 *lpdoc )
28 {
29   INT16 retVal;
30   TRACE(print,"(%p)\n", lpdoc );
31   TRACE(print,"%d 0x%lx:0x%p 0x%lx:0x%p\n",lpdoc->cbSize,
32         lpdoc->lpszDocName,PTR_SEG_TO_LIN(lpdoc->lpszDocName),
33         lpdoc->lpszOutput,PTR_SEG_TO_LIN(lpdoc->lpszOutput));
34   TRACE(print, "%d %s %s\n",lpdoc->cbSize,
35         (LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszDocName),
36         (LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszOutput));
37   retVal =  Escape16(hdc, STARTDOC,
38     strlen((LPSTR)PTR_SEG_TO_LIN(lpdoc->lpszDocName)), lpdoc->lpszDocName, 0);
39   TRACE(print,"Escape16 returned %d\n",retVal);
40   return retVal;
41 }
42
43 /******************************************************************
44  *                  StartDoc32A  [GDI32.347]
45  *
46  */
47 INT32 WINAPI StartDoc32A(HDC32 hdc ,const DOCINFO32A* doc)
48 {
49   FIXME(gdi,"stub\n");
50   SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
51   return 0; /* failure*/
52 }
53
54 /*************************************************************************
55  *                  StartDoc32W [GDI32.348]
56  * 
57  */
58 INT32 WINAPI StartDoc32W(HDC32 hdc, const DOCINFO32W* doc) {
59   FIXME(gdi,"stub\n");
60   SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
61   return 0; /* failure*/
62 }
63
64 /******************************************************************
65  *                  StartPage32  [GDI32.349]
66  *
67  */
68 INT32 WINAPI StartPage32(HDC32 hdc)
69 {
70   FIXME(gdi,"stub\n");
71   SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
72   return 0; /* failure*/
73 }
74
75 /******************************************************************
76  *                  EndPage32  [GDI32.77]
77  *
78  */
79 INT32 WINAPI EndPage32(HDC32 hdc)
80 {
81   FIXME(gdi,"stub\n");
82   SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
83   return 0; /* failure*/
84 }
85
86 /******************************************************************
87  *                  EndDoc16  [GDI.378]
88  *
89  */
90 INT16 WINAPI EndDoc16(HDC16 hdc)
91 {
92   return  Escape16(hdc, ENDDOC, 0, 0, 0);
93 }
94
95 /******************************************************************
96  *                  EndDoc32  [GDI32.76]
97  *
98  */
99 INT32 WINAPI EndDoc32(HDC32 hdc)
100 {
101   FIXME(gdi,"stub\n");
102   SetLastError(ERROR_CALL_NOT_IMPLEMENTED); 
103   return 0; /* failure*/
104 }
105
106 /******************************************************************************
107  *                 AbortDoc16  [GDI.382]
108  */
109 INT16 WINAPI AbortDoc16(HDC16 hdc)
110 {
111   return Escape16(hdc, ABORTDOC, 0, 0, 0);
112 }
113
114 /******************************************************************************
115  *                 AbortDoc32  [GDI32.0]
116  */
117 INT32 WINAPI AbortDoc32(HDC32 hdc)
118 {
119     FIXME(gdi, "(%d): stub\n", hdc);
120     return 1;
121 }
122
123 /******************************************************************
124  *                  DrvGetPrinterDataInternal
125  *
126  * Helper for DrvGetPrinterData
127  */
128 static DWORD DrvGetPrinterDataInternal(LPSTR RegStr_Printer,
129 LPBYTE lpPrinterData, int cbData)
130 {
131     DWORD res = -1;
132     HKEY hkey;
133     DWORD dwType, cbQueryData;
134
135     if (!(RegOpenKey32A(HKEY_LOCAL_MACHINE, RegStr_Printer, &hkey))) {
136         if (cbData > 1) { /* "Default DevMode" */
137             if (!(RegQueryValueEx32A(hkey, DefaultDevMode, 0, &dwType, 0, &cbQueryData))) {
138                 if (!lpPrinterData)
139                     res = cbQueryData;
140                 else if ((cbQueryData) && (cbQueryData <= cbData)) {
141                     cbQueryData = cbData;
142                     if (RegQueryValueEx32A(hkey, DefaultDevMode, 0,
143                                 &dwType, lpPrinterData, &cbQueryData))
144                         res = cbQueryData;
145                 }
146             }
147         } else { /* "Printer Driver" */
148             cbQueryData = 32;
149             RegQueryValueEx32A(hkey, "Printer Driver", 0,
150                         &dwType, lpPrinterData, &cbQueryData);
151             res = cbQueryData;
152         }
153     }
154     if (hkey) RegCloseKey(hkey);
155     return res;
156 }
157
158 /******************************************************************
159  *                DrvGetPrinterData     [GDI.282]
160  *
161  */
162 DWORD WINAPI DrvGetPrinterData(LPSTR lpPrinter, LPSTR lpProfile,
163                                LPDWORD lpType, LPBYTE lpPrinterData,
164                                int cbData, LPDWORD lpNeeded)
165 {
166     LPSTR RegStr_Printer;
167     HKEY hkey = 0, hkey2 = 0;
168     DWORD res = 0;
169     DWORD dwType, PrinterAttr, cbPrinterAttr, SetData, size;
170
171     if (HIWORD(lpPrinter))
172             TRACE(print,"printer %s\n",lpPrinter);
173     else
174             TRACE(print,"printer %p\n",lpPrinter);
175     if (HIWORD(lpProfile))
176             TRACE(print,"profile %s\n",lpProfile);
177     else
178             TRACE(print,"profile %p\n",lpProfile);
179     TRACE(print,"lpType %p\n",lpType);
180
181     if ((!lpPrinter) || (!lpProfile) || (!lpNeeded))
182         return ERROR_INVALID_PARAMETER;
183
184     RegStr_Printer = HeapAlloc(GetProcessHeap(), 0,
185                                strlen(Printers) + strlen(lpPrinter) + 2);
186     strcpy(RegStr_Printer, Printers);
187     strcat(RegStr_Printer, lpPrinter);
188
189     if (((DWORD)lpProfile == INT_PD_DEFAULT_DEVMODE) || (HIWORD(lpProfile) &&
190     (!strcmp(lpProfile, DefaultDevMode)))) {
191         size = DrvGetPrinterDataInternal(RegStr_Printer, lpPrinterData, cbData);
192         if (size+1) {
193             *lpNeeded = size;
194             if ((lpPrinterData) && (*lpNeeded > cbData))
195                 res = ERROR_MORE_DATA;
196         }
197         else res = ERROR_INVALID_PRINTER_NAME;
198     }
199     else
200     if (((DWORD)lpProfile == INT_PD_DEFAULT_MODEL) || (HIWORD(lpProfile) &&
201     (!strcmp(lpProfile, PrinterModel)))) {
202         *lpNeeded = 32;
203         if (!lpPrinterData) goto failed;
204         if (cbData < 32) {
205             res = ERROR_MORE_DATA;
206             goto failed;
207         }
208         size = DrvGetPrinterDataInternal(RegStr_Printer, lpPrinterData, 1);
209         if ((size+1) && (lpType))
210             *lpType = REG_SZ;
211         else
212             res = ERROR_INVALID_PRINTER_NAME;
213     }
214     else
215     {
216         if ((res = RegOpenKey32A(HKEY_LOCAL_MACHINE, RegStr_Printer, &hkey)))
217             goto failed;
218         cbPrinterAttr = 4;
219         if ((res = RegQueryValueEx32A(hkey, "Attributes", 0,
220                         &dwType, (LPBYTE)&PrinterAttr, &cbPrinterAttr)))
221             goto failed;
222         if ((res = RegOpenKey32A(hkey, PrinterDriverData, &hkey2)))
223             goto failed;
224         *lpNeeded = cbData;
225         res = RegQueryValueEx32A(hkey2, lpProfile, 0,
226                 lpType, lpPrinterData, lpNeeded);
227         if ((res != ERROR_CANTREAD) &&
228          ((PrinterAttr &
229         (PRINTER_ATTRIBUTE_ENABLE_BIDI|PRINTER_ATTRIBUTE_NETWORK))
230         == PRINTER_ATTRIBUTE_NETWORK))
231         {
232             if (!(res) && (*lpType == REG_DWORD) && (*(LPDWORD)lpPrinterData == -1))
233                 res = ERROR_INVALID_DATA;
234         }
235         else
236         {
237             SetData = -1;
238             RegSetValueEx32A(hkey2, lpProfile, 0, REG_DWORD, (LPBYTE)&SetData, 4); /* no result returned */
239         }
240     }
241         
242 failed:
243     if (hkey2) RegCloseKey(hkey2);
244     if (hkey) RegCloseKey(hkey);
245     HeapFree(GetProcessHeap(), 0, RegStr_Printer);
246     return res;
247 }
248
249
250 /******************************************************************
251  *                 DrvSetPrinterData     [GDI.281]
252  *
253  */
254 DWORD WINAPI DrvSetPrinterData(LPSTR lpPrinter, LPSTR lpProfile,
255                                DWORD lpType, LPBYTE lpPrinterData,
256                                DWORD dwSize)
257 {
258     LPSTR RegStr_Printer;
259     HKEY hkey = 0;
260     DWORD res = 0;
261
262     if (HIWORD(lpPrinter))
263             TRACE(print,"printer %s\n",lpPrinter);
264     else
265             TRACE(print,"printer %p\n",lpPrinter);
266     if (HIWORD(lpProfile))
267             TRACE(print,"profile %s\n",lpProfile);
268     else
269             TRACE(print,"profile %p\n",lpProfile);
270     TRACE(print,"lpType %08lx\n",lpType);
271
272     if ((!lpPrinter) || (!lpProfile) ||
273     ((DWORD)lpProfile == INT_PD_DEFAULT_MODEL) || (HIWORD(lpProfile) &&
274     (!strcmp(lpProfile, PrinterModel))))
275         return ERROR_INVALID_PARAMETER;
276
277     RegStr_Printer = HeapAlloc(GetProcessHeap(), 0,
278                         strlen(Printers) + strlen(lpPrinter) + 2);
279     strcpy(RegStr_Printer, Printers);
280     strcat(RegStr_Printer, lpPrinter);
281
282     if (((DWORD)lpProfile == INT_PD_DEFAULT_DEVMODE) || (HIWORD(lpProfile) &&
283     (!strcmp(lpProfile, DefaultDevMode)))) {
284         if ( RegOpenKey32A(HKEY_LOCAL_MACHINE, RegStr_Printer, &hkey) 
285              != ERROR_SUCCESS ||
286              RegSetValueEx32A(hkey, DefaultDevMode, 0, REG_BINARY, 
287                               lpPrinterData, dwSize) != ERROR_SUCCESS )
288                 res = ERROR_INVALID_PRINTER_NAME;
289     }
290     else
291     {
292         strcat(RegStr_Printer, "\\");
293
294         if( (res = RegOpenKey32A(HKEY_LOCAL_MACHINE, RegStr_Printer, &hkey)) ==
295             ERROR_SUCCESS ) {
296
297             if (!lpPrinterData) 
298                 res = RegDeleteValue32A(hkey, lpProfile);
299             else
300                 res = RegSetValueEx32A(hkey, lpProfile, 0, lpType,
301                                        lpPrinterData, dwSize);
302         }
303     }
304
305     if (hkey) RegCloseKey(hkey);
306     HeapFree(GetProcessHeap(), 0, RegStr_Printer);
307     return res;
308 }
309
310
311 /******************************************************************
312  *              DeviceCapabilities32A    [WINSPOOL.151]
313  *
314  */
315 INT32 WINAPI DeviceCapabilities32A(LPCSTR printer,LPCSTR target,WORD z,
316                                    LPSTR a,LPDEVMODE32A b)
317 {
318     FIXME(print,"(%s,%s,%d,%p,%p):stub.\n",printer,target,z,a,b);
319     return 1;           
320 }
321
322
323 /*****************************************************************************
324  *          DeviceCapabilities32W 
325  */
326 INT32 WINAPI DeviceCapabilities32W(LPCWSTR pDevice, LPCWSTR pPort,
327                                    WORD fwCapability, LPWSTR pOutput,
328                                    const DEVMODE32W *pDevMode)
329 {
330     FIXME(print,"(%p,%p,%d,%p,%p): stub\n",
331           pDevice, pPort, fwCapability, pOutput, pDevMode);
332     return -1;
333 }
334
335 /******************************************************************
336  *              DocumentProperties32A   [WINSPOOL.155]
337  *
338  */
339 LONG WINAPI DocumentProperties32A(HWND32 hWnd,HANDLE32 hPrinter,
340                                 LPSTR pDeviceName, LPDEVMODE32A pDevModeOutput,
341                                   LPDEVMODE32A pDevModeInput,DWORD fMode )
342 {
343     FIXME(print,"(%d,%d,%s,%p,%p,%ld):stub.\n",
344         hWnd,hPrinter,pDeviceName,pDevModeOutput,pDevModeInput,fMode
345     );
346     return 1;
347 }
348
349
350 /*****************************************************************************
351  *          DocumentProperties32W 
352  */
353 LONG WINAPI DocumentProperties32W(HWND32 hWnd, HANDLE32 hPrinter,
354                                   LPWSTR pDeviceName,
355                                   LPDEVMODE32W pDevModeOutput,
356                                   LPDEVMODE32W pDevModeInput, DWORD fMode)
357 {
358     FIXME(print,"(%d,%d,%s,%p,%p,%ld): stub\n",
359           hWnd,hPrinter,debugstr_w(pDeviceName),pDevModeOutput,pDevModeInput,
360           fMode);
361     return -1;
362 }
363
364
365 /******************************************************************
366  *              OpenPrinter32A        [WINSPOOL.196]
367  *
368  */
369 BOOL32 WINAPI OpenPrinter32A(LPSTR lpPrinterName,HANDLE32 *phPrinter,
370                              LPPRINTER_DEFAULTS32A pDefault)
371 {
372     FIXME(print,"(%s,%p,%p):stub\n",debugstr_a(lpPrinterName), phPrinter,
373           pDefault);
374     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
375     return FALSE;
376 }
377
378 /******************************************************************
379  *              OpenPrinter32W        [WINSPOOL.197]
380  *
381  */
382 BOOL32 WINAPI OpenPrinter32W(LPWSTR lpPrinterName,HANDLE32 *phPrinter,
383                              LPPRINTER_DEFAULTS32W pDefault)
384 {
385     FIXME(print,"(%s,%p,%p):stub\n",debugstr_w(lpPrinterName), phPrinter,
386           pDefault);
387     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
388     return FALSE;
389 }
390
391 /******************************************************************
392  *              EnumPrinters32A        [WINSPOOL.174]
393  *
394  */
395 BOOL32  WINAPI EnumPrinters32A(DWORD dwType, LPSTR lpszName,
396                                DWORD dwLevel, LPBYTE lpbPrinters,
397                                DWORD cbBuf, LPDWORD lpdwNeeded,
398                                LPDWORD lpdwReturned)
399 {
400     FIXME(print,"Nearly empty stub\n");
401     *lpdwReturned=0;
402     *lpdwNeeded = 0;
403     return TRUE;
404 }
405
406 /******************************************************************
407  *              EnumPrinters32W        [WINSPOOL.175]
408  *
409  */
410 BOOL32  WINAPI EnumPrinters32W(DWORD dwType, LPWSTR lpszName,
411                                DWORD dwLevel, LPBYTE lpbPrinters,
412                                DWORD cbBuf, LPDWORD lpdwNeeded,
413                                LPDWORD lpdwReturned)
414 {
415     FIXME(print,"Nearly empty stub\n");
416     *lpdwReturned=0;
417     *lpdwNeeded = 0;
418     return TRUE;
419 }
420
421 /******************************************************************
422  *              AddMonitor32A        [WINSPOOL.107]
423  *
424  */
425 BOOL32 WINAPI AddMonitor32A(LPCSTR pName, DWORD Level, LPBYTE pMonitors)
426 {
427     FIXME(print, "(%s,%lx,%p):stub!\n", pName, Level, pMonitors);
428     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
429     return FALSE;
430 }
431
432 /******************************************************************
433  *              DeletePrinterDriver32A        [WINSPOOL.146]
434  *
435  */
436 BOOL32 WINAPI
437 DeletePrinterDriver32A (LPSTR pName, LPSTR pEnvironment, LPSTR pDriverName)
438 {
439     FIXME(print,"(%s,%s,%s):stub\n",debugstr_a(pName),debugstr_a(pEnvironment),
440           debugstr_a(pDriverName));
441     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
442     return FALSE;
443 }
444
445
446 /******************************************************************
447  *              DeleteMonitor32A        [WINSPOOL.135]
448  *
449  */
450 BOOL32 WINAPI
451 DeleteMonitor32A (LPSTR pName, LPSTR pEnvironment, LPSTR pMonitorName)
452 {
453     FIXME(print,"(%s,%s,%s):stub\n",debugstr_a(pName),debugstr_a(pEnvironment),
454           debugstr_a(pMonitorName));
455     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
456     return FALSE;
457 }
458
459
460 /******************************************************************
461  *              DeletePort32A        [WINSPOOL.137]
462  *
463  */
464 BOOL32 WINAPI
465 DeletePort32A (LPSTR pName, HWND32 hWnd, LPSTR pPortName)
466 {
467     FIXME(print,"(%s,0x%08x,%s):stub\n",debugstr_a(pName),hWnd,
468           debugstr_a(pPortName));
469     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
470     return FALSE;
471 }
472
473 /******************************************************************************
474  *    SetPrinter32W  [WINSPOOL.214]
475  */
476 BOOL32 WINAPI
477 SetPrinter32W(
478   HANDLE32  hPrinter,
479   DWORD     Level,
480   LPBYTE    pPrinter,
481   DWORD     Command) {
482
483        FIXME(print,"():stub\n");
484   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
485        return FALSE;
486 }
487
488 /******************************************************************************
489  *    WritePrinter32  [WINSPOOL.223]
490  */
491 BOOL32 WINAPI
492 WritePrinter32( 
493   HANDLE32  hPrinter,
494   LPVOID  pBuf,
495   DWORD   cbBuf,
496   LPDWORD pcWritten) {
497
498        FIXME(print,"():stub\n");
499   SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
500        return FALSE;
501 }
502
503 /*****************************************************************************
504  *          AddForm32A  [WINSPOOL.103]
505  */
506 BOOL32 WINAPI AddForm32A(HANDLE32 hPrinter, DWORD Level, LPBYTE pForm)
507 {
508     FIXME(print, "(%d,%ld,%p): stub\n", hPrinter, Level, pForm);
509     return 1;
510 }
511
512 /*****************************************************************************
513  *          AddForm32W  [WINSPOOL.104]
514  */
515 BOOL32 WINAPI AddForm32W(HANDLE32 hPrinter, DWORD Level, LPBYTE pForm)
516 {
517     FIXME(print, "(%d,%ld,%p): stub\n", hPrinter, Level, pForm);
518     return 1;
519 }
520
521 /*****************************************************************************
522  *          AddJob32A  [WINSPOOL.105]
523  */
524 BOOL32 WINAPI AddJob32A(HANDLE32 hPrinter, DWORD Level, LPBYTE pData,
525                         DWORD cbBuf, LPDWORD pcbNeeded)
526 {
527     FIXME(print, "(%d,%ld,%p,%ld,%p): stub\n", hPrinter, Level, pData, cbBuf,
528           pcbNeeded);
529     return 1;
530 }
531
532 /*****************************************************************************
533  *          AddJob32W  [WINSPOOL.106]
534  */
535 BOOL32 WINAPI AddJob32W(HANDLE32 hPrinter, DWORD Level, LPBYTE pData, DWORD cbBuf,
536                         LPDWORD pcbNeeded)
537 {
538     FIXME(print, "(%d,%ld,%p,%ld,%p): stub\n", hPrinter, Level, pData, cbBuf,
539           pcbNeeded);
540     return 1;
541 }
542
543 /*****************************************************************************
544  *          AddPrinter32A  [WINSPOOL.117]
545  */
546 HANDLE32 WINAPI AddPrinter32A(LPSTR pName, DWORD Level, LPBYTE pPrinter)
547 {
548     FIXME(print, "(%s,%ld,%p): stub\n", pName, Level, pPrinter);
549     return 0;
550 }
551
552 /*****************************************************************************
553  *          AddPrinter32W  [WINSPOOL.122]
554  */
555 HANDLE32 WINAPI AddPrinter32W(LPWSTR pName, DWORD Level, LPBYTE pPrinter)
556 {
557     FIXME(print, "(%p,%ld,%p): stub\n", pName, Level, pPrinter);
558     return 0;
559 }
560
561
562 /*****************************************************************************
563  *          ClosePrinter32  [WINSPOOL.126]
564  */
565 BOOL32 WINAPI ClosePrinter32(HANDLE32 hPrinter)
566 {
567     FIXME(print, "(%d): stub\n", hPrinter);
568     return 1;
569 }
570
571 /*****************************************************************************
572  *          DeleteForm32A  [WINSPOOL.133]
573  */
574 BOOL32 WINAPI DeleteForm32A(HANDLE32 hPrinter, LPSTR pFormName)
575 {
576     FIXME(print, "(%d,%s): stub\n", hPrinter, pFormName);
577     return 1;
578 }
579
580 /*****************************************************************************
581  *          DeleteForm32W  [WINSPOOL.134]
582  */
583 BOOL32 WINAPI DeleteForm32W(HANDLE32 hPrinter, LPWSTR pFormName)
584 {
585     FIXME(print, "(%d,%s): stub\n", hPrinter, debugstr_w(pFormName));
586     return 1;
587 }
588
589 /*****************************************************************************
590  *          DeletePrinter32  [WINSPOOL.143]
591  */
592 BOOL32 WINAPI DeletePrinter32(HANDLE32 hPrinter)
593 {
594     FIXME(print, "(%d): stub\n", hPrinter);
595     return 1;
596 }
597
598 /*****************************************************************************
599  *          SetPrinter32A  [WINSPOOL.211]
600  */
601 BOOL32 WINAPI SetPrinter32A(HANDLE32 hPrinter, DWORD Level, LPBYTE pPrinter,
602                            DWORD Command)
603 {
604     FIXME(print, "(%d,%ld,%p,%ld): stub\n",hPrinter,Level,pPrinter,Command);
605     return FALSE;
606 }
607
608 /*****************************************************************************
609  *          SetJob32A  [WINSPOOL.209]
610  */
611 BOOL32 WINAPI SetJob32A(HANDLE32 hPrinter, DWORD JobId, DWORD Level,
612                        LPBYTE pJob, DWORD Command)
613 {
614     FIXME(print, "(%d,%ld,%ld,%p,%ld): stub\n",hPrinter,JobId,Level,pJob,
615          Command);
616     return FALSE;
617 }
618
619 /*****************************************************************************
620  *          SetJob32W  [WINSPOOL.210]
621  */
622 BOOL32 WINAPI SetJob32W(HANDLE32 hPrinter, DWORD JobId, DWORD Level,
623                        LPBYTE pJob, DWORD Command)
624 {
625     FIXME(print, "(%d,%ld,%ld,%p,%ld): stub\n",hPrinter,JobId,Level,pJob,
626          Command);
627     return FALSE;
628 }
629
630 /*****************************************************************************
631  *          GetForm32A  [WINSPOOL.181]
632  */
633 BOOL32 WINAPI GetForm32A(HANDLE32 hPrinter, LPSTR pFormName, DWORD Level,
634                  LPBYTE pForm, DWORD cbBuf, LPDWORD pcbNeeded)
635 {
636     FIXME(print, "(%d,%s,%ld,%p,%ld,%p): stub\n",hPrinter,pFormName,
637          Level,pForm,cbBuf,pcbNeeded); 
638     return FALSE;
639 }
640
641 /*****************************************************************************
642  *          GetForm32W  [WINSPOOL.182]
643  */
644 BOOL32 WINAPI GetForm32W(HANDLE32 hPrinter, LPWSTR pFormName, DWORD Level,
645                  LPBYTE pForm, DWORD cbBuf, LPDWORD pcbNeeded)
646 {
647     FIXME(print, "(%d,%s,%ld,%p,%ld,%p): stub\n",hPrinter,
648           debugstr_w(pFormName),Level,pForm,cbBuf,pcbNeeded);
649     return FALSE;
650 }
651
652 /*****************************************************************************
653  *          SetForm32A  [WINSPOOL.207]
654  */
655 BOOL32 WINAPI SetForm32A(HANDLE32 hPrinter, LPSTR pFormName, DWORD Level,
656                         LPBYTE pForm)
657 {
658     FIXME(print, "(%d,%s,%ld,%p): stub\n",hPrinter,pFormName,Level,pForm);
659     return FALSE;
660 }
661
662 /*****************************************************************************
663  *          SetForm32W  [WINSPOOL.208]
664  */
665 BOOL32 WINAPI SetForm32W(HANDLE32 hPrinter, LPWSTR pFormName, DWORD Level,
666                         LPBYTE pForm)
667 {
668     FIXME(print, "(%d,%p,%ld,%p): stub\n",hPrinter,pFormName,Level,pForm);
669     return FALSE;
670 }
671
672 /*****************************************************************************
673  *          ReadPrinter32  [WINSPOOL.202]
674  */
675 BOOL32 WINAPI ReadPrinter32(HANDLE32 hPrinter, LPVOID pBuf, DWORD cbBuf,
676                            LPDWORD pNoBytesRead)
677 {
678     FIXME(print, "(%d,%p,%ld,%p): stub\n",hPrinter,pBuf,cbBuf,pNoBytesRead);
679     return FALSE;
680 }
681
682 /*****************************************************************************
683  *          ResetPrinter32A  [WINSPOOL.203]
684  */
685 BOOL32 WINAPI ResetPrinter32A(HANDLE32 hPrinter, LPPRINTER_DEFAULTS32A pDefault)
686 {
687     FIXME(print, "(%d, %p): stub\n", hPrinter, pDefault);
688     return FALSE;
689 }
690
691 /*****************************************************************************
692  *          ResetPrinter32W  [WINSPOOL.204]
693  */
694 BOOL32 WINAPI ResetPrinter32W(HANDLE32 hPrinter, LPPRINTER_DEFAULTS32W pDefault)
695 {
696     FIXME(print, "(%d, %p): stub\n", hPrinter, pDefault);
697     return FALSE;
698 }
699
700 /*****************************************************************************
701  *          GetPrinter32A  [WINSPOOL.187]
702  */
703 BOOL32 WINAPI GetPrinter32A(HANDLE32 hPrinter, DWORD Level, LPBYTE pPrinter,
704                     DWORD cbBuf, LPDWORD pcbNeeded)
705 {
706     FIXME(print, "(%d,%ld,%p,%ld,%p): stub\n", hPrinter, Level, pPrinter, 
707          cbBuf, pcbNeeded);
708     return FALSE;
709 }
710
711 /*****************************************************************************
712  *          GetPrinter32W  [WINSPOOL.194]
713  */
714 BOOL32 WINAPI GetPrinter32W(HANDLE32 hPrinter, DWORD Level, LPBYTE pPrinter,
715                     DWORD cbBuf, LPDWORD pcbNeeded)
716 {
717     FIXME(print, "(%d,%ld,%p,%ld,%p): stub\n", hPrinter, Level, pPrinter,
718           cbBuf, pcbNeeded);
719     return FALSE;
720 }
721
722 /*****************************************************************************
723  *          GetPrinterDriver32A  [WINSPOOL.190]
724  */
725 BOOL32 WINAPI GetPrinterDriver32A(HANDLE32 hPrinter, LPSTR pEnvironment,
726                                  DWORD Level, LPBYTE pDriverInfo,
727                                  DWORD cbBuf, LPDWORD pcbNeeded)
728 {
729     FIXME(print, "(%d,%s,%ld,%p,%ld,%p): stub\n",hPrinter,pEnvironment,
730          Level,pDriverInfo,cbBuf, pcbNeeded);
731     return FALSE;
732 }
733
734 /*****************************************************************************
735  *          GetPrinterDriver32W  [WINSPOOL.193]
736  */
737 BOOL32 WINAPI GetPrinterDriver32W(HANDLE32 hPrinter, LPWSTR pEnvironment,
738                                   DWORD Level, LPBYTE pDriverInfo, 
739                                   DWORD cbBuf, LPDWORD pcbNeeded)
740 {
741     FIXME(print, "(%d,%p,%ld,%p,%ld,%p): stub\n",hPrinter,pEnvironment,
742           Level,pDriverInfo,cbBuf, pcbNeeded);
743     return FALSE;
744 }
745 /*****************************************************************************
746  *          AddPrinterDriver32A  [WINSPOOL.120]
747  */
748 BOOL32 WINAPI AddPrinterDriver32A(LPSTR printerName,DWORD level, 
749                                    LPBYTE pDriverInfo)
750 {
751     FIXME(print, "(%s,%ld,%p): stub\n",printerName,level,pDriverInfo);
752     return FALSE;
753 }
754 /*****************************************************************************
755  *          AddPrinterDriver32W  [WINSPOOL.121]
756  */
757 BOOL32 WINAPI AddPrinterDriver32W(LPWSTR printerName,DWORD level, 
758                                    LPBYTE pDriverInfo)
759 {
760     FIXME(print, "(%s,%ld,%p): stub\n",debugstr_w(printerName),
761           level,pDriverInfo);
762     return FALSE;
763 }
764
765
766