Commit d317db91 authored by Piotr Caban's avatar Piotr Caban Committed by Alexandre Julliard

gdi32: Store the printer info in a structure.

parent 818a144e
...@@ -51,6 +51,11 @@ struct graphics_driver ...@@ -51,6 +51,11 @@ struct graphics_driver
driver_entry_point entry_point; driver_entry_point entry_point;
}; };
struct print
{
HANDLE printer;
WCHAR *output;
};
DC_ATTR *get_dc_attr( HDC hdc ) DC_ATTR *get_dc_attr( HDC hdc )
{ {
...@@ -200,6 +205,7 @@ HDC WINAPI CreateDCW( LPCWSTR driver, LPCWSTR device, LPCWSTR output, ...@@ -200,6 +205,7 @@ HDC WINAPI CreateDCW( LPCWSTR driver, LPCWSTR device, LPCWSTR output,
driver_entry_point entry_point = NULL; driver_entry_point entry_point = NULL;
const WCHAR *display = NULL, *p; const WCHAR *display = NULL, *p;
WCHAR buf[300], *port = NULL; WCHAR buf[300], *port = NULL;
struct print *print = NULL;
BOOL is_display = FALSE; BOOL is_display = FALSE;
HANDLE hspool = NULL; HANDLE hspool = NULL;
DC_ATTR *dc_attr; DC_ATTR *dc_attr;
...@@ -249,6 +255,11 @@ HDC WINAPI CreateDCW( LPCWSTR driver, LPCWSTR device, LPCWSTR output, ...@@ -249,6 +255,11 @@ HDC WINAPI CreateDCW( LPCWSTR driver, LPCWSTR device, LPCWSTR output,
ClosePrinter( hspool ); ClosePrinter( hspool );
return 0; return 0;
} }
else if (!(print = HeapAlloc( GetProcessHeap(), 0, sizeof(*print) )))
{
ClosePrinter( hspool );
HeapFree( GetProcessHeap(), 0, port );
}
if (display) if (display)
{ {
...@@ -275,13 +286,15 @@ HDC WINAPI CreateDCW( LPCWSTR driver, LPCWSTR device, LPCWSTR output, ...@@ -275,13 +286,15 @@ HDC WINAPI CreateDCW( LPCWSTR driver, LPCWSTR device, LPCWSTR output,
memcpy( port, output, output_str.Length ); memcpy( port, output, output_str.Length );
port[output_str.Length / sizeof(WCHAR)] = 0; port[output_str.Length / sizeof(WCHAR)] = 0;
} }
dc_attr->hspool = HandleToULong( hspool ); print->printer = hspool;
dc_attr->output = (ULONG_PTR)port; print->output = port;
dc_attr->print = (UINT_PTR)print;
} }
else if (hspool) else if (hspool)
{ {
ClosePrinter( hspool ); ClosePrinter( hspool );
HeapFree( GetProcessHeap(), 0, port ); HeapFree( GetProcessHeap(), 0, port );
HeapFree( GetProcessHeap(), 0, print );
} }
return ret; return ret;
...@@ -392,6 +405,21 @@ DEVMODEW *WINAPI GdiConvertToDevmodeW( const DEVMODEA *dmA ) ...@@ -392,6 +405,21 @@ DEVMODEW *WINAPI GdiConvertToDevmodeW( const DEVMODEA *dmA )
return dmW; return dmW;
} }
static inline struct print *get_dc_print( DC_ATTR *dc_attr )
{
return (struct print *)(UINT_PTR)dc_attr->print;
}
static void delete_print_dc( DC_ATTR *dc_attr )
{
struct print *print = get_dc_print( dc_attr );
ClosePrinter( print->printer );
HeapFree( GetProcessHeap(), 0, print->output );
HeapFree( GetProcessHeap(), 0, print );
dc_attr->print = 0;
}
/*********************************************************************** /***********************************************************************
* DeleteDC (GDI32.@) * DeleteDC (GDI32.@)
*/ */
...@@ -401,10 +429,7 @@ BOOL WINAPI DeleteDC( HDC hdc ) ...@@ -401,10 +429,7 @@ BOOL WINAPI DeleteDC( HDC hdc )
if (is_meta_dc( hdc )) return METADC_DeleteDC( hdc ); if (is_meta_dc( hdc )) return METADC_DeleteDC( hdc );
if (!(dc_attr = get_dc_attr( hdc ))) return FALSE; if (!(dc_attr = get_dc_attr( hdc ))) return FALSE;
HeapFree( GetProcessHeap(), 0, (WCHAR *)(ULONG_PTR)dc_attr->output ); if (dc_attr->print) delete_print_dc( dc_attr );
dc_attr->output = 0;
if (dc_attr->hspool) ClosePrinter( ULongToHandle(dc_attr->hspool) );
dc_attr->hspool = 0;
if (dc_attr->emf) EMFDC_DeleteDC( dc_attr ); if (dc_attr->emf) EMFDC_DeleteDC( dc_attr );
return NtGdiDeleteObjectApp( hdc ); return NtGdiDeleteObjectApp( hdc );
} }
...@@ -2192,6 +2217,7 @@ BOOL WINAPI CancelDC(HDC hdc) ...@@ -2192,6 +2217,7 @@ BOOL WINAPI CancelDC(HDC hdc)
INT WINAPI StartDocW( HDC hdc, const DOCINFOW *doc ) INT WINAPI StartDocW( HDC hdc, const DOCINFOW *doc )
{ {
WCHAR *output = NULL; WCHAR *output = NULL;
struct print *print;
DC_ATTR *dc_attr; DC_ATTR *dc_attr;
ABORTPROC proc; ABORTPROC proc;
DOCINFOW info; DOCINFOW info;
...@@ -2218,10 +2244,11 @@ INT WINAPI StartDocW( HDC hdc, const DOCINFOW *doc ) ...@@ -2218,10 +2244,11 @@ INT WINAPI StartDocW( HDC hdc, const DOCINFOW *doc )
proc = (ABORTPROC)(UINT_PTR)dc_attr->abort_proc; proc = (ABORTPROC)(UINT_PTR)dc_attr->abort_proc;
if (proc && !proc( hdc, 0 )) return 0; if (proc && !proc( hdc, 0 )) return 0;
if (dc_attr->hspool) print = get_dc_print( dc_attr );
if (print)
{ {
if (!info.lpszOutput) info.lpszOutput = (const WCHAR *)(ULONG_PTR)dc_attr->output; if (!info.lpszOutput) info.lpszOutput = print->output;
output = StartDocDlgW( ULongToHandle( dc_attr->hspool ), &info ); output = StartDocDlgW( print->printer, &info );
if (output) info.lpszOutput = output; if (output) info.lpszOutput = output;
} }
......
...@@ -198,8 +198,7 @@ typedef struct DC_ATTR ...@@ -198,8 +198,7 @@ typedef struct DC_ATTR
RECTL emf_bounds; RECTL emf_bounds;
UINT64 emf; /* client EMF record pointer */ UINT64 emf; /* client EMF record pointer */
UINT64 abort_proc; /* AbortProc for printing */ UINT64 abort_proc; /* AbortProc for printing */
UINT64 hspool; UINT64 print; /* client printer info pointer */
UINT64 output;
} DC_ATTR; } DC_ATTR;
struct font_enum_entry struct font_enum_entry
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment