printdrv.c 5.7 KB
Newer Older
1
/*
Alexandre Julliard's avatar
Alexandre Julliard committed
2
 * Implementation of some printer driver bits
3
 *
Alexandre Julliard's avatar
Alexandre Julliard committed
4
 * Copyright 1996 John Harvey
5
 * Copyright 1998 Huw Davies
Alexandre Julliard's avatar
Alexandre Julliard committed
6
 * Copyright 1998 Andreas Mohr
7
 * Copyright 1999 Klaas van Gend
8 9 10 11 12 13 14 15 16 17 18 19 20
 *
 * 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
21
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Alexandre Julliard's avatar
Alexandre Julliard committed
22 23
 */

24
#include <stdarg.h>
25

26
#include "windef.h"
27
#include "winbase.h"
28
#include "wingdi.h"
29
#include "winspool.h"
Alexandre Julliard's avatar
Alexandre Julliard committed
30
#include "winerror.h"
31
#include "wine/debug.h"
32
#include "gdi_private.h"
Alexandre Julliard's avatar
Alexandre Julliard committed
33

34
WINE_DEFAULT_DEBUG_CHANNEL(print);
35

36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
/******************************************************************
 * GdiGetSpoolMessage [GDI32.@]
 *
 */
DWORD WINAPI GdiGetSpoolMessage(LPVOID ptr1, DWORD data2, LPVOID ptr3, DWORD data4)
{
    TRACE("(%p 0x%x %p 0x%x) stub\n", ptr1, data2, ptr3, data4);
    /* avoid 100% cpu usage with spoolsv.exe from w2k
      (spoolsv.exe from xp does Sleep 1000/1500/2000 in a loop) */
    Sleep(500);
    return 0;
}

/******************************************************************
 * GdiInitSpool [GDI32.@]
 *
 */
DWORD WINAPI GdiInitSpool(void)
{
    FIXME("stub\n");
    return TRUE;
}
Alexandre Julliard's avatar
Alexandre Julliard committed
58

59
/******************************************************************
60
 *                  StartDocW  [GDI32.@]
61
 *
62 63 64
 * StartDoc calls the STARTDOC Escape with the input data pointing to DocName
 * and the output data (which is used as a second input parameter).pointing at
 * the whole docinfo structure.  This seems to be an undocumented feature of
65
 * the STARTDOC Escape.
66 67
 *
 * Note: we now do it the other way, with the STARTDOC Escape calling StartDoc.
68
 */
69
INT WINAPI StartDocW(HDC hdc, const DOCINFOW* doc)
70
{
71
    INT ret = 0;
72
    DC *dc = get_dc_ptr( hdc );
73

74 75 76
    TRACE("DocName = %s Output = %s Datatype = %s\n",
          debugstr_w(doc->lpszDocName), debugstr_w(doc->lpszOutput),
          debugstr_w(doc->lpszDatatype));
77

78
    if(!dc) return SP_ERROR;
79

80 81 82 83 84 85
    if (dc->pAbortProc && !dc->pAbortProc( hdc, 0 ))
    {
        release_dc_ptr( dc );
        return ret;
    }

86
    if (dc->funcs->pStartDoc) ret = dc->funcs->pStartDoc( dc->physDev, doc );
87
    release_dc_ptr( dc );
88
    return ret;
89 90 91
}

/*************************************************************************
92
 *                  StartDocA [GDI32.@]
93
 *
94
 */
95
INT WINAPI StartDocA(HDC hdc, const DOCINFOA* doc)
96
{
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
    LPWSTR szDocName = NULL, szOutput = NULL, szDatatype = NULL;
    DOCINFOW docW;
    INT ret, len;

    docW.cbSize = doc->cbSize;
    if (doc->lpszDocName)
    {
        len = MultiByteToWideChar(CP_ACP,0,doc->lpszDocName,-1,NULL,0);
        szDocName = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
        MultiByteToWideChar(CP_ACP,0,doc->lpszDocName,-1,szDocName,len);
    }
    if (doc->lpszOutput)
    {
        len = MultiByteToWideChar(CP_ACP,0,doc->lpszOutput,-1,NULL,0);
        szOutput = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
        MultiByteToWideChar(CP_ACP,0,doc->lpszOutput,-1,szOutput,len);
    }
    if (doc->lpszDatatype)
    {
        len = MultiByteToWideChar(CP_ACP,0,doc->lpszDatatype,-1,NULL,0);
        szDatatype = HeapAlloc(GetProcessHeap(),0,len*sizeof(WCHAR));
        MultiByteToWideChar(CP_ACP,0,doc->lpszDatatype,-1,szDatatype,len);
    }

    docW.lpszDocName = szDocName;
    docW.lpszOutput = szOutput;
    docW.lpszDatatype = szDatatype;
    docW.fwType = doc->fwType;

    ret = StartDocW(hdc, &docW);

    HeapFree( GetProcessHeap(), 0, szDocName );
    HeapFree( GetProcessHeap(), 0, szOutput );
    HeapFree( GetProcessHeap(), 0, szDatatype );
131 132

    return ret;
133 134
}

135

136
/******************************************************************
137
 *                  EndDoc  [GDI32.@]
138
 *
139
 */
140 141
INT WINAPI EndDoc(HDC hdc)
{
142
    INT ret = 0;
143
    DC *dc = get_dc_ptr( hdc );
144
    if(!dc) return SP_ERROR;
145

146
    if (dc->funcs->pEndDoc) ret = dc->funcs->pEndDoc( dc->physDev );
147
    release_dc_ptr( dc );
148
    return ret;
149 150
}

151 152

/******************************************************************
153
 *                  StartPage  [GDI32.@]
154 155
 *
 */
156
INT WINAPI StartPage(HDC hdc)
157
{
158
    INT ret = 1;
159
    DC *dc = get_dc_ptr( hdc );
160
    if(!dc) return SP_ERROR;
161 162

    if(dc->funcs->pStartPage)
163
        ret = dc->funcs->pStartPage( dc->physDev );
164 165
    else
        FIXME("stub\n");
166
    release_dc_ptr( dc );
167
    return ret;
168 169
}

Alexandre Julliard's avatar
Alexandre Julliard committed
170

171
/******************************************************************
172
 *                  EndPage  [GDI32.@]
173 174
 *
 */
175
INT WINAPI EndPage(HDC hdc)
176
{
177
    INT ret = 0;
178
    DC *dc = get_dc_ptr( hdc );
179
    if(!dc) return SP_ERROR;
180

181
    if (dc->funcs->pEndPage) ret = dc->funcs->pEndPage( dc->physDev );
182
    release_dc_ptr( dc );
183
    return ret;
184 185
}

186 187

/******************************************************************************
188
 *                 AbortDoc  [GDI32.@]
189
 */
190
INT WINAPI AbortDoc(HDC hdc)
191
{
192
    INT ret = 0;
193
    DC *dc = get_dc_ptr( hdc );
194
    if(!dc) return SP_ERROR;
195

196
    if (dc->funcs->pAbortDoc) ret = dc->funcs->pAbortDoc( dc->physDev );
197
    release_dc_ptr( dc );
198
    return ret;
199
}
200 201 202 203 204 205 206 207 208 209 210 211 212 213 214


/**********************************************************************
 *           SetAbortProc   (GDI32.@)
 *
 */
INT WINAPI SetAbortProc(HDC hdc, ABORTPROC abrtprc)
{
    DC *dc = get_dc_ptr( hdc );

    if (!dc) return FALSE;
    dc->pAbortProc = abrtprc;
    release_dc_ptr( dc );
    return TRUE;
}