windows-nt/Source/XPSP1/NT/multimedia/dshow/vidctl/tunerequestimpl.h
2020-09-26 16:20:57 +08:00

159 lines
4 KiB
C++

/////////////////////////////////////////////////////////////////////////////////////
// TuneRequestimpl.h : implementation helper template for component type interface
// Copyright (c) Microsoft Corporation 1999.
#ifndef TUNEREQUESTIMPL_H
#define TUNEREQUESTIMPL_H
#pragma once
#include <tuner.h>
#include <Components.h>
namespace BDATuningModel {
typedef CComQIPtr<ITuningSpace> PQTuningSpace;
typedef CComQIPtr<ILocator> PQLocator;
template<class T,
class MostDerived = ITuneRequest,
LPCGUID iid = &__uuidof(MostDerived),
LPCGUID LibID = &LIBID_TunerLib,
WORD wMajor = 1,
WORD wMinor = 0,
class tihclass = CComTypeInfoHolder
> class ATL_NO_VTABLE ITuneRequestImpl :
public IPersistPropertyBagImpl<T>,
public IDispatchImpl<MostDerived, iid, LibID, wMajor, wMinor, tihclass>
{
// ITuneRequest
public:
bool m_bRequiresSave;
ITuneRequestImpl() : m_bRequiresSave(false) {
m_Components = new CComObject<CComponents>;
}
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<T*>(new CComObject<T>);
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<ITuneRequest> PQTuneRequest;
}; // namespace
#endif // TUNEREQUESTIMPL_H
// end of file -- tunerequestimpl.h