Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wine-winehq
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wine
wine-winehq
Commits
0bc112cf
Commit
0bc112cf
authored
May 07, 2009
by
Detlef Riekenberg
Committed by
Alexandre Julliard
May 07, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
winspool: Move remaining Xcv support to the backend.
parent
32828799
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
75 additions
and
82 deletions
+75
-82
provider.c
dlls/localspl/provider.c
+68
-1
info.c
dlls/winspool.drv/info.c
+7
-81
No files found.
dlls/localspl/provider.c
View file @
0bc112cf
...
...
@@ -1724,6 +1724,73 @@ static BOOL WINAPI fpOpenPrinter(LPWSTR lpPrinterName, HANDLE *pPrinter,
return
(
*
pPrinter
!=
0
);
}
/******************************************************************************
* fpXcvData [exported through PRINTPROVIDOR]
*
* Execute commands in the Printmonitor DLL
*
* PARAMS
* hXcv [i] Handle from fpOpenPrinter (with XcvMonitor or XcvPort)
* pszDataName [i] Name of the command to execute
* pInputData [i] Buffer for extra Input Data (needed only for some commands)
* cbInputData [i] Size in Bytes of Buffer at pInputData
* pOutputData [o] Buffer to receive additional Data (needed only for some commands)
* cbOutputData [i] Size in Bytes of Buffer at pOutputData
* pcbOutputNeeded [o] PTR to receive the minimal Size in Bytes of the Buffer at pOutputData
* pdwStatus [o] PTR to receive the win32 error code from the Printmonitor DLL
*
* RETURNS
* Success: TRUE
* Failure: FALSE
*
* NOTES
* Returning "TRUE" does mean, that the Printmonitor DLL was called successful.
* The execution of the command can still fail (check pdwStatus for ERROR_SUCCESS).
*
* Minimal List of commands, that a Printmonitor DLL should support:
*
*| "MonitorUI" : Return the Name of the Userinterface-DLL as WSTR in pOutputData
*| "AddPort" : Add a Port
*| "DeletePort": Delete a Port
*
* Many Printmonitors support additional commands. Examples for localspl.dll:
* "GetDefaultCommConfig", "SetDefaultCommConfig",
* "GetTransmissionRetryTimeout", "ConfigureLPTPortCommandOK"
*
*/
static
BOOL
WINAPI
fpXcvData
(
HANDLE
hXcv
,
LPCWSTR
pszDataName
,
PBYTE
pInputData
,
DWORD
cbInputData
,
PBYTE
pOutputData
,
DWORD
cbOutputData
,
PDWORD
pcbOutputNeeded
,
PDWORD
pdwStatus
)
{
printer_t
*
printer
=
(
printer_t
*
)
hXcv
;
TRACE
(
"(%p, %s, %p, %d, %p, %d, %p, %p)
\n
"
,
hXcv
,
debugstr_w
(
pszDataName
),
pInputData
,
cbInputData
,
pOutputData
,
cbOutputData
,
pcbOutputNeeded
,
pdwStatus
);
if
(
!
printer
||
(
!
printer
->
hXcv
))
{
SetLastError
(
ERROR_INVALID_HANDLE
);
return
FALSE
;
}
if
(
!
pcbOutputNeeded
)
{
SetLastError
(
ERROR_INVALID_PARAMETER
);
return
FALSE
;
}
if
(
!
pszDataName
||
!
pdwStatus
||
(
!
pOutputData
&&
(
cbOutputData
>
0
)))
{
SetLastError
(
RPC_X_NULL_REF_POINTER
);
return
FALSE
;
}
*
pcbOutputNeeded
=
0
;
*
pdwStatus
=
printer
->
pm
->
monitor
->
pfnXcvDataPort
(
printer
->
hXcv
,
pszDataName
,
pInputData
,
cbInputData
,
pOutputData
,
cbOutputData
,
pcbOutputNeeded
);
return
TRUE
;
}
/*****************************************************
* setup_provider [internal]
*/
...
...
@@ -1806,7 +1873,7 @@ void setup_provider(void)
NULL
,
/* fpAddPerMachineConnection */
NULL
,
/* fpDeletePerMachineConnection */
NULL
,
/* fpEnumPerMachineConnections */
NULL
,
/* fpXcvData */
fpXcvData
,
fpAddPrinterDriverEx
,
NULL
,
/* fpSplReadPrinter */
NULL
,
/* fpDriverUnloadComplete */
...
...
dlls/winspool.drv/info.c
View file @
0bc112cf
...
...
@@ -109,8 +109,6 @@ typedef struct {
typedef
struct
{
LPWSTR
name
;
LPWSTR
printername
;
monitor_t
*
pm
;
HANDLE
hXcv
;
HANDLE
backend_printer
;
jobqueue_t
*
queue
;
started_doc_t
*
doc
;
...
...
@@ -244,8 +242,6 @@ static const WCHAR deviceW[] = {'d','e','v','i','c','e',0};
static
const
WCHAR
devicesW
[]
=
{
'd'
,
'e'
,
'v'
,
'i'
,
'c'
,
'e'
,
's'
,
0
};
static
const
WCHAR
windowsW
[]
=
{
'w'
,
'i'
,
'n'
,
'd'
,
'o'
,
'w'
,
's'
,
0
};
static
const
WCHAR
emptyStringW
[]
=
{
0
};
static
const
WCHAR
XcvMonitorW
[]
=
{
','
,
'X'
,
'c'
,
'v'
,
'M'
,
'o'
,
'n'
,
'i'
,
't'
,
'o'
,
'r'
,
' '
,
0
};
static
const
WCHAR
XcvPortW
[]
=
{
','
,
'X'
,
'c'
,
'v'
,
'P'
,
'o'
,
'r'
,
't'
,
' '
,
0
};
static
const
WCHAR
May_Delete_Value
[]
=
{
'W'
,
'i'
,
'n'
,
'e'
,
'M'
,
'a'
,
'y'
,
'D'
,
'e'
,
'l'
,
'e'
,
't'
,
'e'
,
'M'
,
'e'
,
0
};
...
...
@@ -1127,9 +1123,6 @@ static HANDLE get_opened_printer_entry(LPWSTR name, LPPRINTER_DEFAULTSW pDefault
opened_printer_t
*
printer
=
NULL
;
LPWSTR
servername
;
LPCWSTR
printername
;
HKEY
hkeyPrinters
;
HKEY
hkeyPrinter
;
DWORD
len
;
if
((
backend
==
NULL
)
&&
!
load_backend
())
return
NULL
;
...
...
@@ -1207,69 +1200,6 @@ static HANDLE get_opened_printer_entry(LPWSTR name, LPPRINTER_DEFAULTSW pDefault
goto
end
;
}
if
(
printername
)
{
len
=
sizeof
(
XcvMonitorW
)
/
sizeof
(
WCHAR
)
-
1
;
if
(
strncmpW
(
printername
,
XcvMonitorW
,
len
)
==
0
)
{
/* OpenPrinter(",XcvMonitor " detected */
TRACE
(
",XcvMonitor: %s
\n
"
,
debugstr_w
(
&
printername
[
len
]));
printer
->
pm
=
monitor_load
(
&
printername
[
len
],
NULL
);
if
(
printer
->
pm
==
NULL
)
{
SetLastError
(
ERROR_UNKNOWN_PORT
);
handle
=
0
;
goto
end
;
}
}
else
{
len
=
sizeof
(
XcvPortW
)
/
sizeof
(
WCHAR
)
-
1
;
if
(
strncmpW
(
printername
,
XcvPortW
,
len
)
==
0
)
{
/* OpenPrinter(",XcvPort " detected */
TRACE
(
",XcvPort: %s
\n
"
,
debugstr_w
(
&
printername
[
len
]));
printer
->
pm
=
monitor_load_by_port
(
&
printername
[
len
]);
if
(
printer
->
pm
==
NULL
)
{
SetLastError
(
ERROR_UNKNOWN_PORT
);
handle
=
0
;
goto
end
;
}
}
}
if
(
printer
->
pm
)
{
if
((
printer
->
pm
->
monitor
)
&&
(
printer
->
pm
->
monitor
->
pfnXcvOpenPort
))
{
printer
->
pm
->
monitor
->
pfnXcvOpenPort
(
&
printername
[
len
],
pDefault
?
pDefault
->
DesiredAccess
:
0
,
&
printer
->
hXcv
);
}
if
(
printer
->
hXcv
==
NULL
)
{
SetLastError
(
ERROR_INVALID_PARAMETER
);
handle
=
0
;
goto
end
;
}
}
else
{
/* Does the Printer exist? */
if
(
RegCreateKeyW
(
HKEY_LOCAL_MACHINE
,
PrintersW
,
&
hkeyPrinters
)
!=
ERROR_SUCCESS
)
{
ERR
(
"Can't create Printers key
\n
"
);
handle
=
0
;
goto
end
;
}
if
(
RegOpenKeyW
(
hkeyPrinters
,
printername
,
&
hkeyPrinter
)
!=
ERROR_SUCCESS
)
{
WARN
(
"Printer not found in Registry: %s
\n
"
,
debugstr_w
(
printername
));
RegCloseKey
(
hkeyPrinters
);
SetLastError
(
ERROR_INVALID_PRINTER_NAME
);
handle
=
0
;
goto
end
;
}
RegCloseKey
(
hkeyPrinter
);
RegCloseKey
(
hkeyPrinters
);
}
}
else
{
TRACE
(
"using the local printserver
\n
"
);
}
if
(
queue
)
printer
->
queue
=
queue
;
else
...
...
@@ -1290,8 +1220,6 @@ end:
LeaveCriticalSection
(
&
printer_handles_cs
);
if
(
!
handle
&&
printer
)
{
/* Something failed: Free all resources */
if
(
printer
->
hXcv
)
printer
->
pm
->
monitor
->
pfnXcvClosePort
(
printer
->
hXcv
);
monitor_unload
(
printer
->
pm
);
HeapFree
(
GetProcessHeap
(),
0
,
printer
->
printername
);
HeapFree
(
GetProcessHeap
(),
0
,
printer
->
name
);
if
(
!
queue
)
HeapFree
(
GetProcessHeap
(),
0
,
printer
->
queue
);
...
...
@@ -2897,9 +2825,7 @@ BOOL WINAPI ClosePrinter(HANDLE hPrinter)
{
struct
list
*
cursor
,
*
cursor2
;
TRACE
(
"%p: %s (hXcv: %p) for %s (doc: %p)
\n
"
,
printer
->
pm
,
debugstr_w
(
printer
->
pm
?
printer
->
pm
->
dllname
:
NULL
),
printer
->
hXcv
,
debugstr_w
(
printer
->
name
),
printer
->
doc
);
TRACE
(
"closing %s (doc: %p)
\n
"
,
debugstr_w
(
printer
->
name
),
printer
->
doc
);
if
(
printer
->
backend_printer
)
{
backend
->
fpClosePrinter
(
printer
->
backend_printer
);
...
...
@@ -2917,8 +2843,7 @@ BOOL WINAPI ClosePrinter(HANDLE hPrinter)
}
HeapFree
(
GetProcessHeap
(),
0
,
printer
->
queue
);
}
if
(
printer
->
hXcv
)
printer
->
pm
->
monitor
->
pfnXcvClosePort
(
printer
->
hXcv
);
monitor_unload
(
printer
->
pm
);
HeapFree
(
GetProcessHeap
(),
0
,
printer
->
printername
);
HeapFree
(
GetProcessHeap
(),
0
,
printer
->
name
);
HeapFree
(
GetProcessHeap
(),
0
,
printer
);
...
...
@@ -7088,8 +7013,10 @@ BOOL WINAPI XcvDataW( HANDLE hXcv, LPCWSTR pszDataName, PBYTE pInputData,
pInputData
,
cbInputData
,
pOutputData
,
cbOutputData
,
pcbOutputNeeded
,
pdwStatus
);
if
((
backend
==
NULL
)
&&
!
load_backend
())
return
FALSE
;
printer
=
get_opened_printer
(
hXcv
);
if
(
!
printer
||
(
!
printer
->
hXcv
))
{
if
(
!
printer
||
(
!
printer
->
backend_printer
))
{
SetLastError
(
ERROR_INVALID_HANDLE
);
return
FALSE
;
}
...
...
@@ -7106,10 +7033,9 @@ BOOL WINAPI XcvDataW( HANDLE hXcv, LPCWSTR pszDataName, PBYTE pInputData,
*
pcbOutputNeeded
=
0
;
*
pdwStatus
=
printer
->
pm
->
monitor
->
pfnXcvDataPort
(
printer
->
hXcv
,
pszDataName
,
pInputData
,
cbInputData
,
pOutputData
,
cbOutputData
,
pcbOutputNeeded
);
return
backend
->
fpXcvData
(
printer
->
backend_printer
,
pszDataName
,
pInputData
,
cbInputData
,
pOutputData
,
cbOutputData
,
pcbOutputNeeded
,
pdwStatus
);
return
TRUE
;
}
/*****************************************************************************
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment