///////////////////////////////////////////////////////////////////////////////////// // TuneRequestimpl.h : implementation helper template for component type interface // Copyright (c) Microsoft Corporation 1999. #ifndef TUNEREQUESTIMPL_H #define TUNEREQUESTIMPL_H #pragma once #include #include namespace BDATuningModel { typedef CComQIPtr PQTuningSpace; typedef CComQIPtr PQLocator; template class ATL_NO_VTABLE ITuneRequestImpl : public IPersistPropertyBagImpl, public IDispatchImpl { // ITuneRequest public: bool m_bRequiresSave; ITuneRequestImpl() : m_bRequiresSave(false) { m_Components = new CComObject; } virtual ~ITuneRequestImpl() {} // undone: the below map entry stores a copy of the tuning space contents instead of a // reference to the tuning space. This should be changed to store a tuning space moniker BEGIN_PROP_MAP(ITuneRequestImpl) PROP_DATA_QI_ENTRY("Tuning Space", m_TS.p, __uuidof(ITuningSpace)) PROP_DATA_QI_ENTRY("Locator", m_Locator.p, __uuidof(ILocator)) END_PROP_MAP() PQTuningSpace m_TS; PQComponents m_Components; PQLocator m_Locator; STDMETHOD(get_TuningSpace)(/* [out, retval] */ ITuningSpace **ppTS){ try { if (!ppTS) { return E_POINTER; } ATL_LOCKT(); if (!m_TS) { return E_UNEXPECTED; } return m_TS.CopyTo(ppTS); } catch (...) { return E_OUTOFMEMORY; } } STDMETHOD(get_Components)(/* [out, retval] */ IComponents **ppC){ try { if (!ppC) { return E_POINTER; } ATL_LOCKT(); if (!m_Components) { return E_UNEXPECTED; } return m_Components.CopyTo(ppC); } catch (...) { return E_OUTOFMEMORY; } } STDMETHOD(Clone) (ITuneRequest **ppTR) { try { if (!ppTR) { return E_POINTER; } ATL_LOCKT(); T* pt = static_cast(new CComObject); if (!pt) { return E_OUTOFMEMORY; } if (!m_TS) { // corrupt tune request. we can't have a tunerequest without an // attached tuning space since the tuning space is the factory // and always sets this property to non-null at creation time. // the only way to get a NULL is for an unpersist from a corrupt store // or a bug in a tuning space's implementation. return E_UNEXPECTED; } ASSERT(!pt->m_TS); HRESULT hr = m_TS->Clone(&pt->m_TS); if (m_Components) { if (pt->m_Components) { pt->m_Components.Release(); } ASSERT(!pt->m_Components); hr = m_Components->Clone(&pt->m_Components); if (FAILED(hr)) { delete pt; return hr; } } if (m_Locator) { ASSERT(!pt->m_Locator); hr = m_Locator->Clone(&pt->m_Locator); if (FAILED(hr)) { delete pt; return hr; } } pt->m_bRequiresSave = true; pt->AddRef(); *ppTR = pt; return NOERROR; } catch (HRESULT h) { return h; } catch (...) { return E_POINTER; } } STDMETHOD(get_Locator) (ILocator **ppLocator) { try { if (!ppLocator) { return E_POINTER; } ATL_LOCKT(); return m_Locator.CopyTo(ppLocator); } catch (HRESULT h) { return h; } catch (...) { return E_POINTER; } }; STDMETHOD(put_Locator) (ILocator *pLocator) { try { ATL_LOCKT(); m_Locator = pLocator; MARK_DIRTY(T); return NOERROR; } catch (HRESULT h) { return h; } catch (...) { return E_POINTER; } }; }; typedef CComQIPtr PQTuneRequest; }; // namespace #endif // TUNEREQUESTIMPL_H // end of file -- tunerequestimpl.h