localspl: Start implementation of OpenPrinter/ClosePrinter.
This commit is contained in:
parent
abadf9a37a
commit
b4120c7f27
@ -62,6 +62,11 @@ static inline void * __WINE_ALLOC_SIZE(1) heap_alloc_zero( size_t len )
|
|||||||
return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len );
|
return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void * __WINE_ALLOC_SIZE(2) heap_realloc_zero( void * mem, size_t len )
|
||||||
|
{
|
||||||
|
return HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, mem, len );
|
||||||
|
}
|
||||||
|
|
||||||
static inline BOOL heap_free( void *mem )
|
static inline BOOL heap_free( void *mem )
|
||||||
{
|
{
|
||||||
return HeapFree( GetProcessHeap(), 0, mem );
|
return HeapFree( GetProcessHeap(), 0, mem );
|
||||||
|
@ -80,6 +80,11 @@ typedef struct {
|
|||||||
LPCWSTR versionsubdir;
|
LPCWSTR versionsubdir;
|
||||||
} printenv_t;
|
} printenv_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
LPWSTR name;
|
||||||
|
LPWSTR printername;
|
||||||
|
} printer_t;
|
||||||
|
|
||||||
/* ############################### */
|
/* ############################### */
|
||||||
|
|
||||||
static struct list monitor_handles = LIST_INIT( monitor_handles );
|
static struct list monitor_handles = LIST_INIT( monitor_handles );
|
||||||
@ -273,6 +278,32 @@ static LONG copy_servername_from_name(LPCWSTR name, LPWSTR target)
|
|||||||
return serverlen;
|
return serverlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* get_basename_from_name (internal)
|
||||||
|
*
|
||||||
|
* skip over the serverpart from the full name
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static LPCWSTR get_basename_from_name(LPCWSTR name)
|
||||||
|
{
|
||||||
|
if (name == NULL) return NULL;
|
||||||
|
if ((name[0] == '\\') && (name[1] == '\\')) {
|
||||||
|
/* skip over the servername and search for the following '\' */
|
||||||
|
name = strchrW(&name[2], '\\');
|
||||||
|
if ((name) && (name[1])) {
|
||||||
|
/* found a separator ('\') followed by a name:
|
||||||
|
skip over the separator and return the rest */
|
||||||
|
name++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* no basename present (we found only a servername) */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* monitor_unload [internal]
|
* monitor_unload [internal]
|
||||||
*
|
*
|
||||||
@ -907,6 +938,64 @@ static HMODULE driver_load(const printenv_t * env, LPWSTR dllname)
|
|||||||
return hui;
|
return hui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* printer_free
|
||||||
|
* free the data pointer of an opened printer
|
||||||
|
*/
|
||||||
|
static VOID printer_free(printer_t * printer)
|
||||||
|
{
|
||||||
|
|
||||||
|
heap_free(printer->printername);
|
||||||
|
heap_free(printer->name);
|
||||||
|
heap_free(printer);
|
||||||
|
}
|
||||||
|
|
||||||
|
/******************************************************************
|
||||||
|
* printer_alloc_handle
|
||||||
|
* alloc a printer handle and remember the data pointer in the printer handle table
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static HANDLE printer_alloc_handle(LPCWSTR name, LPPRINTER_DEFAULTSW pDefault)
|
||||||
|
{
|
||||||
|
WCHAR servername[MAX_COMPUTERNAME_LENGTH + 1];
|
||||||
|
printer_t *printer = NULL;
|
||||||
|
LPCWSTR printername;
|
||||||
|
|
||||||
|
if (copy_servername_from_name(name, servername)) {
|
||||||
|
FIXME("server %s not supported\n", debugstr_w(servername));
|
||||||
|
SetLastError(ERROR_INVALID_PRINTER_NAME);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
printername = get_basename_from_name(name);
|
||||||
|
if (name != printername) TRACE("converted %s to %s\n", debugstr_w(name), debugstr_w(printername));
|
||||||
|
|
||||||
|
/* an empty printername is invalid */
|
||||||
|
if (printername && (!printername[0])) {
|
||||||
|
SetLastError(ERROR_INVALID_PARAMETER);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
printer = heap_alloc_zero(sizeof(printer_t));
|
||||||
|
if (!printer) goto end;
|
||||||
|
|
||||||
|
/* clone the base name. This is NULL for the printserver */
|
||||||
|
printer->printername = strdupW(printername);
|
||||||
|
|
||||||
|
/* clone the full name */
|
||||||
|
printer->name = strdupW(name);
|
||||||
|
if (name && (!printer->name)) {
|
||||||
|
printer_free(printer);
|
||||||
|
printer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
|
||||||
|
TRACE("==> %p\n", printer);
|
||||||
|
return (HANDLE)printer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* myAddPrinterDriverEx [internal]
|
* myAddPrinterDriverEx [internal]
|
||||||
*
|
*
|
||||||
@ -1213,6 +1302,34 @@ static BOOL WINAPI fpAddPrinterDriverEx(LPWSTR pName, DWORD level, LPBYTE pDrive
|
|||||||
|
|
||||||
return myAddPrinterDriverEx(level, pDriverInfo, dwFileCopyFlags, TRUE);
|
return myAddPrinterDriverEx(level, pDriverInfo, dwFileCopyFlags, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* fpClosePrinter [exported through PRINTPROVIDOR]
|
||||||
|
*
|
||||||
|
* Close a printer handle and free associated resources
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
* hPrinter [I] Printerhandle to close
|
||||||
|
*
|
||||||
|
* RESULTS
|
||||||
|
* Success: TRUE
|
||||||
|
* Failure: FALSE
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static BOOL WINAPI fpClosePrinter(HANDLE hPrinter)
|
||||||
|
{
|
||||||
|
printer_t *printer = (printer_t *) hPrinter;
|
||||||
|
|
||||||
|
TRACE("(%p)\n", hPrinter);
|
||||||
|
|
||||||
|
if (printer) {
|
||||||
|
printer_free(printer);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* fpDeleteMonitor [exported through PRINTPROVIDOR]
|
* fpDeleteMonitor [exported through PRINTPROVIDOR]
|
||||||
*
|
*
|
||||||
@ -1425,13 +1542,48 @@ emP_cleanup:
|
|||||||
return (res);
|
return (res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* fpOpenPrinter [exported through PRINTPROVIDOR]
|
||||||
|
*
|
||||||
|
* Open a Printer / Printserver or a Printer-Object
|
||||||
|
*
|
||||||
|
* PARAMS
|
||||||
|
* lpPrinterName [I] Name of Printserver, Printer, or Printer-Object
|
||||||
|
* pPrinter [O] The resulting Handle is stored here
|
||||||
|
* pDefaults [I] PTR to Default Printer Settings or NULL
|
||||||
|
*
|
||||||
|
* RETURNS
|
||||||
|
* Success: TRUE
|
||||||
|
* Failure: FALSE
|
||||||
|
*
|
||||||
|
* NOTES
|
||||||
|
* lpPrinterName is one of:
|
||||||
|
*| Printserver (NT only): "Servername" or NULL for the local Printserver
|
||||||
|
*| Printer: "PrinterName"
|
||||||
|
*| Printer-Object: "PrinterName,Job xxx"
|
||||||
|
*| XcvMonitor: "Servername,XcvMonitor MonitorName"
|
||||||
|
*| XcvPort: "Servername,XcvPort PortName"
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static BOOL WINAPI fpOpenPrinter(LPWSTR lpPrinterName, HANDLE *pPrinter,
|
||||||
|
LPPRINTER_DEFAULTSW pDefaults)
|
||||||
|
{
|
||||||
|
|
||||||
|
TRACE("(%s, %p, %p)\n", debugstr_w(lpPrinterName), pPrinter, pDefaults);
|
||||||
|
|
||||||
|
*pPrinter = printer_alloc_handle(lpPrinterName, pDefaults);
|
||||||
|
|
||||||
|
return (*pPrinter != 0);
|
||||||
|
}
|
||||||
|
|
||||||
/*****************************************************
|
/*****************************************************
|
||||||
* setup_provider [internal]
|
* setup_provider [internal]
|
||||||
*/
|
*/
|
||||||
void setup_provider(void)
|
void setup_provider(void)
|
||||||
{
|
{
|
||||||
static const PRINTPROVIDOR backend = {
|
static const PRINTPROVIDOR backend = {
|
||||||
NULL, /* fpOpenPrinter */
|
fpOpenPrinter,
|
||||||
NULL, /* fpSetJob */
|
NULL, /* fpSetJob */
|
||||||
NULL, /* fpGetJob */
|
NULL, /* fpGetJob */
|
||||||
NULL, /* fpEnumJobs */
|
NULL, /* fpEnumJobs */
|
||||||
@ -1462,7 +1614,7 @@ void setup_provider(void)
|
|||||||
NULL, /* fpGetPrinterData */
|
NULL, /* fpGetPrinterData */
|
||||||
NULL, /* fpSetPrinterData */
|
NULL, /* fpSetPrinterData */
|
||||||
NULL, /* fpWaitForPrinterChange */
|
NULL, /* fpWaitForPrinterChange */
|
||||||
NULL, /* fpClosePrinter */
|
fpClosePrinter,
|
||||||
NULL, /* fpAddForm */
|
NULL, /* fpAddForm */
|
||||||
NULL, /* fpDeleteForm */
|
NULL, /* fpDeleteForm */
|
||||||
NULL, /* fpGetForm */
|
NULL, /* fpGetForm */
|
||||||
|
@ -111,6 +111,7 @@ typedef struct {
|
|||||||
LPWSTR printername;
|
LPWSTR printername;
|
||||||
monitor_t *pm;
|
monitor_t *pm;
|
||||||
HANDLE hXcv;
|
HANDLE hXcv;
|
||||||
|
HANDLE backend_printer;
|
||||||
jobqueue_t *queue;
|
jobqueue_t *queue;
|
||||||
started_doc_t *doc;
|
started_doc_t *doc;
|
||||||
} opened_printer_t;
|
} opened_printer_t;
|
||||||
@ -1119,7 +1120,7 @@ static LPCWSTR get_basename_from_name(LPCWSTR name)
|
|||||||
* ToDo:
|
* ToDo:
|
||||||
* - pDefault is ignored
|
* - pDefault is ignored
|
||||||
*/
|
*/
|
||||||
static HANDLE get_opened_printer_entry(LPCWSTR name, LPPRINTER_DEFAULTSW pDefault)
|
static HANDLE get_opened_printer_entry(LPWSTR name, LPPRINTER_DEFAULTSW pDefault)
|
||||||
{
|
{
|
||||||
UINT_PTR handle = nb_printer_handles, i;
|
UINT_PTR handle = nb_printer_handles, i;
|
||||||
jobqueue_t *queue = NULL;
|
jobqueue_t *queue = NULL;
|
||||||
@ -1130,6 +1131,8 @@ static HANDLE get_opened_printer_entry(LPCWSTR name, LPPRINTER_DEFAULTSW pDefaul
|
|||||||
HKEY hkeyPrinter;
|
HKEY hkeyPrinter;
|
||||||
DWORD len;
|
DWORD len;
|
||||||
|
|
||||||
|
if ((backend == NULL) && !load_backend()) return NULL;
|
||||||
|
|
||||||
servername = get_servername_from_name(name);
|
servername = get_servername_from_name(name);
|
||||||
if (servername) {
|
if (servername) {
|
||||||
FIXME("server %s not supported\n", debugstr_w(servername));
|
FIXME("server %s not supported\n", debugstr_w(servername));
|
||||||
@ -1188,6 +1191,11 @@ static HANDLE get_opened_printer_entry(LPCWSTR name, LPPRINTER_DEFAULTSW pDefaul
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get a printer handle from the backend */
|
||||||
|
if (! backend->fpOpenPrinter(name, &printer->backend_printer, pDefault)) {
|
||||||
|
handle = 0;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
/* clone the base name. This is NULL for the printserver */
|
/* clone the base name. This is NULL for the printserver */
|
||||||
printer->printername = strdupW(printername);
|
printer->printername = strdupW(printername);
|
||||||
@ -2893,6 +2901,10 @@ BOOL WINAPI ClosePrinter(HANDLE hPrinter)
|
|||||||
debugstr_w(printer->pm ? printer->pm->dllname : NULL),
|
debugstr_w(printer->pm ? printer->pm->dllname : NULL),
|
||||||
printer->hXcv, debugstr_w(printer->name), printer->doc );
|
printer->hXcv, debugstr_w(printer->name), printer->doc );
|
||||||
|
|
||||||
|
if (printer->backend_printer) {
|
||||||
|
backend->fpClosePrinter(printer->backend_printer);
|
||||||
|
}
|
||||||
|
|
||||||
if(printer->doc)
|
if(printer->doc)
|
||||||
EndDocPrinter(hPrinter);
|
EndDocPrinter(hPrinter);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user