/*++ Copyright (c) 1996-1997 Microsoft Corporation Module Name: intfui.cpp Abstract: Interface implementation of Windows NT driver UI OEM plugins Environment: Windows NT driver UI Revision History: --*/ #define INITGUID #include "precomp.h" // // List all of the supported OEM UI plugin interface IIDs from the // latest to the oldest, that's the order our driver will QI OEM // plugin for its supported interface. // // DON"T remove the last NULL terminator. // static const GUID *PrintOemUI_IIDs[] = { &IID_IPrintOemUI2, &IID_IPrintOemUI, NULL }; #define CALL_INTERFACE(pOemEntry, MethodName, args) \ if (IsEqualGUID(&(pOemEntry)->iidIntfOem, &IID_IPrintOemUI)) \ { \ return ((IPrintOemUI *)(pOemEntry)->pIntfOem)->MethodName args; \ } \ else if (IsEqualGUID(&(pOemEntry)->iidIntfOem, &IID_IPrintOemUI2)) \ { \ return ((IPrintOemUI2 *)(pOemEntry)->pIntfOem)->MethodName args; \ } \ return E_NOINTERFACE; #define CALL_INTERFACE2(pOemEntry, MethodName, args) \ if (IsEqualGUID(&(pOemEntry)->iidIntfOem, &IID_IPrintOemUI2)) \ { \ return ((IPrintOemUI2 *)(pOemEntry)->pIntfOem)->MethodName args; \ } \ return E_NOINTERFACE; #ifdef PSCRIPT #define VERIFY_OEMUIOBJ(poemuiobj) \ if (!poemuiobj || (((PCOMMONINFO)poemuiobj)->pvStartSign != poemuiobj)) \ return E_INVALIDARG; #define VERIFY_UIDATA(poemuiobj) \ if (!VALIDUIDATA((PUIDATA)poemuiobj)) \ return E_INVALIDARG; #endif // PSCRIPT // // Core driver helper function interfaces // // // The first driver UI herlper interface has version number 1. Any new // helper interface version number is 1 plus the previous version number. // So we need to increase MAX_UI_HELPER_INTF_VER by 1 every time we introduce // a new UI plugin helper interface. // #ifdef PSCRIPT #define MAX_UI_HELPER_INTF_VER 2 #else #define MAX_UI_HELPER_INTF_VER 1 #endif // PSCRIPT // // CPrintOemDriverUI is the object containing the UI helper functions // class CPrintOemDriverUI : public IPrintOemDriverUI { // // IUnknown implementation // virtual STDMETHODIMP QueryInterface(const IID& iid, void** ppv); virtual STDMETHODIMP_(ULONG) AddRef(); virtual STDMETHODIMP_(ULONG) Release(); // // Interface IPrintOemDriverUI implementation // virtual STDMETHODIMP DrvGetDriverSetting( PVOID pci, PCSTR pFeature, PVOID pOutput, DWORD cbSize, PDWORD pcbNeeded, PDWORD pdwOptionsReturned); virtual STDMETHODIMP DrvUpgradeRegistrySetting( HANDLE hPrinter, PCSTR pFeature, PCSTR pOption); virtual STDMETHODIMP DrvUpdateUISetting ( PVOID pci, PVOID pOptItem, DWORD dwPreviousSelection, DWORD dwMode); public: // // Constructor // CPrintOemDriverUI() : m_cRef(0) {} private: long m_cRef; }; STDMETHODIMP CPrintOemDriverUI::QueryInterface(const IID& iid, void** ppv) { if (iid == IID_IUnknown || iid == IID_IPrintOemDriverUI) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } STDMETHODIMP_(ULONG) CPrintOemDriverUI::AddRef() { return InterlockedIncrement(&m_cRef); } STDMETHODIMP_(ULONG) CPrintOemDriverUI::Release() { if (InterlockedDecrement(&m_cRef) == 0) { delete this; return 0; } return m_cRef; } STDMETHODIMP CPrintOemDriverUI::DrvGetDriverSetting(PVOID pci, PCSTR pFeature, PVOID pOutput, DWORD cbSize, PDWORD pcbNeeded, PDWORD pdwOptionsReturned) { if (BGetDriverSettingForOEM((PCOMMONINFO)pci, pFeature, pOutput, cbSize, pcbNeeded, pdwOptionsReturned)) return S_OK; return E_FAIL; } STDMETHODIMP CPrintOemDriverUI::DrvUpgradeRegistrySetting(HANDLE hPrinter, PCSTR pFeature, PCSTR pOption) { if (BUpgradeRegistrySettingForOEM(hPrinter, pFeature, pOption)) return S_OK; return E_FAIL; } STDMETHODIMP CPrintOemDriverUI::DrvUpdateUISetting(PVOID pci, PVOID pOptItem, DWORD dwPreviousSelection, DWORD dwMode) { if (BUpdateUISettingForOEM((PCOMMONINFO)pci, pOptItem, dwPreviousSelection, dwMode)) return S_OK; return E_FAIL; } #ifdef PSCRIPT // // CPrintCoreUI2 is the object containing the new UI helper functions // class CPrintCoreUI2 : public IPrintCoreUI2 { // // IUnknown implementation // virtual STDMETHODIMP QueryInterface(const IID& iid, void** ppv); virtual STDMETHODIMP_(ULONG) AddRef(); virtual STDMETHODIMP_(ULONG) Release(); // // IPrintOemDriverUI methods implementation // virtual STDMETHODIMP DrvGetDriverSetting(PVOID pci, PCSTR pFeature, PVOID pOutput, DWORD cbSize, PDWORD pcbNeeded, PDWORD pdwOptionsReturned); virtual STDMETHODIMP DrvUpgradeRegistrySetting(HANDLE hPrinter, PCSTR pFeature, PCSTR pOption); virtual STDMETHODIMP DrvUpdateUISetting(PVOID pci, PVOID pOptItem, DWORD dwPreviousSelection, DWORD dwMode); // // IPrintCoreUI2 methods implementation // virtual STDMETHODIMP GetOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pmszFeaturesRequested, IN DWORD cbIn, OUT PSTR pmszFeatureOptionBuf, IN DWORD cbSize, OUT PDWORD pcbNeeded); virtual STDMETHODIMP SetOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pmszFeatureOptionBuf, IN DWORD cbIn, OUT PDWORD pdwResult); virtual STDMETHODIMP EnumConstrainedOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, OUT PSTR pmszConstrainedOptionList, IN DWORD cbSize, OUT PDWORD pcbNeeded); virtual STDMETHODIMP WhyConstrained( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, IN PCSTR pszOptionKeyword, OUT PSTR pmszReasonList, IN DWORD cbSize, OUT PDWORD pcbNeeded); virtual STDMETHODIMP GetGlobalAttribute( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszAttribute, OUT PDWORD pdwDataType, OUT PBYTE pbData, IN DWORD cbSize, OUT PDWORD pcbNeeded); virtual STDMETHODIMP GetFeatureAttribute( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, IN PCSTR pszAttribute, OUT PDWORD pdwDataType, OUT PBYTE pbData, IN DWORD cbSize, OUT PDWORD pcbNeeded); virtual STDMETHODIMP GetOptionAttribute( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, IN PCSTR pszOptionKeyword, IN PCSTR pszAttribute, OUT PDWORD pdwDataType, OUT PBYTE pbData, IN DWORD cbSize, OUT PDWORD pcbNeeded); virtual STDMETHODIMP EnumFeatures( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, OUT PSTR pmszFeatureList, IN DWORD cbSize, OUT PDWORD pcbNeeded); virtual STDMETHODIMP EnumOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, OUT PSTR pmszOptionList, IN DWORD cbSize, OUT PDWORD pcbNeeded); virtual STDMETHODIMP QuerySimulationSupport( IN HANDLE hPrinter, IN DWORD dwLevel, OUT PBYTE pCaps, IN DWORD cbSize, OUT PDWORD pcbNeeded); public: // // Constructor // CPrintCoreUI2() : m_cRef(0) {} private: long m_cRef; }; STDMETHODIMP CPrintCoreUI2::QueryInterface(const IID& iid, void** ppv) { if (iid == IID_IUnknown || iid == IID_IPrintCoreUI2) { *ppv = static_cast(this); } else { *ppv = NULL; return E_NOINTERFACE; } reinterpret_cast(*ppv)->AddRef(); return S_OK; } STDMETHODIMP_(ULONG) CPrintCoreUI2::AddRef() { return InterlockedIncrement(&m_cRef); } STDMETHODIMP_(ULONG) CPrintCoreUI2::Release() { if (InterlockedDecrement(&m_cRef) == 0) { delete this; return 0; } return m_cRef; } STDMETHODIMP CPrintCoreUI2::DrvGetDriverSetting(PVOID pci, PCSTR pFeature, PVOID pOutput, DWORD cbSize, PDWORD pcbNeeded, PDWORD pdwOptionsReturned) { VERIFY_OEMUIOBJ((POEMUIOBJ)pci) // // This function is only supported for UI plugins that DON'T fully replace // core driver's standard UI. It should only be called by the UI plugin's // DocumentPropertySheets, DevicePropertySheets and their property sheet // callback functions. // if (!IS_WITHIN_PROPSHEET_SESSION((PCOMMONINFO)pci)) { ERR(("DrvGetDriverSetting called outside of property sheet session. E_NOTIMPL returned.\n")); return E_NOTIMPL; } VERIFY_UIDATA((POEMUIOBJ)pci) if (IS_HIDING_STD_UI((PUIDATA)pci)) { ERR(("DrvGetDriverSetting called by full UI replacing plugin. E_NOTIMPL returned.\n")); return E_NOTIMPL; } if (BGetDriverSettingForOEM((PCOMMONINFO)pci, pFeature, pOutput, cbSize, pcbNeeded, pdwOptionsReturned)) { return S_OK; } return E_FAIL; } STDMETHODIMP CPrintCoreUI2::DrvUpgradeRegistrySetting(HANDLE hPrinter, PCSTR pFeature, PCSTR pOption) { if (BUpgradeRegistrySettingForOEM(hPrinter, pFeature, pOption)) { return S_OK; } return E_FAIL; } STDMETHODIMP CPrintCoreUI2::DrvUpdateUISetting(PVOID pci, PVOID pOptItem, DWORD dwPreviousSelection, DWORD dwMode) { VERIFY_OEMUIOBJ((POEMUIOBJ)pci) // // This function is only supported for UI plugins that DON'T fully replace // core driver's standard UI. It should only be called by the UI plugin's // DocumentPropertySheets, DevicePropertySheets and their property sheet // callback functions. // if (!IS_WITHIN_PROPSHEET_SESSION((PCOMMONINFO)pci)) { ERR(("DrvUpdateUISetting called outside of property sheet session. E_NOTIMPL returned.\n")); return E_NOTIMPL; } VERIFY_UIDATA((POEMUIOBJ)pci) if (IS_HIDING_STD_UI((PUIDATA)pci)) { ERR(("DrvUpdateUISetting called by full UI replacing plugin. E_NOTIMPL returned.\n")); return E_NOTIMPL; } if (BUpdateUISettingForOEM((PCOMMONINFO)pci, pOptItem, dwPreviousSelection, dwMode)) { return S_OK; } return E_FAIL; } /*++ Routine Name: GetOptions Routine Description: get current driver settings for PPD features and driver synthesized features Arguments: poemuiobj - pointer to driver context object dwFlags - flags for the get operation pmszFeaturesRequested - MULTI_SZ ASCII string containing feature keyword names cbin - size in bytes of the pmszFeaturesRequested string pmszFeatureOptionBuf - pointer to output data buffer to store feature settings cbSize - size in bytes of pmszFeatureOptionBuf buffer pcbNeeded - buffer size in bytes needed to output the feature settings Return Value: E_NOTIMPL if called when not supported E_INVALIDARG if poemuiobj is invalid, or see HGetOptions S_OK E_OUTOFMEMORY E_FAIL see HGetOptions Last Error: None --*/ STDMETHODIMP CPrintCoreUI2::GetOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pmszFeaturesRequested, IN DWORD cbIn, OUT PSTR pmszFeatureOptionBuf, IN DWORD cbSize, OUT PDWORD pcbNeeded) { PCOMMONINFO pci; VERIFY_OEMUIOBJ(poemuiobj) // // This function is only supported for UI plugins that fully replace // core driver's standard UI. It should only be called by the UI plugin's // DocumentPropertySheets, DevicePropertySheets and their property sheet // callback functions. // pci = (PCOMMONINFO)poemuiobj; if (!IS_WITHIN_PROPSHEET_SESSION(pci)) { ERR(("GetOptions called outside of property sheet session. E_NOTIMPL returned.\n")); return E_NOTIMPL; } VERIFY_UIDATA(poemuiobj) if (!IS_HIDING_STD_UI((PUIDATA)pci)) { ERR(("GetOptions called by non-full UI replacing plugin. E_NOTIMPL returned.\n")); return E_NOTIMPL; } #ifdef PSCRIPT return HGetOptions(pci->hPrinter, pci->pInfoHeader, pci->pCombinedOptions, pci->pdm, pci->pPrinterData, dwFlags, pmszFeaturesRequested, cbIn, pmszFeatureOptionBuf, cbSize, pcbNeeded, ((PUIDATA)pci)->iMode == MODE_PRINTER_STICKY ? TRUE : FALSE); #else return E_NOTIMPL; #endif // PSCRIPT } /*++ Routine Name: SetOptions Routine Description: set new driver settings for PPD features and driver synthesized features Arguments: poemuiobj - pointer to driver context object dwFlags - flags for the set operation. This should be one of following: SETOPTIONS_FLAG_RESOLVE_CONFLICT SETOPTIONS_FLAG_KEEP_CONFLICT pmszFeatureOptionBuf - MULTI_SZ ASCII string containing new settings' feature/option keyword pairs cbin - size in bytes of the pmszFeatureOptionBuf string pdwResult - pointer to the DWORD that will store the result of set operation. The result will be one of following: SETOPTIONS_RESULT_NO_CONFLICT SETOPTIONS_RESULT_CONFLICT_RESOLVED SETOPTIONS_RESULT_CONFLICT_REMAINED Return Value: S_OK if the set operation succeeds E_NOTIMPL if called when not supported E_INVALIDARG if poemuiobj is invalid, or see HSetOptions E_FAIL see HSetOptions Last Error: None --*/ STDMETHODIMP CPrintCoreUI2::SetOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pmszFeatureOptionBuf, IN DWORD cbIn, OUT PDWORD pdwResult) { VERIFY_OEMUIOBJ(poemuiobj) // // This function is only supported for UI plugins that fully replace // core driver's standard UI. It should only be called by the UI plugin's // DocumentPropertySheets, DevicePropertySheets and their property sheet // callback functions. // if (!IS_WITHIN_PROPSHEET_SESSION((PCOMMONINFO)poemuiobj)) { ERR(("SetOptions called outside of property sheet session. E_NOTIMPL returned.\n")); return E_NOTIMPL; } VERIFY_UIDATA(poemuiobj) if (!IS_HIDING_STD_UI((PUIDATA)poemuiobj)) { ERR(("SetOptions called by non-full UI replacing plugin. E_NOTIMPL returned.\n")); return E_NOTIMPL; } #ifdef PSCRIPT return HSetOptions(poemuiobj, dwFlags, pmszFeatureOptionBuf, cbIn, pdwResult); #else return E_NOTIMPL; #endif // PSCRIPT } /*++ Routine Name: EnumConstrainedOptions Routine Description: enumerate the constrained option keyword name list in the specified feature Arguments: poemuiobj - pointer to driver context object dwFlags - flags for the enumeration operation pszFeatureKeyword - feature keyword name pmszConstrainedOptionList - pointer to output data buffer cbSize - output data buffer size in bytes pcbNeeded - buffer size in bytes needed to store the output data Return Value: E_NOTIMPL if called when not supported E_INVALIDARG if poemuiobj is invalid, or see HEnumConstrainedOptions S_OK E_OUTOFMEMORY E_FAIL see HEnumConstrainedOptions Last Error: None --*/ STDMETHODIMP CPrintCoreUI2::EnumConstrainedOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, OUT PSTR pmszConstrainedOptionList, IN DWORD cbSize, OUT PDWORD pcbNeeded) { VERIFY_OEMUIOBJ(poemuiobj) // // This function is only supported for UI plugins that fully replace // core driver's standard UI. It should only be called by the UI plugin's // DocumentPropertySheets, DevicePropertySheets and their property sheet // callback functions. // if (!IS_WITHIN_PROPSHEET_SESSION((PCOMMONINFO)poemuiobj)) { ERR(("EnumConstrainedOptions called outside of property sheet session. E_NOTIMPL returned.\n")); return E_NOTIMPL; } VERIFY_UIDATA(poemuiobj) if (!IS_HIDING_STD_UI((PUIDATA)poemuiobj)) { ERR(("EnumConstrainedOptions called by non-full UI replacing plugin. E_NOTIMPL returned.\n")); return E_NOTIMPL; } #ifdef PSCRIPT return HEnumConstrainedOptions(poemuiobj, dwFlags, pszFeatureKeyword, pmszConstrainedOptionList, cbSize, pcbNeeded); #else return E_NOTIMPL; #endif // PSCRIPT } /*++ Routine Name: WhyConstrained Routine Description: get feature/option keyword pair that constrains the given feature/option pair Arguments: poemuiobj - pointer to driver context object dwFlags - flags for this operation pszFeatureKeyword - feature keyword name pszOptionKeyword - option keyword name pmszReasonList - pointer to output data buffer cbSize - output data buffer size in bytes pcbNeeded - buffer size in bytes needed to store the output data Return Value: E_NOTIMPL if called when not supported E_INVALIDARG if poemuiobj is invalid, or see HWhyConstrained S_OK E_OUTOFMEMORY see HWhyConstrained Last Error: None --*/ STDMETHODIMP CPrintCoreUI2::WhyConstrained( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, IN PCSTR pszOptionKeyword, OUT PSTR pmszReasonList, IN DWORD cbSize, OUT PDWORD pcbNeeded) { VERIFY_OEMUIOBJ(poemuiobj) // // This function is only supported for UI plugins that fully replace // core driver's standard UI. It should only be called by the UI plugin's // DocumentPropertySheets, DevicePropertySheets and their property sheet // callback functions. // if (!IS_WITHIN_PROPSHEET_SESSION((PCOMMONINFO)poemuiobj)) { ERR(("WhyConstrained called outside of property sheet session. E_NOTIMPL returned.\n")); return E_NOTIMPL; } VERIFY_UIDATA(poemuiobj) if (!IS_HIDING_STD_UI((PUIDATA)poemuiobj)) { ERR(("WhyConstrained called by non-full UI replacing plugin. E_NOTIMPL returned.\n")); return E_NOTIMPL; } #ifdef PSCRIPT return HWhyConstrained(poemuiobj, dwFlags, pszFeatureKeyword, pszOptionKeyword, pmszReasonList, cbSize, pcbNeeded); #else return E_NOTIMPL; #endif // PSCRIPT } /*++ Routine Name: GetGlobalAttribute Routine Description: get PPD global attribute Arguments: poemuiobj - pointer to driver context object dwFlags - flags for the attribute get operation pszAttribute - name of the global attribute pdwDataType - pointer to DWORD to store output data type pbData - pointer to output data buffer cbSize - output data buffer size in bytes pcbNeeded - buffer size in bytes needed to store the output data Return Value: E_INVALIDARG if poemuiobj is invalid, or see HGetGlobalAttribute S_OK E_OUTOFMEMORY see HGetGlobalAttribute Last Error: None --*/ STDMETHODIMP CPrintCoreUI2::GetGlobalAttribute( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszAttribute, OUT PDWORD pdwDataType, OUT PBYTE pbData, IN DWORD cbSize, OUT PDWORD pcbNeeded) { VERIFY_OEMUIOBJ(poemuiobj) #ifdef PSCRIPT return HGetGlobalAttribute(((PCOMMONINFO)poemuiobj)->pInfoHeader, dwFlags, pszAttribute, pdwDataType, pbData, cbSize, pcbNeeded); #else return E_NOTIMPL; #endif // PSCRIPT } /*++ Routine Name: GetFeatureAttribute Routine Description: get PPD feature attribute Arguments: poemuiobj - pointer to driver context object dwFlags - flags for the attribute get operation pszFeatureKeyword - PPD feature keyword name pszAttribute - name of the feature attribute pdwDataType - pointer to DWORD to store output data type pbData - pointer to output data buffer cbSize - output data buffer size in bytes pcbNeeded - buffer size in bytes needed to store the output data Return Value: E_INVALIDARG if poemuiobj is invalid, or see HGetFeatureAttribute S_OK E_OUTOFMEMORY see HGetFeatureAttribute Last Error: None --*/ STDMETHODIMP CPrintCoreUI2::GetFeatureAttribute( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, IN PCSTR pszAttribute, OUT PDWORD pdwDataType, OUT PBYTE pbData, IN DWORD cbSize, OUT PDWORD pcbNeeded) { VERIFY_OEMUIOBJ(poemuiobj) #ifdef PSCRIPT return HGetFeatureAttribute(((PCOMMONINFO)poemuiobj)->pInfoHeader, dwFlags, pszFeatureKeyword, pszAttribute, pdwDataType, pbData, cbSize, pcbNeeded); #else return E_NOTIMPL; #endif // PSCRIPT } /*++ Routine Name: GetOptionAttribute Routine Description: get option attribute of a PPD feature Arguments: poemuiobj - pointer to driver context object dwFlags - flags for the attribute get operation pszFeatureKeyword - PPD feature keyword name pszOptionKeyword - option keyword name of the PPD feature pszAttribute - name of the feature attribute pdwDataType - pointer to DWORD to store output data type pbData - pointer to output data buffer cbSize - output data buffer size in bytes pcbNeeded - buffer size in bytes needed to store the output data Return Value: E_INVALIDARG if poemuiobj is invalid, or see HGetOptionAttribute S_OK E_OUTOFMEMORY see HGetOptionAttribute Last Error: None --*/ STDMETHODIMP CPrintCoreUI2::GetOptionAttribute( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, IN PCSTR pszOptionKeyword, IN PCSTR pszAttribute, OUT PDWORD pdwDataType, OUT PBYTE pbData, IN DWORD cbSize, OUT PDWORD pcbNeeded) { VERIFY_OEMUIOBJ(poemuiobj) #ifdef PSCRIPT return HGetOptionAttribute(((PCOMMONINFO)poemuiobj)->pInfoHeader, dwFlags, pszFeatureKeyword, pszOptionKeyword, pszAttribute, pdwDataType, pbData, cbSize, pcbNeeded); #else return E_NOTIMPL; #endif // PSCRIPT } /*++ Routine Name: EnumFeatures Routine Description: enumerate PPD feature and supported driver feature keyword name list Arguments: poemuiobj - pointer to driver context object dwFlags - flags for the enumeration operation pmszFeatureList - pointer to output data buffer cbSize - output data buffer size in bytes pcbNeeded - buffer size in bytes needed to store the output data Return Value: E_INVALIDARG if peomuiobj is invalid S_OK E_OUTOFMEMORY E_FAIL see HEnumFeaturesOrOptions Last Error: None --*/ STDMETHODIMP CPrintCoreUI2::EnumFeatures( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, OUT PSTR pmszFeatureList, IN DWORD cbSize, OUT PDWORD pcbNeeded) { VERIFY_OEMUIOBJ(poemuiobj) #ifdef PSCRIPT return HEnumFeaturesOrOptions(((PCOMMONINFO)poemuiobj)->hPrinter, ((PCOMMONINFO)poemuiobj)->pInfoHeader, dwFlags, NULL, pmszFeatureList, cbSize, pcbNeeded); #else return E_NOTIMPL; #endif // PSCRIPT } /*++ Routine Name: EnumOptions Routine Description: enumerate option keyword name list of the specified feature Arguments: poemuiobj - pointer to driver context object dwFlags - flags for the enumeration operation pszFeatureKeyword - feature keyword name pmszOptionList - pointer to output data buffer cbSize - output data buffer size in bytes pcbNeeded - buffer size in bytes needed to store the output data Return Value: E_INVALIDARG if poemuiobj is invalid, or feature keyword name is invalid S_OK E_OUTOFMEMORY E_NOTIMPL E_FAIL see HEnumFeaturesOrOptions Last Error: --*/ STDMETHODIMP CPrintCoreUI2::EnumOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, OUT PSTR pmszOptionList, IN DWORD cbSize, OUT PDWORD pcbNeeded) { VERIFY_OEMUIOBJ(poemuiobj) if (pszFeatureKeyword == NULL) { return E_INVALIDARG; } #ifdef PSCRIPT return HEnumFeaturesOrOptions(((PCOMMONINFO)poemuiobj)->hPrinter, ((PCOMMONINFO)poemuiobj)->pInfoHeader, dwFlags, pszFeatureKeyword, pmszOptionList, cbSize, pcbNeeded); #else return E_NOTIMPL; #endif // PSCRIPT } /*++ Routine Name: QuerySimulationSupport Routine Description: get the spooler simulation capability info structure Arguments: hPrinter - printer handle dwLevel - interested level of spooler simulation capability info structure pCaps - pointer to output buffer cbSize - size in bytes of output buffer pcbNeeded - buffer size in bytes needed to store the interested info structure Return Value: E_NOTIMPL if called on NT4, or see HQuerySimulationSupport S_OK E_OUTOFMEMORY E_NOTIMPL E_FAIL see HQuerySimulationSupport Last Error: None --*/ STDMETHODIMP CPrintCoreUI2::QuerySimulationSupport( IN HANDLE hPrinter, IN DWORD dwLevel, OUT PBYTE pCaps, IN DWORD cbSize, OUT PDWORD pcbNeeded) { #ifndef WINNT_40 return HQuerySimulationSupport(hPrinter, dwLevel, pCaps, cbSize, pcbNeeded); #else return E_NOTIMPL; #endif // !WINNT_40 } #endif // PSCRIPT // // Creation function // extern "C" IUnknown* DriverCreateInstance(INT iHelperIntfVer) { IUnknown *pI = NULL; switch (iHelperIntfVer) { case 1: pI = static_cast(new CPrintOemDriverUI); break; #ifdef PSCRIPT case 2: pI = static_cast(new CPrintCoreUI2); break; #endif // PSCRIPT default: ERR(("Unrecognized helper interface version: %d\n", iHelperIntfVer)); break; } if (pI != NULL) pI->AddRef(); return pI; } // // Get OEM plugin interface and publish driver helper interface // extern "C" BOOL BGetOemInterface(POEM_PLUGIN_ENTRY pOemEntry) { IUnknown *pIDriverHelper = NULL; HRESULT hr; INT iHelperVer; // // QI to retrieve the latest interface OEM plugin supports // if (!BQILatestOemInterface(pOemEntry->hInstance, CLSID_OEMUI, PrintOemUI_IIDs, &(pOemEntry->pIntfOem), &(pOemEntry->iidIntfOem))) { ERR(("BQILatestOemInterface failed\n")); return FALSE; } // // If QI succeeded, pOemEntry->pIntfOem will have the OEM plugin // interface pointer with ref count 1. // // // Now publish driver's helper function interface (from latest to oldest). // for (iHelperVer = MAX_UI_HELPER_INTF_VER; iHelperVer > 0; iHelperVer--) { if ((pIDriverHelper = DriverCreateInstance(iHelperVer)) == NULL) { ERR(("DriverCreateInstance failed for version %d\n", iHelperVer)); goto fail_cleanup; } // // As long as we define new OEM UI plugin interface by inheriting old ones, // we can always cast pIntfOem into pointer of the oldest plugin interface // (the base class) and call PublishDriverInterface method. // // Otherwise, this code needs to be modified when new interface is added. // hr = ((IPrintOemUI *)(pOemEntry->pIntfOem))->PublishDriverInterface(pIDriverHelper); // // OEM plugin should do QI in their PublishDriverInterface, so we need to release // our ref count of pIDriverHelper. // pIDriverHelper->Release(); if (SUCCEEDED(hr)) { VERBOSE(("PublishDriverInterface succeeded for version %d\n", iHelperVer)); break; } } if (iHelperVer == 0) { ERR(("PublishDriverInterface failed\n")); goto fail_cleanup; } return TRUE; fail_cleanup: // // If failed, we need to release the ref count we hold on pOemEntry->pIntfOem, // and set pIntfOem to NULL to indicate no COM interface is available. // ((IUnknown *)(pOemEntry->pIntfOem))->Release(); pOemEntry->pIntfOem = NULL; return FALSE; } extern "C" ULONG ReleaseOemInterface(POEM_PLUGIN_ENTRY pOemEntry) { #ifdef WINNT_40 if (IsEqualGUID(&pOemEntry->iidIntfOem, &IID_IPrintOemUI)) { return ((IPrintOemUI *)(pOemEntry)->pIntfOem)->Release(); } #else CALL_INTERFACE(pOemEntry, Release, ()); #endif return 0; } extern "C" HRESULT HComOEMGetInfo(POEM_PLUGIN_ENTRY pOemEntry, DWORD dwMode, PVOID pBuffer, DWORD cbSize, PDWORD pcbNeeded) { CALL_INTERFACE(pOemEntry, GetInfo, (dwMode, pBuffer, cbSize, pcbNeeded)); } extern "C" HRESULT HComOEMDevMode(POEM_PLUGIN_ENTRY pOemEntry, DWORD dwMode, POEMDMPARAM pOemDMParam) { CALL_INTERFACE(pOemEntry, DevMode, (dwMode, pOemDMParam)); } extern "C" HRESULT HComOEMCommonUIProp(POEM_PLUGIN_ENTRY pOemEntry, DWORD dwMode, POEMCUIPPARAM pOemCUIPParam) { CALL_INTERFACE(pOemEntry, CommonUIProp, (dwMode, pOemCUIPParam)); } extern "C" HRESULT HComOEMDocumentPropertySheets(POEM_PLUGIN_ENTRY pOemEntry, PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam) { CALL_INTERFACE(pOemEntry, DocumentPropertySheets, (pPSUIInfo, lParam)); } extern "C" HRESULT HComOEMDevicePropertySheets(POEM_PLUGIN_ENTRY pOemEntry, PPROPSHEETUI_INFO pPSUIInfo, LPARAM lParam) { CALL_INTERFACE(pOemEntry,DevicePropertySheets, (pPSUIInfo, lParam)); } extern "C" HRESULT HComOEMDevQueryPrintEx(POEM_PLUGIN_ENTRY pOemEntry, POEMUIOBJ poemuiobj, PDEVQUERYPRINT_INFO pDQPInfo, PDEVMODE pPublicDM, PVOID pOEMDM) { CALL_INTERFACE(pOemEntry, DevQueryPrintEx, (poemuiobj, pDQPInfo, pPublicDM, pOEMDM)); } extern "C" HRESULT HComOEMDeviceCapabilities(POEM_PLUGIN_ENTRY pOemEntry, POEMUIOBJ poemuiobj, HANDLE hPrinter, PWSTR pDeviceName, WORD wCapability, PVOID pOutput, PDEVMODE pPublicDM, PVOID pOEMDM, DWORD dwOld, DWORD *pdwResult) { CALL_INTERFACE(pOemEntry, DeviceCapabilities, (poemuiobj, hPrinter, pDeviceName, wCapability, pOutput, pPublicDM, pOEMDM, dwOld, pdwResult)); } extern "C" HRESULT HComOEMUpgradePrinter(POEM_PLUGIN_ENTRY pOemEntry, DWORD dwLevel, PBYTE pDriverUpgradeInfo) { CALL_INTERFACE(pOemEntry, UpgradePrinter, (dwLevel, pDriverUpgradeInfo)); } extern "C" HRESULT HComOEMPrinterEvent(POEM_PLUGIN_ENTRY pOemEntry, PWSTR pPrinterName, INT iDriverEvent, DWORD dwFlags, LPARAM lParam) { CALL_INTERFACE(pOemEntry, PrinterEvent, (pPrinterName, iDriverEvent, dwFlags, lParam)); } extern "C" HRESULT HComOEMDriverEvent(POEM_PLUGIN_ENTRY pOemEntry, DWORD dwDriverEvent, DWORD dwLevel, LPBYTE pDriverInfo, LPARAM lParam) { CALL_INTERFACE(pOemEntry, DriverEvent, (dwDriverEvent, dwLevel, pDriverInfo, lParam)); } extern "C" HRESULT HComOEMQUeryColorProfile(POEM_PLUGIN_ENTRY pOemEntry, HANDLE hPrinter, POEMUIOBJ poemuiobj, PDEVMODE pPublicDM, PVOID pOEMDM, ULONG ulQueryMode, VOID *pvProfileData, ULONG *pcbProfileData, FLONG *pflProfileData) { CALL_INTERFACE(pOemEntry,QueryColorProfile, (hPrinter, poemuiobj, pPublicDM, pOEMDM, ulQueryMode, pvProfileData, pcbProfileData, pflProfileData)); } extern "C" HRESULT HComOEMFontInstallerDlgProc(POEM_PLUGIN_ENTRY pOemEntry, HWND hWnd, UINT usMsg, WPARAM wParam, LPARAM lParam) { CALL_INTERFACE(pOemEntry, FontInstallerDlgProc, (hWnd, usMsg, wParam, lParam)); } extern "C" HRESULT HComOEMUpdateExternalFonts(POEM_PLUGIN_ENTRY pOemEntry, HANDLE hPrinter, HANDLE hHeap, PWSTR pwstrCartridges) { CALL_INTERFACE(pOemEntry, UpdateExternalFonts, (hPrinter, hHeap, pwstrCartridges)); } extern "C" HRESULT HComOEMQueryJobAttributes(POEM_PLUGIN_ENTRY pOemEntry, HANDLE hPrinter, PDEVMODE pDevMode, DWORD dwLevel, LPBYTE lpAttributeInfo) { CALL_INTERFACE2(pOemEntry, QueryJobAttributes, (hPrinter, pDevMode, dwLevel, lpAttributeInfo)); } extern "C" HRESULT HComOEMHideStandardUI(POEM_PLUGIN_ENTRY pOemEntry, DWORD dwMode) { CALL_INTERFACE2(pOemEntry, HideStandardUI, (dwMode)); } extern "C" HRESULT HComOEMDocumentEvent(POEM_PLUGIN_ENTRY pOemEntry, HANDLE hPrinter, HDC hdc, INT iEsc, ULONG cbIn, PVOID pbIn, ULONG cbOut, PVOID pbOut, PINT piResult) { CALL_INTERFACE2(pOemEntry, DocumentEvent, (hPrinter, hdc, iEsc, cbIn, pbIn, cbOut, pbOut, piResult)); }