diff --git a/dlls/prntvpt/prntvpt.spec b/dlls/prntvpt/prntvpt.spec index bae26fab9d4..9563d9ae370 100644 --- a/dlls/prntvpt/prntvpt.spec +++ b/dlls/prntvpt/prntvpt.spec @@ -4,7 +4,7 @@ @ stdcall PTCloseProvider(ptr) @ stub BindPTProviderThunk @ stub PTGetPrintCapabilities -@ stub PTMergeAndValidatePrintTicket +@ stdcall PTMergeAndValidatePrintTicket(ptr ptr ptr long ptr ptr) @ stdcall PTConvertPrintTicketToDevMode(ptr ptr long long ptr ptr ptr) @ stdcall PTConvertDevModeToPrintTicket(ptr long ptr long ptr) @ stdcall PTReleaseMemory(ptr) diff --git a/dlls/prntvpt/ticket.c b/dlls/prntvpt/ticket.c index e9745233c98..42cdec6ec07 100644 --- a/dlls/prntvpt/ticket.c +++ b/dlls/prntvpt/ticket.c @@ -1227,3 +1227,31 @@ HRESULT WINAPI PTConvertDevModeToPrintTicket(HPTPROVIDER provider, ULONG size, P return write_ticket(stream, &ticket, scope); } + +HRESULT WINAPI PTMergeAndValidatePrintTicket(HPTPROVIDER provider, IStream *base, IStream *delta, + EPrintTicketScope scope, IStream *result, BSTR *error) +{ + struct prn_provider *prov = (struct prn_provider *)provider; + struct ticket ticket; + HRESULT hr; + + TRACE("%p,%p,%p,%d,%p,%p\n", provider, base, delta, scope, result, error); + + if (!is_valid_provider(provider) || !base || !result) + return E_INVALIDARG; + + hr = initialize_ticket(prov, &ticket); + if (hr != S_OK) return hr; + + hr = parse_ticket(base, scope, &ticket); + if (hr != S_OK) return hr; + + if (delta) + { + hr = parse_ticket(delta, scope, &ticket); + if (hr != S_OK) return hr; + } + + hr = write_ticket(result, &ticket, scope); + return hr ? hr : S_PT_NO_CONFLICT; +} diff --git a/include/prntvpt.h b/include/prntvpt.h index f1d7edc3502..94b047d8c76 100644 --- a/include/prntvpt.h +++ b/include/prntvpt.h @@ -25,7 +25,9 @@ extern "C" { DECLARE_HANDLE(HPTPROVIDER); -#define E_PRINTTICKET_FORMAT 0x80040003 +#define S_PT_NO_CONFLICT 0x00040001 +#define S_PT_CONFLICT_RESOLVED 0x00040002 +#define E_PRINTTICKET_FORMAT 0x80040003 typedef enum { @@ -45,6 +47,7 @@ HRESULT WINAPI PTOpenProviderEx(const WCHAR *printer, DWORD max_version, DWORD p HRESULT WINAPI PTCloseProvider(HPTPROVIDER); HRESULT WINAPI PTConvertDevModeToPrintTicket(HPTPROVIDER, ULONG, PDEVMODEW, EPrintTicketScope, IStream *); HRESULT WINAPI PTConvertPrintTicketToDevMode(HPTPROVIDER, IStream *, EDefaultDevmodeType, EPrintTicketScope, ULONG *, PDEVMODEW *, BSTR *); +HRESULT WINAPI PTMergeAndValidatePrintTicket(HPTPROVIDER, IStream *, IStream *, EPrintTicketScope, IStream *, BSTR *); HRESULT WINAPI PTReleaseMemory(PVOID); #ifdef __cplusplus