printdrv.c 5.85 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 "winnls.h"
30
#include "winspool.h"
Alexandre Julliard's avatar
Alexandre Julliard committed
31
#include "winerror.h"
32
#include "wine/debug.h"
33
#include "gdi_private.h"
Alexandre Julliard's avatar
Alexandre Julliard committed
34

35
WINE_DEFAULT_DEBUG_CHANNEL(print);
36

37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
/******************************************************************
 * 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
59

60
/******************************************************************
61
 *                  StartDocW  [GDI32.@]
62
 *
63 64 65
 * 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
66
 * the STARTDOC Escape.
67 68
 *
 * Note: we now do it the other way, with the STARTDOC Escape calling StartDoc.
69
 */
70
INT WINAPI StartDocW(HDC hdc, const DOCINFOW* doc)
71
{
72
    INT ret;
73
    DC *dc = get_dc_ptr( hdc );
74

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

79
    if(!dc) return SP_ERROR;
80

81 82
    if (dc->pAbortProc && !dc->pAbortProc( hdc, 0 )) ret = 0;
    else
83
    {
84 85
        PHYSDEV physdev = GET_DC_PHYSDEV( dc, pStartDoc );
        ret = physdev->funcs->pStartDoc( physdev, doc );
86
    }
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 = SP_ERROR;
143
    DC *dc = get_dc_ptr( hdc );
144

145 146 147 148 149 150
    if (dc)
    {
        PHYSDEV physdev = GET_DC_PHYSDEV( dc, pEndDoc );
        ret = physdev->funcs->pEndDoc( physdev );
        release_dc_ptr( dc );
    }
151
    return ret;
152 153
}

154 155

/******************************************************************
156
 *                  StartPage  [GDI32.@]
157 158
 *
 */
159
INT WINAPI StartPage(HDC hdc)
160
{
161
    INT ret = SP_ERROR;
162
    DC *dc = get_dc_ptr( hdc );
163

164 165 166 167 168 169
    if (dc)
    {
        PHYSDEV physdev = GET_DC_PHYSDEV( dc, pStartPage );
        ret = physdev->funcs->pStartPage( physdev );
        release_dc_ptr( dc );
    }
170
    return ret;
171 172
}

Alexandre Julliard's avatar
Alexandre Julliard committed
173

174
/******************************************************************
175
 *                  EndPage  [GDI32.@]
176 177
 *
 */
178
INT WINAPI EndPage(HDC hdc)
179
{
180
    INT ret = SP_ERROR;
181
    DC *dc = get_dc_ptr( hdc );
182

183 184 185 186 187 188
    if (dc)
    {
        PHYSDEV physdev = GET_DC_PHYSDEV( dc, pEndPage );
        ret = physdev->funcs->pEndPage( physdev );
        release_dc_ptr( dc );
    }
189
    return ret;
190 191
}

192 193

/******************************************************************************
194
 *                 AbortDoc  [GDI32.@]
195
 */
196
INT WINAPI AbortDoc(HDC hdc)
197
{
198
    INT ret = SP_ERROR;
199
    DC *dc = get_dc_ptr( hdc );
200

201 202 203 204 205 206
    if (dc)
    {
        PHYSDEV physdev = GET_DC_PHYSDEV( dc, pAbortDoc );
        ret = physdev->funcs->pAbortDoc( physdev );
        release_dc_ptr( dc );
    }
207
    return ret;
208
}
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223


/**********************************************************************
 *           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;
}