Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: Shared/ProtocolImpl.inl

Issue 9595007: Fix for crash in urlmon.dll on telegrafua.com. (Endless redirect loop) (Closed)
Patch Set: Created March 5, 2013, 1:41 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Shared/PluginMimeFilterClient.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #ifndef PASSTHROUGHAPP_PROTOCOLIMPL_INL 1 #ifndef PASSTHROUGHAPP_PROTOCOLIMPL_INL
2 #define PASSTHROUGHAPP_PROTOCOLIMPL_INL 2 #define PASSTHROUGHAPP_PROTOCOLIMPL_INL
3 3
4 #if _MSC_VER > 1000 4 #if _MSC_VER > 1000
5 » #pragma once 5 #pragma once
6 #endif // _MSC_VER > 1000 6 #endif // _MSC_VER > 1000
7 7
8 #ifndef PASSTHROUGHAPP_PROTOCOLIMPL_H 8 #ifndef PASSTHROUGHAPP_PROTOCOLIMPL_H
9 » #error ProtocolImpl.inl requires ProtocolImpl.h to be included first 9 #error ProtocolImpl.inl requires ProtocolImpl.h to be included first
10 #endif 10 #endif
11 11
12 namespace PassthroughAPP 12 namespace PassthroughAPP
13 { 13 {
14 14
15 namespace Detail 15 namespace Detail
16 { 16 {
17 17
18 #ifdef WIN64 18 #ifdef WIN64
19 » template <class T> 19 template <class T>
20 inline HRESULT WINAPI QIPassthrough<T>:: 20 inline HRESULT WINAPI QIPassthrough<T>::
21 » QueryInterfacePassthroughT(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw) 21 QueryInterfacePassthroughT(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR d w)
22 #else 22 #else
23 23
24 template <class T> 24 template <class T>
25 inline HRESULT WINAPI QIPassthrough<T>:: 25 inline HRESULT WINAPI QIPassthrough<T>::
26 » QueryInterfacePassthroughT(void* pv, REFIID riid, LPVOID* ppv, DWORD dw) 26 QueryInterfacePassthroughT(void* pv, REFIID riid, LPVOID* ppv, DWORD dw)
27 #endif 27 #endif
28 { 28 {
29 » ATLASSERT(pv != 0); 29 ATLASSERT(pv != 0);
30 » T* pT = static_cast<T*>(pv); 30 T* pT = static_cast<T*>(pv);
31 31
32 » IUnknown* punkTarget = pT->GetTargetUnknown(); 32 IUnknown* punkTarget = pT->GetTargetUnknown();
33 » ATLASSERT(punkTarget != 0); 33 ATLASSERT(punkTarget != 0);
34 » if (!punkTarget) 34 if (!punkTarget)
35 » { 35 {
36 » » ATLTRACE(_T("Interface queried before target unknown is set")); 36 ATLTRACE(_T("Interface queried before target unknown is set"));
37 » » return E_UNEXPECTED; 37 return E_UNEXPECTED;
38 » } 38 }
39 39
40 » IUnknown* punkWrapper = pT->GetUnknown(); 40 IUnknown* punkWrapper = pT->GetUnknown();
41 41
42 » typename T::ObjectLock lock(pT); 42 typename T::ObjectLock lock(pT);
43 » return QueryInterfacePassthrough( 43 return QueryInterfacePassthrough(
44 » » pv, riid, ppv, dw, punkTarget, punkWrapper); 44 pv, riid, ppv, dw, punkTarget, punkWrapper);
45 } 45 }
46 #ifdef WIN64 46 #ifdef WIN64
47 template <class T> 47 template <class T>
48 inline HRESULT WINAPI QIPassthrough<T>:: 48 inline HRESULT WINAPI QIPassthrough<T>::
49 » QueryInterfaceDebugT(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw) 49 QueryInterfaceDebugT(void* pv, REFIID riid, LPVOID* ppv, DWORD_PTR dw)
50 #else 50 #else
51 template <class T> 51 template <class T>
52 inline HRESULT WINAPI QIPassthrough<T>:: 52 inline HRESULT WINAPI QIPassthrough<T>::
53 » QueryInterfaceDebugT(void* pv, REFIID riid, LPVOID* ppv, DWORD dw) 53 QueryInterfaceDebugT(void* pv, REFIID riid, LPVOID* ppv, DWORD dw)
54 #endif 54 #endif
55 { 55 {
56 » ATLASSERT(pv != 0); 56 ATLASSERT(pv != 0);
57 » T* pT = static_cast<T*>(pv); 57 T* pT = static_cast<T*>(pv);
58 58
59 » IUnknown* punkTarget = pT->GetTargetUnknown(); 59 IUnknown* punkTarget = pT->GetTargetUnknown();
60 //» ATLASSERT(punkTarget != 0); 60 //» ATLASSERT(punkTarget != 0);
61 » if (!punkTarget) 61 if (!punkTarget)
62 » { 62 {
63 //» » ATLTRACE(_T("Interface queried before target unknown is set")); 63 //» » ATLTRACE(_T("Interface queried before target unknown is set"));
64 » » return E_UNEXPECTED; 64 return E_UNEXPECTED;
65 » } 65 }
66 66
67 » typename T::ObjectLock lock(pT); 67 typename T::ObjectLock lock(pT);
68 68
69 » return QueryInterfaceDebug(pv, riid, ppv, dw, punkTarget); 69 return QueryInterfaceDebug(pv, riid, ppv, dw, punkTarget);
70 } 70 }
71 #ifdef WIN64 71 #ifdef WIN64
72 inline HRESULT WINAPI QueryInterfacePassthrough(void* pv, REFIID riid, 72 inline HRESULT WINAPI QueryInterfacePassthrough(void* pv, REFIID riid,
73 » LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget, IUnknown* punkWrapper) 73 LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget, IUnknown* punkWrapper)
74 #else 74 #else
75 inline HRESULT WINAPI QueryInterfacePassthrough(void* pv, REFIID riid, 75 inline HRESULT WINAPI QueryInterfacePassthrough(void* pv, REFIID riid,
76 » LPVOID* ppv, DWORD dw, IUnknown* punkTarget, IUnknown* punkWrapper) 76 LPVOID* ppv, DWORD dw, IUnknown* punkTarget, IUnknown* punkWrapper)
77 #endif 77 #endif
78 { 78 {
79 ATLASSERT(pv != 0); 79 ATLASSERT(pv != 0);
80 ATLASSERT(ppv != 0); 80 ATLASSERT(ppv != 0);
81 ATLASSERT(dw != 0); 81 ATLASSERT(dw != 0);
82 ATLASSERT(punkTarget != 0); 82 ATLASSERT(punkTarget != 0);
83 83
84 84
85 const PassthroughItfData& data = 85 const PassthroughItfData& data =
86 *reinterpret_cast<const PassthroughItfData*>(dw); 86 *reinterpret_cast<const PassthroughItfData*>(dw);
87 87
88 IUnknown** ppUnk = reinterpret_cast<IUnknown**>( 88 IUnknown** ppUnk = reinterpret_cast<IUnknown**>(
89 static_cast<char*>(pv) + data.offsetUnk); 89 static_cast<char*>(pv) + data.offsetUnk);
90 90
91 HRESULT hr = S_OK; 91 HRESULT hr = S_OK;
92 if (!*ppUnk) 92 if (!*ppUnk)
93 { 93 {
94 CComPtr<IUnknown> spUnk; 94 CComPtr<IUnknown> spUnk;
95 hr = punkTarget->QueryInterface(riid, 95 hr = punkTarget->QueryInterface(riid,
96 reinterpret_cast<void**>(&spUnk)); 96 reinterpret_cast<void**>(&spUnk));
97 ATLASSERT(FAILED(hr) || spUnk != 0); 97 ATLASSERT(FAILED(hr) || spUnk != 0);
98 if (SUCCEEDED(hr)) 98 if (SUCCEEDED(hr))
99 { 99 {
100 *ppUnk = spUnk.Detach(); 100 *ppUnk = spUnk.Detach();
101 101
102 // Need to QI for base interface to fill in base target pointer 102 // Need to QI for base interface to fill in base target pointer
103 if (data.piidBase) 103 if (data.piidBase)
104 { 104 {
105 ATLASSERT(punkWrapper != 0); 105 ATLASSERT(punkWrapper != 0);
106 hr = punkWrapper->QueryInterface(*data.piidBase, 106 hr = punkWrapper->QueryInterface(*data.piidBase,
107 reinterpret_cast<void**>(&spUnk)); 107 reinterpret_cast<void**>(&spUnk));
108 // since QI for derived interface succeeded, 108 // since QI for derived interface succeeded,
109 // QI for base interface must succeed, too 109 // QI for base interface must succeed, too
110 ATLASSERT(SUCCEEDED(hr)); 110 ATLASSERT(SUCCEEDED(hr));
111 } 111 }
112 } 112 }
113 } 113 }
114 if (SUCCEEDED(hr)) 114 if (SUCCEEDED(hr))
115 { 115 {
116 CComPtr<IUnknown> spItf = reinterpret_cast<IUnknown*>( 116 CComPtr<IUnknown> spItf = reinterpret_cast<IUnknown*>(
117 static_cast<char*>(pv) + data.offsetItf); 117 static_cast<char*>(pv) + data.offsetItf);
118 *ppv = spItf.Detach(); 118 *ppv = spItf.Detach();
119 } 119 }
120 else 120 else
121 { 121 {
122 ATLASSERT(_T("Interface not supported by target unknown")); 122 ATLASSERT(_T("Interface not supported by target unknown"));
123 } 123 }
124 return hr; 124 return hr;
125 } 125 }
126 126
127 inline HRESULT WINAPI QueryInterfaceDebug(void* pv, REFIID riid, 127 inline HRESULT WINAPI QueryInterfaceDebug(void* pv, REFIID riid,
128 LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget) 128 LPVOID* ppv, DWORD_PTR dw, IUnknown* punkTarget)
129 { 129 {
130 ATLASSERT(pv != 0); 130 ATLASSERT(pv != 0);
131 ATLASSERT(ppv != 0); 131 ATLASSERT(ppv != 0);
132 ATLASSERT(punkTarget != 0); 132 ATLASSERT(punkTarget != 0);
133 133
134 CComPtr<IUnknown> spUnk; 134 CComPtr<IUnknown> spUnk;
135 HRESULT hr = punkTarget->QueryInterface(riid, 135 HRESULT hr = punkTarget->QueryInterface(riid,
136 reinterpret_cast<void**>(&spUnk)); 136 reinterpret_cast<void**>(&spUnk));
137 ATLASSERT(FAILED(hr) || spUnk != 0); 137 ATLASSERT(FAILED(hr) || spUnk != 0);
138 if (SUCCEEDED(hr)) 138 if (SUCCEEDED(hr))
139 { 139 {
140 //Added by MH to display interface CLSID in debug 140 //Added by MH to display interface CLSID in debug
141 OLECHAR wszBuff[39]; 141 OLECHAR wszBuff[39];
142 int i = StringFromGUID2(riid, wszBuff, 39); 142 int i = StringFromGUID2(riid, wszBuff, 39);
143 USES_CONVERSION; 143 USES_CONVERSION;
144 ATLTRACE(_T("=====>Unrecognized interface supported by target un known=%s\n"), OLE2T(wszBuff)); 144 ATLTRACE(_T("=====>Unrecognized interface supported by target unknown=%s \n"), OLE2T(wszBuff));
145 } 145 }
146 146
147 // We don't support this interface, so return an error. 147 // We don't support this interface, so return an error.
148 // The operations above are for debugging purposes only, 148 // The operations above are for debugging purposes only,
149 // this function is not supposed to ever return success 149 // this function is not supposed to ever return success
150 return E_NOINTERFACE; 150 return E_NOINTERFACE;
151 } 151 }
152 152
153 inline HRESULT QueryServicePassthrough(REFGUID guidService, 153 inline HRESULT QueryServicePassthrough(REFGUID guidService,
154 IUnknown* punkThis, REFIID riid, void** ppv, 154 IUnknown* punkThis, REFIID riid, void** ppv,
155 IServiceProvider* pClientProvider) 155 IServiceProvider* pClientProvider)
156 { 156 {
157 ATLASSERT(punkThis != 0); 157 ATLASSERT(punkThis != 0);
158 CComPtr<IUnknown> spDummy; 158 CComPtr<IUnknown> spDummy;
159 HRESULT hr = pClientProvider ? 159 HRESULT hr = pClientProvider ?
160 pClientProvider->QueryService(guidService, riid, 160 pClientProvider->QueryService(guidService, riid,
161 reinterpret_cast<void**>(&spDummy)) : 161 reinterpret_cast<void**>(&spDummy)) :
162 E_NOINTERFACE; 162 E_NOINTERFACE;
163 if (SUCCEEDED(hr)) 163 if (SUCCEEDED(hr))
164 { 164 {
165 hr = punkThis->QueryInterface(riid, ppv); 165 hr = punkThis->QueryInterface(riid, ppv);
166 } 166 }
167 return hr; 167 return hr;
168 } 168 }
169 169
170 } // end namespace PassthroughAPP::Detail 170 } // end namespace PassthroughAPP::Detail
171 171
172 // ===== IInternetProtocolImpl ===== 172 // ===== IInternetProtocolImpl =====
173 173
174 inline STDMETHODIMP IInternetProtocolImpl::SetTargetUnknown( 174 inline STDMETHODIMP IInternetProtocolImpl::SetTargetUnknown(
175 IUnknown* punkTarget) 175 IUnknown* punkTarget)
176 { 176 {
177 ATLASSERT(punkTarget != 0); 177 ATLASSERT(punkTarget != 0);
178 if (!punkTarget) 178 if (!punkTarget)
179 { 179 {
180 return E_POINTER; 180 return E_POINTER;
181 } 181 }
182 182
183 // This method should only be called once, and be the only source 183 // This method should only be called once, and be the only source
184 // of target interface pointers. 184 // of target interface pointers.
185 ATLASSERT(m_spInternetProtocolUnk == 0); 185 ATLASSERT(m_spInternetProtocolUnk == 0);
186 ATLASSERT(m_spInternetProtocol == 0); 186 ATLASSERT(m_spInternetProtocol == 0);
187 if (m_spInternetProtocolUnk || m_spInternetProtocol) 187 if (m_spInternetProtocolUnk || m_spInternetProtocol)
188 { 188 {
189 return E_UNEXPECTED; 189 return E_UNEXPECTED;
190 } 190 }
191 191
192 // We expect the target unknown to implement at least IInternetProtocol 192 // We expect the target unknown to implement at least IInternetProtocol
193 // Otherwise we reject it 193 // Otherwise we reject it
194 HRESULT hr = punkTarget->QueryInterface(&m_spInternetProtocol); 194 HRESULT hr = punkTarget->QueryInterface(&m_spInternetProtocol);
195 ATLASSERT(FAILED(hr) || m_spInternetProtocol != 0); 195 ATLASSERT(FAILED(hr) || m_spInternetProtocol != 0);
196 if (FAILED(hr)) 196 if (FAILED(hr))
197 { 197 {
198 return hr; 198 return hr;
199 } 199 }
200 200
201 ATLASSERT(m_spInternetProtocolInfo == 0); 201 ATLASSERT(m_spInternetProtocolInfo == 0);
202 ATLASSERT(m_spInternetPriority == 0); 202 ATLASSERT(m_spInternetPriority == 0);
203 ATLASSERT(m_spInternetThreadSwitch == 0); 203 ATLASSERT(m_spInternetThreadSwitch == 0);
204 ATLASSERT(m_spWinInetInfo == 0); 204 ATLASSERT(m_spWinInetInfo == 0);
205 ATLASSERT(m_spWinInetHttpInfo == 0); 205 ATLASSERT(m_spWinInetHttpInfo == 0);
206 206
207 m_spInternetProtocolUnk = punkTarget; 207 m_spInternetProtocolUnk = punkTarget;
208 return S_OK; 208 return S_OK;
209 } 209 }
210 210
211 inline void IInternetProtocolImpl::ReleaseAll() 211 inline void IInternetProtocolImpl::ReleaseAll()
212 { 212 {
213 m_spInternetProtocolUnk.Release(); 213 m_spInternetProtocolUnk.Release();
214 m_spInternetProtocol.Release(); 214 m_spInternetProtocol.Release();
215 m_spInternetProtocolInfo.Release(); 215 m_spInternetProtocolInfo.Release();
216 m_spInternetPriority.Release(); 216 m_spInternetPriority.Release();
217 m_spInternetThreadSwitch.Release(); 217 m_spInternetThreadSwitch.Release();
218 m_spWinInetInfo.Release(); 218 m_spWinInetInfo.Release();
219 m_spWinInetHttpInfo.Release(); 219 m_spWinInetHttpInfo.Release();
220 } 220 }
221 221
222 // IInternetProtocolRoot 222 // IInternetProtocolRoot
223 inline STDMETHODIMP IInternetProtocolImpl::Start( 223 inline STDMETHODIMP IInternetProtocolImpl::Start(
224 /* [in] */ LPCWSTR szUrl, 224 /* [in] */ LPCWSTR szUrl,
225 /* [in] */ IInternetProtocolSink *pOIProtSink, 225 /* [in] */ IInternetProtocolSink *pOIProtSink,
226 /* [in] */ IInternetBindInfo *pOIBindInfo, 226 /* [in] */ IInternetBindInfo *pOIBindInfo,
227 /* [in] */ DWORD grfPI, 227 /* [in] */ DWORD grfPI,
228 /* [in] */ HANDLE_PTR dwReserved) 228 /* [in] */ HANDLE_PTR dwReserved)
229 { 229 {
230 ATLASSERT(m_spInternetProtocol != 0); 230 ATLASSERT(m_spInternetProtocol != 0);
231 return m_spInternetProtocol ? 231 return m_spInternetProtocol ?
232 m_spInternetProtocol->Start(szUrl, pOIProtSink, pOIBindInfo, grf PI, 232 m_spInternetProtocol->Start(szUrl, pOIProtSink, pOIBindInfo, grfPI,
233 dwReserved) : 233 dwReserved) :
234 E_UNEXPECTED; 234 E_UNEXPECTED;
235 } 235 }
236 236
237 inline STDMETHODIMP IInternetProtocolImpl::Continue( 237 inline STDMETHODIMP IInternetProtocolImpl::Continue(
238 /* [in] */ PROTOCOLDATA *pProtocolData) 238 /* [in] */ PROTOCOLDATA *pProtocolData)
239 { 239 {
240 ATLASSERT(m_spInternetProtocol != 0); 240 ATLASSERT(m_spInternetProtocol != 0);
241 return m_spInternetProtocol ? 241 return m_spInternetProtocol ?
242 m_spInternetProtocol->Continue(pProtocolData) : 242 m_spInternetProtocol->Continue(pProtocolData) :
243 E_UNEXPECTED; 243 E_UNEXPECTED;
244 } 244 }
245 245
246 inline STDMETHODIMP IInternetProtocolImpl::Abort( 246 inline STDMETHODIMP IInternetProtocolImpl::Abort(
247 /* [in] */ HRESULT hrReason, 247 /* [in] */ HRESULT hrReason,
248 /* [in] */ DWORD dwOptions) 248 /* [in] */ DWORD dwOptions)
249 { 249 {
250 ATLASSERT(m_spInternetProtocol != 0); 250 ATLASSERT(m_spInternetProtocol != 0);
251 return m_spInternetProtocol ? 251 return m_spInternetProtocol ?
252 m_spInternetProtocol->Abort(hrReason, dwOptions) : 252 m_spInternetProtocol->Abort(hrReason, dwOptions) :
253 E_UNEXPECTED; 253 E_UNEXPECTED;
254 } 254 }
255 255
256 inline STDMETHODIMP IInternetProtocolImpl::Terminate( 256 inline STDMETHODIMP IInternetProtocolImpl::Terminate(
257 /* [in] */ DWORD dwOptions) 257 /* [in] */ DWORD dwOptions)
258 { 258 {
259 ATLASSERT(m_spInternetProtocol != 0); 259 ATLASSERT(m_spInternetProtocol != 0);
260 return m_spInternetProtocol ? 260 return m_spInternetProtocol ?
261 m_spInternetProtocol->Terminate(dwOptions) : 261 m_spInternetProtocol->Terminate(dwOptions) :
262 E_UNEXPECTED; 262 E_UNEXPECTED;
263 } 263 }
264 264
265 inline STDMETHODIMP IInternetProtocolImpl::Suspend() 265 inline STDMETHODIMP IInternetProtocolImpl::Suspend()
266 { 266 {
267 ATLASSERT(m_spInternetProtocol != 0); 267 ATLASSERT(m_spInternetProtocol != 0);
268 return m_spInternetProtocol ? 268 return m_spInternetProtocol ?
269 m_spInternetProtocol->Suspend() : 269 m_spInternetProtocol->Suspend() :
270 E_UNEXPECTED; 270 E_UNEXPECTED;
271 } 271 }
272 272
273 inline STDMETHODIMP IInternetProtocolImpl::Resume() 273 inline STDMETHODIMP IInternetProtocolImpl::Resume()
274 { 274 {
275 ATLASSERT(m_spInternetProtocol != 0); 275 ATLASSERT(m_spInternetProtocol != 0);
276 return m_spInternetProtocol ? 276 return m_spInternetProtocol ?
277 m_spInternetProtocol->Resume() : 277 m_spInternetProtocol->Resume() :
278 E_UNEXPECTED; 278 E_UNEXPECTED;
279 } 279 }
280 280
281 // IInternetProtocol 281 // IInternetProtocol
282 inline STDMETHODIMP IInternetProtocolImpl::Read( 282 inline STDMETHODIMP IInternetProtocolImpl::Read(
283 /* [in, out] */ void *pv, 283 /* [in, out] */ void *pv,
284 /* [in] */ ULONG cb, 284 /* [in] */ ULONG cb,
285 /* [out] */ ULONG *pcbRead) 285 /* [out] */ ULONG *pcbRead)
286 { 286 {
287 ATLASSERT(m_spInternetProtocol != 0); 287 ATLASSERT(m_spInternetProtocol != 0);
288 return m_spInternetProtocol ? 288 return m_spInternetProtocol ?
289 m_spInternetProtocol->Read(pv, cb, pcbRead) : 289 m_spInternetProtocol->Read(pv, cb, pcbRead) :
290 E_UNEXPECTED; 290 E_UNEXPECTED;
291 } 291 }
292 292
293 inline STDMETHODIMP IInternetProtocolImpl::Seek( 293 inline STDMETHODIMP IInternetProtocolImpl::Seek(
294 /* [in] */ LARGE_INTEGER dlibMove, 294 /* [in] */ LARGE_INTEGER dlibMove,
295 /* [in] */ DWORD dwOrigin, 295 /* [in] */ DWORD dwOrigin,
296 /* [out] */ ULARGE_INTEGER *plibNewPosition) 296 /* [out] */ ULARGE_INTEGER *plibNewPosition)
297 { 297 {
298 ATLASSERT(m_spInternetProtocol != 0); 298 ATLASSERT(m_spInternetProtocol != 0);
299 return m_spInternetProtocol ? 299 return m_spInternetProtocol ?
300 m_spInternetProtocol->Seek(dlibMove, dwOrigin, plibNewPosition) : 300 m_spInternetProtocol->Seek(dlibMove, dwOrigin, plibNewPosition) :
301 E_UNEXPECTED; 301 E_UNEXPECTED;
302 } 302 }
303 303
304 inline STDMETHODIMP IInternetProtocolImpl::LockRequest( 304 inline STDMETHODIMP IInternetProtocolImpl::LockRequest(
305 /* [in] */ DWORD dwOptions) 305 /* [in] */ DWORD dwOptions)
306 { 306 {
307 ATLASSERT(m_spInternetProtocol != 0); 307 ATLASSERT(m_spInternetProtocol != 0);
308 return m_spInternetProtocol ? 308 return m_spInternetProtocol ?
309 m_spInternetProtocol->LockRequest(dwOptions) : 309 m_spInternetProtocol->LockRequest(dwOptions) :
310 E_UNEXPECTED; 310 E_UNEXPECTED;
311 } 311 }
312 312
313 inline STDMETHODIMP IInternetProtocolImpl::UnlockRequest() 313 inline STDMETHODIMP IInternetProtocolImpl::UnlockRequest()
314 { 314 {
315 ATLASSERT(m_spInternetProtocol != 0); 315 ATLASSERT(m_spInternetProtocol != 0);
316 return m_spInternetProtocol ? 316 return m_spInternetProtocol ?
317 m_spInternetProtocol->UnlockRequest() : 317 m_spInternetProtocol->UnlockRequest() :
318 E_UNEXPECTED; 318 E_UNEXPECTED;
319 } 319 }
320 320
321 // IInternetProtocolInfo 321 // IInternetProtocolInfo
322 inline STDMETHODIMP IInternetProtocolImpl::ParseUrl( 322 inline STDMETHODIMP IInternetProtocolImpl::ParseUrl(
323 /* [in] */ LPCWSTR pwzUrl, 323 /* [in] */ LPCWSTR pwzUrl,
324 /* [in] */ PARSEACTION ParseAction, 324 /* [in] */ PARSEACTION ParseAction,
325 /* [in] */ DWORD dwParseFlags, 325 /* [in] */ DWORD dwParseFlags,
326 /* [out] */ LPWSTR pwzResult, 326 /* [out] */ LPWSTR pwzResult,
327 /* [in] */ DWORD cchResult, 327 /* [in] */ DWORD cchResult,
328 /* [out] */ DWORD *pcchResult, 328 /* [out] */ DWORD *pcchResult,
329 /* [in] */ DWORD dwReserved) 329 /* [in] */ DWORD dwReserved)
330 { 330 {
331 ATLASSERT(m_spInternetProtocolInfo != 0); 331 ATLASSERT(m_spInternetProtocolInfo != 0);
332 return m_spInternetProtocolInfo ? 332 return m_spInternetProtocolInfo ?
333 m_spInternetProtocolInfo->ParseUrl(pwzUrl, ParseAction, dwParseF lags, 333 m_spInternetProtocolInfo->ParseUrl(pwzUrl, ParseAction, dwParseFlags,
334 pwzResult, cchResult, pcchResult, dwReserved) : 334 pwzResult, cchResult, pcchResult, dwReserved) :
335 E_UNEXPECTED; 335 E_UNEXPECTED;
336 } 336 }
337 337
338 inline STDMETHODIMP IInternetProtocolImpl::CombineUrl( 338 inline STDMETHODIMP IInternetProtocolImpl::CombineUrl(
339 /* [in] */ LPCWSTR pwzBaseUrl, 339 /* [in] */ LPCWSTR pwzBaseUrl,
340 /* [in] */ LPCWSTR pwzRelativeUrl, 340 /* [in] */ LPCWSTR pwzRelativeUrl,
341 /* [in] */ DWORD dwCombineFlags, 341 /* [in] */ DWORD dwCombineFlags,
342 /* [out] */ LPWSTR pwzResult, 342 /* [out] */ LPWSTR pwzResult,
343 /* [in] */ DWORD cchResult, 343 /* [in] */ DWORD cchResult,
344 /* [out] */ DWORD *pcchResult, 344 /* [out] */ DWORD *pcchResult,
345 /* [in] */ DWORD dwReserved) 345 /* [in] */ DWORD dwReserved)
346 { 346 {
347 ATLASSERT(m_spInternetProtocolInfo != 0); 347 ATLASSERT(m_spInternetProtocolInfo != 0);
348 return m_spInternetProtocolInfo ? 348 return m_spInternetProtocolInfo ?
349 m_spInternetProtocolInfo->CombineUrl(pwzBaseUrl, pwzRelativeUrl, 349 m_spInternetProtocolInfo->CombineUrl(pwzBaseUrl, pwzRelativeUrl,
350 dwCombineFlags, pwzResult, cchResult, pcchResult, dwRese rved) : 350 dwCombineFlags, pwzResult, cchResult, pcchResult, dwReserved) :
351 E_UNEXPECTED; 351 E_UNEXPECTED;
352 } 352 }
353 353
354 inline STDMETHODIMP IInternetProtocolImpl::CompareUrl( 354 inline STDMETHODIMP IInternetProtocolImpl::CompareUrl(
355 /* [in] */ LPCWSTR pwzUrl1, 355 /* [in] */ LPCWSTR pwzUrl1,
356 /* [in] */ LPCWSTR pwzUrl2, 356 /* [in] */ LPCWSTR pwzUrl2,
357 /* [in] */ DWORD dwCompareFlags) 357 /* [in] */ DWORD dwCompareFlags)
358 { 358 {
359 ATLASSERT(m_spInternetProtocolInfo != 0); 359 ATLASSERT(m_spInternetProtocolInfo != 0);
360 return m_spInternetProtocolInfo ? 360 return m_spInternetProtocolInfo ?
361 m_spInternetProtocolInfo->CompareUrl(pwzUrl1,pwzUrl2, dwCompareF lags) : 361 m_spInternetProtocolInfo->CompareUrl(pwzUrl1,pwzUrl2, dwCompareFlags) :
362 E_UNEXPECTED; 362 E_UNEXPECTED;
363 } 363 }
364 364
365 inline STDMETHODIMP IInternetProtocolImpl::QueryInfo( 365 inline STDMETHODIMP IInternetProtocolImpl::QueryInfo(
366 /* [in] */ LPCWSTR pwzUrl, 366 /* [in] */ LPCWSTR pwzUrl,
367 /* [in] */ QUERYOPTION QueryOption, 367 /* [in] */ QUERYOPTION QueryOption,
368 /* [in] */ DWORD dwQueryFlags, 368 /* [in] */ DWORD dwQueryFlags,
369 /* [in, out] */ LPVOID pBuffer, 369 /* [in, out] */ LPVOID pBuffer,
370 /* [in] */ DWORD cbBuffer, 370 /* [in] */ DWORD cbBuffer,
371 /* [in, out] */ DWORD *pcbBuf, 371 /* [in, out] */ DWORD *pcbBuf,
372 /* [in] */ DWORD dwReserved) 372 /* [in] */ DWORD dwReserved)
373 { 373 {
374 ATLASSERT(m_spInternetProtocolInfo != 0); 374 ATLASSERT(m_spInternetProtocolInfo != 0);
375 return m_spInternetProtocolInfo ? 375 return m_spInternetProtocolInfo ?
376 m_spInternetProtocolInfo->QueryInfo(pwzUrl, QueryOption, dwQuery Flags, 376 m_spInternetProtocolInfo->QueryInfo(pwzUrl, QueryOption, dwQueryFlags,
377 pBuffer, cbBuffer, pcbBuf, dwReserved) : 377 pBuffer, cbBuffer, pcbBuf, dwReserved) :
378 E_UNEXPECTED; 378 E_UNEXPECTED;
379 } 379 }
380 380
381 // IInternetPriority 381 // IInternetPriority
382 inline STDMETHODIMP IInternetProtocolImpl::SetPriority( 382 inline STDMETHODIMP IInternetProtocolImpl::SetPriority(
383 /* [in] */ LONG nPriority) 383 /* [in] */ LONG nPriority)
384 { 384 {
385 ATLASSERT(m_spInternetPriority != 0); 385 ATLASSERT(m_spInternetPriority != 0);
386 return m_spInternetPriority ? 386 return m_spInternetPriority ?
387 m_spInternetPriority->SetPriority(nPriority) : 387 m_spInternetPriority->SetPriority(nPriority) :
388 E_UNEXPECTED; 388 E_UNEXPECTED;
389 } 389 }
390 390
391 inline STDMETHODIMP IInternetProtocolImpl::GetPriority( 391 inline STDMETHODIMP IInternetProtocolImpl::GetPriority(
392 /* [out] */ LONG *pnPriority) 392 /* [out] */ LONG *pnPriority)
393 { 393 {
394 ATLASSERT(m_spInternetPriority != 0); 394 ATLASSERT(m_spInternetPriority != 0);
395 return m_spInternetPriority ? 395 return m_spInternetPriority ?
396 m_spInternetPriority->GetPriority(pnPriority) : 396 m_spInternetPriority->GetPriority(pnPriority) :
397 E_UNEXPECTED; 397 E_UNEXPECTED;
398 } 398 }
399 399
400 // IInternetThreadSwitch 400 // IInternetThreadSwitch
401 inline STDMETHODIMP IInternetProtocolImpl::Prepare() 401 inline STDMETHODIMP IInternetProtocolImpl::Prepare()
402 { 402 {
403 ATLASSERT(m_spInternetThreadSwitch != 0); 403 ATLASSERT(m_spInternetThreadSwitch != 0);
404 return m_spInternetThreadSwitch ? 404 return m_spInternetThreadSwitch ?
405 m_spInternetThreadSwitch->Prepare() : 405 m_spInternetThreadSwitch->Prepare() :
406 E_UNEXPECTED; 406 E_UNEXPECTED;
407 } 407 }
408 408
409 inline STDMETHODIMP IInternetProtocolImpl::Continue() 409 inline STDMETHODIMP IInternetProtocolImpl::Continue()
410 { 410 {
411 ATLASSERT(m_spInternetThreadSwitch != 0); 411 ATLASSERT(m_spInternetThreadSwitch != 0);
412 return m_spInternetThreadSwitch ? 412 return m_spInternetThreadSwitch ?
413 m_spInternetThreadSwitch->Continue() : 413 m_spInternetThreadSwitch->Continue() :
414 E_UNEXPECTED; 414 E_UNEXPECTED;
415 } 415 }
416 416
417 // IWinInetInfo 417 // IWinInetInfo
418 inline STDMETHODIMP IInternetProtocolImpl::QueryOption( 418 inline STDMETHODIMP IInternetProtocolImpl::QueryOption(
419 /* [in] */ DWORD dwOption, 419 /* [in] */ DWORD dwOption,
420 /* [in, out] */ LPVOID pBuffer, 420 /* [in, out] */ LPVOID pBuffer,
421 /* [in, out] */ DWORD *pcbBuf) 421 /* [in, out] */ DWORD *pcbBuf)
422 { 422 {
423 ATLASSERT(m_spWinInetInfo != 0); 423 ATLASSERT(m_spWinInetInfo != 0);
424 return m_spWinInetInfo ? 424 return m_spWinInetInfo ?
425 m_spWinInetInfo->QueryOption(dwOption, pBuffer, pcbBuf) : 425 m_spWinInetInfo->QueryOption(dwOption, pBuffer, pcbBuf) :
426 E_UNEXPECTED; 426 E_UNEXPECTED;
427 } 427 }
428 428
429 // IWinInetHttpInfo 429 // IWinInetHttpInfo
430 inline STDMETHODIMP IInternetProtocolImpl::QueryInfo( 430 inline STDMETHODIMP IInternetProtocolImpl::QueryInfo(
431 /* [in] */ DWORD dwOption, 431 /* [in] */ DWORD dwOption,
432 /* [in, out] */ LPVOID pBuffer, 432 /* [in, out] */ LPVOID pBuffer,
433 /* [in, out] */ DWORD *pcbBuf, 433 /* [in, out] */ DWORD *pcbBuf,
434 /* [in, out] */ DWORD *pdwFlags, 434 /* [in, out] */ DWORD *pdwFlags,
435 /* [in, out] */ DWORD *pdwReserved) 435 /* [in, out] */ DWORD *pdwReserved)
436 { 436 {
437 ATLASSERT(m_spWinInetHttpInfo != 0); 437 ATLASSERT(m_spWinInetHttpInfo != 0);
438 return m_spWinInetHttpInfo ? 438 return m_spWinInetHttpInfo ?
439 m_spWinInetHttpInfo->QueryInfo(dwOption, pBuffer, pcbBuf, pdwFla gs, 439 m_spWinInetHttpInfo->QueryInfo(dwOption, pBuffer, pcbBuf, pdwFlags,
440 pdwReserved) : 440 pdwReserved) :
441 E_UNEXPECTED; 441 E_UNEXPECTED;
442 } 442 }
443 443
444 // ===== IInternetProtocolSinkImpl ===== 444 // ===== IInternetProtocolSinkImpl =====
445 445
446 inline HRESULT IInternetProtocolSinkImpl::OnStart(LPCWSTR szUrl, 446 inline HRESULT IInternetProtocolSinkImpl::OnStart(LPCWSTR szUrl,
447 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, 447 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
448 DWORD grfPI, DWORD dwReserved, IInternetProtocol* pTargetProtocol) 448 DWORD grfPI, DWORD dwReserved, IInternetProtocol* pTargetProtocol)
449 { 449 {
450 ATLASSERT(pOIProtSink != 0); 450 ATLASSERT(pOIProtSink != 0);
451 ATLASSERT(pOIBindInfo != 0); 451 ATLASSERT(pOIBindInfo != 0);
452 ATLASSERT(pTargetProtocol != 0); 452 ATLASSERT(pTargetProtocol != 0);
453 if (!pOIProtSink || !pOIBindInfo || !pTargetProtocol) 453 if (!pOIProtSink || !pOIBindInfo || !pTargetProtocol)
454 { 454 {
455 return E_POINTER; 455 return E_POINTER;
456 } 456 }
457 457
458 // This method should only be called once, and be the only source 458 // This method should only be called once, and be the only source
459 // of target interface pointers. 459 // of target interface pointers.
460 ATLASSERT(m_spInternetProtocolSink == 0); 460 ATLASSERT(m_spInternetProtocolSink == 0);
461 ATLASSERT(m_spInternetBindInfo == 0); 461 ATLASSERT(m_spInternetBindInfo == 0);
462 ATLASSERT(m_spTargetProtocol == 0); 462 ATLASSERT(m_spTargetProtocol == 0);
463 if (m_spInternetProtocolSink || m_spInternetBindInfo || m_spTargetProtoc ol) 463 if (m_spInternetProtocolSink || m_spInternetBindInfo || m_spTargetProtocol)
464 { 464 {
465 return E_UNEXPECTED; 465 return E_UNEXPECTED;
466 } 466 }
467 467
468 ATLASSERT(m_spServiceProvider == 0); 468 ATLASSERT(m_spServiceProvider == 0);
469 469
470 m_spInternetProtocolSink = pOIProtSink; 470 m_spInternetProtocolSink = pOIProtSink;
471 m_spInternetBindInfo = pOIBindInfo; 471 m_spInternetBindInfo = pOIBindInfo;
472 m_spTargetProtocol = pTargetProtocol; 472 m_spTargetProtocol = pTargetProtocol;
473 return S_OK; 473 return S_OK;
474 } 474 }
475 475
476 inline void IInternetProtocolSinkImpl::ReleaseAll() 476 inline void IInternetProtocolSinkImpl::ReleaseAll()
477 { 477 {
478 m_spInternetProtocolSink.Release(); 478 m_spInternetProtocolSink.Release();
479 m_spServiceProvider.Release(); 479 m_spServiceProvider.Release();
480 m_spInternetBindInfo.Release(); 480 m_spInternetBindInfo.Release();
481 m_spTargetProtocol.Release(); 481 m_spTargetProtocol.Release();
482 } 482 }
483 483
484 inline IServiceProvider* IInternetProtocolSinkImpl::GetClientServiceProvider() 484 inline IServiceProvider* IInternetProtocolSinkImpl::GetClientServiceProvider()
485 { 485 {
486 return m_spServiceProvider; 486 return m_spServiceProvider;
487 } 487 }
488 488
489 inline HRESULT IInternetProtocolSinkImpl::QueryServiceFromClient( 489 inline HRESULT IInternetProtocolSinkImpl::QueryServiceFromClient(
490 REFGUID guidService, REFIID riid, void** ppvObject) 490 REFGUID guidService, REFIID riid, void** ppvObject)
491 { 491 {
492 HRESULT hr = S_OK; 492 HRESULT hr = S_OK;
493 CComPtr<IServiceProvider> spClientProvider = m_spServiceProvider; 493 CComPtr<IServiceProvider> spClientProvider = m_spServiceProvider;
494 if (!spClientProvider) 494 if (!spClientProvider)
495 { 495 {
496 hr = m_spInternetProtocolSink->QueryInterface(&spClientProvider) ; 496 hr = m_spInternetProtocolSink->QueryInterface(&spClientProvider);
497 ATLASSERT(SUCCEEDED(hr) && spClientProvider != 0); 497 ATLASSERT(SUCCEEDED(hr) && spClientProvider != 0);
498 } 498 }
499 if (SUCCEEDED(hr)) 499 if (SUCCEEDED(hr))
500 { 500 {
501 hr = spClientProvider->QueryService(guidService, riid, ppvObject ); 501 hr = spClientProvider->QueryService(guidService, riid, ppvObject);
502 } 502 }
503 return hr; 503 return hr;
504 } 504 }
505 505
506 // IInternetProtocolSink 506 // IInternetProtocolSink
507 inline STDMETHODIMP IInternetProtocolSinkImpl::Switch( 507 inline STDMETHODIMP IInternetProtocolSinkImpl::Switch(
508 /* [in] */ PROTOCOLDATA *pProtocolData) 508 /* [in] */ PROTOCOLDATA *pProtocolData)
509 { 509 {
510 ATLASSERT(m_spInternetProtocolSink != 0); 510 ATLASSERT(m_spInternetProtocolSink != 0);
511 return m_spInternetProtocolSink ? 511 return m_spInternetProtocolSink ?
512 m_spInternetProtocolSink->Switch(pProtocolData) : 512 m_spInternetProtocolSink->Switch(pProtocolData) :
513 E_UNEXPECTED; 513 E_UNEXPECTED;
514 } 514 }
515 515
516 inline STDMETHODIMP IInternetProtocolSinkImpl::ReportProgress( 516 inline STDMETHODIMP IInternetProtocolSinkImpl::ReportProgress(
517 /* [in] */ ULONG ulStatusCode, 517 /* [in] */ ULONG ulStatusCode,
518 /* [in] */ LPCWSTR szStatusText) 518 /* [in] */ LPCWSTR szStatusText)
519 { 519 {
520 ATLASSERT(m_spInternetProtocolSink != 0); 520 ATLASSERT(m_spInternetProtocolSink != 0);
521 return m_spInternetProtocolSink ? 521 return m_spInternetProtocolSink ?
522 m_spInternetProtocolSink->ReportProgress(ulStatusCode, szStatusT ext) : 522 m_spInternetProtocolSink->ReportProgress(ulStatusCode, szStatusText) :
523 E_UNEXPECTED; 523 E_UNEXPECTED;
524 } 524 }
525 525
526 inline STDMETHODIMP IInternetProtocolSinkImpl::ReportData( 526 inline STDMETHODIMP IInternetProtocolSinkImpl::ReportData(
527 /* [in] */ DWORD grfBSCF, 527 /* [in] */ DWORD grfBSCF,
528 /* [in] */ ULONG ulProgress, 528 /* [in] */ ULONG ulProgress,
529 /* [in] */ ULONG ulProgressMax) 529 /* [in] */ ULONG ulProgressMax)
530 { 530 {
531 ATLASSERT(m_spInternetProtocolSink != 0); 531 ATLASSERT(m_spInternetProtocolSink != 0);
532 return m_spInternetProtocolSink ? 532 return m_spInternetProtocolSink ?
533 m_spInternetProtocolSink->ReportData(grfBSCF, ulProgress, 533 m_spInternetProtocolSink->ReportData(grfBSCF, ulProgress,
534 ulProgressMax) : 534 ulProgressMax) :
535 E_UNEXPECTED; 535 E_UNEXPECTED;
536 } 536 }
537 537
538 inline STDMETHODIMP IInternetProtocolSinkImpl::ReportResult( 538 inline STDMETHODIMP IInternetProtocolSinkImpl::ReportResult(
539 /* [in] */ HRESULT hrResult, 539 /* [in] */ HRESULT hrResult,
540 /* [in] */ DWORD dwError, 540 /* [in] */ DWORD dwError,
541 /* [in] */ LPCWSTR szResult) 541 /* [in] */ LPCWSTR szResult)
542 { 542 {
543 // ATLASSERT(m_spInternetProtocolSink != 0); 543 ATLASSERT(m_spInternetProtocolSink != 0);
544 return m_spInternetProtocolSink ? 544
545 m_spInternetProtocolSink->ReportResult(hrResult, dwError, szResu lt) : 545 // On some websites there are broken requests, that keep on redirecting with out a stop.
546 E_UNEXPECTED; 546 // For example: http://telegrafua.com/ has a request to: http://www.ool.ua/w ebroot/delivery/images/ool-button.gif
547 } 547 // which causes IE tab to crash in urlmon.dll. That request doesn't ever res olve, since it's constantly responding
548 548 // with HTTP 302.
549 // IServiceProvider 549
550 inline STDMETHODIMP IInternetProtocolSinkImpl::QueryService( 550 // It seems like WinInet (urlmon.dll) doesn't expect anything like that to h appen, and relies on APP to make sure it doesn't.
551 /* [in] */ REFGUID guidService, 551 // So here we detect if there has been too many redirects (ie INET_E_REDIREC T_FAILED) and we just notify WinInet
552 /* [in] */ REFIID riid, 552 // that there has been a generic problem, not redirect specific error.
553 /* [out] */ void** ppvObject) 553
554 { 554 if (hrResult == INET_E_REDIRECT_FAILED)
555 ATLASSERT(m_spServiceProvider != 0); 555 hrResult = S_FALSE;
Wladimir Palant 2013/03/05 15:21:48 Is that issue really specific to INET_E_REDIRECT_F
Oleksandr 2013/03/05 18:03:08 I have not seen anything like this for any other e
556 return m_spServiceProvider ? 556
557 m_spServiceProvider->QueryService(guidService, riid, ppvObject) : 557 return m_spInternetProtocolSink ?
558 E_UNEXPECTED; 558 m_spInternetProtocolSink->ReportResult(hrResult, dwError, szResult) :
559 } 559 E_UNEXPECTED;
Oleksandr 2013/03/05 13:44:10 The actual fix is below. All other changes are jus
Wladimir Palant 2013/03/05 15:21:48 In general, it's a good idea to separate style cha
560 560 }
561 // IInternetBindInfo 561
562 inline STDMETHODIMP IInternetProtocolSinkImpl::GetBindInfo( 562 // IServiceProvider
563 /* [out] */ DWORD *grfBINDF, 563 inline STDMETHODIMP IInternetProtocolSinkImpl::QueryService(
564 /* [in, out] */ BINDINFO *pbindinfo) 564 /* [in] */ REFGUID guidService,
565 { 565 /* [in] */ REFIID riid,
566 ATLASSERT(m_spInternetBindInfo != 0); 566 /* [out] */ void** ppvObject)
567 return m_spInternetBindInfo ? 567 {
568 m_spInternetBindInfo->GetBindInfo(grfBINDF, pbindinfo) : 568 ATLASSERT(m_spServiceProvider != 0);
569 E_UNEXPECTED; 569 return m_spServiceProvider ?
570 } 570 m_spServiceProvider->QueryService(guidService, riid, ppvObject) :
571 571 E_UNEXPECTED;
572 inline STDMETHODIMP IInternetProtocolSinkImpl::GetBindString( 572 }
573 /* [in] */ ULONG ulStringType, 573
574 /* [in, out] */ LPOLESTR *ppwzStr, 574 // IInternetBindInfo
575 /* [in] */ ULONG cEl, 575 inline STDMETHODIMP IInternetProtocolSinkImpl::GetBindInfo(
576 /* [in, out] */ ULONG *pcElFetched) 576 /* [out] */ DWORD *grfBINDF,
577 { 577 /* [in, out] */ BINDINFO *pbindinfo)
578 ATLASSERT(m_spInternetBindInfo != 0); 578 {
579 return m_spInternetBindInfo ? 579 ATLASSERT(m_spInternetBindInfo != 0);
580 m_spInternetBindInfo->GetBindString(ulStringType, ppwzStr, cEl, 580 return m_spInternetBindInfo ?
581 pcElFetched) : 581 m_spInternetBindInfo->GetBindInfo(grfBINDF, pbindinfo) :
582 E_UNEXPECTED; 582 E_UNEXPECTED;
583 } 583 }
584 584
585 // ===== CInternetProtocolSinkWithSP ===== 585 inline STDMETHODIMP IInternetProtocolSinkImpl::GetBindString(
586 586 /* [in] */ ULONG ulStringType,
587 template <class T, class ThreadModel> 587 /* [in, out] */ LPOLESTR *ppwzStr,
588 inline HRESULT CInternetProtocolSinkWithSP<T, ThreadModel>::OnStart( 588 /* [in] */ ULONG cEl,
589 LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, 589 /* [in, out] */ ULONG *pcElFetched)
590 IInternetBindInfo *pOIBindInfo, DWORD grfPI, DWORD dwReserved, 590 {
591 IInternetProtocol* pTargetProtocol) 591 ATLASSERT(m_spInternetBindInfo != 0);
592 { 592 return m_spInternetBindInfo ?
593 ATLASSERT(m_spServiceProvider == 0); 593 m_spInternetBindInfo->GetBindString(ulStringType, ppwzStr, cEl,
594 if (m_spServiceProvider) 594 pcElFetched) :
595 { 595 E_UNEXPECTED;
596 return E_UNEXPECTED; 596 }
597 } 597
598 HRESULT hr = BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, 598 // ===== CInternetProtocolSinkWithSP =====
599 dwReserved, pTargetProtocol); 599
600 if (SUCCEEDED(hr)) 600 template <class T, class ThreadModel>
601 { 601 inline HRESULT CInternetProtocolSinkWithSP<T, ThreadModel>::OnStart(
602 pOIProtSink->QueryInterface(&m_spServiceProvider); 602 LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink,
603 } 603 IInternetBindInfo *pOIBindInfo, DWORD grfPI, DWORD dwReserved,
604 return hr; 604 IInternetProtocol* pTargetProtocol)
605 } 605 {
606 606 ATLASSERT(m_spServiceProvider == 0);
607 template <class T, class ThreadModel> 607 if (m_spServiceProvider)
608 inline HRESULT CInternetProtocolSinkWithSP<T, ThreadModel>:: 608 {
609 _InternalQueryService(REFGUID guidService, REFIID riid, void** ppvObject ) 609 return E_UNEXPECTED;
610 { 610 }
611 return E_NOINTERFACE; 611 HRESULT hr = BaseClass::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI,
612 } 612 dwReserved, pTargetProtocol);
613 613 if (SUCCEEDED(hr))
614 template <class T, class ThreadModel> 614 {
615 inline STDMETHODIMP CInternetProtocolSinkWithSP<T, ThreadModel>::QueryService( 615 pOIProtSink->QueryInterface(&m_spServiceProvider);
616 REFGUID guidService, REFIID riid, void** ppv) 616 }
617 { 617 return hr;
618 T* pT = static_cast<T*>(this); 618 }
619 HRESULT hr = pT->_InternalQueryService(guidService, riid, ppv); 619
620 if (FAILED(hr) && m_spServiceProvider) 620 template <class T, class ThreadModel>
621 { 621 inline HRESULT CInternetProtocolSinkWithSP<T, ThreadModel>::
622 hr = m_spServiceProvider->QueryService(guidService, riid, ppv); 622 _InternalQueryService(REFGUID guidService, REFIID riid, void** ppvObject)
623 } 623 {
624 return hr; 624 return E_NOINTERFACE;
625 } 625 }
626 626
627 // ===== NoSinkStartPolicy ===== 627 template <class T, class ThreadModel>
628 628 inline STDMETHODIMP CInternetProtocolSinkWithSP<T, ThreadModel>::QueryService(
629 inline HRESULT NoSinkStartPolicy::OnStart(LPCWSTR szUrl, 629 REFGUID guidService, REFIID riid, void** ppv)
630 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, 630 {
631 DWORD grfPI, DWORD dwReserved, IInternetProtocol* pTargetProtocol) 631 T* pT = static_cast<T*>(this);
632 { 632 HRESULT hr = pT->_InternalQueryService(guidService, riid, ppv);
633 // ATLASSERT(pTargetProtocol != 0); 633 if (FAILED(hr) && m_spServiceProvider)
634 return pTargetProtocol->Start(szUrl, pOIProtSink, pOIBindInfo, 634 {
635 grfPI, dwReserved); 635 hr = m_spServiceProvider->QueryService(guidService, riid, ppv);
636 } 636 }
637 637 return hr;
638 // ===== CComObjectSharedRef ===== 638 }
639 639
640 template<class Base> 640 // ===== NoSinkStartPolicy =====
641 inline CComObjectSharedRef<Base>::CComObjectSharedRef(IUnknown* punkOuter) : 641
642 m_punkOuter(punkOuter) 642 inline HRESULT NoSinkStartPolicy::OnStart(LPCWSTR szUrl,
643 { 643 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
644 ATLASSERT(m_punkOuter != 0); 644 DWORD grfPI, DWORD dwReserved, IInternetProtocol* pTargetProtocol)
645 } 645 {
646 646 ATLASSERT(pTargetProtocol != 0);
647 template<class Base> 647 return pTargetProtocol->Start(szUrl, pOIProtSink, pOIBindInfo,
648 inline STDMETHODIMP CComObjectSharedRef<Base>::QueryInterface(REFIID iid, 648 grfPI, dwReserved);
649 void** ppvObject) 649 }
650 { 650
651 return _InternalQueryInterface(iid, ppvObject); 651 // ===== CComObjectSharedRef =====
652 } 652
653 653 template<class Base>
654 template<class Base> 654 inline CComObjectSharedRef<Base>::CComObjectSharedRef(IUnknown* punkOuter) :
655 inline STDMETHODIMP_(ULONG) CComObjectSharedRef<Base>::AddRef() 655 m_punkOuter(punkOuter)
656 { 656 {
657 if (m_punkOuter) 657 ATLASSERT(m_punkOuter != 0);
658 { 658 }
659 m_punkOuter->AddRef(); 659
660 } 660 template<class Base>
661 return InternalAddRef(); 661 inline STDMETHODIMP CComObjectSharedRef<Base>::QueryInterface(REFIID iid,
662 } 662 void** ppvObject)
663 663 {
664 template<class Base> 664 HRESULT hr = _InternalQueryInterface(iid, ppvObject);
665 inline STDMETHODIMP_(ULONG) CComObjectSharedRef<Base>::Release() 665
666 { 666 return hr;
667 ULONG l = InternalRelease(); 667
668 if (!l) 668 }
669 { 669
670 ReleaseAll(); 670 template<class Base>
671 } 671 inline STDMETHODIMP_(ULONG) CComObjectSharedRef<Base>::AddRef()
672 if (m_punkOuter) 672 {
673 { 673 if (m_punkOuter)
674 m_punkOuter->Release(); 674 {
675 } 675 m_punkOuter->AddRef();
676 return l; 676 }
677 } 677 return InternalAddRef();
678 678 }
679 // ===== CustomSinkStartPolicy ===== 679
680 680 template<class Base>
681 template <class Sink> 681 inline STDMETHODIMP_(ULONG) CComObjectSharedRef<Base>::Release()
682 inline CustomSinkStartPolicy<Sink>:: 682 {
683 CustomSinkStartPolicy(IUnknown* punkOuter) : 683 ULONG l = InternalRelease();
684 m_internetSink(punkOuter) 684 if (!l)
685 { 685 {
686 } 686 ReleaseAll();
687 687 }
688 template <class Sink> 688 if (m_punkOuter)
689 inline HRESULT CustomSinkStartPolicy<Sink>::OnStart(LPCWSTR szUrl, 689 {
690 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, 690 m_punkOuter->Release();
691 DWORD grfPI, DWORD dwReserved, IInternetProtocol* pTargetProtocol) 691 }
692 { 692 return l;
693 ATLASSERT(pTargetProtocol); 693 }
694 HRESULT hr = m_internetSink.OnStart(szUrl, pOIProtSink, pOIBindInfo, 694
695 grfPI, dwReserved, pTargetProtocol); 695 // ===== CustomSinkStartPolicy =====
696 696
697 //We return INET_E_REDIRECT_FAILED in case we have iframe blocking. 697 template <class Sink>
698 if (hr == INET_E_REDIRECT_FAILED) 698 inline CustomSinkStartPolicy<Sink>::
699 { 699 CustomSinkStartPolicy(IUnknown* punkOuter) :
700 return S_OK; 700 m_internetSink(punkOuter)
701 } 701 {
702 CComPtr<IInternetProtocolSink> spSink; 702 }
703 CComPtr<IInternetBindInfo> spBindInfo; 703
704 if (SUCCEEDED(hr)) 704 template <class Sink>
705 { 705 inline HRESULT CustomSinkStartPolicy<Sink>::OnStart(LPCWSTR szUrl,
706 hr = m_internetSink.QueryInterface(&spSink); 706 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
707 ATLASSERT(SUCCEEDED(hr) && spSink != 0); 707 DWORD grfPI, DWORD dwReserved, IInternetProtocol* pTargetProtocol)
708 } 708 {
709 if (SUCCEEDED(hr)) 709 ATLASSERT(pTargetProtocol);
710 { 710 HRESULT hr = m_internetSink.OnStart(szUrl, pOIProtSink, pOIBindInfo,
711 hr = m_internetSink.QueryInterface(&spBindInfo); 711 grfPI, dwReserved, pTargetProtocol);
712 ATLASSERT(SUCCEEDED(hr) && spBindInfo != 0); 712
713 } 713 //We return INET_E_REDIRECT_FAILED in case we have iframe blocking.
714 if (SUCCEEDED(hr)) 714 if (hr == INET_E_REDIRECT_FAILED)
715 { 715 {
716 hr = pTargetProtocol->Start(szUrl, spSink, spBindInfo, grfPI, 716 return hr;
717 dwReserved); 717 }
718 } 718 CComPtr<IInternetProtocolSink> spSink;
719 else 719 CComPtr<IInternetBindInfo> spBindInfo;
720 { 720 if (SUCCEEDED(hr))
721 721 {
722 } 722 hr = m_internetSink.QueryInterface(&spSink);
723 return hr; 723 ATLASSERT(SUCCEEDED(hr) && spSink != 0);
724 } 724 }
725 template <class Sink> 725 if (SUCCEEDED(hr))
726 inline HRESULT CustomSinkStartPolicy<Sink>::Read(/* [in, out] */ void *pv,/* [in ] */ ULONG cb,/* [out] */ ULONG *pcbRead) 726 {
727 { 727 hr = m_internetSink.QueryInterface(&spBindInfo);
728 return m_internetSink.Read(pv, cb, pcbRead); 728 ATLASSERT(SUCCEEDED(hr) && spBindInfo != 0);
729 } 729 }
730 730 if (SUCCEEDED(hr))
731 // ===== CInternetProtocol ===== 731 {
732 732 hr = pTargetProtocol->Start(szUrl, spSink, spBindInfo, grfPI,
733 template <class StartPolicy, class ThreadModel> 733 dwReserved);
734 inline CInternetProtocol<StartPolicy, ThreadModel>::CInternetProtocol() : 734 }
735 StartPolicy(GetUnknown()) 735 else
736 { 736 {
737 } 737
738 738 }
739 // IInternetProtocolRoot 739 return hr;
740 template <class StartPolicy, class ThreadModel> 740 }
741 inline STDMETHODIMP CInternetProtocol<StartPolicy, ThreadModel>::Start( 741 template <class Sink>
742 LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, 742 inline HRESULT CustomSinkStartPolicy<Sink>::Read(/* [in, out] */ void *pv,/* [ in] */ ULONG cb,/* [out] */ ULONG *pcbRead)
743 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved) 743 {
744 { 744 return m_internetSink.Read(pv, cb, pcbRead);
745 ATLASSERT(m_spInternetProtocol != 0); 745 }
746 if (!m_spInternetProtocol) 746
747 { 747 // ===== CInternetProtocol =====
748 return E_UNEXPECTED; 748
749 } 749 template <class StartPolicy, class ThreadModel>
750 750 inline CInternetProtocol<StartPolicy, ThreadModel>::CInternetProtocol() :
751 return StartPolicy::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI, 751 StartPolicy(GetUnknown())
752 dwReserved, m_spInternetProtocol); 752 {
753 } 753 }
754 template <class StartPolicy, class ThreadModel> 754
755 inline STDMETHODIMP CInternetProtocol<StartPolicy, ThreadModel>::Read( 755 // IInternetProtocolRoot
756 /* [in, out] */ void *pv, 756 template <class StartPolicy, class ThreadModel>
757 /* [in] */ ULONG cb, 757 inline STDMETHODIMP CInternetProtocol<StartPolicy, ThreadModel>::Start(
758 /* [out] */ ULONG *pcbRead) 758 LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink,
759 { 759 IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
760 return StartPolicy::Read(pv, cb, pcbRead); 760 {
761 } 761 ATLASSERT(m_spInternetProtocol != 0);
762 if (!m_spInternetProtocol)
763 {
764 return E_UNEXPECTED;
765 }
766
767 return StartPolicy::OnStart(szUrl, pOIProtSink, pOIBindInfo, grfPI,
768 dwReserved, m_spInternetProtocol);
769 }
770 template <class StartPolicy, class ThreadModel>
771 inline STDMETHODIMP CInternetProtocol<StartPolicy, ThreadModel>::Read(
772 /* [in, out] */ void *pv,
773 /* [in] */ ULONG cb,
774 /* [out] */ ULONG *pcbRead)
775 {
776 return StartPolicy::Read(pv, cb, pcbRead);
777 }
762 } // end namespace PassthroughAPP 778 } // end namespace PassthroughAPP
763 779
764 #endif // PASSTHROUGHAPP_PROTOCOLIMPL_INL 780 #endif // PASSTHROUGHAPP_PROTOCOLIMPL_INL
OLDNEW
« no previous file with comments | « Shared/PluginMimeFilterClient.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld