ReactOS 0.4.17-dev-573-g8315b8c
mimefilter.c
Go to the documentation of this file.
1/*
2 * Copyright 2009 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#include "urlmon_main.h"
20#include "wine/debug.h"
21
23
24typedef struct {
27
30
32{
33 return CONTAINING_RECORD(iface, MimeFilter, IInternetProtocol_iface);
34}
35
37{
39
40 *ppv = NULL;
42 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
43 *ppv = &This->IInternetProtocol_iface;
44 }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) {
45 TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv);
46 *ppv = &This->IInternetProtocol_iface;
47 }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) {
48 TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv);
49 *ppv = &This->IInternetProtocol_iface;
50 }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) {
51 TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv);
52 *ppv = &This->IInternetProtocolSink_iface;
53 }
54
55 if(*ppv) {
56 IInternetProtocol_AddRef(iface);
57 return S_OK;
58 }
59
60 WARN("not supported interface %s\n", debugstr_guid(riid));
61 return E_NOINTERFACE;
62}
63
65{
68 TRACE("(%p) ref=%ld\n", This, ref);
69 return ref;
70}
71
73{
76
77 TRACE("(%p) ref=%ld\n", This, ref);
78
79 if(!ref) {
80 free(This);
81
83 }
84
85 return ref;
86}
87
89 IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo,
91{
93 FIXME("(%p)->(%s %p %p %08lx %Ix)\n", This, debugstr_w(szUrl), pOIProtSink,
94 pOIBindInfo, grfPI, dwReserved);
95 return E_NOTIMPL;
96}
97
98static HRESULT WINAPI MimeFilterProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
99{
101 FIXME("(%p)->(%p)\n", This, pProtocolData);
102 return E_NOTIMPL;
103}
104
107{
109 FIXME("(%p)->(%08lx %08lx)\n", This, hrReason, dwOptions);
110 return E_NOTIMPL;
111}
112
114{
116 FIXME("(%p)->(%08lx)\n", This, dwOptions);
117 return E_NOTIMPL;
118}
119
121{
123 FIXME("(%p)\n", This);
124 return E_NOTIMPL;
125}
126
128{
130 FIXME("(%p)\n", This);
131 return E_NOTIMPL;
132}
133
135 ULONG cb, ULONG *pcbRead)
136{
138 FIXME("(%p)->(%p %lu %p)\n", This, pv, cb, pcbRead);
139 return E_NOTIMPL;
140}
141
143 DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
144{
146 FIXME("(%p)->(%ld %ld %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
147 return E_NOTIMPL;
148}
149
151{
153 FIXME("(%p)->(%08lx)\n", This, dwOptions);
154 return E_NOTIMPL;
155}
156
158{
160 FIXME("(%p)\n", This);
161 return E_NOTIMPL;
162}
163
164static const IInternetProtocolVtbl MimeFilterProtocolVtbl = {
178};
179
181{
182 return CONTAINING_RECORD(iface, MimeFilter, IInternetProtocolSink_iface);
183}
184
186 REFIID riid, void **ppv)
187{
189 return IInternetProtocol_QueryInterface(&This->IInternetProtocol_iface, riid, ppv);
190}
191
193{
195 return IInternetProtocol_AddRef(&This->IInternetProtocol_iface);
196}
197
199{
201 return IInternetProtocol_Release(&This->IInternetProtocol_iface);
202}
203
205 PROTOCOLDATA *pProtocolData)
206{
208 FIXME("(%p)->(%p)\n", This, pProtocolData);
209 return E_NOTIMPL;
210}
211
213 ULONG ulStatusCode, LPCWSTR szStatusText)
214{
216 FIXME("(%p)->(%lu %s)\n", This, ulStatusCode, debugstr_w(szStatusText));
217 return E_NOTIMPL;
218}
219
221 DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
222{
224 FIXME("(%p)->(%ld %lu %lu)\n", This, grfBSCF, ulProgress, ulProgressMax);
225 return E_NOTIMPL;
226}
227
229 HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
230{
232 FIXME("(%p)->(%08lx %ld %s)\n", This, hrResult, dwError, debugstr_w(szResult));
233 return E_NOTIMPL;
234}
235
236static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl = {
244};
245
247{
249
250 TRACE("(%p %p)\n", pUnkOuter, ppobj);
251
253
254 ret = calloc(1, sizeof(MimeFilter));
255
256 ret->IInternetProtocol_iface.lpVtbl = &MimeFilterProtocolVtbl;
257 ret->IInternetProtocolSink_iface.lpVtbl = &InternetProtocolSinkVtbl;
258 ret->ref = 1;
259
260 *ppobj = &ret->IInternetProtocol_iface;
261 return S_OK;
262}
263
265{
266 return size > 5 && !memcmp(b, "{\\rtf", 5);
267}
268
270{
271 if(size < 6)
272 return FALSE;
273
274 if((b[0] == '<'
275 && (b[1] == 'h' || b[1] == 'H')
276 && (b[2] == 't' || b[2] == 'T')
277 && (b[3] == 'm' || b[3] == 'M')
278 && (b[4] == 'l' || b[4] == 'L'))
279 || (b[0] == '<'
280 && (b[1] == 'h' || b[1] == 'H')
281 && (b[2] == 'e' || b[2] == 'E')
282 && (b[3] == 'a' || b[3] == 'A')
283 && (b[4] == 'd' || b[4] == 'D'))
284 || (b[0] == '<'
285 && (b[1] == 'b' || b[1] == 'B')
286 && (b[2] == 'o' || b[2] == 'O')
287 && (b[3] == 'd' || b[3] == 'D')
288 && (b[4] == 'y' || b[4] == 'Y'))) return TRUE;
289
290 return FALSE;
291}
292
294{
295 if(size < 7)
296 return FALSE;
297
298 if(b[0] == '<' && b[1] == '?'
299 && (b[2] == 'x' || b[2] == 'X')
300 && (b[3] == 'm' || b[3] == 'M')
301 && (b[4] == 'l' || b[4] == 'L')
302 && b[5] == ' ') return TRUE;
303
304 return FALSE;
305}
306
308{
309 return size > 4
310 && b[0] == '.' && b[1] == 's' && b[2] == 'n' && b[3] == 'd';
311}
312
314{
315 return size > 12
316 && b[0] == 'R' && b[1] == 'I' && b[2] == 'F' && b[3] == 'F'
317 && b[8] == 'W' && b[9] == 'A' && b[10] == 'V' && b[11] == 'E';
318}
319
321{
322 return size >= 6
323 && (b[0] == 'G' || b[0] == 'g')
324 && (b[1] == 'I' || b[1] == 'i')
325 && (b[2] == 'F' || b[2] == 'f')
326 && b[3] == '8'
327 && (b[4] == '7' || b[4] == '9')
328 && (b[5] == 'A' || b[5] == 'a');
329}
330
332{
333 return size > 2 && b[0] == 0xff && b[1] == 0xd8;
334}
335
337{
338 static const BYTE magic1[] = {0x4d,0x4d,0x00,0x2a};
339 static const BYTE magic2[] = {0x49,0x49,0x2a,0xff};
340
341 return size >= 4 && (!memcmp(b, magic1, 4) || !memcmp(b, magic2, 4));
342}
343
345{
346 static const BYTE xpng_header[] = {0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a};
347 return size > sizeof(xpng_header) && !memcmp(b, xpng_header, sizeof(xpng_header));
348}
349
351{
352 return size >= 14
353 && b[0] == 0x42 && b[1] == 0x4d
354 && *(const DWORD *)(b+6) == 0;
355}
356
358{
359 return size > 12
360 && b[0] == 'R' && b[1] == 'I' && b[2] == 'F' && b[3] == 'F'
361 && b[8] == 'A' && b[9] == 'V' && b[10] == 'I' && b[11] == 0x20;
362}
363
365{
366 return size > 4
367 && !b[0] && !b[1] && b[2] == 0x01
368 && (b[3] == 0xb3 || b[3] == 0xba);
369}
370
372{
373 return size > 2 && b[0] == '%' && b[1] == '!';
374}
375
377{
378 return size > 4 && b[0] == 0x25 && b[1] == 0x50 && b[2] == 0x44 && b[3] == 0x46;
379}
380
382{
383 return size > 2 && b[0] == 0x50 && b[1] == 0x4b;
384}
385
387{
388 return size > 2 && b[0] == 0x1f && b[1] == 0x8b;
389}
390
392{
393 return size > 4 && b[0] == 0xca && b[1] == 0xfe && b[2] == 0xba && b[3] == 0xbe;
394}
395
397{
398 return size > 2 && b[0] == 'M' && b[1] == 'Z';
399}
400
402{
403 if(b < 0x20 && b != '\n' && b != '\r' && b != '\t')
404 return FALSE;
405 return TRUE;
406}
407
409{
410 const BYTE *ptr;
411
412 for(ptr = b; ptr < b+size-1; ptr++) {
414 return FALSE;
415 }
416
417 return TRUE;
418}
419
421{
422 return TRUE;
423}
424
426{
427 DWORD res, size;
428 WCHAR mime[64];
429 HKEY hkey;
430
432 if(res != ERROR_SUCCESS)
433 return HRESULT_FROM_WIN32(res);
434
435 size = sizeof(mime);
436 res = RegQueryValueExW(hkey, L"Content Type", NULL, NULL, (BYTE*)mime, &size);
437 RegCloseKey(hkey);
438 if(res != ERROR_SUCCESS)
439 return HRESULT_FROM_WIN32(res);
440
441 TRACE("found MIME %s\n", debugstr_w(mime));
442
444 memcpy(*ret, mime, size);
445 return S_OK;
446}
447
449{
450 const WCHAR *ptr, *end_ptr;
451 WCHAR *ext = NULL;
453
454 for(end_ptr = url; *end_ptr; end_ptr++) {
455 if(*end_ptr == '?' || *end_ptr == '#')
456 break;
457 }
458
459 for(ptr = end_ptr; ptr >= url; ptr--) {
460 if(*ptr == '.')
461 break;
462 }
463
464 if(ptr < url)
465 return E_FAIL;
466
467 if(*end_ptr) {
468 unsigned len = end_ptr-ptr;
469
470 ext = malloc((len + 1) * sizeof(WCHAR));
471 if(!ext)
472 return E_OUTOFMEMORY;
473
474 memcpy(ext, ptr, len*sizeof(WCHAR));
475 ext[len] = 0;
476 }
477
479 free(ext);
480 return hres;
481}
482
483static const WCHAR text_plainW[] = L"text/plain";
484static const WCHAR app_octetstreamW[] = L"application/octet-stream";
485
486static const struct {
487 const WCHAR *mime;
488 BOOL (*filter)(const BYTE *,DWORD);
490 {L"text/html", text_html_filter},
491 {L"text/xml", text_xml_filter}
493 {L"text/richtext", text_richtext_filter},
494 /* {L"audio/x-aiff", audio_xaiff_filter}, */
495 {L"audio/basic", audio_basic_filter},
496 {L"audio/wav", audio_wav_filter},
497 {L"image/gif", image_gif_filter},
498 {L"image/pjpeg", image_pjpeg_filter},
499 {L"image/tiff", image_tiff_filter},
500 {L"image/x-png", image_xpng_filter},
501 /* {L"image/x-bitmap", image_xbitmap_filter}, */
502 {L"image/bmp", image_bmp_filter},
503 /* {L"image/x-jg", image_xjg_filter}, */
504 /* {L"image/x-emf", image_xemf_filter}, */
505 /* {L"image/x-wmf", image_xwmf_filter}, */
506 {L"video/avi", video_avi_filter},
507 {L"video/mpeg", video_mpeg_filter},
508 {L"application/postscript", application_postscript_filter},
509 /* {L"application/base64", application_base64_filter}, */
510 /* {L"application/mac-binhex40", application_macbinhex40_filter}, */
511 {L"application/pdf", application_pdf_filter},
512 /* {L"application/x-compressed", application_xcompressed_filter}, */
513 {L"application/x-zip-compressed", application_xzip_filter},
514 {L"application/x-gzip-compressed", application_xgzip_filter},
515 {L"application/java", application_java_filter},
516 {L"application/x-msdownload", application_xmsdownload},
520
522{
523 unsigned i;
524
525 for(i=0; i < ARRAY_SIZE(mime_filters_any_pos); i++) {
527 return TRUE;
528 }
529
530 for(i=0; i < ARRAY_SIZE(mime_filters); i++) {
532 return TRUE;
533 }
534
535 return FALSE;
536}
537
538static HRESULT find_mime_from_buffer(const BYTE *buf, DWORD size, const WCHAR *proposed_mime, const WCHAR *url, WCHAR **ret_mime)
539{
540 int len, i, any_pos_mime = -1;
541 const WCHAR *ret = NULL;
542
543 if(!buf || !size) {
544 if(!proposed_mime)
545 return E_FAIL;
546
548 *ret_mime = CoTaskMemAlloc(len*sizeof(WCHAR));
549 if(!*ret_mime)
550 return E_OUTOFMEMORY;
551
552 memcpy(*ret_mime, proposed_mime, len*sizeof(WCHAR));
553 return S_OK;
554 }
555
559
560 if(proposed_mime) {
562
563 for(i=0; i < ARRAY_SIZE(mime_filters_any_pos); i++) {
565 any_pos_mime = i;
566 for(len=size; len>0; len--) {
568 break;
569 }
570 if(!len)
571 ret = NULL;
572 break;
573 }
574 }
575
577 for(i=0; i < ARRAY_SIZE(mime_filters); i++) {
580 ret = NULL;
581 break;
582 }
583 }
584 }
585 }
586
587 /* Looks like a bug in native implementation, html and xml mimes
588 * are not looked for if none of them was proposed */
589 if(!proposed_mime || any_pos_mime!=-1) {
590 for(len=size; !ret && len>0; len--) {
591 for(i=0; i<ARRAY_SIZE(mime_filters_any_pos); i++) {
593 ret = mime_filters_any_pos[i].mime;
594 break;
595 }
596 }
597 }
598 }
599
600 i=0;
601 while(!ret) {
604 i++;
605 }
606
607 if(any_pos_mime!=-1 && ret==text_plainW)
608 ret = mime_filters_any_pos[any_pos_mime].mime;
609 else if(proposed_mime && ret==app_octetstreamW) {
610 for(len=size; ret==app_octetstreamW && len>0; len--) {
612 break;
613 for(i=0; i<ARRAY_SIZE(mime_filters_any_pos); i++) {
616 break;
617 }
618 }
619 }
620
621 if(ret == app_octetstreamW)
623 }
624
625 if(url && (ret == app_octetstreamW || ret == text_plainW)) {
626 WCHAR *url_mime;
628
629 hres = find_mime_from_url(url, &url_mime);
630 if(SUCCEEDED(hres)) {
631 if(!is_known_mime_type(url_mime)) {
632 *ret_mime = url_mime;
633 return hres;
634 }
635 CoTaskMemFree(url_mime);
636 }
637 }
638
639 TRACE("found %s for %s\n", debugstr_w(ret), debugstr_an((const char*)buf, min(32, size)));
640
641 len = lstrlenW(ret)+1;
642 *ret_mime = CoTaskMemAlloc(len*sizeof(WCHAR));
643 if(!*ret_mime)
644 return E_OUTOFMEMORY;
645
646 memcpy(*ret_mime, ret, len*sizeof(WCHAR));
647 return S_OK;
648}
649
650/***********************************************************************
651 * FindMimeFromData (URLMON.@)
652 *
653 * Determines the Multipurpose Internet Mail Extensions (MIME) type from the data provided.
654 */
656 DWORD cbSize, LPCWSTR pwzMimeProposed, DWORD dwMimeFlags,
657 LPWSTR* ppwzMimeOut, DWORD dwReserved)
658{
659 TRACE("(%p,%s,%p,%ld,%s,0x%lx,%p,0x%lx)\n", pBC, debugstr_w(pwzUrl), pBuffer, cbSize,
660 debugstr_w(pwzMimeProposed), dwMimeFlags, ppwzMimeOut, dwReserved);
661
662 if(dwMimeFlags)
663 WARN("dwMimeFlags=%08lx\n", dwMimeFlags);
664 if(dwReserved)
665 WARN("dwReserved=%ld\n", dwReserved);
666
667 /* pBC seems to not be used */
668
669 if(!ppwzMimeOut || (!pwzUrl && !pBuffer))
670 return E_INVALIDARG;
671
672 if(pwzMimeProposed || pBuffer)
673 return find_mime_from_buffer(pBuffer, cbSize, pwzMimeProposed, pwzUrl, ppwzMimeOut);
674
675 return find_mime_from_url(pwzUrl, ppwzMimeOut);
676}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define ARRAY_SIZE(A)
Definition: main.h:20
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
unsigned long HANDLE_PTR
Definition: basetsd.h:72
const GUID IID_IUnknown
#define RegCloseKey(hKey)
Definition: registry.h:49
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegOpenKeyW(HKEY hKey, LPCWSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3268
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
static __inline const char * debugstr_an(const char *s, int n)
Definition: compat.h:55
#define lstrlenW
Definition: compat.h:750
static const WCHAR *const ext[]
Definition: module.c:53
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
GLsizeiptr size
Definition: glext.h:5919
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: glext.h:7005
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
static HRESULT WINAPI MimeFilterProtocol_Read(IInternetProtocol *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: mimefilter.c:134
static const struct @611 mime_filters_any_pos[]
static BOOL video_mpeg_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:364
static BOOL audio_basic_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:307
static HRESULT WINAPI MimeFilterProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
Definition: mimefilter.c:36
static MimeFilter * impl_from_IInternetProtocolSink(IInternetProtocolSink *iface)
Definition: mimefilter.c:180
HRESULT WINAPI FindMimeFromData(LPBC pBC, LPCWSTR pwzUrl, LPVOID pBuffer, DWORD cbSize, LPCWSTR pwzMimeProposed, DWORD dwMimeFlags, LPWSTR *ppwzMimeOut, DWORD dwReserved)
Definition: mimefilter.c:655
static HRESULT WINAPI MimeFilterProtocol_Start(IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
Definition: mimefilter.c:88
static HRESULT WINAPI MimeFilterProtocol_Abort(IInternetProtocol *iface, HRESULT hrReason, DWORD dwOptions)
Definition: mimefilter.c:105
static BOOL is_known_mime_type(const WCHAR *mime)
Definition: mimefilter.c:521
static BOOL video_avi_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:357
static BOOL image_pjpeg_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:331
static HRESULT WINAPI MimeFilterSink_ReportData(IInternetProtocolSink *iface, DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
Definition: mimefilter.c:220
static HRESULT WINAPI MimeFilterSink_QueryInterface(IInternetProtocolSink *iface, REFIID riid, void **ppv)
Definition: mimefilter.c:185
static HRESULT find_mime_from_buffer(const BYTE *buf, DWORD size, const WCHAR *proposed_mime, const WCHAR *url, WCHAR **ret_mime)
Definition: mimefilter.c:538
static BOOL application_pdf_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:376
static BOOL text_html_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:269
static const struct @611 mime_filters[]
static HRESULT WINAPI MimeFilterProtocol_UnlockRequest(IInternetProtocol *iface)
Definition: mimefilter.c:157
static BOOL image_tiff_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:336
static BOOL text_richtext_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:264
static HRESULT find_mime_from_url(const WCHAR *url, WCHAR **ret)
Definition: mimefilter.c:448
static HRESULT WINAPI MimeFilterProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
Definition: mimefilter.c:150
static BOOL is_text_plain_char(BYTE b)
Definition: mimefilter.c:401
static BOOL application_xgzip_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:386
BOOL(* filter)(const BYTE *, DWORD)
Definition: mimefilter.c:488
static const IInternetProtocolVtbl MimeFilterProtocolVtbl
Definition: mimefilter.c:164
HRESULT find_mime_from_ext(const WCHAR *ext, WCHAR **ret)
Definition: mimefilter.c:425
static BOOL application_octet_stream_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:420
static HRESULT WINAPI MimeFilterProtocol_Suspend(IInternetProtocol *iface)
Definition: mimefilter.c:120
static BOOL application_xmsdownload(const BYTE *b, DWORD size)
Definition: mimefilter.c:396
static const WCHAR text_plainW[]
Definition: mimefilter.c:483
static HRESULT WINAPI MimeFilterProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
Definition: mimefilter.c:98
static BOOL text_plain_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:408
static BOOL application_xzip_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:381
static HRESULT WINAPI MimeFilterProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: mimefilter.c:142
static HRESULT WINAPI MimeFilterSink_Switch(IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
Definition: mimefilter.c:204
static HRESULT WINAPI MimeFilterProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
Definition: mimefilter.c:113
static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
Definition: mimefilter.c:236
static MimeFilter * impl_from_IInternetProtocol(IInternetProtocol *iface)
Definition: mimefilter.c:31
static BOOL text_xml_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:293
static BOOL application_java_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:391
static BOOL image_bmp_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:350
static HRESULT WINAPI MimeFilterProtocol_Resume(IInternetProtocol *iface)
Definition: mimefilter.c:127
static BOOL audio_wav_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:313
static BOOL image_gif_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:320
static ULONG WINAPI MimeFilterSink_Release(IInternetProtocolSink *iface)
Definition: mimefilter.c:198
static BOOL image_xpng_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:344
static const WCHAR app_octetstreamW[]
Definition: mimefilter.c:484
static HRESULT WINAPI MimeFilterSink_ReportResult(IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
Definition: mimefilter.c:228
static ULONG WINAPI MimeFilterSink_AddRef(IInternetProtocolSink *iface)
Definition: mimefilter.c:192
const WCHAR * mime
Definition: mimefilter.c:487
static HRESULT WINAPI MimeFilterSink_ReportProgress(IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: mimefilter.c:212
HRESULT MimeFilter_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
Definition: mimefilter.c:246
static BOOL application_postscript_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:371
static ULONG WINAPI MimeFilterProtocol_AddRef(IInternetProtocol *iface)
Definition: mimefilter.c:64
static ULONG WINAPI MimeFilterProtocol_Release(IInternetProtocol *iface)
Definition: mimefilter.c:72
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
static PVOID ptr
Definition: dispmode.c:27
static const WCHAR url[]
Definition: encode.c:1384
HRESULT hres
Definition: protocol.c:465
const WCHAR * proposed_mime
Definition: misc.c:598
#define min(a, b)
Definition: monoChain.cc:55
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
#define BOOL
Definition: nt_native.h:43
#define DWORD
Definition: nt_native.h:44
interface IBindCtx * LPBC
Definition: objfwd.h:18
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
PVOID pBuffer
#define calloc
Definition: rosglue.h:14
#define TRACE(s)
Definition: solgame.cpp:4
DWORD dwOptions
Definition: solitaire.cpp:25
IInternetProtocol IInternetProtocol_iface
Definition: mimefilter.c:25
IInternetProtocolSink IInternetProtocolSink_iface
Definition: mimefilter.c:26
LONG ref
Definition: mimefilter.c:28
Definition: send.c:48
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
struct _LARGE_INTEGER::@2527 u
static void URLMON_LockModule(void)
Definition: urlmon_main.h:64
static void URLMON_UnlockModule(void)
Definition: urlmon_main.h:65
#define WINAPI
Definition: msvc.h:6
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define E_NOINTERFACE
Definition: winerror.h:3479
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
unsigned char BYTE
Definition: xxhash.c:193