printdrv.c 5.72 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 = 0;
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 83 84 85 86
    if (dc->pAbortProc && !dc->pAbortProc( hdc, 0 ))
    {
        release_dc_ptr( dc );
        return ret;
    }

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

/*************************************************************************
93
 *                  StartDocA [GDI32.@]
94
 *
95
 */
96
INT WINAPI StartDocA(HDC hdc, const DOCINFOA* doc)
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 131
    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 );
132 133

    return ret;
134 135
}

136

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

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

152 153

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

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

Alexandre Julliard's avatar
Alexandre Julliard committed
171

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

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

187 188

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

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


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