| Index: src/plugin/passthroughapp/ProtocolImpl.inl |
| =================================================================== |
| --- a/src/plugin/passthroughapp/ProtocolImpl.inl |
| +++ b/src/plugin/passthroughapp/ProtocolImpl.inl |
| @@ -1,612 +1,755 @@ |
| -// Copyright 2007 Igor Tandetnik |
| -// |
| -// Licensed under the Apache License, Version 2.0 (the "License"); |
| -// you may not use this file except in compliance with the License. |
| -// You may obtain a copy of the License at |
| -// |
| -// http://www.apache.org/licenses/LICENSE-2.0 |
| -// |
| -// Unless required by applicable law or agreed to in writing, software |
| -// distributed under the License is distributed on an "AS IS" BASIS, |
| -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| -// See the License for the specific language governing permissions and |
| -// limitations under the License. |
| - |
| #ifndef PASSTHROUGHAPP_PROTOCOLIMPL_INL |
| #define PASSTHROUGHAPP_PROTOCOLIMPL_INL |
| #if _MSC_VER > 1000 |
| -#pragma once |
| + #pragma once |
| #endif // _MSC_VER > 1000 |
| #ifndef PASSTHROUGHAPP_PROTOCOLIMPL_H |
| -#error ProtocolImpl.inl requires ProtocolImpl.h to be included first |
| + #error ProtocolImpl.inl requires ProtocolImpl.h to be included first |
| #endif |
| namespace PassthroughAPP |
| { |
| - namespace Detail |
| - { |
| - template <class T> |
| - inline HRESULT WINAPI QIPassthrough<T>:: |
| - QueryInterfacePassthroughT(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw) |
| - { |
| - ATLASSERT(pv != 0); |
| - T* pT = static_cast<T*>(pv); |
| +namespace Detail |
| +{ |
| - IUnknown* punkTarget = pT->GetTargetUnknown(); |
| - ATLASSERT(punkTarget != 0); |
| - if (!punkTarget) |
| - { |
| - ATLTRACE(_T("Interface queried before target unknown is set")); |
| - return E_UNEXPECTED; |
| - } |
| +template <class T> |
| +inline HRESULT WINAPI QIPassthrough<T>:: |
| + QueryInterfacePassthroughT(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw) |
| +{ |
| + ATLASSERT(pv != 0); |
| + T* pT = static_cast<T*>(pv); |
| - IUnknown* punkWrapper = pT->GetUnknown(); |
| + IUnknown* punkTarget = pT->GetTargetUnknown(); |
| + ATLASSERT(punkTarget != 0); |
| + if (!punkTarget) |
| + { |
| + ATLTRACE(_T("Interface queried before target unknown is set")); |
| + return E_UNEXPECTED; |
| + } |
| - typename T::ObjectLock lock(pT); |
| - return QueryInterfacePassthrough( |
| - pv, riid, ppv, dw, punkTarget, punkWrapper); |
| - } |
| + IUnknown* punkWrapper = pT->GetUnknown(); |
| - template <class T> |
| - inline HRESULT WINAPI QIPassthrough<T>:: |
| - QueryInterfaceDebugT(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw) |
| - { |
| - ATLASSERT(pv != 0); |
| - T* pT = static_cast<T*>(pv); |
| + typename T::ObjectLock lock(pT); |
| + return QueryInterfacePassthrough( |
| + pv, riid, ppv, dw, punkTarget, punkWrapper); |
| +} |
| - IUnknown* punkTarget = pT->GetTargetUnknown(); |
| - // ATLASSERT(punkTarget != 0); |
| - if (!punkTarget) |
| - { |
| - // ATLTRACE(_T("Interface queried before target unknown is set")); |
| - return E_UNEXPECTED; |
| - } |
| +template <class T> |
| +inline HRESULT WINAPI QIPassthrough<T>:: |
| + QueryInterfaceDebugT(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw) |
| +{ |
| + ATLASSERT(pv != 0); |
| + T* pT = static_cast<T*>(pv); |
| - typename T::ObjectLock lock(pT); |
| + IUnknown* punkTarget = pT->GetTargetUnknown(); |
| + ATLASSERT(punkTarget != 0); |
| + if (!punkTarget) |
| + { |
| + ATLTRACE(_T("Interface queried before target unknown is set")); |
| + return E_UNEXPECTED; |
| + } |
| - return QueryInterfaceDebug(pv, riid, ppv, dw, punkTarget); |
| - } |
| + typename T::ObjectLock lock(pT); |
| + return QueryInterfaceDebug(pv, riid, ppv, dw, punkTarget); |
| +} |
| - inline HRESULT WINAPI QueryInterfacePassthrough(void* pv, REFIID riid, |
| - LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget, IUnknown* punkWrapper) |
| - { |
| - ATLASSERT(pv != 0); |
| - ATLASSERT(ppv != 0); |
| - ATLASSERT(dw != 0); |
| - ATLASSERT(punkTarget != 0); |
| +inline HRESULT WINAPI QueryInterfacePassthrough(void* pv, REFIID riid, |
| + LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget, IUnknown* punkWrapper) |
| +{ |
| + ATLASSERT(pv != 0); |
| + ATLASSERT(ppv != 0); |
| + ATLASSERT(dw != 0); |
| + ATLASSERT(punkTarget != 0); |
| + const PassthroughItfData& data = |
| + *reinterpret_cast<const PassthroughItfData*>(dw); |
| - const PassthroughItfData& data = |
| - *reinterpret_cast<const PassthroughItfData*>(dw); |
| + IUnknown** ppUnk = reinterpret_cast<IUnknown**>( |
| + static_cast<char*>(pv) + data.offsetUnk); |
| - IUnknown** ppUnk = reinterpret_cast<IUnknown**>( |
| - static_cast<char*>(pv) + data.offsetUnk); |
| + HRESULT hr = S_OK; |
| + if (!*ppUnk) |
| + { |
| + CComPtr<IUnknown> spUnk; |
| + hr = punkTarget->QueryInterface(riid, |
| + reinterpret_cast<void**>(&spUnk)); |
| + ATLASSERT(FAILED(hr) || spUnk != 0); |
| + if (SUCCEEDED(hr)) |
| + { |
| + *ppUnk = spUnk.Detach(); |
| - HRESULT hr = S_OK; |
| - if (!*ppUnk) |
| - { |
| - CComPtr<IUnknown> spUnk; |
| - hr = punkTarget->QueryInterface(riid, |
| - reinterpret_cast<void**>(&spUnk)); |
| - ATLASSERT(FAILED(hr) || spUnk != 0); |
| - if (SUCCEEDED(hr)) |
| - { |
| - *ppUnk = spUnk.Detach(); |
| + // Need to QI for base interface to fill in base target pointer |
| + if (data.piidBase) |
| + { |
| + ATLASSERT(punkWrapper != 0); |
| + hr = punkWrapper->QueryInterface(*data.piidBase, |
| + reinterpret_cast<void**>(&spUnk)); |
| + // since QI for derived interface succeeded, |
| + // QI for base interface must succeed, too |
| + ATLASSERT(SUCCEEDED(hr)); |
| + } |
| + } |
| + } |
| + if (SUCCEEDED(hr)) |
| + { |
| + CComPtr<IUnknown> spItf = reinterpret_cast<IUnknown*>( |
| + static_cast<char*>(pv) + data.offsetItf); |
| + *ppv = spItf.Detach(); |
| + } |
| + else |
| + { |
| + ATLASSERT(_T("Interface not supported by target unknown")); |
| + } |
| + return hr; |
| +} |
| - // Need to QI for base interface to fill in base target pointer |
| - if (data.piidBase) |
| - { |
| - ATLASSERT(punkWrapper != 0); |
| - hr = punkWrapper->QueryInterface(*data.piidBase, |
| - reinterpret_cast<void**>(&spUnk)); |
| - // since QI for derived interface succeeded, |
| - // QI for base interface must succeed, too |
| - ATLASSERT(SUCCEEDED(hr)); |
| - } |
| - } |
| - } |
| - if (SUCCEEDED(hr)) |
| - { |
| - CComPtr<IUnknown> spItf = reinterpret_cast<IUnknown*>( |
| - static_cast<char*>(pv) + data.offsetItf); |
| - *ppv = spItf.Detach(); |
| - } |
| - else |
| - { |
| - ATLASSERT(_T("Interface not supported by target unknown")); |
| - } |
| - return hr; |
| - } |
| +inline HRESULT WINAPI QueryInterfaceDebug(void* pv, REFIID riid, |
| + LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget) |
| +{ |
| + ATLASSERT(pv != 0); |
| + ATLASSERT(ppv != 0); |
| + ATLASSERT(punkTarget != 0); |
| - inline HRESULT WINAPI QueryInterfaceDebug(void* pv, REFIID riid, |
| - LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget) |
| - { |
| - ATLASSERT(pv != 0); |
| - ATLASSERT(ppv != 0); |
| - ATLASSERT(punkTarget != 0); |
| + CComPtr<IUnknown> spUnk; |
| + HRESULT hr = punkTarget->QueryInterface(riid, |
| + reinterpret_cast<void**>(&spUnk)); |
| + ATLASSERT(FAILED(hr) || spUnk != 0); |
| + if (SUCCEEDED(hr)) |
| + { |
| + ATLTRACE(_T("Unrecognized interface supported by target unknown")); |
| + ATLASSERT(false); |
| + } |
| - CComPtr<IUnknown> spUnk; |
| - HRESULT hr = punkTarget->QueryInterface(riid, |
| - reinterpret_cast<void**>(&spUnk)); |
| - ATLASSERT(FAILED(hr) || spUnk != 0); |
| - if (SUCCEEDED(hr)) |
| - { |
| - //Added by MH to display interface CLSID in debug |
| - OLECHAR wszBuff[39]; |
| - int i = StringFromGUID2(riid, wszBuff, 39); |
| - USES_CONVERSION; |
| - ATLTRACE(_T("=====>Unrecognized interface supported by target unknown=%s\n"), OLE2T(wszBuff)); |
| - } |
| + // We don't support this interface, so return an error. |
| + // The operations above are for debugging purposes only, |
| + // this function is not supposed to ever return success |
| + return E_NOINTERFACE; |
| +} |
| - // We don't support this interface, so return an error. |
| - // The operations above are for debugging purposes only, |
| - // this function is not supposed to ever return success |
| - return E_NOINTERFACE; |
| - } |
| +inline HRESULT QueryServicePassthrough(REFGUID guidService, |
| + IUnknown* punkThis, REFIID riid, void** ppv, |
| + IServiceProvider* pClientProvider) |
| +{ |
| + ATLASSERT(punkThis != 0); |
| + CComPtr<IUnknown> spDummy; |
| + HRESULT hr = pClientProvider ? |
| + pClientProvider->QueryService(guidService, riid, |
| + reinterpret_cast<void**>(&spDummy)) : |
| + E_NOINTERFACE; |
| + if (SUCCEEDED(hr)) |
| + { |
| + hr = punkThis->QueryInterface(riid, ppv); |
| + } |
| + return hr; |
| +} |
| - inline HRESULT QueryServicePassthrough(REFGUID guidService, |
| - IUnknown* punkThis, REFIID riid, void** ppv, |
| - IServiceProvider* pClientProvider) |
| - { |
| - ATLASSERT(punkThis != 0); |
| - CComPtr<IUnknown> spDummy; |
| - HRESULT hr = pClientProvider ? |
| - pClientProvider->QueryService(guidService, riid, |
| - reinterpret_cast<void**>(&spDummy)) : |
| - E_NOINTERFACE; |
| - if (SUCCEEDED(hr)) |
| - { |
| - hr = punkThis->QueryInterface(riid, ppv); |
| - } |
| - return hr; |
| - } |
| +} // end namespace PassthroughAPP::Detail |
| - } // end namespace PassthroughAPP::Detail |
| +// ===== IInternetProtocolImpl ===== |
| - // ===== IInternetProtocolImpl ===== |
| +inline STDMETHODIMP IInternetProtocolImpl::SetTargetUnknown( |
| + IUnknown* punkTarget) |
| +{ |
| + ATLASSERT(punkTarget != 0); |
| + if (!punkTarget) |
| + { |
| + return E_POINTER; |
| + } |
| - inline STDMETHODIMP IInternetProtocolImpl::SetTargetUnknown( |
| - IUnknown* punkTarget) |
| - { |
| - ATLASSERT(punkTarget != 0); |
| - if (!punkTarget) |
| - { |
| - return E_POINTER; |
| - } |
| + // This method should only be called once, and be the only source |
| + // of target interface pointers. |
| + ATLASSERT(m_spInternetProtocolUnk == 0); |
| + ATLASSERT(m_spInternetProtocol == 0); |
| + if (m_spInternetProtocolUnk || m_spInternetProtocol) |
| + { |
| + return E_UNEXPECTED; |
| + } |
| - // This method should only be called once, and be the only source |
| - // of target interface pointers. |
| - ATLASSERT(m_spInternetProtocolUnk == 0); |
| - ATLASSERT(m_spInternetProtocol == 0); |
| - if (m_spInternetProtocolUnk || m_spInternetProtocol) |
| - { |
| - return E_UNEXPECTED; |
| - } |
| + // We expect the target unknown to implement at least IInternetProtocol |
| + // Otherwise we reject it |
| + HRESULT hr = punkTarget->QueryInterface(&m_spInternetProtocol); |
| + ATLASSERT(FAILED(hr) || m_spInternetProtocol != 0); |
| + if (FAILED(hr)) |
| + { |
| + return hr; |
| + } |
| - // We expect the target unknown to implement at least IInternetProtocol |
| - // Otherwise we reject it |
| - HRESULT hr = punkTarget->QueryInterface(&m_spInternetProtocol); |
| - ATLASSERT(FAILED(hr) || m_spInternetProtocol != 0); |
| - if (FAILED(hr)) |
| - { |
| - return hr; |
| - } |
| + hr = m_spInternetProtocol->QueryInterface(&m_spInternetProtocolEx); |
| + ATLASSERT(FAILED(hr) || m_spInternetProtocolEx != 0); |
| + if (FAILED(hr)) |
| + { |
| + return hr; |
| + } |
| - ATLASSERT(m_spInternetProtocolInfo == 0); |
| - ATLASSERT(m_spInternetPriority == 0); |
| - ATLASSERT(m_spInternetThreadSwitch == 0); |
| - ATLASSERT(m_spWinInetInfo == 0); |
| - ATLASSERT(m_spWinInetHttpInfo == 0); |
| + ATLASSERT(m_spInternetProtocolInfo == 0); |
| + ATLASSERT(m_spInternetPriority == 0); |
| + ATLASSERT(m_spInternetThreadSwitch == 0); |
| + ATLASSERT(m_spWinInetInfo == 0); |
| + ATLASSERT(m_spWinInetHttpInfo == 0); |
| - m_spInternetProtocolUnk = punkTarget; |
| - return S_OK; |
| - } |
| + m_spInternetProtocolUnk = punkTarget; |
| + return S_OK; |
| +} |
| - inline void IInternetProtocolImpl::ReleaseAll() |
| - { |
| - m_spInternetProtocolUnk.Release(); |
| - m_spInternetProtocol.Release(); |
| - m_spInternetProtocolInfo.Release(); |
| - m_spInternetPriority.Release(); |
| - m_spInternetThreadSwitch.Release(); |
| - m_spWinInetInfo.Release(); |
| - m_spWinInetHttpInfo.Release(); |
| - } |
| +inline void IInternetProtocolImpl::ReleaseAll() |
| +{ |
| + m_spInternetProtocolUnk.Release(); |
| + m_spInternetProtocol.Release(); |
| + m_spInternetProtocolEx.Release(); |
| + m_spInternetProtocolInfo.Release(); |
| + m_spInternetPriority.Release(); |
| + m_spInternetThreadSwitch.Release(); |
| + m_spWinInetInfo.Release(); |
| + m_spWinInetHttpInfo.Release(); |
| + m_spWinInetCacheHints.Release(); |
| + m_spWinInetCacheHints2.Release(); |
| +} |
| - // IInternetProtocolRoot |
| - inline STDMETHODIMP IInternetProtocolImpl::Start( |
| - /* [in] */ LPCWSTR szUrl, |
| - /* [in] */ IInternetProtocolSink *pOIProtSink, |
| - /* [in] */ IInternetBindInfo *pOIBindInfo, |
| - /* [in] */ DWORD grfPI, |
| - /* [in] */ HANDLE_PTR dwReserved) |
| - { |
| - ATLASSERT(m_spInternetProtocol != 0); |
| - return m_spInternetProtocol ? |
| - m_spInternetProtocol->Start(szUrl, pOIProtSink, pOIBindInfo, grfPI, |
| - dwReserved) : |
| - E_UNEXPECTED; |
| - } |
| +// IInternetProtocolRoot |
| +inline STDMETHODIMP IInternetProtocolImpl::Start( |
| + /* [in] */ LPCWSTR szUrl, |
| + /* [in] */ IInternetProtocolSink *pOIProtSink, |
| + /* [in] */ IInternetBindInfo *pOIBindInfo, |
| + /* [in] */ DWORD grfPI, |
| + /* [in] */ HANDLE_PTR dwReserved) |
| +{ |
| + ATLASSERT(m_spInternetProtocol != 0); |
| + return m_spInternetProtocol ? |
| + m_spInternetProtocol->Start(szUrl, pOIProtSink, pOIBindInfo, grfPI, |
| + dwReserved) : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::Continue( |
| - /* [in] */ PROTOCOLDATA *pProtocolData) |
| - { |
| - ATLASSERT(m_spInternetProtocol != 0); |
| - return m_spInternetProtocol ? |
| - m_spInternetProtocol->Continue(pProtocolData) : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::Continue( |
| + /* [in] */ PROTOCOLDATA *pProtocolData) |
| +{ |
| + ATLASSERT(m_spInternetProtocol != 0); |
| + return m_spInternetProtocol ? |
| + m_spInternetProtocol->Continue(pProtocolData) : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::Abort( |
| - /* [in] */ HRESULT hrReason, |
| - /* [in] */ DWORD dwOptions) |
| - { |
| - ATLASSERT(m_spInternetProtocol != 0); |
| - return m_spInternetProtocol ? |
| - m_spInternetProtocol->Abort(hrReason, dwOptions) : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::Abort( |
| + /* [in] */ HRESULT hrReason, |
| + /* [in] */ DWORD dwOptions) |
| +{ |
| + ATLASSERT(m_spInternetProtocol != 0); |
| + return m_spInternetProtocol ? |
| + m_spInternetProtocol->Abort(hrReason, dwOptions) : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::Terminate( |
| - /* [in] */ DWORD dwOptions) |
| - { |
| - ATLASSERT(m_spInternetProtocol != 0); |
| - return m_spInternetProtocol ? |
| - m_spInternetProtocol->Terminate(dwOptions) : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::Terminate( |
| + /* [in] */ DWORD dwOptions) |
| +{ |
| + ATLASSERT(m_spInternetProtocol != 0); |
| + return m_spInternetProtocol ? |
| + m_spInternetProtocol->Terminate(dwOptions) : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::Suspend() |
| - { |
| - ATLASSERT(m_spInternetProtocol != 0); |
| - return m_spInternetProtocol ? |
| - m_spInternetProtocol->Suspend() : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::Suspend() |
| +{ |
| + ATLASSERT(m_spInternetProtocol != 0); |
| + return m_spInternetProtocol ? |
| + m_spInternetProtocol->Suspend() : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::Resume() |
| - { |
| - ATLASSERT(m_spInternetProtocol != 0); |
| - return m_spInternetProtocol ? |
| - m_spInternetProtocol->Resume() : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::Resume() |
| +{ |
| + ATLASSERT(m_spInternetProtocol != 0); |
| + return m_spInternetProtocol ? |
| + m_spInternetProtocol->Resume() : |
| + E_UNEXPECTED; |
| +} |
| - // IInternetProtocol |
| - inline STDMETHODIMP IInternetProtocolImpl::Read( |
| - /* [in, out] */ void *pv, |
| - /* [in] */ ULONG cb, |
| - /* [out] */ ULONG *pcbRead) |
| - { |
| - ATLASSERT(m_spInternetProtocol != 0); |
| - return m_spInternetProtocol ? |
| - m_spInternetProtocol->Read(pv, cb, pcbRead) : |
| - E_UNEXPECTED; |
| - } |
| +// IInternetProtocol |
| +inline STDMETHODIMP IInternetProtocolImpl::Read( |
| + /* [in, out] */ void *pv, |
| + /* [in] */ ULONG cb, |
| + /* [out] */ ULONG *pcbRead) |
| +{ |
| + ATLASSERT(m_spInternetProtocol != 0); |
| + return m_spInternetProtocol ? |
| + m_spInternetProtocol->Read(pv, cb, pcbRead) : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::Seek( |
| - /* [in] */ LARGE_INTEGER dlibMove, |
| - /* [in] */ DWORD dwOrigin, |
| - /* [out] */ ULARGE_INTEGER *plibNewPosition) |
| - { |
| - ATLASSERT(m_spInternetProtocol != 0); |
| - return m_spInternetProtocol ? |
| - m_spInternetProtocol->Seek(dlibMove, dwOrigin, plibNewPosition) : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::Seek( |
| + /* [in] */ LARGE_INTEGER dlibMove, |
| + /* [in] */ DWORD dwOrigin, |
| + /* [out] */ ULARGE_INTEGER *plibNewPosition) |
| +{ |
| + ATLASSERT(m_spInternetProtocol != 0); |
| + return m_spInternetProtocol ? |
| + m_spInternetProtocol->Seek(dlibMove, dwOrigin, plibNewPosition) : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::LockRequest( |
| - /* [in] */ DWORD dwOptions) |
| - { |
| - ATLASSERT(m_spInternetProtocol != 0); |
| - return m_spInternetProtocol ? |
| - m_spInternetProtocol->LockRequest(dwOptions) : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::LockRequest( |
| + /* [in] */ DWORD dwOptions) |
| +{ |
| + ATLASSERT(m_spInternetProtocol != 0); |
| + return m_spInternetProtocol ? |
| + m_spInternetProtocol->LockRequest(dwOptions) : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::UnlockRequest() |
| - { |
| - ATLASSERT(m_spInternetProtocol != 0); |
| - return m_spInternetProtocol ? |
| - m_spInternetProtocol->UnlockRequest() : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::UnlockRequest() |
| +{ |
| + ATLASSERT(m_spInternetProtocol != 0); |
| + return m_spInternetProtocol ? |
| + m_spInternetProtocol->UnlockRequest() : |
| + E_UNEXPECTED; |
| +} |
| - // IInternetProtocolInfo |
| - inline STDMETHODIMP IInternetProtocolImpl::ParseUrl( |
| - /* [in] */ LPCWSTR pwzUrl, |
| - /* [in] */ PARSEACTION ParseAction, |
| - /* [in] */ DWORD dwParseFlags, |
| - /* [out] */ LPWSTR pwzResult, |
| - /* [in] */ DWORD cchResult, |
| - /* [out] */ DWORD *pcchResult, |
| - /* [in] */ DWORD dwReserved) |
| - { |
| - ATLASSERT(m_spInternetProtocolInfo != 0); |
| - return m_spInternetProtocolInfo ? |
| - m_spInternetProtocolInfo->ParseUrl(pwzUrl, ParseAction, dwParseFlags, |
| - pwzResult, cchResult, pcchResult, dwReserved) : |
| - E_UNEXPECTED; |
| - } |
| +// IInternetProtocolEx |
| - inline STDMETHODIMP IInternetProtocolImpl::CombineUrl( |
| - /* [in] */ LPCWSTR pwzBaseUrl, |
| - /* [in] */ LPCWSTR pwzRelativeUrl, |
| - /* [in] */ DWORD dwCombineFlags, |
| - /* [out] */ LPWSTR pwzResult, |
| - /* [in] */ DWORD cchResult, |
| - /* [out] */ DWORD *pcchResult, |
| - /* [in] */ DWORD dwReserved) |
| - { |
| - ATLASSERT(m_spInternetProtocolInfo != 0); |
| - return m_spInternetProtocolInfo ? |
| - m_spInternetProtocolInfo->CombineUrl(pwzBaseUrl, pwzRelativeUrl, |
| - dwCombineFlags, pwzResult, cchResult, pcchResult, dwReserved) : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::StartEx( |
| + IUri *pUri, |
| + IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, |
| + DWORD grfPI, |
| + HANDLE_PTR dwReserved) |
| +{ |
| + ATLASSERT(m_spInternetProtocolEx != 0); |
| + return m_spInternetProtocolEx ? |
| + m_spInternetProtocolEx->StartEx(pUri, pOIProtSink, pOIBindInfo, grfPI, dwReserved) : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::CompareUrl( |
| - /* [in] */ LPCWSTR pwzUrl1, |
| - /* [in] */ LPCWSTR pwzUrl2, |
| - /* [in] */ DWORD dwCompareFlags) |
| - { |
| - ATLASSERT(m_spInternetProtocolInfo != 0); |
| - return m_spInternetProtocolInfo ? |
| - m_spInternetProtocolInfo->CompareUrl(pwzUrl1,pwzUrl2, dwCompareFlags) : |
| - E_UNEXPECTED; |
| - } |
| +// IInternetProtocolInfo |
| +inline STDMETHODIMP IInternetProtocolImpl::ParseUrl( |
| + /* [in] */ LPCWSTR pwzUrl, |
| + /* [in] */ PARSEACTION ParseAction, |
| + /* [in] */ DWORD dwParseFlags, |
| + /* [out] */ LPWSTR pwzResult, |
| + /* [in] */ DWORD cchResult, |
| + /* [out] */ DWORD *pcchResult, |
| + /* [in] */ DWORD dwReserved) |
| +{ |
| + ATLASSERT(m_spInternetProtocolInfo != 0); |
| + return m_spInternetProtocolInfo ? |
| + m_spInternetProtocolInfo->ParseUrl(pwzUrl, ParseAction, dwParseFlags, |
| + pwzResult, cchResult, pcchResult, dwReserved) : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::QueryInfo( |
| - /* [in] */ LPCWSTR pwzUrl, |
| - /* [in] */ QUERYOPTION QueryOption, |
| - /* [in] */ DWORD dwQueryFlags, |
| - /* [in, out] */ LPVOID pBuffer, |
| - /* [in] */ DWORD cbBuffer, |
| - /* [in, out] */ DWORD *pcbBuf, |
| - /* [in] */ DWORD dwReserved) |
| - { |
| - ATLASSERT(m_spInternetProtocolInfo != 0); |
| - return m_spInternetProtocolInfo ? |
| - m_spInternetProtocolInfo->QueryInfo(pwzUrl, QueryOption, dwQueryFlags, |
| - pBuffer, cbBuffer, pcbBuf, dwReserved) : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::CombineUrl( |
| + /* [in] */ LPCWSTR pwzBaseUrl, |
| + /* [in] */ LPCWSTR pwzRelativeUrl, |
| + /* [in] */ DWORD dwCombineFlags, |
| + /* [out] */ LPWSTR pwzResult, |
| + /* [in] */ DWORD cchResult, |
| + /* [out] */ DWORD *pcchResult, |
| + /* [in] */ DWORD dwReserved) |
| +{ |
| + ATLASSERT(m_spInternetProtocolInfo != 0); |
| + return m_spInternetProtocolInfo ? |
| + m_spInternetProtocolInfo->CombineUrl(pwzBaseUrl, pwzRelativeUrl, |
| + dwCombineFlags, pwzResult, cchResult, pcchResult, dwReserved) : |
| + E_UNEXPECTED; |
| +} |
| - // IInternetPriority |
| - inline STDMETHODIMP IInternetProtocolImpl::SetPriority( |
| - /* [in] */ LONG nPriority) |
| - { |
| - ATLASSERT(m_spInternetPriority != 0); |
| - return m_spInternetPriority ? |
| - m_spInternetPriority->SetPriority(nPriority) : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::CompareUrl( |
| + /* [in] */ LPCWSTR pwzUrl1, |
| + /* [in] */ LPCWSTR pwzUrl2, |
| + /* [in] */ DWORD dwCompareFlags) |
| +{ |
| + ATLASSERT(m_spInternetProtocolInfo != 0); |
| + return m_spInternetProtocolInfo ? |
| + m_spInternetProtocolInfo->CompareUrl(pwzUrl1,pwzUrl2, dwCompareFlags) : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::GetPriority( |
| - /* [out] */ LONG *pnPriority) |
| - { |
| - ATLASSERT(m_spInternetPriority != 0); |
| - return m_spInternetPriority ? |
| - m_spInternetPriority->GetPriority(pnPriority) : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::QueryInfo( |
| + /* [in] */ LPCWSTR pwzUrl, |
| + /* [in] */ QUERYOPTION QueryOption, |
| + /* [in] */ DWORD dwQueryFlags, |
| + /* [in, out] */ LPVOID pBuffer, |
| + /* [in] */ DWORD cbBuffer, |
| + /* [in, out] */ DWORD *pcbBuf, |
| + /* [in] */ DWORD dwReserved) |
| +{ |
| + ATLASSERT(m_spInternetProtocolInfo != 0); |
| + return m_spInternetProtocolInfo ? |
| + m_spInternetProtocolInfo->QueryInfo(pwzUrl, QueryOption, dwQueryFlags, |
| + pBuffer, cbBuffer, pcbBuf, dwReserved) : |
| + E_UNEXPECTED; |
| +} |
| - // IInternetThreadSwitch |
| - inline STDMETHODIMP IInternetProtocolImpl::Prepare() |
| - { |
| - ATLASSERT(m_spInternetThreadSwitch != 0); |
| - return m_spInternetThreadSwitch ? |
| - m_spInternetThreadSwitch->Prepare() : |
| - E_UNEXPECTED; |
| - } |
| +// IInternetPriority |
| +inline STDMETHODIMP IInternetProtocolImpl::SetPriority( |
| + /* [in] */ LONG nPriority) |
| +{ |
| + ATLASSERT(m_spInternetPriority != 0); |
| + return m_spInternetPriority ? |
| + m_spInternetPriority->SetPriority(nPriority) : |
| + E_UNEXPECTED; |
| +} |
| - inline STDMETHODIMP IInternetProtocolImpl::Continue() |
| - { |
| - ATLASSERT(m_spInternetThreadSwitch != 0); |
| - return m_spInternetThreadSwitch ? |
| - m_spInternetThreadSwitch->Continue() : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::GetPriority( |
| + /* [out] */ LONG *pnPriority) |
| +{ |
| + ATLASSERT(m_spInternetPriority != 0); |
| + return m_spInternetPriority ? |
| + m_spInternetPriority->GetPriority(pnPriority) : |
| + E_UNEXPECTED; |
| +} |
| - // IWinInetInfo |
| - inline STDMETHODIMP IInternetProtocolImpl::QueryOption( |
| - /* [in] */ DWORD dwOption, |
| - /* [in, out] */ LPVOID pBuffer, |
| - /* [in, out] */ DWORD *pcbBuf) |
| - { |
| - ATLASSERT(m_spWinInetInfo != 0); |
| - return m_spWinInetInfo ? |
| - m_spWinInetInfo->QueryOption(dwOption, pBuffer, pcbBuf) : |
| - E_UNEXPECTED; |
| - } |
| +// IInternetThreadSwitch |
| +inline STDMETHODIMP IInternetProtocolImpl::Prepare() |
| +{ |
| + ATLASSERT(m_spInternetThreadSwitch != 0); |
| + return m_spInternetThreadSwitch ? |
| + m_spInternetThreadSwitch->Prepare() : |
| + E_UNEXPECTED; |
| +} |
| - // IWinInetHttpInfo |
| - inline STDMETHODIMP IInternetProtocolImpl::QueryInfo( |
| - /* [in] */ DWORD dwOption, |
| - /* [in, out] */ LPVOID pBuffer, |
| - /* [in, out] */ DWORD *pcbBuf, |
| - /* [in, out] */ DWORD *pdwFlags, |
| - /* [in, out] */ DWORD *pdwReserved) |
| - { |
| - ATLASSERT(m_spWinInetHttpInfo != 0); |
| - return m_spWinInetHttpInfo ? |
| - m_spWinInetHttpInfo->QueryInfo(dwOption, pBuffer, pcbBuf, pdwFlags, |
| - pdwReserved) : |
| - E_UNEXPECTED; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::Continue() |
| +{ |
| + ATLASSERT(m_spInternetThreadSwitch != 0); |
| + return m_spInternetThreadSwitch ? |
| + m_spInternetThreadSwitch->Continue() : |
| + E_UNEXPECTED; |
| +} |
| - // ===== IInternetProtocolSinkImpl ===== |
| +// IWinInetInfo |
| +inline STDMETHODIMP IInternetProtocolImpl::QueryOption( |
| + /* [in] */ DWORD dwOption, |
| + /* [in, out] */ LPVOID pBuffer, |
| + /* [in, out] */ DWORD *pcbBuf) |
| +{ |
| + ATLASSERT(m_spWinInetInfo != 0); |
| + return m_spWinInetInfo ? |
| + m_spWinInetInfo->QueryOption(dwOption, pBuffer, pcbBuf) : |
| + E_UNEXPECTED; |
| +} |
| - inline HRESULT IInternetProtocolSinkImpl::OnStart(LPCWSTR szUrl, |
| - IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, |
| - DWORD grfPI, HANDLE_PTR dwReserved, IInternetProtocol* pTargetProtocol) |
| - { |
| - ATLASSERT(pOIProtSink != 0); |
| - ATLASSERT(pOIBindInfo != 0); |
| - ATLASSERT(pTargetProtocol != 0); |
| - if (!pOIProtSink || !pOIBindInfo || !pTargetProtocol) |
| - { |
| - return E_POINTER; |
| - } |
| +// IWinInetHttpInfo |
| +inline STDMETHODIMP IInternetProtocolImpl::QueryInfo( |
| + /* [in] */ DWORD dwOption, |
| + /* [in, out] */ LPVOID pBuffer, |
| + /* [in, out] */ DWORD *pcbBuf, |
| + /* [in, out] */ DWORD *pdwFlags, |
| + /* [in, out] */ DWORD *pdwReserved) |
| +{ |
| + ATLASSERT(m_spWinInetHttpInfo != 0); |
| + return m_spWinInetHttpInfo ? |
| + m_spWinInetHttpInfo->QueryInfo(dwOption, pBuffer, pcbBuf, pdwFlags, |
| + pdwReserved) : |
| + E_UNEXPECTED; |
| +} |
| - // This method should only be called once, and be the only source |
| - // of target interface pointers. |
| - ATLASSERT(m_spInternetProtocolSink == 0); |
| - ATLASSERT(m_spTargetProtocol == 0); |
| - if (m_spInternetProtocolSink || m_spTargetProtocol) |
| - { |
| - return E_UNEXPECTED; |
| - } |
| +// IWinInetCacheHints |
| - ATLASSERT(m_spServiceProvider == 0); |
| +inline STDMETHODIMP IInternetProtocolImpl::SetCacheExtension( |
| + /* [in] */ LPCWSTR pwzExt, |
| + /* [in, out] */ LPVOID pszCacheFile, |
| + /* [in, out] */ DWORD *pcbCacheFile, |
| + /* [in, out] */ DWORD *pdwWinInetError, |
| + /* [in, out] */ DWORD *pdwReserved) |
| +{ |
| + ATLASSERT(m_spWinInetCacheHints2 != NULL); |
| + return m_spWinInetCacheHints2 ? |
| + m_spWinInetCacheHints2->SetCacheExtension(pwzExt, pszCacheFile, pcbCacheFile, |
| + pdwWinInetError, pdwReserved) : E_UNEXPECTED; |
| +} |
| - m_spInternetProtocolSink = pOIProtSink; |
| - m_spTargetProtocol = pTargetProtocol; |
| - return S_OK; |
| - } |
| +inline STDMETHODIMP IInternetProtocolImpl::SetCacheExtension2( |
| + /* [in] */ LPCWSTR pwzExt, |
| + /* [out] */ WCHAR *pwzCacheFile, |
| + /* [in, out] */ DWORD *pcchCacheFile, |
| + /* [out] */ DWORD *pdwWinInetError, |
| + /* [out] */ DWORD *pdwReserved) |
| +{ |
| + ATLASSERT(m_spWinInetCacheHints2 != NULL); |
| + return m_spWinInetCacheHints2 ? |
| + m_spWinInetCacheHints2->SetCacheExtension2(pwzExt, pwzCacheFile, pcchCacheFile, |
| + pdwWinInetError, pdwReserved) : E_UNEXPECTED; |
| +} |
| - inline void IInternetProtocolSinkImpl::ReleaseAll() |
| - { |
| - m_spInternetProtocolSink.Release(); |
| - m_spServiceProvider.Release(); |
| - m_spTargetProtocol.Release(); |
| - } |
| +// ===== IInternetProtocolSinkImpl ===== |
| - inline IServiceProvider* IInternetProtocolSinkImpl::GetClientServiceProvider() |
| - { |
| - return m_spServiceProvider; |
| - } |
| +inline HRESULT IInternetProtocolSinkImpl::InitMembers(IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, |
| + IInternetProtocol* pTargetProtocol) |
| +{ |
| + ATLASSERT(pOIProtSink != 0); |
| + ATLASSERT(pOIBindInfo != 0); |
| + ATLASSERT(pTargetProtocol != 0); |
| + if (!pOIProtSink || !pOIBindInfo || !pTargetProtocol) |
| + { |
| + return E_POINTER; |
| + } |
| - inline HRESULT IInternetProtocolSinkImpl::QueryServiceFromClient( |
| - REFGUID guidService, REFIID riid, void** ppvObject) |
| - { |
| - HRESULT hr = S_OK; |
| - CComPtr<IServiceProvider> spClientProvider = m_spServiceProvider; |
| - if (!spClientProvider) |
| - { |
| - hr = m_spInternetProtocolSink->QueryInterface(&spClientProvider); |
| - ATLASSERT(SUCCEEDED(hr) && spClientProvider != 0); |
| - } |
| - if (SUCCEEDED(hr)) |
| - { |
| - hr = spClientProvider->QueryService(guidService, riid, ppvObject); |
| - } |
| - return hr; |
| - } |
| + // This method should only be called once, and be the only source |
| + // of target interface pointers. |
| + ATLASSERT(m_spInternetProtocolSink == 0); |
| + ATLASSERT(m_spInternetBindInfo == 0); |
| + ATLASSERT(m_spTargetProtocol == 0); |
| + if (m_spInternetProtocolSink || m_spInternetBindInfo || m_spTargetProtocol) |
| + { |
| + return E_UNEXPECTED; |
| + } |
| - // IInternetProtocolSink |
| - inline STDMETHODIMP IInternetProtocolSinkImpl::Switch( |
| - /* [in] */ PROTOCOLDATA *pProtocolData) |
| - { |
| - ATLASSERT(m_spInternetProtocolSink != 0); |
| - return m_spInternetProtocolSink ? |
| - m_spInternetProtocolSink->Switch(pProtocolData) : |
| - E_UNEXPECTED; |
| - } |
| + ATLASSERT(m_spServiceProvider == 0); |
| - inline STDMETHODIMP IInternetProtocolSinkImpl::ReportProgress( |
| - /* [in] */ ULONG ulStatusCode, |
| - /* [in] */ LPCWSTR szStatusText) |
| - { |
| - ATLASSERT(m_spInternetProtocolSink != 0); |
| - return m_spInternetProtocolSink ? |
| - m_spInternetProtocolSink->ReportProgress(ulStatusCode, szStatusText) : |
| - E_UNEXPECTED; |
| - } |
| + m_spInternetProtocolSink = pOIProtSink; |
| + m_spInternetBindInfo = pOIBindInfo; |
| + if (FAILED(m_spInternetBindInfo->QueryInterface(&m_spInternetBindInfoEx))) |
| + m_spInternetBindInfoEx = NULL; |
| + m_spTargetProtocol = pTargetProtocol; |
| + return S_OK; |
| +} |
| - inline STDMETHODIMP IInternetProtocolSinkImpl::ReportData( |
| - /* [in] */ DWORD grfBSCF, |
| - /* [in] */ ULONG ulProgress, |
| - /* [in] */ ULONG ulProgressMax) |
| - { |
| - ATLASSERT(m_spInternetProtocolSink != 0); |
| - return m_spInternetProtocolSink ? |
| - m_spInternetProtocolSink->ReportData(grfBSCF, ulProgress, |
| - ulProgressMax) : |
| - E_UNEXPECTED; |
| - } |
| +inline HRESULT IInternetProtocolSinkImpl::OnStart(LPCWSTR szUrl, |
| + IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, |
| + DWORD grfPI, HANDLE_PTR dwReserved, IInternetProtocol* pTargetProtocol) |
| +{ |
| + return InitMembers(pOIProtSink, pOIBindInfo, pTargetProtocol); |
| +} |
| - inline STDMETHODIMP IInternetProtocolSinkImpl::ReportResult( |
| - /* [in] */ HRESULT hrResult, |
| - /* [in] */ DWORD dwError, |
| - /* [in] */ LPCWSTR szResult) |
| - { |
| - ATLASSERT(m_spInternetProtocolSink != 0); |
| +inline HRESULT IInternetProtocolSinkImpl::OnStartEx(IUri* pUri, |
| + IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, |
| + DWORD grfPI, HANDLE_PTR dwReserved, IInternetProtocol* pTargetProtocol) |
| +{ |
| + return InitMembers(pOIProtSink, pOIBindInfo, pTargetProtocol); |
| +} |
| - // On some websites there are broken requests, that keep on redirecting without a stop. |
| - // For example: http://telegrafua.com/ has a request to: http://www.ool.ua/webroot/delivery/images/ool-button.gif |
| - // which causes IE tab to crash in urlmon.dll. That request doesn't ever resolve, since it's constantly responding |
| - // with HTTP 302. |
| - // It seems like WinInet (urlmon.dll) doesn't expect anything like that to happen, and relies on APP to make sure it doesn't. |
| - // So here we detect if there has been too many redirects (ie INET_E_REDIRECT_FAILED) and we just notify WinInet |
| - // that there has been a generic problem, not redirect specific error. |
| +inline void IInternetProtocolSinkImpl::ReleaseAll() |
| +{ |
| + m_spInternetProtocolSink.Release(); |
| + m_spServiceProvider.Release(); |
| + m_spInternetBindInfo.Release(); |
| + m_spInternetBindInfoEx.Release(); |
| + m_spUriContainer.Release(); |
| + m_spTargetProtocol.Release(); |
| +} |
| - // This seem to only postpone the issue to some different place. Undo for now |
| -// if (hrResult == INET_E_REDIRECT_FAILED) |
| -// hrResult = S_FALSE; |
| +inline IServiceProvider* IInternetProtocolSinkImpl::GetClientServiceProvider() |
| +{ |
| + return m_spServiceProvider; |
| +} |
| - return m_spInternetProtocolSink ? |
| - m_spInternetProtocolSink->ReportResult(hrResult, dwError, szResult) : |
| - E_UNEXPECTED; |
| - } |
| +inline HRESULT IInternetProtocolSinkImpl::QueryServiceFromClient( |
| + REFGUID guidService, REFIID riid, void** ppvObject) |
| +{ |
| + HRESULT hr = S_OK; |
| + CComPtr<IServiceProvider> spClientProvider = m_spServiceProvider; |
| + if (!spClientProvider) |
| + { |
| + hr = m_spInternetProtocolSink->QueryInterface(&spClientProvider); |
| + ATLASSERT(SUCCEEDED(hr) && spClientProvider != 0); |
| + } |
| + if (SUCCEEDED(hr)) |
| + { |
| + hr = spClientProvider->QueryService(guidService, riid, ppvObject); |
| + } |
| + return hr; |
| +} |
| - // IServiceProvider |
| - inline STDMETHODIMP IInternetProtocolSinkImpl::QueryService( |
| - /* [in] */ REFGUID guidService, |
| - /* [in] */ REFIID riid, |
| - /* [out] */ void** ppvObject) |
| - { |
| - ATLASSERT(m_spServiceProvider != 0); |
| - return m_spServiceProvider ? |
| - m_spServiceProvider->QueryService(guidService, riid, ppvObject) : |
| - E_UNEXPECTED; |
| - } |
| +// IInternetProtocolSink |
| +inline STDMETHODIMP IInternetProtocolSinkImpl::Switch( |
| + /* [in] */ PROTOCOLDATA *pProtocolData) |
| +{ |
| + ATLASSERT(m_spInternetProtocolSink != 0); |
| + return m_spInternetProtocolSink ? |
| + m_spInternetProtocolSink->Switch(pProtocolData) : |
| + E_UNEXPECTED; |
| +} |
| - // ===== CInternetProtocolSinkWithSP ===== |
| +inline STDMETHODIMP IInternetProtocolSinkImpl::ReportProgress( |
| + /* [in] */ ULONG ulStatusCode, |
| + /* [in] */ LPCWSTR szStatusText) |
| +{ |
| + ATLASSERT(m_spInternetProtocolSink != 0); |
| + return m_spInternetProtocolSink ? |
| + m_spInternetProtocolSink->ReportProgress(ulStatusCode, szStatusText) : |
| + E_UNEXPECTED; |
| +} |
| - template <class T, class ThreadModel> |
| - inline HRESULT CInternetProtocolSinkWithSP<T, ThreadModel>::OnStart( |
| - LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, |
| - IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved, |
| - IInternetProtocol* pTargetProtocol) |
| - { |
| - ATLASSERT(m_spServiceProvider == 0); |
| - if (m_spServiceProvider) |
| - { |
| - return E_UNEXPECTED; |
| - } |
| - HRESULT hr = BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, |
| - dwReserved, pTargetProtocol); |
| - if (SUCCEEDED(hr)) |
| - { |
| - pOIProtSink->QueryInterface(&m_spServiceProvider); |
| - } |
| - return hr; |
| - } |
| +inline STDMETHODIMP IInternetProtocolSinkImpl::ReportData( |
| + /* [in] */ DWORD grfBSCF, |
| + /* [in] */ ULONG ulProgress, |
| + /* [in] */ ULONG ulProgressMax) |
| +{ |
| + ATLASSERT(m_spInternetProtocolSink != 0); |
| + return m_spInternetProtocolSink ? |
| + m_spInternetProtocolSink->ReportData(grfBSCF, ulProgress, |
| + ulProgressMax) : |
| + E_UNEXPECTED; |
| +} |
| - template <class T, class ThreadModel> |
| - inline HRESULT CInternetProtocolSinkWithSP<T, ThreadModel>:: |
| - _InternalQueryService(REFGUID guidService, REFIID riid, void** ppvObject) |
| - { |
| - return E_NOINTERFACE; |
| - } |
| +inline STDMETHODIMP IInternetProtocolSinkImpl::ReportResult( |
| + /* [in] */ HRESULT hrResult, |
| + /* [in] */ DWORD dwError, |
| + /* [in] */ LPCWSTR szResult) |
| +{ |
| + ATLASSERT(m_spInternetProtocolSink != 0); |
| + return m_spInternetProtocolSink ? |
| + m_spInternetProtocolSink->ReportResult(hrResult, dwError, szResult) : |
| + E_UNEXPECTED; |
| +} |
| - template <class T, class ThreadModel> |
| - inline STDMETHODIMP CInternetProtocolSinkWithSP<T, ThreadModel>::QueryService( |
| - REFGUID guidService, REFIID riid, void** ppv) |
| - { |
| - T* pT = static_cast<T*>(this); |
| - HRESULT hr = pT->_InternalQueryService(guidService, riid, ppv); |
| - if (FAILED(hr) && m_spServiceProvider) |
| - { |
| - hr = m_spServiceProvider->QueryService(guidService, riid, ppv); |
| - } |
| - return hr; |
| - } |
| +// IServiceProvider |
| +inline STDMETHODIMP IInternetProtocolSinkImpl::QueryService( |
| + /* [in] */ REFGUID guidService, |
| + /* [in] */ REFIID riid, |
| + /* [out] */ void** ppvObject) |
| +{ |
| + ATLASSERT(m_spServiceProvider != 0); |
| + return m_spServiceProvider ? |
| + m_spServiceProvider->QueryService(guidService, riid, ppvObject) : |
| + E_UNEXPECTED; |
| +} |
| + |
| +// IInternetBindInfo |
| +inline STDMETHODIMP IInternetProtocolSinkImpl::GetBindInfo( |
| + /* [out] */ DWORD *grfBINDF, |
| + /* [in, out] */ BINDINFO *pbindinfo) |
| +{ |
| + ATLASSERT(m_spInternetBindInfo != 0); |
| + return m_spInternetBindInfo ? |
| + m_spInternetBindInfo->GetBindInfo(grfBINDF, pbindinfo) : |
| + E_UNEXPECTED; |
| +} |
| + |
| +inline STDMETHODIMP IInternetProtocolSinkImpl::GetBindString( |
| + /* [in] */ ULONG ulStringType, |
| + /* [in, out] */ LPOLESTR *ppwzStr, |
| + /* [in] */ ULONG cEl, |
| + /* [in, out] */ ULONG *pcElFetched) |
| +{ |
| + ATLASSERT(m_spInternetBindInfo != 0); |
| + return m_spInternetBindInfo ? |
| + m_spInternetBindInfo->GetBindString(ulStringType, ppwzStr, cEl, |
| + pcElFetched) : |
| + E_UNEXPECTED; |
| +} |
| + |
| +// IInternetBindInfoEx |
| +inline STDMETHODIMP IInternetProtocolSinkImpl::GetBindInfoEx( |
| + DWORD *grfBINDF, |
| + BINDINFO *pbindinfo, |
| + DWORD *grfBINDF2, |
| + DWORD *pdwReserved) |
| +{ |
| + ATLASSERT(m_spInternetBindInfoEx != 0); |
| + return m_spInternetBindInfoEx ? |
| + m_spInternetBindInfoEx->GetBindInfoEx(grfBINDF, pbindinfo, |
| + grfBINDF2, pdwReserved) : E_UNEXPECTED; |
| +} |
| + |
| +inline STDMETHODIMP IInternetProtocolSinkImpl::GetIUri( |
| + IUri **ppIUri |
| +) |
| +{ |
| + ATLASSERT(m_spUriContainer != 0); |
| + return m_spUriContainer ? |
| + m_spUriContainer->GetIUri(ppIUri) : E_UNEXPECTED; |
| +} |
| + |
| +// ===== CInternetProtocolSinkWithSP ===== |
| + |
| +template <class T, class ThreadModel> |
| +inline HRESULT CInternetProtocolSinkWithSP<T, ThreadModel>::OnStart( |
| + LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved, |
| + IInternetProtocol* pTargetProtocol) |
| +{ |
| + ATLASSERT(m_spServiceProvider == 0); |
| + if (m_spServiceProvider) |
| + { |
| + return E_UNEXPECTED; |
| + } |
| + HRESULT hr = BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, |
| + dwReserved, pTargetProtocol); |
| + if (SUCCEEDED(hr)) |
| + { |
| + pOIProtSink->QueryInterface(&m_spServiceProvider); |
| + } |
| + return hr; |
| +} |
| + |
| +template <class T, class ThreadModel> |
| +inline HRESULT CInternetProtocolSinkWithSP<T, ThreadModel>::OnStartEx( |
| + IUri* pUri, IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved, |
| + IInternetProtocol* pTargetProtocol) |
| +{ |
| + ATLASSERT(m_spServiceProvider == 0); |
| + if (m_spServiceProvider) |
| + { |
| + return E_UNEXPECTED; |
| + } |
| + HRESULT hr = BaseClass::OnStartEx(pUri, pOIProtSink, pOIBindInfo, grfPI, |
| + dwReserved, pTargetProtocol); |
| + if (SUCCEEDED(hr)) |
| + { |
| + pOIProtSink->QueryInterface(&m_spServiceProvider); |
| + } |
| + return hr; |
| +} |
| + |
| +template <class T, class ThreadModel> |
| +inline HRESULT CInternetProtocolSinkWithSP<T, ThreadModel>:: |
| + _InternalQueryService(REFGUID guidService, REFIID riid, void** ppvObject) |
| +{ |
| + return E_NOINTERFACE; |
| +} |
| + |
| +template <class T, class ThreadModel> |
| +inline STDMETHODIMP CInternetProtocolSinkWithSP<T, ThreadModel>::QueryService( |
| + REFGUID guidService, REFIID riid, void** ppv) |
| +{ |
| + T* pT = static_cast<T*>(this); |
| + HRESULT hr = pT->_InternalQueryService(guidService, riid, ppv); |
| + if (FAILED(hr) && m_spServiceProvider) |
| + { |
| + hr = m_spServiceProvider->QueryService(guidService, riid, ppv); |
| + } |
| + return hr; |
| +} |
| + |
| +// ===== CInternetProtocol ===== |
| + |
| +// IInternetProtocolRoot |
| +template <class StartPolicy, class ThreadModel> |
| +inline STDMETHODIMP CInternetProtocol<StartPolicy, ThreadModel>::Start( |
| + LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved) |
| +{ |
| + ATLASSERT(m_spInternetProtocol != 0); |
| + if (!m_spInternetProtocol) |
| + { |
| + return E_UNEXPECTED; |
| + } |
| + |
| + return StartPolicy::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, |
| + dwReserved, m_spInternetProtocol); |
| +} |
| + |
| +// IInternetProtocolEx |
| +template <class StartPolicy, class ThreadModel> |
| +inline STDMETHODIMP CInternetProtocol<StartPolicy, ThreadModel>::StartEx( |
| + IUri* pUri, IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved) |
| +{ |
| + ATLASSERT(m_spInternetProtocolEx != 0); |
| + if (!m_spInternetProtocolEx) |
| + { |
| + return E_UNEXPECTED; |
| + } |
| + |
| + return StartPolicy::OnStartEx(pUri, pOIProtSink, pOIBindInfo, grfPI, |
| + dwReserved, m_spInternetProtocolEx); |
| +} |
| + |
| } // end namespace PassthroughAPP |
| #endif // PASSTHROUGHAPP_PROTOCOLIMPL_INL |