| Index: src/plugin/passthroughapp/SinkPolicy.inl |
| =================================================================== |
| --- a/src/plugin/passthroughapp/SinkPolicy.inl |
| +++ b/src/plugin/passthroughapp/SinkPolicy.inl |
| @@ -15,421 +15,414 @@ |
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| -#ifndef PASSTHROUGHAPP_SINKPOLICY_INL |
| -#define PASSTHROUGHAPP_SINKPOLICY_INL |
| - |
| -#if _MSC_VER > 1000 |
| - #pragma once |
| -#endif // _MSC_VER > 1000 |
| - |
| -#ifndef PASSTHROUGHAPP_SINKPOLICY_H |
| - #error SinkPolicy.inl requires SinkPolicy.h to be included first |
| -#endif |
| - |
| -namespace PassthroughAPP |
| -{ |
| - |
| -// ===== NoSinkStartPolicy ===== |
| - |
| -inline HRESULT NoSinkStartPolicy::OnStart(LPCWSTR szUrl, |
| - IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, |
| - DWORD grfPI, HANDLE_PTR dwReserved, |
| - IInternetProtocol* pTargetProtocol) const |
| -{ |
| - ATLASSERT(pTargetProtocol != 0); |
| - return pTargetProtocol->Start(szUrl, pOIProtSink, pOIBindInfo, |
| - grfPI, dwReserved); |
| -} |
| - |
| - |
| -// ===== CComObjectSharedRef ===== |
| - |
| -template<class Base> |
| -inline CComObjectSharedRef<Base>:: |
| - CComObjectSharedRef(IUnknown* punkRefCount, IUnknown*) : |
| - m_punkRefCount(punkRefCount) |
| -{ |
| - ATLASSERT(punkRefCount != 0); |
| -} |
| - |
| -#ifdef _ATL_DEBUG_INTERFACES |
| -template<class Base> |
| -inline CComObjectSharedRef<Base>::~CComObjectSharedRef() |
| -{ |
| -#if _ATL_VER < 0x700 |
| - _Module.DeleteNonAddRefThunk(_GetRawUnknown()); |
| -#else |
| - _AtlDebugInterfacesModule.DeleteNonAddRefThunk(_GetRawUnknown()); |
| -#endif |
| -} |
| -#endif // _ATL_DEBUG_INTERFACES |
| - |
| -template<class Base> |
| -inline STDMETHODIMP CComObjectSharedRef<Base>::QueryInterface(REFIID iid, |
| - void** ppvObject) |
| -{ |
| - return _InternalQueryInterface(iid, ppvObject); |
| -} |
| - |
| -template<class Base> |
| -inline STDMETHODIMP_(ULONG) CComObjectSharedRef<Base>::AddRef() |
| -{ |
| - if (m_punkRefCount) |
| - { |
| - m_punkRefCount->AddRef(); |
| - } |
| - return InternalAddRef(); |
| -} |
| - |
| -template<class Base> |
| -inline STDMETHODIMP_(ULONG) CComObjectSharedRef<Base>::Release() |
| -{ |
| - ULONG l = InternalRelease(); |
| - if (!l) |
| - { |
| - ReleaseAll(); |
| - } |
| - if (m_punkRefCount) |
| - { |
| - m_punkRefCount->Release(); |
| - } |
| - return l; |
| -} |
| - |
| -template<class Base> |
| -inline Base* CComObjectSharedRef<Base>::GetContainedObject() |
| -{ |
| - return this; |
| -} |
| - |
| -template<class Base> |
| -inline CComObjectSharedRef<Base>* CComObjectSharedRef<Base>:: |
| - GetThisObject(const Base* pBase) |
| -{ |
| - ATLASSERT(pBase != 0); |
| - return const_cast<CComObjectSharedRef<Base>*>( |
| - static_cast<const CComObjectSharedRef<Base>*>(pBase)); |
| -} |
| - |
| -// ===== CComPolyObjectSharedRef ===== |
| - |
| -template <class Contained> |
| -inline CComPolyObjectSharedRef<Contained>:: |
| - CComPolyObjectSharedRef(IUnknown* punkRefCount, IUnknown* punkOuter) : |
| - m_contained(punkOuter ? punkOuter : this), |
| - m_punkRefCount(punkRefCount) |
| -{ |
| - ATLASSERT(punkRefCount != 0); |
| -} |
| - |
| -#ifdef _ATL_DEBUG_INTERFACES |
| -template <class Contained> |
| -inline CComPolyObjectSharedRef<Contained>::~CComPolyObjectSharedRef() |
| -{ |
| -#if _ATL_VER < 0x700 |
| - _Module.DeleteNonAddRefThunk(this); |
| -#else |
| - _AtlDebugInterfacesModule.DeleteNonAddRefThunk(this); |
| -#endif |
| -} |
| -#endif // _ATL_DEBUG_INTERFACES |
| - |
| -template <class Contained> |
| -inline HRESULT CComPolyObjectSharedRef<Contained>::FinalConstruct() |
| -{ |
| - InternalAddRef(); |
| - CComObjectRootEx<Contained::_ThreadModel::ThreadModelNoCS>:: |
| - FinalConstruct(); |
| - HRESULT hr; |
| -#if _ATL_VER >= 0x800 |
| - hr = m_contained._AtlInitialConstruct(); |
| - if (SUCCEEDED(hr)) |
| -#endif |
| - hr = m_contained.FinalConstruct(); |
| -#if _ATL_VER >= 0x800 |
| - if (SUCCEEDED(hr)) |
| - hr = m_contained._AtlFinalConstruct(); |
| -#endif |
| - InternalRelease(); |
| - return hr; |
| -} |
| - |
| -template <class Contained> |
| -inline void CComPolyObjectSharedRef<Contained>::FinalRelease() |
| -{ |
| - CComObjectRootEx<Contained::_ThreadModel::ThreadModelNoCS>:: |
| - FinalRelease(); |
| - m_contained.FinalRelease(); |
| -} |
| - |
| -template <class Contained> |
| -inline STDMETHODIMP CComPolyObjectSharedRef<Contained>::QueryInterface( |
| - REFIID iid, void** ppvObject) |
| -{ |
| - ATLASSERT(ppvObject != 0); |
| - if (!ppvObject) |
| - { |
| - return E_POINTER; |
| - } |
| - *ppvObject = NULL; |
| - |
| - HRESULT hr = S_OK; |
| - if (InlineIsEqualUnknown(iid)) |
| - { |
| - if (ppvObject == NULL) |
| - { |
| - return E_POINTER; |
| - } |
| - *ppvObject = static_cast<IUnknown*>(this); |
| - AddRef(); |
| -#ifdef _ATL_DEBUG_INTERFACES |
| -#if _ATL_VER < 0x700 |
| - _Module.AddThunk((IUnknown**)ppvObject, (LPCTSTR)Contained::_GetEntries()[-1].dw, iid); |
| -#else |
| - _AtlDebugInterfacesModule.AddThunk((IUnknown**)ppvObject, (LPCTSTR)Contained::_GetEntries()[-1].dw, iid); |
| -#endif |
| -#endif // _ATL_DEBUG_INTERFACES |
| - } |
| - else |
| - { |
| - hr = m_contained._InternalQueryInterface(iid, ppvObject); |
| - } |
| - return hr; |
| -} |
| - |
| -template <class Contained> |
| -inline STDMETHODIMP_(ULONG) CComPolyObjectSharedRef<Contained>::AddRef() |
| -{ |
| - if (m_punkRefCount) |
| - { |
| - m_punkRefCount->AddRef(); |
| - } |
| - return InternalAddRef(); |
| -} |
| - |
| -template <class Contained> |
| -inline STDMETHODIMP_(ULONG) CComPolyObjectSharedRef<Contained>::Release() |
| -{ |
| - ULONG l = InternalRelease(); |
| - if (!l) |
| - { |
| - m_contained.ReleaseAll(); |
| - } |
| - if (m_punkRefCount) |
| - { |
| - m_punkRefCount->Release(); |
| - } |
| - return l; |
| -} |
| - |
| -template <class Contained> |
| -inline IUnknown* CComPolyObjectSharedRef<Contained>::GetControllingUnknown() |
| -{ |
| - return m_contained.GetControllingUnknown(); |
| -} |
| - |
| -template <class Contained> |
| -Contained* CComPolyObjectSharedRef<Contained>::GetContainedObject() |
| -{ |
| - return &m_contained; |
| -} |
| - |
| -template<class Contained> |
| -inline CComPolyObjectSharedRef<Contained>* CComPolyObjectSharedRef<Contained>:: |
| - GetThisObject(const Contained* pContained) |
| -{ |
| - ATLASSERT(pContained != 0); |
| - const CComContainedObject<Contained>* pContainedObject = |
| - static_cast<const CComContainedObject<Contained>*>(pContained); |
| - return reinterpret_cast<CComPolyObjectSharedRef<Contained>*>( |
| - reinterpret_cast<DWORD_PTR>(pContainedObject) - |
| - offsetof(CComPolyObjectSharedRef<Contained>, m_contained)); |
| -} |
| - |
| -// ===== CComObjectRefCount ===== |
| - |
| -template <class T, class ThreadModel> |
| -inline STDMETHODIMP CComObjectRefCount<T, ThreadModel>:: |
| - QueryInterface(REFIID iid, void** ppvObject) |
| -{ |
| - ATLASSERT(false && _T("CComObjectRefCount: QueryInterface should never be called")); |
| - return E_NOTIMPL; |
| -} |
| - |
| -template <class T, class ThreadModel> |
| -inline STDMETHODIMP_(ULONG) CComObjectRefCount<T, ThreadModel>::AddRef() |
| -{ |
| - return InternalAddRef(); |
| -} |
| - |
| -template <class T, class ThreadModel> |
| -inline STDMETHODIMP_(ULONG) CComObjectRefCount<T, ThreadModel>::Release() |
| -{ |
| - ULONG l = InternalRelease(); |
| - if (l == 0) |
| - { |
| - T* pT = reinterpret_cast<T*>( |
| - reinterpret_cast<DWORD_PTR>(this) - offsetof(T, m_refCount)); |
| - delete pT; |
| - } |
| - return l; |
| -} |
| - |
| -// ===== CComObjectProtSink ===== |
| - |
| -template <class ProtocolObject, class SinkObject> |
| -inline CComObjectProtSink<ProtocolObject, SinkObject>:: |
| - CComObjectProtSink(void* pv) : |
| - ProtocolObject(&m_refCount, static_cast<IUnknown*>(pv)), |
| - m_sink(&m_refCount) |
| -{ |
| -#if _ATL_VER < 0x700 |
| - _Module.Lock(); |
| -#else |
| - _pAtlModule->Lock(); |
| -#endif |
| -} |
| - |
| -template <class ProtocolObject, class SinkObject> |
| -inline CComObjectProtSink<ProtocolObject, SinkObject>:: |
| - ~CComObjectProtSink() |
| -{ |
| - m_refCount.m_dwRef = 1; |
| - FinalRelease(); |
| -#if _ATL_VER < 0x700 |
| -#ifdef _ATL_DEBUG_INTERFACES |
| - _Module.DeleteNonAddRefThunk(this); |
| -#endif |
| - _Module.Unlock(); |
| -#else // _ATL_VER >= 0x700 |
| -#ifdef _ATL_DEBUG_INTERFACES |
| - _AtlDebugInterfacesModule.DeleteNonAddRefThunk(this); |
| -#endif |
| - _pAtlModule->Unlock(); |
| -#endif |
| -} |
| - |
| -template <class ProtocolObject, class SinkObject> |
| -inline HRESULT CComObjectProtSink<ProtocolObject, SinkObject>:: |
| - FinalConstruct() |
| -{ |
| - m_refCount.InternalAddRef(); |
| - m_refCount.FinalConstruct(); |
| - HRESULT hr = ProtocolObject::FinalConstruct(); |
| - HRESULT hrSink; |
| -#if _ATL_VER >= 0x800 |
| - hrSink = m_sink._AtlInitialConstruct(); |
| - if (SUCCEEDED(hrSink)) |
| -#endif |
| - hrSink = m_sink.FinalConstruct(); |
| -#if _ATL_VER >= 0x800 |
| - if (SUCCEEDED(hrSink)) |
| - hrSink = m_sink._AtlFinalConstruct(); |
| -#endif |
| - if (SUCCEEDED(hr) && FAILED(hrSink)) |
| - { |
| - hr = hrSink; |
| - } |
| - m_refCount.InternalRelease(); |
| - return hr; |
| -} |
| - |
| -template <class ProtocolObject, class SinkObject> |
| -inline void CComObjectProtSink<ProtocolObject, SinkObject>:: |
| - FinalRelease() |
| -{ |
| - m_sink.FinalRelease(); |
| - ProtocolObject::FinalRelease(); |
| - m_refCount.FinalRelease(); |
| -} |
| - |
| -template <class ProtocolObject, class SinkObject> |
| -inline typename CComObjectProtSink<ProtocolObject, SinkObject>::Protocol* |
| -CComObjectProtSink<ProtocolObject, SinkObject>:: |
| - GetProtocol(const typename CComObjectProtSink<ProtocolObject, SinkObject>::Sink* pSink) |
| -{ |
| - ATLASSERT(pSink != 0); |
| - const SinkObject* pSinkObject = SinkObject::GetThisObject(pSink); |
| - CComObjectProtSink* pThis = reinterpret_cast<CComObjectProtSink*>( |
| - reinterpret_cast<DWORD_PTR>(pSinkObject) - |
| - offsetof(CComObjectProtSink, m_sink)); |
| - return pThis->ProtocolObject::GetContainedObject(); |
| -} |
| - |
| -template <class ProtocolObject, class SinkObject> |
| -inline typename CComObjectProtSink<ProtocolObject, SinkObject>::Sink* |
| -CComObjectProtSink<ProtocolObject, SinkObject>:: |
| - GetSink(const typename CComObjectProtSink<ProtocolObject, SinkObject>::Protocol* pProtocol) |
| -{ |
| - ATLASSERT(pProtocol != 0); |
| - const ProtocolObject* pProtocolObject = |
| - ProtocolObject::GetThisObject(pProtocol); |
| - CComObjectProtSink* pThis = const_cast<CComObjectProtSink*>( |
| - static_cast<const CComObjectProtSink*>(pProtocolObject)); |
| - return pThis->m_sink.GetContainedObject(); |
| -} |
| - |
| -// ===== CustomSinkStartPolicy ===== |
| - |
| -template <class Protocol, class Sink> |
| -inline HRESULT CustomSinkStartPolicy<Protocol, Sink>::OnStart(LPCWSTR szUrl, |
| - IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, |
| - DWORD grfPI, HANDLE_PTR dwReserved, |
| - IInternetProtocol* pTargetProtocol) |
| -{ |
| - ATLASSERT(pTargetProtocol != 0); |
| - |
| - Sink* pSink = GetSink(static_cast<const Protocol*>(this)); |
| - HRESULT hr = pSink->OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, |
| - dwReserved, pTargetProtocol); |
| - |
| - CComPtr<IInternetProtocolSink> spSink; |
| - CComPtr<IInternetBindInfo> spBindInfo; |
| - if (SUCCEEDED(hr)) |
| - { |
| - hr = pSink->QueryInterface(IID_IInternetProtocolSink, reinterpret_cast<void**>(&spSink)); |
| - ATLASSERT(SUCCEEDED(hr) && spSink != 0); |
| - } |
| - if (SUCCEEDED(hr)) |
| - { |
| - hr = pSink->QueryInterface(IID_IInternetBindInfo, reinterpret_cast<void**>(&spBindInfo)); |
| - ATLASSERT(SUCCEEDED(hr) && spBindInfo != 0); |
| - } |
| - if (SUCCEEDED(hr)) |
| - { |
| - hr = pTargetProtocol->Start(szUrl, spSink, spBindInfo, grfPI, dwReserved); |
| - } |
| - if (E_ABORT == hr && pSink->m_isCustomResponse) |
| - { |
| - static_cast<Protocol*>(this)->m_shouldSupplyCustomContent = true; |
| - pSink->m_spInternetProtocolSink->ReportProgress(BINDSTATUS_MIMETYPEAVAILABLE, L"text/html"); |
| - pSink->m_spInternetProtocolSink->ReportData(BSCF_FIRSTDATANOTIFICATION, 0, static_cast<ULONG>(g_blockedByABPPage.size())); |
| - return S_OK; |
| - } |
| - return hr; |
| -} |
| - |
| - |
| -template <class Protocol, class Sink> |
| -inline Sink* CustomSinkStartPolicy<Protocol, Sink>::GetSink( |
| - const Protocol* pProtocol) |
| -{ |
| - return Protocol::ComObjectClass::GetSink(pProtocol); |
| -} |
| - |
| -template <class Protocol, class Sink> |
| -inline Sink* CustomSinkStartPolicy<Protocol, Sink>::GetSink() const |
| -{ |
| - return GetSink(static_cast<const Protocol*>(this)); |
| -} |
| - |
| -template <class Protocol, class Sink> |
| -inline Protocol* CustomSinkStartPolicy<Protocol, Sink>::GetProtocol( |
| - const Sink* pSink) |
| -{ |
| - return Protocol::ComObjectClass::GetProtocol(pSink); |
| -} |
| - |
| -} // end namespace PassthroughAPP |
| - |
| +#ifndef PASSTHROUGHAPP_SINKPOLICY_INL |
| +#define PASSTHROUGHAPP_SINKPOLICY_INL |
| + |
| +#if _MSC_VER > 1000 |
| + #pragma once |
| +#endif // _MSC_VER > 1000 |
| + |
| +#ifndef PASSTHROUGHAPP_SINKPOLICY_H |
| + #error SinkPolicy.inl requires SinkPolicy.h to be included first |
| +#endif |
| + |
| +namespace PassthroughAPP |
| +{ |
| + |
| +// ===== NoSinkStartPolicy ===== |
| + |
| +inline HRESULT NoSinkStartPolicy::OnStart(LPCWSTR szUrl, |
| + IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, |
| + DWORD grfPI, HANDLE_PTR dwReserved, |
| + IInternetProtocol* pTargetProtocol) const |
| +{ |
| + ATLASSERT(pTargetProtocol != 0); |
| + return pTargetProtocol->Start(szUrl, pOIProtSink, pOIBindInfo, |
| + grfPI, dwReserved); |
| +} |
| + |
| + |
| +// ===== CComObjectSharedRef ===== |
| + |
| +template<class Base> |
| +inline CComObjectSharedRef<Base>:: |
| + CComObjectSharedRef(IUnknown* punkRefCount, IUnknown*) : |
| + m_punkRefCount(punkRefCount) |
| +{ |
| + ATLASSERT(punkRefCount != 0); |
| +} |
| + |
| +#ifdef _ATL_DEBUG_INTERFACES |
| +template<class Base> |
| +inline CComObjectSharedRef<Base>::~CComObjectSharedRef() |
| +{ |
| +#if _ATL_VER < 0x700 |
| + _Module.DeleteNonAddRefThunk(_GetRawUnknown()); |
| +#else |
| + _AtlDebugInterfacesModule.DeleteNonAddRefThunk(_GetRawUnknown()); |
| +#endif |
| +} |
| +#endif // _ATL_DEBUG_INTERFACES |
| + |
| +template<class Base> |
| +inline STDMETHODIMP CComObjectSharedRef<Base>::QueryInterface(REFIID iid, |
| + void** ppvObject) |
| +{ |
| + return _InternalQueryInterface(iid, ppvObject); |
| +} |
| + |
| +template<class Base> |
| +inline STDMETHODIMP_(ULONG) CComObjectSharedRef<Base>::AddRef() |
| +{ |
| + if (m_punkRefCount) |
| + { |
| + m_punkRefCount->AddRef(); |
| + } |
| + return InternalAddRef(); |
| +} |
| + |
| +template<class Base> |
| +inline STDMETHODIMP_(ULONG) CComObjectSharedRef<Base>::Release() |
| +{ |
| + ULONG l = InternalRelease(); |
| + if (!l) |
| + { |
| + ReleaseAll(); |
| + } |
| + if (m_punkRefCount) |
| + { |
| + m_punkRefCount->Release(); |
| + } |
| + return l; |
| +} |
| + |
| +template<class Base> |
| +inline Base* CComObjectSharedRef<Base>::GetContainedObject() |
| +{ |
| + return this; |
| +} |
| + |
| +template<class Base> |
| +inline CComObjectSharedRef<Base>* CComObjectSharedRef<Base>:: |
| + GetThisObject(const Base* pBase) |
| +{ |
| + ATLASSERT(pBase != 0); |
| + return const_cast<CComObjectSharedRef<Base>*>( |
| + static_cast<const CComObjectSharedRef<Base>*>(pBase)); |
| +} |
| + |
| +// ===== CComPolyObjectSharedRef ===== |
| + |
| +template <class Contained> |
| +inline CComPolyObjectSharedRef<Contained>:: |
| + CComPolyObjectSharedRef(IUnknown* punkRefCount, IUnknown* punkOuter) : |
| + m_contained(punkOuter ? punkOuter : this), |
| + m_punkRefCount(punkRefCount) |
| +{ |
| + ATLASSERT(punkRefCount != 0); |
| +} |
| + |
| +#ifdef _ATL_DEBUG_INTERFACES |
| +template <class Contained> |
| +inline CComPolyObjectSharedRef<Contained>::~CComPolyObjectSharedRef() |
| +{ |
| +#if _ATL_VER < 0x700 |
| + _Module.DeleteNonAddRefThunk(this); |
| +#else |
| + _AtlDebugInterfacesModule.DeleteNonAddRefThunk(this); |
| +#endif |
| +} |
| +#endif // _ATL_DEBUG_INTERFACES |
| + |
| +template <class Contained> |
| +inline HRESULT CComPolyObjectSharedRef<Contained>::FinalConstruct() |
| +{ |
| + InternalAddRef(); |
| + CComObjectRootEx<Contained::_ThreadModel::ThreadModelNoCS>:: |
| + FinalConstruct(); |
| + HRESULT hr; |
| +#if _ATL_VER >= 0x800 |
| + hr = m_contained._AtlInitialConstruct(); |
| + if (SUCCEEDED(hr)) |
| +#endif |
| + hr = m_contained.FinalConstruct(); |
| +#if _ATL_VER >= 0x800 |
| + if (SUCCEEDED(hr)) |
| + hr = m_contained._AtlFinalConstruct(); |
| +#endif |
| + InternalRelease(); |
| + return hr; |
| +} |
| + |
| +template <class Contained> |
| +inline void CComPolyObjectSharedRef<Contained>::FinalRelease() |
| +{ |
| + CComObjectRootEx<Contained::_ThreadModel::ThreadModelNoCS>:: |
| + FinalRelease(); |
| + m_contained.FinalRelease(); |
| +} |
| + |
| +template <class Contained> |
| +inline STDMETHODIMP CComPolyObjectSharedRef<Contained>::QueryInterface( |
| + REFIID iid, void** ppvObject) |
| +{ |
| + ATLASSERT(ppvObject != 0); |
| + if (!ppvObject) |
| + { |
| + return E_POINTER; |
| + } |
| + *ppvObject = NULL; |
| + |
| + HRESULT hr = S_OK; |
| + if (InlineIsEqualUnknown(iid)) |
| + { |
| + if (ppvObject == NULL) |
| + { |
| + return E_POINTER; |
| + } |
| + *ppvObject = static_cast<IUnknown*>(this); |
| + AddRef(); |
| +#ifdef _ATL_DEBUG_INTERFACES |
| +#if _ATL_VER < 0x700 |
| + _Module.AddThunk((IUnknown**)ppvObject, (LPCTSTR)Contained::_GetEntries()[-1].dw, iid); |
| +#else |
| + _AtlDebugInterfacesModule.AddThunk((IUnknown**)ppvObject, (LPCTSTR)Contained::_GetEntries()[-1].dw, iid); |
| +#endif |
| +#endif // _ATL_DEBUG_INTERFACES |
| + } |
| + else |
| + { |
| + hr = m_contained._InternalQueryInterface(iid, ppvObject); |
| + } |
| + return hr; |
| +} |
| + |
| +template <class Contained> |
| +inline STDMETHODIMP_(ULONG) CComPolyObjectSharedRef<Contained>::AddRef() |
| +{ |
| + if (m_punkRefCount) |
| + { |
| + m_punkRefCount->AddRef(); |
| + } |
| + return InternalAddRef(); |
| +} |
| + |
| +template <class Contained> |
| +inline STDMETHODIMP_(ULONG) CComPolyObjectSharedRef<Contained>::Release() |
| +{ |
| + ULONG l = InternalRelease(); |
| + if (!l) |
| + { |
| + m_contained.ReleaseAll(); |
| + } |
| + if (m_punkRefCount) |
| + { |
| + m_punkRefCount->Release(); |
| + } |
| + return l; |
| +} |
| + |
| +template <class Contained> |
| +inline IUnknown* CComPolyObjectSharedRef<Contained>::GetControllingUnknown() |
| +{ |
| + return m_contained.GetControllingUnknown(); |
| +} |
| + |
| +template <class Contained> |
| +Contained* CComPolyObjectSharedRef<Contained>::GetContainedObject() |
| +{ |
| + return &m_contained; |
| +} |
| + |
| +template<class Contained> |
| +inline CComPolyObjectSharedRef<Contained>* CComPolyObjectSharedRef<Contained>:: |
| + GetThisObject(const Contained* pContained) |
| +{ |
| + ATLASSERT(pContained != 0); |
| + const CComContainedObject<Contained>* pContainedObject = |
| + static_cast<const CComContainedObject<Contained>*>(pContained); |
| + return reinterpret_cast<CComPolyObjectSharedRef<Contained>*>( |
| + reinterpret_cast<DWORD_PTR>(pContainedObject) - |
| + offsetof(CComPolyObjectSharedRef<Contained>, m_contained)); |
| +} |
| + |
| +// ===== CComObjectRefCount ===== |
| + |
| +template <class T, class ThreadModel> |
| +inline STDMETHODIMP CComObjectRefCount<T, ThreadModel>:: |
| + QueryInterface(REFIID iid, void** ppvObject) |
| +{ |
| + ATLASSERT(false && _T("CComObjectRefCount: QueryInterface should never be called")); |
| + return E_NOTIMPL; |
| +} |
| + |
| +template <class T, class ThreadModel> |
| +inline STDMETHODIMP_(ULONG) CComObjectRefCount<T, ThreadModel>::AddRef() |
| +{ |
| + return InternalAddRef(); |
| +} |
| + |
| +template <class T, class ThreadModel> |
| +inline STDMETHODIMP_(ULONG) CComObjectRefCount<T, ThreadModel>::Release() |
| +{ |
| + ULONG l = InternalRelease(); |
| + if (l == 0) |
| + { |
| + T* pT = reinterpret_cast<T*>( |
| + reinterpret_cast<DWORD_PTR>(this) - offsetof(T, m_refCount)); |
| + delete pT; |
| + } |
| + return l; |
| +} |
| + |
| +// ===== CComObjectProtSink ===== |
| + |
| +template <class ProtocolObject, class SinkObject> |
| +inline CComObjectProtSink<ProtocolObject, SinkObject>:: |
| + CComObjectProtSink(void* pv) : |
| + ProtocolObject(&m_refCount, static_cast<IUnknown*>(pv)), |
| + m_sink(&m_refCount) |
| +{ |
| +#if _ATL_VER < 0x700 |
| + _Module.Lock(); |
| +#else |
| + _pAtlModule->Lock(); |
| +#endif |
| +} |
| + |
| +template <class ProtocolObject, class SinkObject> |
| +inline CComObjectProtSink<ProtocolObject, SinkObject>:: |
| + ~CComObjectProtSink() |
| +{ |
| + m_refCount.m_dwRef = 1; |
| + FinalRelease(); |
| +#if _ATL_VER < 0x700 |
| +#ifdef _ATL_DEBUG_INTERFACES |
| + _Module.DeleteNonAddRefThunk(this); |
| +#endif |
| + _Module.Unlock(); |
| +#else // _ATL_VER >= 0x700 |
| +#ifdef _ATL_DEBUG_INTERFACES |
| + _AtlDebugInterfacesModule.DeleteNonAddRefThunk(this); |
| +#endif |
| + _pAtlModule->Unlock(); |
| +#endif |
| +} |
| + |
| +template <class ProtocolObject, class SinkObject> |
| +inline HRESULT CComObjectProtSink<ProtocolObject, SinkObject>:: |
| + FinalConstruct() |
| +{ |
| + m_refCount.InternalAddRef(); |
| + m_refCount.FinalConstruct(); |
| + HRESULT hr = ProtocolObject::FinalConstruct(); |
| + HRESULT hrSink; |
| +#if _ATL_VER >= 0x800 |
| + hrSink = m_sink._AtlInitialConstruct(); |
| + if (SUCCEEDED(hrSink)) |
| +#endif |
| + hrSink = m_sink.FinalConstruct(); |
| +#if _ATL_VER >= 0x800 |
| + if (SUCCEEDED(hrSink)) |
| + hrSink = m_sink._AtlFinalConstruct(); |
| +#endif |
| + if (SUCCEEDED(hr) && FAILED(hrSink)) |
| + { |
| + hr = hrSink; |
| + } |
| + m_refCount.InternalRelease(); |
| + return hr; |
| +} |
| + |
| +template <class ProtocolObject, class SinkObject> |
| +inline void CComObjectProtSink<ProtocolObject, SinkObject>:: |
| + FinalRelease() |
| +{ |
| + m_sink.FinalRelease(); |
| + ProtocolObject::FinalRelease(); |
| + m_refCount.FinalRelease(); |
| +} |
| + |
| +template <class ProtocolObject, class SinkObject> |
| +inline typename CComObjectProtSink<ProtocolObject, SinkObject>::Protocol* |
| +CComObjectProtSink<ProtocolObject, SinkObject>:: |
| + GetProtocol(const typename CComObjectProtSink<ProtocolObject, SinkObject>::Sink* pSink) |
| +{ |
| + ATLASSERT(pSink != 0); |
| + const SinkObject* pSinkObject = SinkObject::GetThisObject(pSink); |
| + CComObjectProtSink* pThis = reinterpret_cast<CComObjectProtSink*>( |
| + reinterpret_cast<DWORD_PTR>(pSinkObject) - |
| + offsetof(CComObjectProtSink, m_sink)); |
| + return pThis->ProtocolObject::GetContainedObject(); |
| +} |
| + |
| +template <class ProtocolObject, class SinkObject> |
| +inline typename CComObjectProtSink<ProtocolObject, SinkObject>::Sink* |
| +CComObjectProtSink<ProtocolObject, SinkObject>:: |
| + GetSink(const typename CComObjectProtSink<ProtocolObject, SinkObject>::Protocol* pProtocol) |
| +{ |
| + ATLASSERT(pProtocol != 0); |
| + const ProtocolObject* pProtocolObject = |
| + ProtocolObject::GetThisObject(pProtocol); |
| + CComObjectProtSink* pThis = const_cast<CComObjectProtSink*>( |
| + static_cast<const CComObjectProtSink*>(pProtocolObject)); |
| + return pThis->m_sink.GetContainedObject(); |
| +} |
| + |
| +// ===== CustomSinkStartPolicy ===== |
| + |
| +template <class Protocol, class Sink> |
| +inline HRESULT CustomSinkStartPolicy<Protocol, Sink>::OnStart(LPCWSTR szUrl, |
| + IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, |
| + DWORD grfPI, HANDLE_PTR dwReserved, |
| + IInternetProtocol* pTargetProtocol) const |
| +{ |
| + ATLASSERT(pTargetProtocol != 0); |
| + |
| + Sink* pSink = GetSink(static_cast<const Protocol*>(this)); |
| + HRESULT hr = pSink->OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, |
| + dwReserved, pTargetProtocol); |
| + |
| + CComPtr<IInternetProtocolSink> spSink; |
| + CComPtr<IInternetBindInfo> spBindInfo; |
| + if (SUCCEEDED(hr)) |
| + { |
| + hr = pSink->QueryInterface(IID_IInternetProtocolSink, reinterpret_cast<void**>(&spSink)); |
| + ATLASSERT(SUCCEEDED(hr) && spSink != 0); |
| + } |
| + if (SUCCEEDED(hr)) |
| + { |
| + hr = pSink->QueryInterface(IID_IInternetBindInfo, reinterpret_cast<void**>(&spBindInfo)); |
| + ATLASSERT(SUCCEEDED(hr) && spBindInfo != 0); |
| + } |
| + if (SUCCEEDED(hr)) |
| + { |
| + hr = pTargetProtocol->Start(szUrl, spSink, spBindInfo, grfPI, dwReserved); |
| + } |
| + return hr; |
| +} |
| + |
| + |
| +template <class Protocol, class Sink> |
| +inline Sink* CustomSinkStartPolicy<Protocol, Sink>::GetSink( |
| + const Protocol* pProtocol) |
| +{ |
| + return Protocol::ComObjectClass::GetSink(pProtocol); |
| +} |
| + |
| +template <class Protocol, class Sink> |
| +inline Sink* CustomSinkStartPolicy<Protocol, Sink>::GetSink() const |
| +{ |
| + return GetSink(static_cast<const Protocol*>(this)); |
| +} |
| + |
| +template <class Protocol, class Sink> |
| +inline Protocol* CustomSinkStartPolicy<Protocol, Sink>::GetProtocol( |
| + const Sink* pSink) |
| +{ |
| + return Protocol::ComObjectClass::GetProtocol(pSink); |
| +} |
| + |
| +} // end namespace PassthroughAPP |
| + |
| #endif // PASSTHROUGHAPP_SINKPOLICY_INL |