ReactOS  0.4.14-dev-599-g2d4d3f5
protocol.c
Go to the documentation of this file.
1 /*
2  * Copyright 2017 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 
19 #define COBJMACROS
20 #define NONAMELESSUNION
21 
22 #include <assert.h>
23 
24 #include "mimeole.h"
25 #include "inetcomm_private.h"
26 
27 #include "wine/debug.h"
28 #include "wine/heap.h"
29 
31 
32 typedef struct {
36 
39 
44 
45 typedef struct {
46  const WCHAR *mhtml;
47  size_t mhtml_len;
48  const WCHAR *location;
49 } mhtml_url_t;
50 
51 typedef struct {
53 
55 
59  WCHAR url[1];
61 
62 static const WCHAR mhtml_prefixW[] = {'m','h','t','m','l',':'};
63 static const WCHAR mhtml_separatorW[] = {'!','x','-','u','s','c',':'};
64 
66 {
67  LPWSTR ret = NULL;
68 
69  if(str) {
70  DWORD size;
71 
72  size = (lstrlenW(str)+1)*sizeof(WCHAR);
73  ret = heap_alloc(size);
74  if(ret)
75  memcpy(ret, str, size);
76  }
77 
78  return ret;
79 }
80 
82 {
83  const WCHAR *p;
84 
86  return E_FAIL;
87 
88  r->mhtml = url + ARRAY_SIZE(mhtml_prefixW);
89  p = wcschr(r->mhtml, '!');
90  if(p) {
91  r->mhtml_len = p - r->mhtml;
92  /* FIXME: We handle '!' and '!x-usc:' in URLs as the same thing. Those should not be the same. */
95  else
96  p++;
97  }else {
98  r->mhtml_len = lstrlenW(r->mhtml);
99  }
100 
101  r->location = p;
102  return S_OK;
103 }
104 
106 {
107  if(protocol->sink) {
108  IInternetProtocolSink_ReportResult(protocol->sink, result, ERROR_SUCCESS, NULL);
109  IInternetProtocolSink_Release(protocol->sink);
110  protocol->sink = NULL;
111  }
112 
113  return result;
114 }
115 
117 {
118  FINDBODY find = {NULL};
119  IMimeBody *mime_body;
120  PROPVARIANT value;
121  HBODY body;
122  HRESULT hres;
123 
124  hres = IMimeMessage_FindFirst(mime_message, &find, &body);
125  if(FAILED(hres))
126  return report_result(protocol, hres);
127 
128  if(protocol->location) {
129  BOOL found = FALSE;
130  do {
131  hres = IMimeMessage_FindNext(mime_message, &find, &body);
132  if(FAILED(hres)) {
133  WARN("location %s not found\n", debugstr_w(protocol->location));
134  return report_result(protocol, hres);
135  }
136 
137  value.vt = VT_LPWSTR;
138  hres = IMimeMessage_GetBodyProp(mime_message, body, "content-location", 0, &value);
139  if(hres == MIME_E_NOT_FOUND)
140  continue;
141  if(FAILED(hres))
142  return report_result(protocol, hres);
143 
144  found = !lstrcmpW(protocol->location, value.u.pwszVal);
146  }while(!found);
147  }else {
148  hres = IMimeMessage_FindNext(mime_message, &find, &body);
149  if(FAILED(hres)) {
150  WARN("location %s not found\n", debugstr_w(protocol->location));
151  return report_result(protocol, hres);
152  }
153  }
154 
155  hres = IMimeMessage_BindToObject(mime_message, body, &IID_IMimeBody, (void**)&mime_body);
156  if(FAILED(hres))
157  return report_result(protocol, hres);
158 
159  value.vt = VT_LPWSTR;
160  hres = IMimeBody_GetProp(mime_body, "content-type", 0, &value);
161  if(SUCCEEDED(hres)) {
162  hres = IInternetProtocolSink_ReportProgress(protocol->sink, BINDSTATUS_MIMETYPEAVAILABLE, value.u.pwszVal);
164  }
165 
166  /* FIXME: Create and report cache file. */
167 
168  hres = IMimeBody_GetData(mime_body, IET_DECODED, &protocol->stream);
169  if(FAILED(hres))
170  return report_result(protocol, hres);
171 
172  IInternetProtocolSink_ReportData(protocol->sink, BSCF_FIRSTDATANOTIFICATION
173  | BSCF_INTERMEDIATEDATANOTIFICATION
174  | BSCF_LASTDATANOTIFICATION
175  | BSCF_DATAFULLYAVAILABLE
176  | BSCF_AVAILABLEDATASIZEUNKNOWN, 0, 0);
177 
178  return report_result(protocol, S_OK);
179 }
180 
182 {
183  IMimeMessage *mime_message;
184  HRESULT hres;
185 
186  hres = MimeMessage_create(NULL, (void**)&mime_message);
187  if(FAILED(hres))
188  return hres;
189 
190  IMimeMessage_InitNew(mime_message);
191 
192  hres = IMimeMessage_Load(mime_message, stream);
193  if(FAILED(hres)) {
194  IMimeMessage_Release(mime_message);
195  return hres;
196  }
197 
198  *ret = mime_message;
199  return S_OK;
200 }
201 
203 {
204  return CONTAINING_RECORD(iface, MimeHtmlBinding, IBindStatusCallback_iface);
205 }
206 
208  REFIID riid, void **ppv)
209 {
211 
212  if(IsEqualGUID(&IID_IUnknown, riid)) {
213  TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
214  *ppv = &This->IBindStatusCallback_iface;
215  }else if(IsEqualGUID(&IID_IBindStatusCallback, riid)) {
216  TRACE("(%p)->(IID_IBindStatusCallback %p)\n", This, ppv);
217  *ppv = &This->IBindStatusCallback_iface;
218  }else {
219  TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
220  *ppv = NULL;
221  return E_NOINTERFACE;
222  }
223 
224  IUnknown_AddRef((IUnknown*)*ppv);
225  return S_OK;
226 }
227 
229 {
232 
233  TRACE("(%p) ref=%d\n", This, ref);
234 
235  return ref;
236 }
237 
239 {
242 
243  TRACE("(%p) ref=%d\n", This, ref);
244 
245  if(!ref) {
246  if(This->protocol)
247  IInternetProtocol_Release(&This->protocol->IInternetProtocol_iface);
248  if(This->stream)
249  IStream_Release(This->stream);
250  heap_free(This);
251  }
252 
253  return ref;
254 }
255 
257  DWORD dwReserved, IBinding *pib)
258 {
260 
261  TRACE("(%p)->(%x %p)\n", This, dwReserved, pib);
262 
263  assert(!This->stream);
264  return CreateStreamOnHGlobal(NULL, TRUE, &This->stream);
265 }
266 
268 {
269  return E_NOTIMPL;
270 }
271 
273 {
274  return E_NOTIMPL;
275 }
276 
278  ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
279 {
281  TRACE("(%p)->(%u/%u %u %s)\n", This, ulProgress, ulProgressMax, ulStatusCode, debugstr_w(szStatusText));
282  return S_OK;
283 }
284 
286 {
288  IMimeMessage *mime_message = NULL;
289 
290  TRACE("(%p)->(%x %s)\n", This, hresult, debugstr_w(szError));
291 
292  if(SUCCEEDED(hresult)) {
293  hresult = load_mime_message(This->stream, &mime_message);
294  IStream_Release(This->stream);
295  This->stream = NULL;
296  }
297 
298  This->status = hresult;
299 
300  if(mime_message)
301  on_mime_message_available(This->protocol, mime_message);
302  else
303  report_result(This->protocol, hresult);
304 
305  if(mime_message)
306  IMimeMessage_Release(mime_message);
307  IInternetProtocol_Release(&This->protocol->IInternetProtocol_iface);
308  This->protocol = NULL;
309  return S_OK;
310 }
311 
313  DWORD* grfBINDF, BINDINFO* pbindinfo)
314 {
316 
317  TRACE("(%p)\n", This);
318 
319  *grfBINDF = BINDF_ASYNCHRONOUS;
320  return S_OK;
321 }
322 
324  DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed)
325 {
327  BYTE buf[4*1024];
328  DWORD read;
329  HRESULT hres;
330 
331  TRACE("(%p)\n", This);
332 
333  assert(pstgmed->tymed == TYMED_ISTREAM);
334 
335  while(1) {
336  hres = IStream_Read(pstgmed->u.pstm, buf, sizeof(buf), &read);
337  if(FAILED(hres))
338  return hres;
339  if(!read)
340  break;
341  hres = IStream_Write(This->stream, buf, read, NULL);
342  if(FAILED(hres))
343  return hres;
344  }
345  return S_OK;
346 }
347 
349  REFIID riid, IUnknown* punk)
350 {
351  ERR("\n");
352  return E_NOTIMPL;
353 }
354 
355 static const IBindStatusCallbackVtbl BindStatusCallbackVtbl = {
367 };
368 
370 {
371  return CONTAINING_RECORD(iface, MimeHtmlProtocol, IUnknown_inner);
372 }
373 
375 {
377 
378  if(IsEqualGUID(&IID_IUnknown, riid)) {
379  TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
380  *ppv = &This->IInternetProtocol_iface;
381  }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
382  TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
383  *ppv = &This->IInternetProtocol_iface;
384  }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
385  TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
386  *ppv = &This->IInternetProtocol_iface;
387  }else if(IsEqualGUID(&IID_IInternetProtocolInfo, riid)) {
388  TRACE("(%p)->(IID_IInternetProtocolInfo %p)\n", This, ppv);
389  *ppv = &This->IInternetProtocolInfo_iface;
390  }else {
391  FIXME("unknown interface %s\n", debugstr_guid(riid));
392  *ppv = NULL;
393  return E_NOINTERFACE;
394  }
395 
396  IUnknown_AddRef((IUnknown*)*ppv);
397  return S_OK;
398 }
399 
401 {
404 
405  TRACE("(%p) ref=%d\n", This, ref);
406 
407  return ref;
408 }
409 
411 {
414 
415  TRACE("(%p) ref=%x\n", This, ref);
416 
417  if(!ref) {
418  if(This->sink)
419  IInternetProtocolSink_Release(This->sink);
420  if(This->stream)
421  IStream_Release(This->stream);
422  heap_free(This->location);
423  heap_free(This);
424  }
425 
426  return ref;
427 }
428 
429 static const IUnknownVtbl MimeHtmlProtocolInnerVtbl = {
433 };
434 
436 {
437  return CONTAINING_RECORD(iface, MimeHtmlProtocol, IInternetProtocol_iface);
438 }
439 
441 {
443  return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
444 }
445 
447 {
449  return IUnknown_AddRef(This->outer_unk);
450 }
451 
453 {
455  return IUnknown_Release(This->outer_unk);
456 }
457 
459  IInternetProtocolSink* pOIProtSink, IInternetBindInfo* pOIBindInfo,
460  DWORD grfPI, HANDLE_PTR dwReserved)
461 {
463  BINDINFO bindinfo = { sizeof(bindinfo) };
464  MimeHtmlBinding *binding;
465  IBindCtx *bind_ctx;
466  IStream *stream;
468  DWORD bindf = 0;
469  IMoniker *mon;
470  HRESULT hres;
471 
472  TRACE("(%p)->(%s %p %p %08x %lx)\n", This, debugstr_w(szUrl), pOIProtSink, pOIBindInfo, grfPI, dwReserved);
473 
474  hres = parse_mhtml_url(szUrl, &url);
475  if(FAILED(hres))
476  return hres;
477 
478  if(url.location && !(This->location = heap_strdupW(url.location)))
479  return E_OUTOFMEMORY;
480 
481  hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &bindf, &bindinfo);
482  if(FAILED(hres)) {
483  WARN("GetBindInfo failed: %08x\n", hres);
484  return hres;
485  }
486  if((bindf & (BINDF_ASYNCHRONOUS|BINDF_FROMURLMON|BINDF_NEEDFILE)) != (BINDF_ASYNCHRONOUS|BINDF_FROMURLMON|BINDF_NEEDFILE))
487  FIXME("unsupported bindf %x\n", bindf);
488 
489  IInternetProtocolSink_AddRef(This->sink = pOIProtSink);
490 
491  binding = heap_alloc(FIELD_OFFSET(MimeHtmlBinding, url[url.mhtml_len+1]));
492  if(!binding)
493  return E_OUTOFMEMORY;
494  memcpy(binding->url, url.mhtml, url.mhtml_len*sizeof(WCHAR));
495  binding->url[url.mhtml_len] = 0;
496 
497  hres = CreateURLMoniker(NULL, binding->url, &mon);
498  if(FAILED(hres)) {
499  heap_free(binding);
500  return hres;
501  }
502 
504  binding->ref = 1;
505  binding->status = E_PENDING;
506  binding->stream = NULL;
507  binding->protocol = NULL;
508 
509  hres = CreateAsyncBindCtx(0, &binding->IBindStatusCallback_iface, NULL, &bind_ctx);
510  if(FAILED(hres)) {
511  IMoniker_Release(mon);
512  IBindStatusCallback_Release(&binding->IBindStatusCallback_iface);
513  return hres;
514  }
515 
516  IInternetProtocol_AddRef(&This->IInternetProtocol_iface);
517  binding->protocol = This;
518 
519  hres = IMoniker_BindToStorage(mon, bind_ctx, NULL, &IID_IStream, (void**)&stream);
520  IBindCtx_Release(bind_ctx);
521  IMoniker_Release(mon);
522  if(stream)
523  IStream_Release(stream);
524  hres = binding->status;
525  IBindStatusCallback_Release(&binding->IBindStatusCallback_iface);
526  if(FAILED(hres) && hres != E_PENDING)
528  return hres;
529 }
530 
531 static HRESULT WINAPI MimeHtmlProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
532 {
534  FIXME("(%p)->(%p)\n", This, pProtocolData);
535  return E_NOTIMPL;
536 }
537 
539 {
541  FIXME("(%p)->(%08x %08x)\n", This, hrReason, dwOptions);
542  return E_NOTIMPL;
543 }
544 
546 {
548  TRACE("(%p)->(%08x)\n", This, dwOptions);
549  return S_OK;
550 }
551 
553 {
555  FIXME("(%p)\n", This);
556  return E_NOTIMPL;
557 }
558 
560 {
562  FIXME("(%p)\n", This);
563  return E_NOTIMPL;
564 }
565 
567 {
569  ULONG read = 0;
570  HRESULT hres;
571 
572  TRACE("(%p)->(%p %u %p)\n", This, pv, cb, pcbRead);
573 
574  hres = IStream_Read(This->stream, pv, cb, &read);
575  if(pcbRead)
576  *pcbRead = read;
577  if(hres != S_OK)
578  return hres;
579 
580  return read ? S_OK : S_FALSE;
581 }
582 
584  DWORD dwOrigin, ULARGE_INTEGER* plibNewPosition)
585 {
587  FIXME("(%p)->(%d %d %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
588  return E_NOTIMPL;
589 }
590 
592 {
594  FIXME("(%p)->(%d)\n", This, dwOptions);
595  return S_OK;
596 }
597 
599 {
601  FIXME("(%p)\n", This);
602  return S_OK;
603 }
604 
605 static const IInternetProtocolVtbl MimeHtmlProtocolVtbl = {
619 };
620 
622 {
623  return CONTAINING_RECORD(iface, MimeHtmlProtocol, IInternetProtocolInfo_iface);
624 }
625 
627 {
629  return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
630 }
631 
633 {
635  return IUnknown_AddRef(This->outer_unk);
636 }
637 
639 {
641  return IUnknown_Release(This->outer_unk);
642 }
643 
645  PARSEACTION ParseAction, DWORD dwParseFlags, LPWSTR pwzResult, DWORD cchResult,
646  DWORD* pcchResult, DWORD dwReserved)
647 {
649  FIXME("(%p)->(%s %d %x %p %d %p %d)\n", This, debugstr_w(pwzUrl), ParseAction,
650  dwParseFlags, pwzResult, cchResult, pcchResult, dwReserved);
651  return INET_E_DEFAULT_ACTION;
652 }
653 
655  LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, DWORD dwCombineFlags, LPWSTR pwzResult,
656  DWORD cchResult, DWORD* pcchResult, DWORD dwReserved)
657 {
659  size_t len = ARRAY_SIZE(mhtml_prefixW);
661  WCHAR *p;
662  HRESULT hres;
663 
664  TRACE("(%p)->(%s %s %08x %p %d %p %d)\n", This, debugstr_w(pwzBaseUrl),
665  debugstr_w(pwzRelativeUrl), dwCombineFlags, pwzResult, cchResult,
666  pcchResult, dwReserved);
667 
668  hres = parse_mhtml_url(pwzBaseUrl, &url);
669  if(FAILED(hres))
670  return hres;
671 
672  if(!_wcsnicmp(pwzRelativeUrl, mhtml_prefixW, ARRAY_SIZE(mhtml_prefixW))) {
673  FIXME("Relative URL is mhtml protocol\n");
674  return INET_E_USE_DEFAULT_PROTOCOLHANDLER;
675  }
676 
677  len += url.mhtml_len;
678  if(*pwzRelativeUrl)
679  len += lstrlenW(pwzRelativeUrl) + ARRAY_SIZE(mhtml_separatorW);
680  if(len >= cchResult) {
681  *pcchResult = 0;
682  return E_FAIL;
683  }
684 
685  memcpy(pwzResult, mhtml_prefixW, sizeof(mhtml_prefixW));
686  p = pwzResult + ARRAY_SIZE(mhtml_prefixW);
687  memcpy(p, url.mhtml, url.mhtml_len*sizeof(WCHAR));
688  p += url.mhtml_len;
689  if(*pwzRelativeUrl) {
692  lstrcpyW(p, pwzRelativeUrl);
693  }else {
694  *p = 0;
695  }
696 
697  *pcchResult = len;
698  return S_OK;
699 }
700 
702  LPCWSTR pwzUrl2, DWORD dwCompareFlags)
703 {
705  FIXME("(%p)->(%s %s %08x)\n", This, debugstr_w(pwzUrl1), debugstr_w(pwzUrl2), dwCompareFlags);
706  return E_NOTIMPL;
707 }
708 
710  QUERYOPTION QueryOption, DWORD dwQueryFlags, LPVOID pBuffer, DWORD cbBuffer, DWORD* pcbBuf,
712 {
714  FIXME("(%p)->(%s %08x %08x %p %d %p %d)\n", This, debugstr_w(pwzUrl), QueryOption, dwQueryFlags, pBuffer,
715  cbBuffer, pcbBuf, dwReserved);
716  return INET_E_USE_DEFAULT_PROTOCOLHANDLER;
717 }
718 
719 static const IInternetProtocolInfoVtbl MimeHtmlProtocolInfoVtbl = {
727 };
728 
730 {
732 
733  protocol = heap_alloc(sizeof(*protocol));
734  if(!protocol)
735  return E_OUTOFMEMORY;
736 
737  protocol->IUnknown_inner.lpVtbl = &MimeHtmlProtocolInnerVtbl;
738  protocol->IInternetProtocol_iface.lpVtbl = &MimeHtmlProtocolVtbl;
739  protocol->IInternetProtocolInfo_iface.lpVtbl = &MimeHtmlProtocolInfoVtbl;
740  protocol->ref = 1;
741  protocol->outer_unk = outer ? outer : &protocol->IUnknown_inner;
742  protocol->location = NULL;
743  protocol->stream = NULL;
744  protocol->sink = NULL;
745 
746  *obj = &protocol->IUnknown_inner;
747  return S_OK;
748 }
static PARSEACTION
Definition: misc.c:73
struct _LARGE_INTEGER::@2220 u
static HRESULT WINAPI MimeHtmlProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
Definition: protocol.c:531
static const IUnknownVtbl MimeHtmlProtocolInnerVtbl
Definition: protocol.c:429
DWORD dwOptions
Definition: solitaire.cpp:23
static ULONG WINAPI MimeHtmlProtocol_AddRef(IUnknown *iface)
Definition: protocol.c:400
IStream * stream
Definition: protocol.c:58
size_t mhtml_len
Definition: protocol.c:47
static HRESULT WINAPI BindStatusCallback_OnObjectAvailable(IBindStatusCallback *iface, REFIID riid, IUnknown *punk)
Definition: protocol.c:348
MimeHtmlProtocol * protocol
Definition: protocol.c:56
#define REFIID
Definition: guiddef.h:118
#define TRUE
Definition: types.h:120
IInternetProtocolSink * sink
Definition: protocol.c:42
#define E_NOINTERFACE
Definition: winerror.h:2364
HRESULT status
Definition: protocol.c:57
#define ERROR_SUCCESS
Definition: deptool.c:10
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
const WCHAR * mhtml
Definition: protocol.c:46
static MimeHtmlBinding * impl_from_IBindStatusCallback(IBindStatusCallback *iface)
Definition: protocol.c:202
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
REFIID riid
Definition: precomp.h:44
HRESULT WINAPI PropVariantClear(PROPVARIANT *pvar)
Definition: ole2.c:2968
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
WCHAR url[1]
Definition: protocol.c:59
int WINAPI lstrcmpW(LPCWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:170
static HRESULT WINAPI MimeHtmlProtocolInfo_CompareUrl(IInternetProtocolInfo *iface, LPCWSTR pwzUrl1, LPCWSTR pwzUrl2, DWORD dwCompareFlags)
Definition: protocol.c:701
static const IInternetProtocolVtbl MimeHtmlProtocolVtbl
Definition: protocol.c:605
#define WARN(fmt,...)
Definition: debug.h:111
static HRESULT WINAPI MimeHtmlProtocol_UnlockRequest(IInternetProtocol *iface)
Definition: protocol.c:598
static HRESULT WINAPI MimeHtmlProtocolInfo_CombineUrl(IInternetProtocolInfo *iface, LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, DWORD dwCombineFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
Definition: protocol.c:654
_Check_return_ _CRTIMP int __cdecl _wcsnicmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
REFIID LPVOID * ppv
Definition: atlbase.h:39
static const IBindStatusCallbackVtbl BindStatusCallbackVtbl
Definition: protocol.c:355
#define assert(x)
Definition: debug.h:53
static HRESULT load_mime_message(IStream *stream, IMimeMessage **ret)
Definition: protocol.c:181
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL fDeleteOnRelease, LPSTREAM *ppstm)
static HRESULT WINAPI InternetProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
Definition: protocol.c:440
static HRESULT WINAPI BindStatusCallback_GetBindInfo(IBindStatusCallback *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: protocol.c:312
IUnknown IUnknown_inner
Definition: protocol.c:33
static ULONG WINAPI MimeHtmlProtocolInfo_Release(IInternetProtocolInfo *iface)
Definition: protocol.c:638
IInternetProtocolInfo IInternetProtocolInfo_iface
Definition: protocol.c:35
#define lstrlenW
Definition: compat.h:415
#define E_FAIL
Definition: ddrawi.h:102
static ULONG WINAPI BindStatusCallback_Release(IBindStatusCallback *iface)
Definition: protocol.c:238
static HRESULT WINAPI BindStatusCallback_OnLowResource(IBindStatusCallback *iface, DWORD dwReserved)
Definition: protocol.c:272
Definition: send.c:47
IInternetProtocol IInternetProtocol_iface
Definition: protocol.c:34
static void * heap_alloc(size_t len)
Definition: appwiz.h:65
static ULONG WINAPI InternetProtocol_Release(IInternetProtocol *iface)
Definition: protocol.c:452
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
static HRESULT WINAPI BindStatusCallback_OnStartBinding(IBindStatusCallback *iface, DWORD dwReserved, IBinding *pib)
Definition: protocol.c:256
static HRESULT WINAPI MimeHtmlProtocolInfo_ParseUrl(IInternetProtocolInfo *iface, LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD dwParseFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
Definition: protocol.c:644
static HRESULT on_mime_message_available(MimeHtmlProtocol *protocol, IMimeMessage *mime_message)
Definition: protocol.c:116
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:90
static const WCHAR mhtml_separatorW[]
Definition: protocol.c:63
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
#define debugstr_w
Definition: kernel32.h:32
GLenum GLint ref
Definition: glext.h:6028
#define FIXME(fmt,...)
Definition: debug.h:110
#define S_FALSE
Definition: winerror.h:2357
const WCHAR * str
static HRESULT WINAPI MimeHtmlProtocol_Resume(IInternetProtocol *iface)
Definition: protocol.c:559
smooth NULL
Definition: ftsmooth.c:416
PVOID pBuffer
static QUERYOPTION
Definition: misc.c:74
static HRESULT WINAPI BindStatusCallback_GetPriority(IBindStatusCallback *iface, LONG *pnPriority)
Definition: protocol.c:267
WCHAR * location
Definition: protocol.c:40
#define debugstr_guid
Definition: kernel32.h:35
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
Definition: Messaging.c:560
#define TRACE(s)
Definition: solgame.cpp:4
GLsizeiptr size
Definition: glext.h:5919
HRESULT hres
Definition: protocol.c:465
_CONST_RETURN wchar_t *__cdecl wcschr(_In_z_ const wchar_t *_Str, wchar_t _Ch)
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
static const WCHAR url[]
Definition: encode.c:1432
const GUID IID_IUnknown
static HRESULT report_result(MimeHtmlProtocol *protocol, HRESULT result)
Definition: protocol.c:105
#define WINAPI
Definition: msvc.h:6
unsigned long DWORD
Definition: ntddk_ex.h:95
_Check_return_ _CRTIMP int __cdecl wcsncmp(_In_reads_or_z_(_MaxCount) const wchar_t *_Str1, _In_reads_or_z_(_MaxCount) const wchar_t *_Str2, _In_ size_t _MaxCount)
static HRESULT WINAPI MimeHtmlProtocol_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: protocol.c:374
static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallback *iface, REFIID riid, void **ppv)
Definition: protocol.c:207
static HRESULT WINAPI BindStatusCallback_OnProgress(IBindStatusCallback *iface, ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: protocol.c:277
int ret
static LPWSTR heap_strdupW(LPCWSTR str)
Definition: protocol.c:65
static HRESULT WINAPI MimeHtmlProtocol_Read(IInternetProtocol *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: protocol.c:566
static const WCHAR mhtml_prefixW[]
Definition: protocol.c:62
#define InterlockedDecrement
Definition: armddk.h:52
Definition: parse.h:22
GLuint GLuint stream
Definition: glext.h:7522
IBindStatusCallback IBindStatusCallback_iface
Definition: protocol.c:52
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
GLenum GLsizei len
Definition: glext.h:6722
unsigned char BYTE
Definition: mem.h:68
HRESULT MimeHtmlProtocol_create(IUnknown *outer, void **obj)
Definition: protocol.c:729
GLsizei const GLfloat * value
Definition: glext.h:6069
static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *iface, HRESULT hresult, LPCWSTR szError)
Definition: protocol.c:285
#define ERR(fmt,...)
Definition: debug.h:109
#define S_OK
Definition: intsafe.h:59
static HRESULT WINAPI MimeHtmlProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
Definition: protocol.c:545
HRESULT WINAPI CreateAsyncBindCtx(DWORD reserved, IBindStatusCallback *callback, IEnumFORMATETC *format, IBindCtx **pbind)
Definition: bindctx.c:899
#define InterlockedIncrement
Definition: armddk.h:53
#define lstrcpyW
Definition: compat.h:414
unsigned long HANDLE_PTR
Definition: basetsd.h:78
#define ARRAY_SIZE(a)
Definition: main.h:24
static HRESULT WINAPI MimeHtmlProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: protocol.c:583
static HRESULT WINAPI MimeHtmlProtocolInfo_QueryInterface(IInternetProtocolInfo *iface, REFIID riid, void **ppv)
Definition: protocol.c:626
#define E_NOTIMPL
Definition: ddrawi.h:99
union value::@482 u
static HRESULT WINAPI MimeHtmlProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason, DWORD dwOptions)
Definition: protocol.c:538
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:254
static HRESULT WINAPI MimeHtmlProtocolInfo_QueryInfo(IInternetProtocolInfo *iface, LPCWSTR pwzUrl, QUERYOPTION QueryOption, DWORD dwQueryFlags, LPVOID pBuffer, DWORD cbBuffer, DWORD *pcbBuf, DWORD dwReserved)
Definition: protocol.c:709
static HRESULT WINAPI BindStatusCallback_OnDataAvailable(IBindStatusCallback *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
Definition: protocol.c:323
static const void * body(MD5_CTX *ctx, const void *data, unsigned long size)
Definition: md5.c:100
static MimeHtmlProtocol * impl_from_IInternetProtocolInfo(IInternetProtocolInfo *iface)
Definition: protocol.c:621
IStream * stream
Definition: protocol.c:41
static HRESULT WINAPI MimeHtmlProtocol_Start(IInternetProtocol *iface, const WCHAR *szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
Definition: protocol.c:458
BOOL WINAPI IsEqualGUID(REFGUID rguid1, REFGUID rguid2)
Definition: compobj.c:4112
static ULONG WINAPI InternetProtocol_AddRef(IInternetProtocol *iface)
Definition: protocol.c:446
static ULONG WINAPI MimeHtmlProtocolInfo_AddRef(IInternetProtocolInfo *iface)
Definition: protocol.c:632
IUnknown * outer_unk
Definition: protocol.c:38
static HRESULT WINAPI MimeHtmlProtocol_Suspend(IInternetProtocol *iface)
Definition: protocol.c:552
static HMODULE MODULEINFO DWORD cb
Definition: module.c:32
static TAGID TAGID find
Definition: db.cpp:153
static const IInternetProtocolInfoVtbl MimeHtmlProtocolInfoVtbl
Definition: protocol.c:719
static ULONG WINAPI MimeHtmlProtocol_Release(IUnknown *iface)
Definition: protocol.c:410
unsigned int ULONG
Definition: retypes.h:1
HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk)
Definition: umon.c:732
const SHORT IET_DECODED
Definition: mimeole.idl:248
const WCHAR * location
Definition: protocol.c:48
static HRESULT parse_mhtml_url(const WCHAR *url, mhtml_url_t *r)
Definition: protocol.c:81
GLfloat GLfloat p
Definition: glext.h:8902
WCHAR * LPWSTR
Definition: xmlstorage.h:184
#define E_PENDING
Definition: dinput.h:172
GLuint64EXT * result
Definition: glext.h:11304
static MimeHtmlProtocol * impl_from_IUnknown(IUnknown *iface)
Definition: protocol.c:369
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:54
_CRTIMP int __cdecl read(_In_ int _FileHandle, _Out_writes_bytes_(_MaxCharCount) void *_DstBuf, _In_ unsigned int _MaxCharCount)
#define SUCCEEDED(hr)
Definition: intsafe.h:57
static HRESULT WINAPI MimeHtmlProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
Definition: protocol.c:591
WINE_DEFAULT_DEBUG_CHANNEL(inetcomm)
static MimeHtmlProtocol * impl_from_IInternetProtocol(IInternetProtocol *iface)
Definition: protocol.c:435
static BOOL heap_free(void *mem)
Definition: appwiz.h:75
static ULONG WINAPI BindStatusCallback_AddRef(IBindStatusCallback *iface)
Definition: protocol.c:228
static DWORD bindf
Definition: protocol.c:70
HRESULT MimeMessage_create(IUnknown *outer, void **obj) DECLSPEC_HIDDEN
Definition: mimeole.c:3085