localspl: Start implementation of OpenPrinter/ClosePrinter.

This commit is contained in:
Detlef Riekenberg 2009-05-05 05:24:34 +02:00 committed by Alexandre Julliard
parent abadf9a37a
commit b4120c7f27
3 changed files with 172 additions and 3 deletions

View file

@ -62,6 +62,11 @@ static inline void * __WINE_ALLOC_SIZE(1) heap_alloc_zero( size_t 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 )
{
return HeapFree( GetProcessHeap(), 0, mem );

View file

@ -80,6 +80,11 @@ typedef struct {
LPCWSTR versionsubdir;
} printenv_t;
typedef struct {
LPWSTR name;
LPWSTR printername;
} printer_t;
/* ############################### */
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;
}
/******************************************************************
* 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]
*
@ -907,6 +938,64 @@ static HMODULE driver_load(const printenv_t * env, LPWSTR dllname)
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]
*
@ -1213,6 +1302,34 @@ static BOOL WINAPI fpAddPrinterDriverEx(LPWSTR pName, DWORD level, LPBYTE pDrive
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]
*
@ -1425,13 +1542,48 @@ emP_cleanup:
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]
*/
void setup_provider(void)
{
static const PRINTPROVIDOR backend = {
NULL, /* fpOpenPrinter */
fpOpenPrinter,
NULL, /* fpSetJob */
NULL, /* fpGetJob */
NULL, /* fpEnumJobs */
@ -1462,7 +1614,7 @@ void setup_provider(void)
NULL, /* fpGetPrinterData */
NULL, /* fpSetPrinterData */
NULL, /* fpWaitForPrinterChange */
NULL, /* fpClosePrinter */
fpClosePrinter,
NULL, /* fpAddForm */
NULL, /* fpDeleteForm */
NULL, /* fpGetForm */

View file

@ -111,6 +111,7 @@ typedef struct {
LPWSTR printername;
monitor_t *pm;
HANDLE hXcv;
HANDLE backend_printer;
jobqueue_t *queue;
started_doc_t *doc;
} opened_printer_t;
@ -1119,7 +1120,7 @@ static LPCWSTR get_basename_from_name(LPCWSTR name)
* ToDo:
* - 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;
jobqueue_t *queue = NULL;
@ -1130,6 +1131,8 @@ static HANDLE get_opened_printer_entry(LPCWSTR name, LPPRINTER_DEFAULTSW pDefaul
HKEY hkeyPrinter;
DWORD len;
if ((backend == NULL) && !load_backend()) return NULL;
servername = get_servername_from_name(name);
if (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;
}
/* 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 */
printer->printername = strdupW(printername);
@ -2893,6 +2901,10 @@ BOOL WINAPI ClosePrinter(HANDLE hPrinter)
debugstr_w(printer->pm ? printer->pm->dllname : NULL),
printer->hXcv, debugstr_w(printer->name), printer->doc );
if (printer->backend_printer) {
backend->fpClosePrinter(printer->backend_printer);
}
if(printer->doc)
EndDocPrinter(hPrinter);