OLD | NEW |
1 // Copyright 2007 Igor Tandetnik | |
2 // | |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
4 // you may not use this file except in compliance with the License. | |
5 // You may obtain a copy of the License at | |
6 // | |
7 // http://www.apache.org/licenses/LICENSE-2.0 | |
8 // | |
9 // Unless required by applicable law or agreed to in writing, software | |
10 // distributed under the License is distributed on an "AS IS" BASIS, | |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
12 // See the License for the specific language governing permissions and | |
13 // limitations under the License. | |
14 | |
15 #ifndef PASSTHROUGHAPP_PROTOCOLIMPL_H | 1 #ifndef PASSTHROUGHAPP_PROTOCOLIMPL_H |
16 #define PASSTHROUGHAPP_PROTOCOLIMPL_H | 2 #define PASSTHROUGHAPP_PROTOCOLIMPL_H |
17 | 3 |
18 #if _MSC_VER > 1000 | 4 #if _MSC_VER > 1000 |
19 #pragma once | 5 » #pragma once |
20 #endif // _MSC_VER > 1000 | 6 #endif // _MSC_VER > 1000 |
21 | 7 |
22 #include <urlmon.h> | 8 #include <urlmon.h> |
23 #pragma comment(lib, "urlmon.lib") | 9 #pragma comment(lib, "urlmon.lib") |
24 | 10 |
| 11 #include "PassthroughObject.h" |
| 12 |
25 namespace PassthroughAPP | 13 namespace PassthroughAPP |
26 { | 14 { |
27 | 15 |
28 namespace Detail | 16 namespace Detail |
29 { | 17 { |
30 struct PassthroughItfData | 18 |
31 { | 19 struct PassthroughItfData |
32 DWORD_PTR offsetItf; | 20 { |
33 DWORD_PTR offsetUnk; | 21 » DWORD_PTR offsetItf; |
34 const IID* piidBase; | 22 » DWORD_PTR offsetUnk; |
35 }; | 23 » const IID* piidBase; |
36 | 24 }; |
37 template <class itf, class impl, DWORD_PTR offsetUnk, const IID* piidBase> | 25 |
38 struct PassthroughItfHelper | 26 template <class itf, class impl, DWORD_PTR offsetUnk, const IID* piidBase> |
39 { | 27 struct PassthroughItfHelper |
40 static PassthroughItfData data; | 28 { |
41 }; | 29 » static PassthroughItfData data; |
42 | 30 }; |
43 template <class itf, class impl, DWORD_PTR offsetUnk, const IID* piidBase> | 31 |
44 PassthroughItfData | 32 template <class itf, class impl, DWORD_PTR offsetUnk, const IID* piidBase> |
45 PassthroughItfHelper<itf, impl, offsetUnk, piidBase>:: | 33 PassthroughItfData |
46 data = {offsetofclass(itf, impl), offsetUnk, piidBase}; | 34 » PassthroughItfHelper<itf, impl, offsetUnk, piidBase>:: |
| 35 » » » data = {offsetofclass(itf, impl), offsetUnk, piidBase}; |
47 | 36 |
48 #define COM_INTERFACE_ENTRY_PASSTHROUGH(itf, punk)\ | 37 #define COM_INTERFACE_ENTRY_PASSTHROUGH(itf, punk)\ |
49 {&_ATL_IIDOF(itf),\ | 38 » {&_ATL_IIDOF(itf),\ |
50 (DWORD_PTR)&::PassthroughAPP::Detail::PassthroughItfHelper<\ | 39 » (DWORD_PTR)&::PassthroughAPP::Detail::PassthroughItfHelper<\ |
51 itf, _ComMapClass,\ | 40 » » itf, _ComMapClass,\ |
52 (DWORD_PTR)offsetof(_ComMapClass, punk),\ | 41 » » (DWORD_PTR)offsetof(_ComMapClass, punk),\ |
53 0\ | 42 » » 0\ |
54 >::data,\ | 43 » >::data,\ |
55 ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ | 44 » ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ |
56 QueryInterfacePassthroughT\ | 45 » » QueryInterfacePassthroughT\ |
57 }, | 46 » }, |
58 | 47 |
59 #define COM_INTERFACE_ENTRY_PASSTHROUGH2(itf, punk, itfBase)\ | 48 #define COM_INTERFACE_ENTRY_PASSTHROUGH2(itf, punk, itfBase)\ |
60 {&_ATL_IIDOF(itf),\ | 49 » {&_ATL_IIDOF(itf),\ |
61 (DWORD_PTR)&::PassthroughAPP::Detail::PassthroughItfHelper<\ | 50 » (DWORD_PTR)&::PassthroughAPP::Detail::PassthroughItfHelper<\ |
62 itf, _ComMapClass,\ | 51 » » itf, _ComMapClass,\ |
63 (DWORD_PTR)offsetof(_ComMapClass, punk),\ | 52 » » (DWORD_PTR)offsetof(_ComMapClass, punk),\ |
64 &_ATL_IIDOF(itfBase)\ | 53 » » &_ATL_IIDOF(itfBase)\ |
65 >::data,\ | 54 » >::data,\ |
66 ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ | 55 » ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ |
67 QueryInterfacePassthroughT\ | 56 » » QueryInterfacePassthroughT\ |
68 }, | 57 » }, |
69 | 58 |
70 | 59 |
71 #ifdef DEBUG | 60 #ifdef DEBUG |
72 | 61 |
73 #define COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG()\ | 62 » #define COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG()\ |
74 {0, 0,\ | 63 » » {0, 0,\ |
75 ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ | 64 » » ::PassthroughAPP::Detail::QIPassthrough<_ComMapClass>::\ |
76 QueryInterfaceDebugT\ | 65 » » » QueryInterfaceDebugT\ |
77 }, | 66 » » }, |
78 | 67 |
79 #else | 68 #else |
80 #define COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() | 69 » #define COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() |
81 #endif | 70 #endif |
82 | 71 |
83 #define DECLARE_GET_TARGET_UNKNOWN(x) \ | 72 #define DECLARE_GET_TARGET_UNKNOWN(x) \ |
84 inline IUnknown* GetTargetUnknown() {return x;} | 73 inline IUnknown* GetTargetUnknown() {return x;} |
85 | 74 |
86 // Workaround for VC6's deficiencies in dealing with function templates. | 75 // Workaround for VC6's deficiencies in dealing with function templates. |
87 // We'd use non-member template functions, but VC6 does not handle those wel
l. | 76 // We'd use non-member template functions, but VC6 does not handle those well. |
88 // Static members of class templates work much better, and we don't need | 77 // Static members of class templates work much better, and we don't need |
89 // parameter deduction here | 78 // parameter deduction here |
90 template <class T> | 79 template <class T> |
91 struct QIPassthrough | 80 struct QIPassthrough |
92 { | 81 { |
93 static HRESULT WINAPI QueryInterfacePassthroughT(void* pv, REFIID riid, | 82 static HRESULT WINAPI QueryInterfacePassthroughT(void* pv, REFIID riid, |
94 LPVOID* ppv, DWORD_PTR dw); | 83 LPVOID* ppv, DWORD_PTR dw); |
95 static HRESULT WINAPI QueryInterfaceDebugT(void* pv, REFIID riid, | 84 static HRESULT WINAPI QueryInterfaceDebugT(void* pv, REFIID riid, |
96 LPVOID* ppv, DWORD_PTR dw); | 85 LPVOID* ppv, DWORD_PTR dw); |
97 }; | 86 }; |
98 | 87 |
99 HRESULT WINAPI QueryInterfacePassthrough(void* pv, REFIID riid, | 88 HRESULT WINAPI QueryInterfacePassthrough(void* pv, REFIID riid, |
100 LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget, IUnknown* punkWrapper); | 89 LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget, IUnknown* punkWrapper); |
101 | 90 |
102 HRESULT WINAPI QueryInterfaceDebug(void* pv, REFIID riid, | 91 HRESULT WINAPI QueryInterfaceDebug(void* pv, REFIID riid, |
103 LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget); | 92 LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget); |
104 | 93 |
105 HRESULT QueryServicePassthrough(REFGUID guidService, | 94 HRESULT QueryServicePassthrough(REFGUID guidService, |
106 IUnknown* punkThis, REFIID riid, void** ppv, | 95 IUnknown* punkThis, REFIID riid, void** ppv, |
107 IServiceProvider* pClientProvider); | 96 IServiceProvider* pClientProvider); |
108 | 97 |
109 } // end namespace PassthroughAPP::Detail | 98 } // end namespace PassthroughAPP::Detail |
110 | 99 |
111 class ATL_NO_VTABLE IInternetProtocolImpl : | 100 class ATL_NO_VTABLE IInternetProtocolImpl : |
112 public IPassthroughObject, | 101 public IPassthroughObject, |
113 public IInternetProtocol, | 102 public IInternetProtocolEx, |
114 public IInternetProtocolInfo, | 103 public IInternetProtocolInfo, |
115 public IInternetPriority, | 104 public IInternetPriority, |
116 public IInternetThreadSwitch, | 105 public IInternetThreadSwitch, |
117 public IWinInetHttpInfo | 106 public IWinInetHttpInfo, |
118 { | 107 public IWinInetCacheHints2 |
119 public: | 108 { |
120 void ReleaseAll(); | 109 public: |
121 | 110 void ReleaseAll(); |
122 DECLARE_GET_TARGET_UNKNOWN(m_spInternetProtocolUnk) | 111 |
123 public: | 112 DECLARE_GET_TARGET_UNKNOWN(m_spInternetProtocolUnk) |
124 // IPassthroughObject | 113 public: |
125 STDMETHODIMP SetTargetUnknown(IUnknown* punkTarget); | 114 // IPassthroughObject |
126 | 115 STDMETHODIMP SetTargetUnknown(IUnknown* punkTarget); |
127 // IInternetProtocolRoot | 116 |
128 STDMETHODIMP Start( | 117 // IInternetProtocolRoot |
129 /* [in] */ LPCWSTR szUrl, | 118 STDMETHODIMP Start( |
130 /* [in] */ IInternetProtocolSink *pOIProtSink, | 119 /* [in] */ LPCWSTR szUrl, |
131 /* [in] */ IInternetBindInfo *pOIBindInfo, | 120 /* [in] */ IInternetProtocolSink *pOIProtSink, |
132 /* [in] */ DWORD grfPI, | 121 /* [in] */ IInternetBindInfo *pOIBindInfo, |
133 /* [in] */ HANDLE_PTR dwReserved); | 122 /* [in] */ DWORD grfPI, |
134 | 123 /* [in] */ HANDLE_PTR dwReserved); |
135 STDMETHODIMP Continue( | 124 |
136 /* [in] */ PROTOCOLDATA *pProtocolData); | 125 STDMETHODIMP Continue( |
137 | 126 /* [in] */ PROTOCOLDATA *pProtocolData); |
138 STDMETHODIMP Abort( | 127 |
139 /* [in] */ HRESULT hrReason, | 128 STDMETHODIMP Abort( |
140 /* [in] */ DWORD dwOptions); | 129 /* [in] */ HRESULT hrReason, |
141 | 130 /* [in] */ DWORD dwOptions); |
142 STDMETHODIMP Terminate( | 131 |
143 /* [in] */ DWORD dwOptions); | 132 STDMETHODIMP Terminate( |
144 | 133 /* [in] */ DWORD dwOptions); |
145 STDMETHODIMP Suspend(); | 134 |
146 | 135 STDMETHODIMP Suspend(); |
147 STDMETHODIMP Resume(); | 136 |
148 | 137 STDMETHODIMP Resume(); |
149 // IInternetProtocol | 138 |
150 STDMETHODIMP Read( | 139 // IInternetProtocol |
151 /* [in, out] */ void *pv, | 140 STDMETHODIMP Read( |
152 /* [in] */ ULONG cb, | 141 /* [in, out] */ void *pv, |
153 /* [out] */ ULONG *pcbRead); | 142 /* [in] */ ULONG cb, |
154 | 143 /* [out] */ ULONG *pcbRead); |
155 STDMETHODIMP Seek( | 144 |
156 /* [in] */ LARGE_INTEGER dlibMove, | 145 STDMETHODIMP Seek( |
157 /* [in] */ DWORD dwOrigin, | 146 /* [in] */ LARGE_INTEGER dlibMove, |
158 /* [out] */ ULARGE_INTEGER *plibNewPosition); | 147 /* [in] */ DWORD dwOrigin, |
159 | 148 /* [out] */ ULARGE_INTEGER *plibNewPosition); |
160 STDMETHODIMP LockRequest( | 149 |
161 /* [in] */ DWORD dwOptions); | 150 STDMETHODIMP LockRequest( |
162 | 151 /* [in] */ DWORD dwOptions); |
163 STDMETHODIMP UnlockRequest(); | 152 |
164 | 153 STDMETHODIMP UnlockRequest(); |
165 // IInternetProtocolInfo | 154 |
166 STDMETHODIMP ParseUrl( | 155 // IInternetProtocolEx |
167 /* [in] */ LPCWSTR pwzUrl, | 156 STDMETHODIMP StartEx( |
168 /* [in] */ PARSEACTION ParseAction, | 157 IUri *pUri, |
169 /* [in] */ DWORD dwParseFlags, | 158 IInternetProtocolSink *pOIProtSink, |
170 /* [out] */ LPWSTR pwzResult, | 159 IInternetBindInfo *pOIBindInfo, |
171 /* [in] */ DWORD cchResult, | 160 DWORD grfPI, |
172 /* [out] */ DWORD *pcchResult, | 161 HANDLE_PTR dwReserved); |
173 /* [in] */ DWORD dwReserved); | 162 |
174 | 163 // IInternetProtocolInfo |
175 STDMETHODIMP CombineUrl( | 164 STDMETHODIMP ParseUrl( |
176 /* [in] */ LPCWSTR pwzBaseUrl, | 165 /* [in] */ LPCWSTR pwzUrl, |
177 /* [in] */ LPCWSTR pwzRelativeUrl, | 166 /* [in] */ PARSEACTION ParseAction, |
178 /* [in] */ DWORD dwCombineFlags, | 167 /* [in] */ DWORD dwParseFlags, |
179 /* [out] */ LPWSTR pwzResult, | 168 /* [out] */ LPWSTR pwzResult, |
180 /* [in] */ DWORD cchResult, | 169 /* [in] */ DWORD cchResult, |
181 /* [out] */ DWORD *pcchResult, | 170 /* [out] */ DWORD *pcchResult, |
182 /* [in] */ DWORD dwReserved); | 171 /* [in] */ DWORD dwReserved); |
183 | 172 |
184 STDMETHODIMP CompareUrl( | 173 STDMETHODIMP CombineUrl( |
185 /* [in] */ LPCWSTR pwzUrl1, | 174 /* [in] */ LPCWSTR pwzBaseUrl, |
186 /* [in] */ LPCWSTR pwzUrl2, | 175 /* [in] */ LPCWSTR pwzRelativeUrl, |
187 /* [in] */ DWORD dwCompareFlags); | 176 /* [in] */ DWORD dwCombineFlags, |
188 | 177 /* [out] */ LPWSTR pwzResult, |
189 STDMETHODIMP QueryInfo( | 178 /* [in] */ DWORD cchResult, |
190 /* [in] */ LPCWSTR pwzUrl, | 179 /* [out] */ DWORD *pcchResult, |
191 /* [in] */ QUERYOPTION QueryOption, | 180 /* [in] */ DWORD dwReserved); |
192 /* [in] */ DWORD dwQueryFlags, | 181 |
193 /* [in, out] */ LPVOID pBuffer, | 182 STDMETHODIMP CompareUrl( |
194 /* [in] */ DWORD cbBuffer, | 183 /* [in] */ LPCWSTR pwzUrl1, |
195 /* [in, out] */ DWORD *pcbBuf, | 184 /* [in] */ LPCWSTR pwzUrl2, |
196 /* [in] */ DWORD dwReserved); | 185 /* [in] */ DWORD dwCompareFlags); |
197 | 186 |
198 // IInternetPriority | 187 STDMETHODIMP QueryInfo( |
199 STDMETHODIMP SetPriority( | 188 /* [in] */ LPCWSTR pwzUrl, |
200 /* [in] */ LONG nPriority); | 189 /* [in] */ QUERYOPTION QueryOption, |
201 | 190 /* [in] */ DWORD dwQueryFlags, |
202 STDMETHODIMP GetPriority( | 191 /* [in, out] */ LPVOID pBuffer, |
203 /* [out] */ LONG *pnPriority); | 192 /* [in] */ DWORD cbBuffer, |
204 | 193 /* [in, out] */ DWORD *pcbBuf, |
205 // IInternetThreadSwitch | 194 /* [in] */ DWORD dwReserved); |
206 STDMETHODIMP Prepare(); | 195 |
207 | 196 // IInternetPriority |
208 STDMETHODIMP Continue(); | 197 STDMETHODIMP SetPriority( |
209 | 198 /* [in] */ LONG nPriority); |
210 // IWinInetInfo | 199 |
211 STDMETHODIMP QueryOption( | 200 STDMETHODIMP GetPriority( |
212 /* [in] */ DWORD dwOption, | 201 /* [out] */ LONG *pnPriority); |
213 /* [in, out] */ LPVOID pBuffer, | 202 |
214 /* [in, out] */ DWORD *pcbBuf); | 203 // IInternetThreadSwitch |
215 | 204 STDMETHODIMP Prepare(); |
216 // IWinInetHttpInfo | 205 |
217 STDMETHODIMP QueryInfo( | 206 STDMETHODIMP Continue(); |
218 /* [in] */ DWORD dwOption, | 207 |
219 /* [in, out] */ LPVOID pBuffer, | 208 // IWinInetInfo |
220 /* [in, out] */ DWORD *pcbBuf, | 209 STDMETHODIMP QueryOption( |
221 /* [in, out] */ DWORD *pdwFlags, | 210 /* [in] */ DWORD dwOption, |
222 /* [in, out] */ DWORD *pdwReserved); | 211 /* [in, out] */ LPVOID pBuffer, |
223 | 212 /* [in, out] */ DWORD *pcbBuf); |
224 public: | 213 |
225 CComPtr<IUnknown> m_spInternetProtocolUnk; | 214 // IWinInetHttpInfo |
226 CComPtr<IInternetProtocol> m_spInternetProtocol; | 215 STDMETHODIMP QueryInfo( |
227 CComPtr<IInternetProtocolInfo> m_spInternetProtocolInfo; | 216 /* [in] */ DWORD dwOption, |
228 CComPtr<IInternetPriority> m_spInternetPriority; | 217 /* [in, out] */ LPVOID pBuffer, |
229 CComPtr<IInternetThreadSwitch> m_spInternetThreadSwitch; | 218 /* [in, out] */ DWORD *pcbBuf, |
230 CComPtr<IWinInetInfo> m_spWinInetInfo; | 219 /* [in, out] */ DWORD *pdwFlags, |
231 CComPtr<IWinInetHttpInfo> m_spWinInetHttpInfo; | 220 /* [in, out] */ DWORD *pdwReserved); |
232 }; | 221 |
233 | 222 // IWinInetCacheHints |
234 class ATL_NO_VTABLE IInternetProtocolSinkImpl : | 223 STDMETHODIMP SetCacheExtension( |
235 public IInternetProtocolSink, | 224 /* [in] */ LPCWSTR pwzExt, |
236 public IServiceProvider | 225 /* [in, out] */ LPVOID pszCacheFile, |
237 { | 226 /* [in, out] */ DWORD *pcbCacheFile, |
238 public: | 227 /* [in, out] */ DWORD *pdwWinInetError, |
239 HRESULT OnStart(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, | 228 /* [in, out] */ DWORD *pdwReserved); |
240 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved, | 229 |
241 IInternetProtocol* pTargetProtocol); | 230 // IWinInetCacheHints2 |
242 void ReleaseAll(); | 231 STDMETHODIMP SetCacheExtension2( |
243 | 232 /* [in] */ LPCWSTR pwzExt, |
244 DECLARE_GET_TARGET_UNKNOWN(m_spInternetProtocolSink) | 233 /* [out] */ WCHAR *pwzCacheFile, |
245 | 234 /* [in, out] */ DWORD *pcchCacheFile, |
246 IServiceProvider* GetClientServiceProvider(); | 235 /* [out] */ DWORD *pdwWinInetError, |
247 | 236 /* [out] */ DWORD *pdwReserved); |
248 HRESULT QueryServiceFromClient(REFGUID guidService, REFIID riid, | 237 |
249 void** ppvObject); | 238 public: |
250 template <class Q> | 239 CComPtr<IUnknown> m_spInternetProtocolUnk; |
251 HRESULT QueryServiceFromClient(REFGUID guidService, Q** pp) | 240 CComPtr<IInternetProtocol> m_spInternetProtocol; |
252 { | 241 CComPtr<IInternetProtocolEx> m_spInternetProtocolEx; |
253 return QueryServiceFromClient(guidService, _ATL_IIDOF(Q), | 242 CComPtr<IInternetProtocolInfo> m_spInternetProtocolInfo; |
254 reinterpret_cast<void**>(pp)); | 243 CComPtr<IInternetPriority> m_spInternetPriority; |
255 } | 244 CComPtr<IInternetThreadSwitch> m_spInternetThreadSwitch; |
256 template <class Q> | 245 CComPtr<IWinInetInfo> m_spWinInetInfo; |
257 HRESULT QueryServiceFromClient(Q** pp) | 246 CComPtr<IWinInetHttpInfo> m_spWinInetHttpInfo; |
258 { | 247 CComPtr<IWinInetCacheHints> m_spWinInetCacheHints; |
259 return QueryServiceFromClient(_ATL_IIDOF(Q), _ATL_IIDOF(Q), | 248 CComPtr<IWinInetCacheHints2> m_spWinInetCacheHints2; |
260 reinterpret_cast<void**>(pp)); | 249 }; |
261 } | 250 |
262 public: | 251 class ATL_NO_VTABLE IInternetProtocolSinkImpl : |
263 // IInternetProtocolSink | 252 public IInternetProtocolSink, |
264 STDMETHODIMP Switch( | 253 public IServiceProvider, |
265 /* [in] */ PROTOCOLDATA *pProtocolData); | 254 public IInternetBindInfoEx, |
266 | 255 public IUriContainer |
267 STDMETHODIMP ReportProgress( | 256 { |
268 /* [in] */ ULONG ulStatusCode, | 257 public: |
269 /* [in] */ LPCWSTR szStatusText); | 258 HRESULT OnStart(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, |
270 | 259 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserv
ed, |
271 STDMETHODIMP ReportData( | 260 IInternetProtocol* pTargetProtocol); |
272 /* [in] */ DWORD grfBSCF, | 261 HRESULT OnStartEx(IUri* pUri, IInternetProtocolSink *pOIProtSink, |
273 /* [in] */ ULONG ulProgress, | 262 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserv
ed, |
274 /* [in] */ ULONG ulProgressMax); | 263 IInternetProtocol* pTargetProtocol); |
275 | 264 void ReleaseAll(); |
276 STDMETHODIMP ReportResult( | 265 |
277 /* [in] */ HRESULT hrResult, | 266 DECLARE_GET_TARGET_UNKNOWN(m_spInternetProtocolSink) |
278 /* [in] */ DWORD dwError, | 267 |
279 /* [in] */ LPCWSTR szResult); | 268 IServiceProvider* GetClientServiceProvider(); |
280 | 269 |
281 // IServiceProvider | 270 HRESULT QueryServiceFromClient(REFGUID guidService, REFIID riid, |
282 STDMETHODIMP QueryService( | 271 void** ppvObject); |
283 /* [in] */ REFGUID guidService, | 272 template <class Q> |
284 /* [in] */ REFIID riid, | 273 HRESULT QueryServiceFromClient(REFGUID guidService, Q** pp) |
285 /* [out] */ void** ppvObject); | 274 { |
286 | 275 return QueryServiceFromClient(guidService, _ATL_IIDOF(Q), |
287 public: | 276 reinterpret_cast<void**>(pp)); |
288 CComPtr<IInternetProtocolSink> m_spInternetProtocolSink; | 277 } |
289 CComPtr<IServiceProvider> m_spServiceProvider; | 278 template <class Q> |
290 CComPtr<IInternetProtocol> m_spTargetProtocol; | 279 HRESULT QueryServiceFromClient(Q** pp) |
291 }; | 280 { |
292 | 281 return QueryServiceFromClient(_ATL_IIDOF(Q), _ATL_IIDOF(Q), |
293 template <class ThreadModel> | 282 reinterpret_cast<void**>(pp)); |
294 class CInternetProtocolSinkTM : | 283 } |
295 public CComObjectRootEx<ThreadModel>, | 284 public: |
296 public IInternetProtocolSinkImpl | 285 // IInternetProtocolSink |
297 { | 286 STDMETHODIMP Switch( |
298 private: | 287 /* [in] */ PROTOCOLDATA *pProtocolData); |
| 288 |
| 289 STDMETHODIMP ReportProgress( |
| 290 /* [in] */ ULONG ulStatusCode, |
| 291 /* [in] */ LPCWSTR szStatusText); |
| 292 |
| 293 STDMETHODIMP ReportData( |
| 294 /* [in] */ DWORD grfBSCF, |
| 295 /* [in] */ ULONG ulProgress, |
| 296 /* [in] */ ULONG ulProgressMax); |
| 297 |
| 298 STDMETHODIMP ReportResult( |
| 299 /* [in] */ HRESULT hrResult, |
| 300 /* [in] */ DWORD dwError, |
| 301 /* [in] */ LPCWSTR szResult); |
| 302 |
| 303 // IServiceProvider |
| 304 STDMETHODIMP QueryService( |
| 305 /* [in] */ REFGUID guidService, |
| 306 /* [in] */ REFIID riid, |
| 307 /* [out] */ void** ppvObject); |
| 308 |
| 309 // IInternetBindInfo |
| 310 STDMETHODIMP GetBindInfo( |
| 311 /* [out] */ DWORD *grfBINDF, |
| 312 /* [in, out] */ BINDINFO *pbindinfo); |
| 313 |
| 314 STDMETHODIMP GetBindString( |
| 315 /* [in] */ ULONG ulStringType, |
| 316 /* [in, out] */ LPOLESTR *ppwzStr, |
| 317 /* [in] */ ULONG cEl, |
| 318 /* [in, out] */ ULONG *pcElFetched); |
| 319 |
| 320 // IInternetBindInfoEx |
| 321 STDMETHODIMP GetBindInfoEx( |
| 322 DWORD *grfBINDF, |
| 323 BINDINFO *pbindinfo, |
| 324 DWORD *grfBINDF2, |
| 325 DWORD *pdwReserved); |
| 326 |
| 327 // IUriContainer |
| 328 STDMETHODIMP GetIUri( |
| 329 /* [out] */ IUri **ppIUri); |
| 330 |
| 331 protected: |
| 332 HRESULT InitMembers(IInternetProtocolSink *pOIProtSink, IInternetBindInf
o *pOIBindInfo, |
| 333 IInternetProtocol* pTargetProtocol); |
| 334 |
| 335 public: |
| 336 CComPtr<IInternetProtocolSink> m_spInternetProtocolSink; |
| 337 CComPtr<IServiceProvider> m_spServiceProvider; |
| 338 CComPtr<IInternetBindInfo> m_spInternetBindInfo; |
| 339 CComPtr<IInternetBindInfoEx> m_spInternetBindInfoEx; |
| 340 CComPtr<IUriContainer> m_spUriContainer; |
| 341 |
| 342 CComPtr<IInternetProtocol> m_spTargetProtocol; |
| 343 }; |
| 344 |
| 345 template <class ThreadModel = CComMultiThreadModel> |
| 346 class CInternetProtocolSinkTM : |
| 347 public CComObjectRootEx<ThreadModel>, |
| 348 public IInternetProtocolSinkImpl |
| 349 { |
| 350 private: |
299 static HRESULT WINAPI OnDelegateIID(void* pv, REFIID riid, LPVOID* ppv,
DWORD_PTR dw) | 351 static HRESULT WINAPI OnDelegateIID(void* pv, REFIID riid, LPVOID* ppv,
DWORD_PTR dw) |
300 { | 352 { |
301 IInternetProtocolSink* pSink = ((CInternetProtocolSinkTM<ThreadM
odel> *) pv)->m_spInternetProtocolSink; | 353 IInternetProtocolSink* pSink = ((CInternetProtocolSinkTM<ThreadM
odel> *) pv)->m_spInternetProtocolSink; |
302 ATLASSERT(pSink != 0); | 354 ATLASSERT(pSink != 0); |
303 return pSink ? pSink->QueryInterface(riid, ppv) : E_UNEXPECTED; | 355 return pSink ? pSink->QueryInterface(riid, ppv) : E_UNEXPECTED; |
304 } | 356 } |
305 | 357 |
306 public: | 358 public: |
307 BEGIN_COM_MAP(CInternetProtocolSinkTM) | 359 » BEGIN_COM_MAP(CInternetProtocolSinkTM) |
308 COM_INTERFACE_ENTRY(IInternetProtocolSink) | 360 » » COM_INTERFACE_ENTRY(IInternetProtocolSink) |
309 COM_INTERFACE_ENTRY_PASSTHROUGH(IServiceProvider, | 361 » » COM_INTERFACE_ENTRY_PASSTHROUGH(IServiceProvider, |
310 m_spServiceProvider.p) | 362 » » » m_spServiceProvider.p) |
311 » COM_INTERFACE_ENTRY_FUNC_BLIND(0, OnDelegateIID) | 363 » » COM_INTERFACE_ENTRY(IInternetBindInfo) |
312 COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() | 364 » » COM_INTERFACE_ENTRY(IInternetBindInfoEx) |
313 END_COM_MAP() | 365 » » COM_INTERFACE_ENTRY_PASSTHROUGH(IUriContainer, m_spUriContainer.
p) |
| 366 » » COM_INTERFACE_ENTRY_FUNC_BLIND(0, OnDelegateIID) |
| 367 » » COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() |
| 368 » END_COM_MAP() |
| 369 }; |
314 | 370 |
315 }; | 371 typedef CInternetProtocolSinkTM<> CInternetProtocolSink; |
316 | 372 |
317 typedef CInternetProtocolSinkTM<CComMultiThreadModel> CInternetProtocolSink; | 373 template <class T, class ThreadModel = CComMultiThreadModel> |
| 374 class CInternetProtocolSinkWithSP : |
| 375 » public CInternetProtocolSinkTM<ThreadModel> |
| 376 { |
| 377 » typedef CInternetProtocolSinkTM<ThreadModel> BaseClass; |
| 378 public: |
| 379 » HRESULT OnStart(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, |
| 380 » » IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserv
ed, |
| 381 » » IInternetProtocol* pTargetProtocol); |
| 382 » HRESULT OnStartEx(IUri* pUri, IInternetProtocolSink *pOIProtSink, |
| 383 » » IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserv
ed, |
| 384 » » IInternetProtocol* pTargetProtocol); |
318 | 385 |
319 template <class T, class ThreadModel = CComMultiThreadModel> | 386 » STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void** ppv); |
320 class CInternetProtocolSinkWithSP : | |
321 public CInternetProtocolSinkTM<ThreadModel> | |
322 { | |
323 typedef CInternetProtocolSinkTM<ThreadModel> BaseClass; | |
324 public: | |
325 HRESULT OnStart(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, | |
326 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved, | |
327 IInternetProtocol* pTargetProtocol); | |
328 | 387 |
329 STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void** ppv); | 388 » HRESULT _InternalQueryService(REFGUID guidService, REFIID riid, |
| 389 » » void** ppvObject); |
330 | 390 |
331 HRESULT _InternalQueryService(REFGUID guidService, REFIID riid, | 391 » BEGIN_COM_MAP(CInternetProtocolSinkWithSP) |
332 void** ppvObject); | 392 » » COM_INTERFACE_ENTRY(IServiceProvider) |
333 | 393 » » COM_INTERFACE_ENTRY_CHAIN(BaseClass) |
334 BEGIN_COM_MAP(CInternetProtocolSinkWithSP) | 394 » END_COM_MAP() |
335 COM_INTERFACE_ENTRY(IServiceProvider) | 395 }; |
336 COM_INTERFACE_ENTRY_CHAIN(BaseClass) | |
337 END_COM_MAP() | |
338 }; | |
339 | 396 |
340 #define SERVICE_ENTRY_PASSTHROUGH(x) \ | 397 #define SERVICE_ENTRY_PASSTHROUGH(x) \ |
341 if (InlineIsEqualGUID(guidService, x)) \ | 398 » if (InlineIsEqualGUID(guidService, x)) \ |
342 { \ | 399 » { \ |
343 return ::PassthroughAPP::Detail::QueryServicePassthrough(guidService, \ | 400 » » return ::PassthroughAPP::Detail::QueryServicePassthrough(guidSer
vice, \ |
344 GetUnknown(), riid, ppvObject, GetClientServiceProvider()); \ | 401 » » » GetUnknown(), riid, ppvObject, GetClientServiceProvider(
)); \ |
345 } | 402 » } |
346 | 403 |
347 struct __declspec(uuid("C7A98E66-1010-492c-A1C8-C809E1F75905")) IInternetProto
colEx; | 404 template <class StartPolicy, class ThreadModel = CComMultiThreadModel> |
| 405 class ATL_NO_VTABLE CInternetProtocol : |
| 406 » public CComObjectRootEx<ThreadModel>, |
| 407 » public IInternetProtocolImpl, |
| 408 » public StartPolicy |
| 409 { |
| 410 private: |
| 411 » static HRESULT WINAPI OnDelegateIID(void* pv, REFIID riid, LPVOID* ppv,
DWORD_PTR dw) |
| 412 » { |
| 413 » » IInternetProtocol* pProtocol = ((CInternetProtocol<StartPolicy,
ThreadModel> *) pv)->m_spInternetProtocol; |
| 414 » » ATLASSERT(pProtocol != 0); |
| 415 » » return pProtocol ? pProtocol->QueryInterface(riid, ppv) : E_UNEX
PECTED; |
| 416 » } |
348 | 417 |
349 template <class StartPolicy, class ThreadModel = CComMultiThreadModel> | 418 public: |
350 class ATL_NO_VTABLE CInternetProtocol : | 419 » BEGIN_COM_MAP(CInternetProtocol) |
351 public CComObjectRootEx<ThreadModel>, | 420 » » COM_INTERFACE_ENTRY(IPassthroughObject) |
352 public IInternetProtocolImpl, | 421 » » COM_INTERFACE_ENTRY(IInternetProtocolRoot) |
353 public StartPolicy | 422 » » COM_INTERFACE_ENTRY(IInternetProtocol) |
354 { | 423 » » COM_INTERFACE_ENTRY(IInternetProtocolEx) |
355 private: | 424 » » COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetProtocolInfo, |
356 static HRESULT WINAPI OnDelegateIID(void* pv, REFIID riid, LPVOID* ppv, DWOR
D_PTR dw) | 425 » » » m_spInternetProtocolInfo.p) |
357 { | 426 » » COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetPriority, |
358 IInternetProtocol* pProtocol = ((CInternetProtocol<StartPolicy, ThreadMode
l> *) pv)->m_spInternetProtocol; | 427 » » » m_spInternetPriority.p) |
359 ATLASSERT(pProtocol != 0); | 428 » » COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetThreadSwitch, |
360 // TODO: don't need this once we support IInternetProtocolEx | 429 » » » m_spInternetThreadSwitch.p) |
361 if (InlineIsEqualGUID(riid, __uuidof(IInternetProtocolEx))) return E_NOINT
ERFACE; | 430 » » COM_INTERFACE_ENTRY_PASSTHROUGH(IWinInetInfo, m_spWinInetInfo.p) |
362 return pProtocol ? pProtocol->QueryInterface(riid, ppv) : E_UNEXPECTED; | 431 » » COM_INTERFACE_ENTRY_PASSTHROUGH2(IWinInetHttpInfo, |
363 } | 432 » » » m_spWinInetHttpInfo.p, IWinInetInfo) |
364 public: | 433 » » COM_INTERFACE_ENTRY_PASSTHROUGH(IWinInetCacheHints, |
365 BEGIN_COM_MAP(CInternetProtocol) | 434 » » » m_spWinInetCacheHints.p) |
366 COM_INTERFACE_ENTRY(IPassthroughObject) | 435 » » COM_INTERFACE_ENTRY_PASSTHROUGH2(IWinInetCacheHints2, |
367 COM_INTERFACE_ENTRY(IInternetProtocolRoot) | 436 » » » m_spWinInetCacheHints2.p, IWinInetCacheHints) |
368 COM_INTERFACE_ENTRY(IInternetProtocol) | 437 » » COM_INTERFACE_ENTRY_FUNC_BLIND(0, OnDelegateIID) |
369 COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetProtocolInfo, | 438 » » COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() |
370 m_spInternetProtocolInfo.p) | 439 » END_COM_MAP() |
371 COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetPriority, | 440 |
372 m_spInternetPriority.p) | 441 » // IInternetProtocolRoot |
373 COM_INTERFACE_ENTRY_PASSTHROUGH(IInternetThreadSwitch, | 442 » STDMETHODIMP Start(LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, |
374 m_spInternetThreadSwitch.p) | 443 » » IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserv
ed); |
375 COM_INTERFACE_ENTRY_PASSTHROUGH(IWinInetInfo, m_spWinInetInfo.p) | 444 |
376 COM_INTERFACE_ENTRY_PASSTHROUGH2(IWinInetHttpInfo, | 445 » // IInternetProtocolEx |
377 m_spWinInetHttpInfo.p, IWinInetInfo) | 446 » STDMETHODIMP StartEx(IUri *pUri, IInternetProtocolSink *pOIProtSink, |
378 COM_INTERFACE_ENTRY_FUNC_BLIND(0, OnDelegateIID) | 447 » » IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserv
ed); |
379 COM_INTERFACE_ENTRY_PASSTHROUGH_DEBUG() | 448 }; |
380 END_COM_MAP() | |
381 }; | |
382 | 449 |
383 } // end namespace PassthroughAPP | 450 } // end namespace PassthroughAPP |
384 | 451 |
385 #include "ProtocolImpl.inl" | 452 #include "ProtocolImpl.inl" |
386 | 453 |
387 #include "SinkPolicy.h" | 454 #include "SinkPolicy.h" |
388 | 455 |
389 #endif // PASSTHROUGHAPP_PROTOCOLIMPL_H | 456 #endif // PASSTHROUGHAPP_PROTOCOLIMPL_H |
OLD | NEW |