#include "stdafx.h" #pragma hdrstop HRESULT CDeskHtmlProp::QueryInterface(REFIID riid, LPVOID * ppvObj) { HRESULT hr = E_NOINTERFACE; static const QITAB qit[] = { QITABENT(CDeskHtmlProp, IObjectWithSite), QITABENT(CDeskHtmlProp, IShellExtInit), QITABENT(CDeskHtmlProp, IPersist), QITABENT(CDeskHtmlProp, IPropertyBag), QITABENT(CDeskHtmlProp, IBasePropPage), QITABENTMULTI(CDeskHtmlProp, IShellPropSheetExt, IBasePropPage), { 0 }, }; return QISearch(this, qit, riid, ppvObj); } ULONG CDeskHtmlProp::AddRef() { _cRef++; return _cRef; } ULONG CDeskHtmlProp::Release() { _cRef--; if (_cRef > 0) return _cRef; delete this; return 0; } CDeskHtmlProp::CDeskHtmlProp() : _cRef(1), CObjectCLSID(&PPID_Background) { DllAddRef(); OleInitialize(NULL); _pspseBkgdPage = NULL; } CDeskHtmlProp::~CDeskHtmlProp() { ATOMICRELEASE(_pspseBkgdPage); OleUninitialize(); DllRelease(); } HRESULT CDeskHtmlProp::_InitBackgroundTab(void) { HRESULT hr = S_OK; if (!_pspseBkgdPage) { CBackPropSheetPage * pbpsp = new CBackPropSheetPage(); hr = E_OUTOFMEMORY; if (pbpsp) { hr = pbpsp->QueryInterface(IID_PPV_ARG(IShellPropSheetExt, &_pspseBkgdPage)); pbpsp->Release(); } else { TraceMsg(TF_WARNING, "DeskHtml - ReplacePage could not create a page"); } } return hr; } // *** IObjectWithSite *** HRESULT CDeskHtmlProp::SetSite(IN IUnknown * punkSite) { HRESULT hr = _InitBackgroundTab(); if (SUCCEEDED(hr)) { hr = IUnknown_SetSite(_pspseBkgdPage, punkSite); } return hr; } HRESULT CDeskHtmlProp::GetSite(IN REFIID riid, OUT void ** ppvSite) { HRESULT hr = _InitBackgroundTab(); if (SUCCEEDED(hr)) { IObjectWithSite * punk; hr = _pspseBkgdPage->QueryInterface(IID_PPV_ARG(IObjectWithSite, &punk)); if (SUCCEEDED(hr)) { hr = punk->GetSite(riid, ppvSite); punk->Release(); } } return hr; } // *** IShellExtInit *** HRESULT CDeskHtmlProp::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT pdtobj, HKEY hkeyProgID) { TraceMsg(TF_GENERAL, "DeskHtmlProp - Initialize"); HRESULT hr = E_INVALIDARG; // Forward on to the Background tab (CBackPropSheetPage) hr = _InitBackgroundTab(); if (SUCCEEDED(hr)) { IShellExtInit * pShellExtInt; if (SUCCEEDED(_pspseBkgdPage->QueryInterface(IID_PPV_ARG(IShellExtInit, &pShellExtInt)))) { hr = pShellExtInt->Initialize(pidlFolder, pdtobj, hkeyProgID); pShellExtInt->Release(); } } return hr; } // *** IBasePropPage *** HRESULT CDeskHtmlProp::GetAdvancedDialog(OUT IAdvancedDialog ** ppAdvDialog) { HRESULT hr = E_INVALIDARG; // Forward on to the Background tab (CBackPropSheetPage) if (ppAdvDialog) { *ppAdvDialog = NULL; hr = _InitBackgroundTab(); if (SUCCEEDED(hr)) { IBasePropPage * pBasePage; hr = _pspseBkgdPage->QueryInterface(IID_PPV_ARG(IBasePropPage, &pBasePage)); if (SUCCEEDED(hr)) { hr = pBasePage->GetAdvancedDialog(ppAdvDialog); pBasePage->Release(); } } } return hr; } HRESULT CDeskHtmlProp::OnApply(IN PROPPAGEONAPPLY oaAction) { HRESULT hr = _InitBackgroundTab(); if (SUCCEEDED(hr)) { IBasePropPage * pBasePage; hr = _pspseBkgdPage->QueryInterface(IID_PPV_ARG(IBasePropPage, &pBasePage)); if (SUCCEEDED(hr)) { hr = pBasePage->OnApply(oaAction); pBasePage->Release(); } } return hr; } // *** IPropertyBag *** HRESULT CDeskHtmlProp::Read(IN LPCOLESTR pszPropName, IN VARIANT * pVar, IN IErrorLog *pErrorLog) { HRESULT hr = _InitBackgroundTab(); if (SUCCEEDED(hr)) { IPropertyBag * pPropertyBag; hr = _pspseBkgdPage->QueryInterface(IID_PPV_ARG(IPropertyBag, &pPropertyBag)); if (SUCCEEDED(hr)) { hr = pPropertyBag->Read(pszPropName, pVar, pErrorLog); pPropertyBag->Release(); } } return hr; } HRESULT CDeskHtmlProp::Write(IN LPCOLESTR pszPropName, IN VARIANT *pVar) { HRESULT hr = _InitBackgroundTab(); if (SUCCEEDED(hr)) { IPropertyBag * pPropertyBag; hr = _pspseBkgdPage->QueryInterface(IID_PPV_ARG(IPropertyBag, &pPropertyBag)); if (SUCCEEDED(hr)) { hr = pPropertyBag->Write(pszPropName, pVar); pPropertyBag->Release(); } } return hr; } // *** IShellPropSheetExt *** HRESULT CDeskHtmlProp::AddPages(LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam) { TraceMsg(TF_GENERAL, "DeskHtmlProp - ReplacePage"); RegisterBackPreviewClass(); HRESULT hr = _InitBackgroundTab(); if (SUCCEEDED(hr)) { hr = _pspseBkgdPage->AddPages(lpfnAddPage, lParam); } return hr; } typedef struct tagREPLACEPAGE_LPARAM { void * pvDontTouch; IThemeUIPages * ptuiPages; } REPLACEPAGE_LPARAM; //----------------------------------------------------------------------------- // // _PSXACALLINFO // // used to forward LPFNADDPROPSHEETPAGE calls with added error checking // //----------------------------------------------------------------------------- typedef struct { LPFNADDPROPSHEETPAGE pfn; LPARAM lparam; UINT count; BOOL allowmulti; BOOL alreadycalled; } _PSXACALLINFO; HRESULT CDeskHtmlProp::ReplacePage(UINT uPageID, LPFNADDPROPSHEETPAGE lpfnReplaceWith, LPARAM lParam) { return S_OK; } HRESULT CDeskHtmlProp_CreateInstance(LPUNKNOWN punkOuter, REFIID riid, void **ppvOut) { TraceMsg(TF_GENERAL, "DeskHtmlProp - CreateInstance"); CDeskHtmlProp* pdhd = new CDeskHtmlProp(); if (pdhd) { HRESULT hres = pdhd->QueryInterface(riid, ppvOut); pdhd->Release(); return hres; } *ppvOut = NULL; return E_OUTOFMEMORY; }