// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A // PARTICULAR PURPOSE. // // Copyright 2001 - 2003 Microsoft Corporation. All Rights Reserved. // // FILE: Helper.cpp // // // PURPOSE: Implementation of wrapper class for Driver UI Helper interface. // // // Functions: // // // // // PLATFORMS: Windows 2000, Windows XP, Windows Server 2003 // // #include "precomp.h" #include #include "Helper.h" // StrSafe.h needs to be included last // to disallow bad string functions. #include //////////////////////////////////////////////////////// // Internal Macros //////////////////////////////////////////////////////// // Macros for simplifying calling the Driver UI Helper interfaces correctly. #define CALL_HELPER(MethodName, args) \ if (IsEqualGUID(&m_iidUIHelper, &IID_IPrintOemDriverUI)) \ { \ return static_cast(m_pUIHelper)->MethodName args; \ } \ else if (IsEqualGUID(&m_iidUIHelper, &IID_IPrintCoreUI2)) \ { \ return static_cast(m_pUIHelper)->MethodName args; \ } \ return E_NOINTERFACE; #define CALL_HELPER2(MethodName, args) \ if (IsEqualGUID(&m_iidUIHelper, &IID_IPrintCoreUI2)) \ { \ return static_cast(m_pUIHelper)->MethodName args; \ } \ return E_NOINTERFACE; ///////////////////////////////////////////////////////////// // // CUIHelper Class Methods // // // Private Methods // // Clears or initializes data members. void CUIHelper::Clear() { // Clear stored interface m_pUIHelper = NULL; m_iidUIHelper = GUID_NULL; } // // Public Methods // // Default contructor. CUIHelper::CUIHelper() { // Initialize the data members. Clear(); } // Constructor with assignment. CUIHelper::CUIHelper(const IID &HelperIID, PVOID pHelper) { // Assign the interface. Assign(HelperIID, pHelper); } // Destructor CUIHelper::~CUIHelper() { // Release the interface reference. Release(); } // Stores helper interface in helper entry structure. void CUIHelper::Assign(const IID &HelperIID, PVOID pHelper) { // If we already have a helper interface, release it. if(IsValid()) { Release(); } // Store helper interface and IID for it. m_pUIHelper = static_cast(pHelper); m_iidUIHelper = HelperIID; } // Releases the helper interface and // our removes the references to it. ULONG CUIHelper::Release() { ULONG ulRef = 0; if(IsValid()) { // Release the interface. // Since IPrintCoreUI2 inherits from IPrintOemDriverUI, // it is safe to cast both types of helper interfaces // to IPrintOemDriverUI for purposes of calling a // method implemented in IPrintOemDriverUI. // NOTE: can't cast to IUnknown since it just has pure virtual // calls for AddRef and Release. ulRef = static_cast(m_pUIHelper)->Release(); // Clear the data members. Clear(); } return ulRef; } // // IPrintOemDriverUI methods // // // Helper function to get driver settings. This function is only supported // for UI plugins that do not fully replace core driver's standard UI. // HRESULT __stdcall CUIHelper::DrvGetDriverSetting( PVOID pci, PCSTR Feature, PVOID pOutput, DWORD cbSize, PDWORD pcbNeeded, PDWORD pdwOptionsReturned ) { CALL_HELPER(DrvGetDriverSetting, (pci, Feature, pOutput, cbSize, pcbNeeded, pdwOptionsReturned ) ); } // // Helper function to allow OEM plugins upgrade private registry // settings. This function is supported for any UI plugins and should be // called only by OEM's UpgradePrinter. // HRESULT __stdcall CUIHelper::DrvUpgradeRegistrySetting( HANDLE hPrinter, PCSTR pFeature, PCSTR pOption ) { CALL_HELPER(DrvUpgradeRegistrySetting, (hPrinter, pFeature, pOption ) ); } // // Helper function to allow OEM plugins to update the driver UI settings. // This function is only supported for UI plugins that do not fully replace // core driver's standard UI. It should be called only when the UI is present. // HRESULT __stdcall CUIHelper::DrvUpdateUISetting( PVOID pci, PVOID pOptItem, DWORD dwPreviousSelection, DWORD dwMode ) { CALL_HELPER(DrvUpdateUISetting, (pci, pOptItem, dwPreviousSelection, dwMode ) ); } // // IPrintCoreUI2 new methods // // // Following four helper functions are only supported for UI plugins that fully // replace core driver's standard UI. They should only be called by the UI plugin's // DocumentPropertySheets, DevicePropertySheets and their property sheet callback // functions. // // Helper function to retrieve driver's current setting as a list of // feature/option keyword pairs. // HRESULT __stdcall CUIHelper::GetOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pmszFeaturesRequested, IN DWORD cbIn, OUT PSTR pmszFeatureOptionBuf, IN DWORD cbSize, OUT PDWORD pcbNeeded) { CALL_HELPER2(GetOptions, (poemuiobj, dwFlags, pmszFeaturesRequested, cbIn, pmszFeatureOptionBuf, cbSize, pcbNeeded ) ); } // // Helper function to change driver's setting using a list of feature/option // keyword pairs. // HRESULT __stdcall CUIHelper::SetOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pmszFeatureOptionBuf, IN DWORD cbIn, OUT PDWORD pdwResult) { CALL_HELPER2(SetOptions, (poemuiobj, dwFlags, pmszFeatureOptionBuf, cbIn, pdwResult ) ); } // // Helper function to retrieve the option(s) of a given feature that are // constrained in driver's current setting. // HRESULT __stdcall CUIHelper::EnumConstrainedOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, OUT PSTR pmszConstrainedOptionList, IN DWORD cbSize, OUT PDWORD pcbNeeded) { CALL_HELPER2(EnumConstrainedOptions, (poemuiobj, dwFlags, pszFeatureKeyword, pmszConstrainedOptionList, cbSize, pcbNeeded ) ); } // // Helper function to retrieve a list of feature/option keyword pairs from // driver's current setting that conflict with the given feature/option pair. // HRESULT __stdcall CUIHelper::WhyConstrained( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, IN PCSTR pszOptionKeyword, OUT PSTR pmszReasonList, IN DWORD cbSize, OUT PDWORD pcbNeeded) { CALL_HELPER2(WhyConstrained, (poemuiobj, dwFlags, pszFeatureKeyword, pszOptionKeyword, pmszReasonList, cbSize, pcbNeeded ) ); } // // Following five helper functions are supported for any UI plugins. // // Helper function to retrieve global attribute. // HRESULT __stdcall CUIHelper::GetGlobalAttribute( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszAttribute, OUT PDWORD pdwDataType, OUT PBYTE pbData, IN DWORD cbSize, OUT PDWORD pcbNeeded) { CALL_HELPER2(GetGlobalAttribute, (poemuiobj, dwFlags, pszAttribute, pdwDataType, pbData, cbSize, pcbNeeded ) ); } // // Helper function to retrieve attribute of a given feature. // HRESULT __stdcall CUIHelper::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) { CALL_HELPER2(GetFeatureAttribute, (poemuiobj, dwFlags, pszFeatureKeyword, pszAttribute, pdwDataType, pbData, cbSize, pcbNeeded ) ); } // // Helper function to retrieve attribute of a given feature/option selection. // HRESULT __stdcall CUIHelper::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) { CALL_HELPER2(GetOptionAttribute, (poemuiobj, dwFlags, pszFeatureKeyword, pszOptionKeyword, pszAttribute, pdwDataType, pbData, cbSize, pcbNeeded ) ); } // // Helper function to retrieve the list of feature keyword. // HRESULT __stdcall CUIHelper::EnumFeatures( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, OUT PSTR pmszFeatureList, IN DWORD cbSize, OUT PDWORD pcbNeeded) { CALL_HELPER2(EnumFeatures, (poemuiobj, dwFlags, pmszFeatureList, cbSize, pcbNeeded ) ); } // // Helper function to retrieve the list of options keyword of a given feature. // HRESULT __stdcall CUIHelper::EnumOptions( IN POEMUIOBJ poemuiobj, IN DWORD dwFlags, IN PCSTR pszFeatureKeyword, OUT PSTR pmszOptionList, IN DWORD cbSize, OUT PDWORD pcbNeeded) { CALL_HELPER2(EnumOptions, (poemuiobj, dwFlags, pszFeatureKeyword, pmszOptionList, cbSize, pcbNeeded ) ); } // // Helper function to query system simulation support // HRESULT __stdcall CUIHelper::QuerySimulationSupport( IN HANDLE hPrinter, IN DWORD dwLevel, OUT PBYTE pCaps, IN DWORD cbSize, OUT PDWORD pcbNeeded) { CALL_HELPER2(QuerySimulationSupport, (hPrinter, dwLevel, pCaps, cbSize, pcbNeeded ) ); }