| Index: src/plugin/passthroughapp/ProtocolImpl.h |
| =================================================================== |
| --- a/src/plugin/passthroughapp/ProtocolImpl.h |
| +++ b/src/plugin/passthroughapp/ProtocolImpl.h |
| @@ -1,301 +1,353 @@ |
| -// 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_H |
| #define PASSTHROUGHAPP_PROTOCOLIMPL_H |
| #if _MSC_VER > 1000 |
| -#pragma once |
| + #pragma once |
| #endif // _MSC_VER > 1000 |
| #include <urlmon.h> |
| #pragma comment(lib, "urlmon.lib") |
| +#include "PassthroughObject.h" |
| + |
| namespace PassthroughAPP |
| { |
| - namespace Detail |
| - { |
| - struct PassthroughItfData |
| - { |
| - DWORD_PTR offsetItf; |
| - DWORD_PTR offsetUnk; |
| - const IID* piidBase; |
| - }; |
| +namespace Detail |
| +{ |
| - template <class itf, class impl, DWORD_PTR offsetUnk, const IID* piidBase> |
| - struct PassthroughItfHelper |
| - { |
| - static PassthroughItfData data; |
| - }; |
| +struct PassthroughItfData |
| +{ |
| + DWORD_PTR offsetItf; |
| + DWORD_PTR offsetUnk; |
| + const IID* piidBase; |
| +}; |
| - template <class itf, class impl, DWORD_PTR offsetUnk, const IID* piidBase> |
| - PassthroughItfData |
| - PassthroughItfHelper<itf, impl, offsetUnk, piidBase>:: |
| - data = {offsetofclass(itf, impl), offsetUnk, piidBase}; |
| +template <class itf, class impl, DWORD_PTR offsetUnk, const IID* piidBase> |
| +struct PassthroughItfHelper |
| +{ |
| + static PassthroughItfData data; |
| +}; |
| + |
| +template <class itf, class impl, DWORD_PTR offsetUnk, const IID* piidBase> |
| +PassthroughItfData |
| + PassthroughItfHelper<itf, impl, offsetUnk, piidBase>:: |
| + data = {offsetofclass(itf, impl), offsetUnk, piidBase}; |
| #define COM_INTERFACE_ENTRY_PASSTHROUGH(itf, punk)\ |
| - {&_ATL_IIDOF(itf),\ |
| - (DWORD_PTR)&::PassthroughAPP::Detail::PassthroughItfHelper<\ |
| - itf, _ComMapClass,\ |
| - (DWORD_PTR)offsetof(_ComMapClass, punk),\ |
| - 0\ |
| - >::data,\ |
| - ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ |
| - QueryInterfacePassthroughT\ |
| - }, |
| + {&_ATL_IIDOF(itf),\ |
| + (DWORD_PTR)&::PassthroughAPP::Detail::PassthroughItfHelper<\ |
| + itf, _ComMapClass,\ |
| + (DWORD_PTR)offsetof(_ComMapClass, punk),\ |
| + 0\ |
| + >::data,\ |
| + ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ |
| + QueryInterfacePassthroughT\ |
| + }, |
| #define COM_INTERFACE_ENTRY_PASSTHROUGH2(itf, punk, itfBase)\ |
| - {&_ATL_IIDOF(itf),\ |
| - (DWORD_PTR)&::PassthroughAPP::Detail::PassthroughItfHelper<\ |
| - itf, _ComMapClass,\ |
| - (DWORD_PTR)offsetof(_ComMapClass, punk),\ |
| - &_ATL_IIDOF(itfBase)\ |
| - >::data,\ |
| - ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ |
| - QueryInterfacePassthroughT\ |
| - }, |
| + {&_ATL_IIDOF(itf),\ |
| + (DWORD_PTR)&::PassthroughAPP::Detail::PassthroughItfHelper<\ |
| + itf, _ComMapClass,\ |
| + (DWORD_PTR)offsetof(_ComMapClass, punk),\ |
| + &_ATL_IIDOF(itfBase)\ |
| + >::data,\ |
| + ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ |
| + QueryInterfacePassthroughT\ |
| + }, |
| #ifdef DEBUG |
| -#define COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG()\ |
| - {0, 0,\ |
| - ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ |
| - QueryInterfaceDebugT\ |
| - }, |
| + #define COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG()\ |
| + {0, 0,\ |
| + ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ |
| + QueryInterfaceDebugT\ |
| + }, |
| #else |
| -#define COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() |
| + #define COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() |
| #endif |
| #define DECLARE_GET_TARGET_UNKNOWN(x) \ |
| - inline IUnknown* GetTargetUnknown() {return x;} |
| + inline IUnknown* GetTargetUnknown() {return x;} |
| - // Workaround for VC6's deficiencies in dealing with function templates. |
| - // We'd use non-member template functions, but VC6 does not handle those well. |
| - // Static members of class templates work much better, and we don't need |
| - // parameter deduction here |
| - template <class T> |
| - struct QIPassthrough |
| - { |
| - static HRESULT WINAPI QueryInterfacePassthroughT(void* pv, REFIID riid, |
| - LPVOID* ppv, DWORD_PTR dw); |
| - static HRESULT WINAPI QueryInterfaceDebugT(void* pv, REFIID riid, |
| - LPVOID* ppv, DWORD_PTR dw); |
| - }; |
| +// Workaround for VC6's deficiencies in dealing with function templates. |
| +// We'd use non-member template functions, but VC6 does not handle those well. |
| +// Static members of class templates work much better, and we don't need |
| +// parameter deduction here |
| +template <class T> |
| +struct QIPassthrough |
| +{ |
| + static HRESULT WINAPI QueryInterfacePassthroughT(void* pv, REFIID riid, |
| + LPVOID* ppv, DWORD_PTR dw); |
| + static HRESULT WINAPI QueryInterfaceDebugT(void* pv, REFIID riid, |
| + LPVOID* ppv, DWORD_PTR dw); |
| +}; |
| - HRESULT WINAPI QueryInterfacePassthrough(void* pv, REFIID riid, |
| - LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget, IUnknown* punkWrapper); |
| +HRESULT WINAPI QueryInterfacePassthrough(void* pv, REFIID riid, |
| + LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget, IUnknown* punkWrapper); |
| - HRESULT WINAPI QueryInterfaceDebug(void* pv, REFIID riid, |
| - LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget); |
| +HRESULT WINAPI QueryInterfaceDebug(void* pv, REFIID riid, |
| + LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget); |
| - HRESULT QueryServicePassthrough(REFGUID guidService, |
| - IUnknown* punkThis, REFIID riid, void** ppv, |
| - IServiceProvider* pClientProvider); |
| +HRESULT QueryServicePassthrough(REFGUID guidService, |
| + IUnknown* punkThis, REFIID riid, void** ppv, |
| + IServiceProvider* pClientProvider); |
| - } // end namespace PassthroughAPP::Detail |
| +} // end namespace PassthroughAPP::Detail |
| - class ATL_NO_VTABLE IInternetProtocolImpl : |
| - public IPassthroughObject, |
| - public IInternetProtocol, |
| - public IInternetProtocolInfo, |
| - public IInternetPriority, |
| - public IInternetThreadSwitch, |
| - public IWinInetHttpInfo |
| - { |
| - public: |
| - void ReleaseAll(); |
| +class ATL_NO_VTABLE IInternetProtocolImpl : |
| + public IPassthroughObject, |
| + public IInternetProtocolEx, |
| + public IInternetProtocolInfo, |
| + public IInternetPriority, |
| + public IInternetThreadSwitch, |
| + public IWinInetHttpInfo, |
| + public IWinInetCacheHints2 |
| +{ |
| +public: |
| + void ReleaseAll(); |
| - DECLARE_GET_TARGET_UNKNOWN(m_spInternetProtocolUnk) |
| - public: |
| - // IPassthroughObject |
| - STDMETHODIMP SetTargetUnknown(IUnknown* punkTarget); |
| + DECLARE_GET_TARGET_UNKNOWN(m_spInternetProtocolUnk) |
| +public: |
| + // IPassthroughObject |
| + STDMETHODIMP SetTargetUnknown(IUnknown* punkTarget); |
| - // IInternetProtocolRoot |
| - STDMETHODIMP Start( |
| - /* [in] */ LPCWSTR szUrl, |
| - /* [in] */ IInternetProtocolSink *pOIProtSink, |
| - /* [in] */ IInternetBindInfo *pOIBindInfo, |
| - /* [in] */ DWORD grfPI, |
| - /* [in] */ HANDLE_PTR dwReserved); |
| + // IInternetProtocolRoot |
| + STDMETHODIMP Start( |
| + /* [in] */ LPCWSTR szUrl, |
| + /* [in] */ IInternetProtocolSink *pOIProtSink, |
| + /* [in] */ IInternetBindInfo *pOIBindInfo, |
| + /* [in] */ DWORD grfPI, |
| + /* [in] */ HANDLE_PTR dwReserved); |
| - STDMETHODIMP Continue( |
| - /* [in] */ PROTOCOLDATA *pProtocolData); |
| + STDMETHODIMP Continue( |
| + /* [in] */ PROTOCOLDATA *pProtocolData); |
| - STDMETHODIMP Abort( |
| - /* [in] */ HRESULT hrReason, |
| - /* [in] */ DWORD dwOptions); |
| + STDMETHODIMP Abort( |
| + /* [in] */ HRESULT hrReason, |
| + /* [in] */ DWORD dwOptions); |
| - STDMETHODIMP Terminate( |
| - /* [in] */ DWORD dwOptions); |
| + STDMETHODIMP Terminate( |
| + /* [in] */ DWORD dwOptions); |
| - STDMETHODIMP Suspend(); |
| + STDMETHODIMP Suspend(); |
| - STDMETHODIMP Resume(); |
| + STDMETHODIMP Resume(); |
| - // IInternetProtocol |
| - STDMETHODIMP Read( |
| - /* [in, out] */ void *pv, |
| - /* [in] */ ULONG cb, |
| - /* [out] */ ULONG *pcbRead); |
| + // IInternetProtocol |
| + STDMETHODIMP Read( |
| + /* [in, out] */ void *pv, |
| + /* [in] */ ULONG cb, |
| + /* [out] */ ULONG *pcbRead); |
| - STDMETHODIMP Seek( |
| - /* [in] */ LARGE_INTEGER dlibMove, |
| - /* [in] */ DWORD dwOrigin, |
| - /* [out] */ ULARGE_INTEGER *plibNewPosition); |
| + STDMETHODIMP Seek( |
| + /* [in] */ LARGE_INTEGER dlibMove, |
| + /* [in] */ DWORD dwOrigin, |
| + /* [out] */ ULARGE_INTEGER *plibNewPosition); |
| - STDMETHODIMP LockRequest( |
| - /* [in] */ DWORD dwOptions); |
| + STDMETHODIMP LockRequest( |
| + /* [in] */ DWORD dwOptions); |
| - STDMETHODIMP UnlockRequest(); |
| + STDMETHODIMP UnlockRequest(); |
| - // IInternetProtocolInfo |
| - STDMETHODIMP ParseUrl( |
| - /* [in] */ LPCWSTR pwzUrl, |
| - /* [in] */ PARSEACTION ParseAction, |
| - /* [in] */ DWORD dwParseFlags, |
| - /* [out] */ LPWSTR pwzResult, |
| - /* [in] */ DWORD cchResult, |
| - /* [out] */ DWORD *pcchResult, |
| - /* [in] */ DWORD dwReserved); |
| + // IInternetProtocolEx |
| + STDMETHODIMP StartEx( |
| + IUri *pUri, |
| + IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, |
| + DWORD grfPI, |
| + HANDLE_PTR dwReserved); |
| - STDMETHODIMP CombineUrl( |
| - /* [in] */ LPCWSTR pwzBaseUrl, |
| - /* [in] */ LPCWSTR pwzRelativeUrl, |
| - /* [in] */ DWORD dwCombineFlags, |
| - /* [out] */ LPWSTR pwzResult, |
| - /* [in] */ DWORD cchResult, |
| - /* [out] */ DWORD *pcchResult, |
| - /* [in] */ DWORD dwReserved); |
| + // IInternetProtocolInfo |
| + STDMETHODIMP ParseUrl( |
| + /* [in] */ LPCWSTR pwzUrl, |
| + /* [in] */ PARSEACTION ParseAction, |
| + /* [in] */ DWORD dwParseFlags, |
| + /* [out] */ LPWSTR pwzResult, |
| + /* [in] */ DWORD cchResult, |
| + /* [out] */ DWORD *pcchResult, |
| + /* [in] */ DWORD dwReserved); |
| - STDMETHODIMP CompareUrl( |
| - /* [in] */ LPCWSTR pwzUrl1, |
| - /* [in] */ LPCWSTR pwzUrl2, |
| - /* [in] */ DWORD dwCompareFlags); |
| + STDMETHODIMP CombineUrl( |
| + /* [in] */ LPCWSTR pwzBaseUrl, |
| + /* [in] */ LPCWSTR pwzRelativeUrl, |
| + /* [in] */ DWORD dwCombineFlags, |
| + /* [out] */ LPWSTR pwzResult, |
| + /* [in] */ DWORD cchResult, |
| + /* [out] */ DWORD *pcchResult, |
| + /* [in] */ DWORD dwReserved); |
| - STDMETHODIMP QueryInfo( |
| - /* [in] */ LPCWSTR pwzUrl, |
| - /* [in] */ QUERYOPTION QueryOption, |
| - /* [in] */ DWORD dwQueryFlags, |
| - /* [in, out] */ LPVOID pBuffer, |
| - /* [in] */ DWORD cbBuffer, |
| - /* [in, out] */ DWORD *pcbBuf, |
| - /* [in] */ DWORD dwReserved); |
| + STDMETHODIMP CompareUrl( |
| + /* [in] */ LPCWSTR pwzUrl1, |
| + /* [in] */ LPCWSTR pwzUrl2, |
| + /* [in] */ DWORD dwCompareFlags); |
| - // IInternetPriority |
| - STDMETHODIMP SetPriority( |
| - /* [in] */ LONG nPriority); |
| + STDMETHODIMP QueryInfo( |
| + /* [in] */ LPCWSTR pwzUrl, |
| + /* [in] */ QUERYOPTION QueryOption, |
| + /* [in] */ DWORD dwQueryFlags, |
| + /* [in, out] */ LPVOID pBuffer, |
| + /* [in] */ DWORD cbBuffer, |
| + /* [in, out] */ DWORD *pcbBuf, |
| + /* [in] */ DWORD dwReserved); |
| - STDMETHODIMP GetPriority( |
| - /* [out] */ LONG *pnPriority); |
| + // IInternetPriority |
| + STDMETHODIMP SetPriority( |
| + /* [in] */ LONG nPriority); |
| - // IInternetThreadSwitch |
| - STDMETHODIMP Prepare(); |
| + STDMETHODIMP GetPriority( |
| + /* [out] */ LONG *pnPriority); |
| - STDMETHODIMP Continue(); |
| + // IInternetThreadSwitch |
| + STDMETHODIMP Prepare(); |
| - // IWinInetInfo |
| - STDMETHODIMP QueryOption( |
| - /* [in] */ DWORD dwOption, |
| - /* [in, out] */ LPVOID pBuffer, |
| - /* [in, out] */ DWORD *pcbBuf); |
| + STDMETHODIMP Continue(); |
| - // IWinInetHttpInfo |
| - STDMETHODIMP QueryInfo( |
| - /* [in] */ DWORD dwOption, |
| - /* [in, out] */ LPVOID pBuffer, |
| - /* [in, out] */ DWORD *pcbBuf, |
| - /* [in, out] */ DWORD *pdwFlags, |
| - /* [in, out] */ DWORD *pdwReserved); |
| + // IWinInetInfo |
| + STDMETHODIMP QueryOption( |
| + /* [in] */ DWORD dwOption, |
| + /* [in, out] */ LPVOID pBuffer, |
| + /* [in, out] */ DWORD *pcbBuf); |
| - public: |
| - CComPtr<IUnknown> m_spInternetProtocolUnk; |
| - CComPtr<IInternetProtocol> m_spInternetProtocol; |
| - CComPtr<IInternetProtocolInfo> m_spInternetProtocolInfo; |
| - CComPtr<IInternetPriority> m_spInternetPriority; |
| - CComPtr<IInternetThreadSwitch> m_spInternetThreadSwitch; |
| - CComPtr<IWinInetInfo> m_spWinInetInfo; |
| - CComPtr<IWinInetHttpInfo> m_spWinInetHttpInfo; |
| - }; |
| + // IWinInetHttpInfo |
| + STDMETHODIMP QueryInfo( |
| + /* [in] */ DWORD dwOption, |
| + /* [in, out] */ LPVOID pBuffer, |
| + /* [in, out] */ DWORD *pcbBuf, |
| + /* [in, out] */ DWORD *pdwFlags, |
| + /* [in, out] */ DWORD *pdwReserved); |
| - class ATL_NO_VTABLE IInternetProtocolSinkImpl : |
| - public IInternetProtocolSink, |
| - public IServiceProvider |
| - { |
| - public: |
| - HRESULT OnStart(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, |
| - IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved, |
| - IInternetProtocol* pTargetProtocol); |
| - void ReleaseAll(); |
| + // IWinInetCacheHints |
| + STDMETHODIMP SetCacheExtension( |
| + /* [in] */ LPCWSTR pwzExt, |
| + /* [in, out] */ LPVOID pszCacheFile, |
| + /* [in, out] */ DWORD *pcbCacheFile, |
| + /* [in, out] */ DWORD *pdwWinInetError, |
| + /* [in, out] */ DWORD *pdwReserved); |
| - DECLARE_GET_TARGET_UNKNOWN(m_spInternetProtocolSink) |
| + // IWinInetCacheHints2 |
| + STDMETHODIMP SetCacheExtension2( |
| + /* [in] */ LPCWSTR pwzExt, |
| + /* [out] */ WCHAR *pwzCacheFile, |
| + /* [in, out] */ DWORD *pcchCacheFile, |
| + /* [out] */ DWORD *pdwWinInetError, |
| + /* [out] */ DWORD *pdwReserved); |
| - IServiceProvider* GetClientServiceProvider(); |
| +public: |
| + CComPtr<IUnknown> m_spInternetProtocolUnk; |
| + CComPtr<IInternetProtocol> m_spInternetProtocol; |
| + CComPtr<IInternetProtocolEx> m_spInternetProtocolEx; |
| + CComPtr<IInternetProtocolInfo> m_spInternetProtocolInfo; |
| + CComPtr<IInternetPriority> m_spInternetPriority; |
| + CComPtr<IInternetThreadSwitch> m_spInternetThreadSwitch; |
| + CComPtr<IWinInetInfo> m_spWinInetInfo; |
| + CComPtr<IWinInetHttpInfo> m_spWinInetHttpInfo; |
| + CComPtr<IWinInetCacheHints> m_spWinInetCacheHints; |
| + CComPtr<IWinInetCacheHints2> m_spWinInetCacheHints2; |
| +}; |
| - HRESULT QueryServiceFromClient(REFGUID guidService, REFIID riid, |
| - void** ppvObject); |
| - template <class Q> |
| - HRESULT QueryServiceFromClient(REFGUID guidService, Q** pp) |
| - { |
| - return QueryServiceFromClient(guidService, _ATL_IIDOF(Q), |
| - reinterpret_cast<void**>(pp)); |
| - } |
| - template <class Q> |
| - HRESULT QueryServiceFromClient(Q** pp) |
| - { |
| - return QueryServiceFromClient(_ATL_IIDOF(Q), _ATL_IIDOF(Q), |
| - reinterpret_cast<void**>(pp)); |
| - } |
| - public: |
| - // IInternetProtocolSink |
| - STDMETHODIMP Switch( |
| - /* [in] */ PROTOCOLDATA *pProtocolData); |
| +class ATL_NO_VTABLE IInternetProtocolSinkImpl : |
| + public IInternetProtocolSink, |
| + public IServiceProvider, |
| + public IInternetBindInfoEx, |
| + public IUriContainer |
| +{ |
| +public: |
| + HRESULT OnStart(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved, |
| + IInternetProtocol* pTargetProtocol); |
| + HRESULT OnStartEx(IUri* pUri, IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved, |
| + IInternetProtocol* pTargetProtocol); |
| + void ReleaseAll(); |
| - STDMETHODIMP ReportProgress( |
| - /* [in] */ ULONG ulStatusCode, |
| - /* [in] */ LPCWSTR szStatusText); |
| + DECLARE_GET_TARGET_UNKNOWN(m_spInternetProtocolSink) |
| - STDMETHODIMP ReportData( |
| - /* [in] */ DWORD grfBSCF, |
| - /* [in] */ ULONG ulProgress, |
| - /* [in] */ ULONG ulProgressMax); |
| + IServiceProvider* GetClientServiceProvider(); |
| - STDMETHODIMP ReportResult( |
| - /* [in] */ HRESULT hrResult, |
| - /* [in] */ DWORD dwError, |
| - /* [in] */ LPCWSTR szResult); |
| + HRESULT QueryServiceFromClient(REFGUID guidService, REFIID riid, |
| + void** ppvObject); |
| + template <class Q> |
| + HRESULT QueryServiceFromClient(REFGUID guidService, Q** pp) |
| + { |
| + return QueryServiceFromClient(guidService, _ATL_IIDOF(Q), |
| + reinterpret_cast<void**>(pp)); |
| + } |
| + template <class Q> |
| + HRESULT QueryServiceFromClient(Q** pp) |
| + { |
| + return QueryServiceFromClient(_ATL_IIDOF(Q), _ATL_IIDOF(Q), |
| + reinterpret_cast<void**>(pp)); |
| + } |
| +public: |
| + // IInternetProtocolSink |
| + STDMETHODIMP Switch( |
| + /* [in] */ PROTOCOLDATA *pProtocolData); |
| - // IServiceProvider |
| - STDMETHODIMP QueryService( |
| - /* [in] */ REFGUID guidService, |
| - /* [in] */ REFIID riid, |
| - /* [out] */ void** ppvObject); |
| + STDMETHODIMP ReportProgress( |
| + /* [in] */ ULONG ulStatusCode, |
| + /* [in] */ LPCWSTR szStatusText); |
| - public: |
| - CComPtr<IInternetProtocolSink> m_spInternetProtocolSink; |
| - CComPtr<IServiceProvider> m_spServiceProvider; |
| - CComPtr<IInternetProtocol> m_spTargetProtocol; |
| - }; |
| + STDMETHODIMP ReportData( |
| + /* [in] */ DWORD grfBSCF, |
| + /* [in] */ ULONG ulProgress, |
| + /* [in] */ ULONG ulProgressMax); |
| - template <class ThreadModel> |
| - class CInternetProtocolSinkTM : |
| - public CComObjectRootEx<ThreadModel>, |
| - public IInternetProtocolSinkImpl |
| - { |
| - private: |
| + STDMETHODIMP ReportResult( |
| + /* [in] */ HRESULT hrResult, |
| + /* [in] */ DWORD dwError, |
| + /* [in] */ LPCWSTR szResult); |
| + |
| + // IServiceProvider |
| + STDMETHODIMP QueryService( |
| + /* [in] */ REFGUID guidService, |
| + /* [in] */ REFIID riid, |
| + /* [out] */ void** ppvObject); |
| + |
| + // IInternetBindInfo |
| + STDMETHODIMP GetBindInfo( |
| + /* [out] */ DWORD *grfBINDF, |
| + /* [in, out] */ BINDINFO *pbindinfo); |
| + |
| + STDMETHODIMP GetBindString( |
| + /* [in] */ ULONG ulStringType, |
| + /* [in, out] */ LPOLESTR *ppwzStr, |
| + /* [in] */ ULONG cEl, |
| + /* [in, out] */ ULONG *pcElFetched); |
| + |
| + // IInternetBindInfoEx |
| + STDMETHODIMP GetBindInfoEx( |
| + DWORD *grfBINDF, |
| + BINDINFO *pbindinfo, |
| + DWORD *grfBINDF2, |
| + DWORD *pdwReserved); |
| + |
| + // IUriContainer |
| + STDMETHODIMP GetIUri( |
| + /* [out] */ IUri **ppIUri); |
| + |
| +protected: |
| + HRESULT InitMembers(IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, |
| + IInternetProtocol* pTargetProtocol); |
| + |
| +public: |
| + CComPtr<IInternetProtocolSink> m_spInternetProtocolSink; |
| + CComPtr<IServiceProvider> m_spServiceProvider; |
| + CComPtr<IInternetBindInfo> m_spInternetBindInfo; |
| + CComPtr<IInternetBindInfoEx> m_spInternetBindInfoEx; |
| + CComPtr<IUriContainer> m_spUriContainer; |
| + |
| + CComPtr<IInternetProtocol> m_spTargetProtocol; |
| +}; |
| + |
| +template <class ThreadModel = CComMultiThreadModel> |
| +class CInternetProtocolSinkTM : |
| + public CComObjectRootEx<ThreadModel>, |
| + public IInternetProtocolSinkImpl |
| +{ |
| +private: |
| static HRESULT WINAPI OnDelegateIID(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw) |
| { |
| IInternetProtocolSink* pSink = ((CInternetProtocolSinkTM<ThreadModel> *) pv)->m_spInternetProtocolSink; |
| @@ -303,82 +355,97 @@ |
| return pSink ? pSink->QueryInterface(riid, ppv) : E_UNEXPECTED; |
| } |
| - public: |
| - BEGIN_COM_MAP(CInternetProtocolSinkTM) |
| - COM_INTERFACE_ENTRY(IInternetProtocolSink) |
| - COM_INTERFACE_ENTRY_PASSTHROUGH(IServiceProvider, |
| - m_spServiceProvider.p) |
| - COM_INTERFACE_ENTRY_FUNC_BLIND(0, OnDelegateIID) |
| - COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() |
| - END_COM_MAP() |
| +public: |
| + BEGIN_COM_MAP(CInternetProtocolSinkTM) |
| + COM_INTERFACE_ENTRY(IInternetProtocolSink) |
| + COM_INTERFACE_ENTRY_PASSTHROUGH(IServiceProvider, |
| + m_spServiceProvider.p) |
| + COM_INTERFACE_ENTRY(IInternetBindInfo) |
| + COM_INTERFACE_ENTRY(IInternetBindInfoEx) |
| + COM_INTERFACE_ENTRY_PASSTHROUGH(IUriContainer, m_spUriContainer.p) |
| + COM_INTERFACE_ENTRY_FUNC_BLIND(0, OnDelegateIID) |
| + COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() |
| + END_COM_MAP() |
| +}; |
| - }; |
| +typedef CInternetProtocolSinkTM<> CInternetProtocolSink; |
| - typedef CInternetProtocolSinkTM<CComMultiThreadModel> CInternetProtocolSink; |
| +template <class T, class ThreadModel = CComMultiThreadModel> |
| +class CInternetProtocolSinkWithSP : |
| + public CInternetProtocolSinkTM<ThreadModel> |
| +{ |
| + typedef CInternetProtocolSinkTM<ThreadModel> BaseClass; |
| +public: |
| + HRESULT OnStart(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved, |
| + IInternetProtocol* pTargetProtocol); |
| + HRESULT OnStartEx(IUri* pUri, IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved, |
| + IInternetProtocol* pTargetProtocol); |
| - template <class T, class ThreadModel = CComMultiThreadModel> |
| - class CInternetProtocolSinkWithSP : |
| - public CInternetProtocolSinkTM<ThreadModel> |
| - { |
| - typedef CInternetProtocolSinkTM<ThreadModel> BaseClass; |
| - public: |
| - HRESULT OnStart(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, |
| - IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved, |
| - IInternetProtocol* pTargetProtocol); |
| + STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void** ppv); |
| - STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void** ppv); |
| + HRESULT _InternalQueryService(REFGUID guidService, REFIID riid, |
| + void** ppvObject); |
| - HRESULT _InternalQueryService(REFGUID guidService, REFIID riid, |
| - void** ppvObject); |
| - |
| - BEGIN_COM_MAP(CInternetProtocolSinkWithSP) |
| - COM_INTERFACE_ENTRY(IServiceProvider) |
| - COM_INTERFACE_ENTRY_CHAIN(BaseClass) |
| - END_COM_MAP() |
| - }; |
| + BEGIN_COM_MAP(CInternetProtocolSinkWithSP) |
| + COM_INTERFACE_ENTRY(IServiceProvider) |
| + COM_INTERFACE_ENTRY_CHAIN(BaseClass) |
| + END_COM_MAP() |
| +}; |
| #define SERVICE_ENTRY_PASSTHROUGH(x) \ |
| - if (InlineIsEqualGUID(guidService, x)) \ |
| - { \ |
| - return ::PassthroughAPP::Detail::QueryServicePassthrough(guidService, \ |
| - GetUnknown(), riid, ppvObject, GetClientServiceProvider()); \ |
| - } |
| + if (InlineIsEqualGUID(guidService, x)) \ |
| + { \ |
| + return ::PassthroughAPP::Detail::QueryServicePassthrough(guidService, \ |
| + GetUnknown(), riid, ppvObject, GetClientServiceProvider()); \ |
| + } |
| - struct __declspec(uuid("C7A98E66-1010-492c-A1C8-C809E1F75905")) IInternetProtocolEx; |
| +template <class StartPolicy, class ThreadModel = CComMultiThreadModel> |
| +class ATL_NO_VTABLE CInternetProtocol : |
| + public CComObjectRootEx<ThreadModel>, |
| + public IInternetProtocolImpl, |
| + public StartPolicy |
| +{ |
| +private: |
| + static HRESULT WINAPI OnDelegateIID(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw) |
| + { |
| + IInternetProtocol* pProtocol = ((CInternetProtocol<StartPolicy, ThreadModel> *) pv)->m_spInternetProtocol; |
| + ATLASSERT(pProtocol != 0); |
| + return pProtocol ? pProtocol->QueryInterface(riid, ppv) : E_UNEXPECTED; |
| + } |
| - template <class StartPolicy, class ThreadModel = CComMultiThreadModel> |
| - class ATL_NO_VTABLE CInternetProtocol : |
| - public CComObjectRootEx<ThreadModel>, |
| - public IInternetProtocolImpl, |
| - public StartPolicy |
| - { |
| - private: |
| - static HRESULT WINAPI OnDelegateIID(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw) |
| - { |
| - IInternetProtocol* pProtocol = ((CInternetProtocol<StartPolicy, ThreadModel> *) pv)->m_spInternetProtocol; |
| - ATLASSERT(pProtocol != 0); |
| - // TODO: don't need this once we support IInternetProtocolEx |
| - if (InlineIsEqualGUID(riid, __uuidof(IInternetProtocolEx))) return E_NOINTERFACE; |
| - return pProtocol ? pProtocol->QueryInterface(riid, ppv) : E_UNEXPECTED; |
| - } |
| - public: |
| - BEGIN_COM_MAP(CInternetProtocol) |
| - COM_INTERFACE_ENTRY(IPassthroughObject) |
| - COM_INTERFACE_ENTRY(IInternetProtocolRoot) |
| - COM_INTERFACE_ENTRY(IInternetProtocol) |
| - COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetProtocolInfo, |
| - m_spInternetProtocolInfo.p) |
| - COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetPriority, |
| - m_spInternetPriority.p) |
| - COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetThreadSwitch, |
| - m_spInternetThreadSwitch.p) |
| - COM_INTERFACE_ENTRY_PASSTHROUGH(IWinInetInfo, m_spWinInetInfo.p) |
| - COM_INTERFACE_ENTRY_PASSTHROUGH2(IWinInetHttpInfo, |
| - m_spWinInetHttpInfo.p, IWinInetInfo) |
| - COM_INTERFACE_ENTRY_FUNC_BLIND(0, OnDelegateIID) |
| - COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() |
| - END_COM_MAP() |
| - }; |
| +public: |
| + BEGIN_COM_MAP(CInternetProtocol) |
| + COM_INTERFACE_ENTRY(IPassthroughObject) |
| + COM_INTERFACE_ENTRY(IInternetProtocolRoot) |
| + COM_INTERFACE_ENTRY(IInternetProtocol) |
| + COM_INTERFACE_ENTRY(IInternetProtocolEx) |
| + COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetProtocolInfo, |
| + m_spInternetProtocolInfo.p) |
| + COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetPriority, |
| + m_spInternetPriority.p) |
| + COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetThreadSwitch, |
| + m_spInternetThreadSwitch.p) |
| + COM_INTERFACE_ENTRY_PASSTHROUGH(IWinInetInfo, m_spWinInetInfo.p) |
| + COM_INTERFACE_ENTRY_PASSTHROUGH2(IWinInetHttpInfo, |
| + m_spWinInetHttpInfo.p, IWinInetInfo) |
| + COM_INTERFACE_ENTRY_PASSTHROUGH(IWinInetCacheHints, |
| + m_spWinInetCacheHints.p) |
| + COM_INTERFACE_ENTRY_PASSTHROUGH2(IWinInetCacheHints2, |
| + m_spWinInetCacheHints2.p, IWinInetCacheHints) |
| + COM_INTERFACE_ENTRY_FUNC_BLIND(0, OnDelegateIID) |
| + COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() |
| + END_COM_MAP() |
| + |
| + // IInternetProtocolRoot |
| + STDMETHODIMP Start(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved); |
| + |
| + // IInternetProtocolEx |
| + STDMETHODIMP StartEx(IUri *pUri, IInternetProtocolSink *pOIProtSink, |
| + IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved); |
| +}; |
| } // end namespace PassthroughAPP |