ReactOS 0.4.17-dev-573-g8315b8c
mimefilter.c File Reference
#include "urlmon_main.h"
#include "wine/debug.h"
Include dependency graph for mimefilter.c:

Go to the source code of this file.

Classes

struct  MimeFilter
 

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (urlmon)
 
static MimeFilterimpl_from_IInternetProtocol (IInternetProtocol *iface)
 
static HRESULT WINAPI MimeFilterProtocol_QueryInterface (IInternetProtocol *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI MimeFilterProtocol_AddRef (IInternetProtocol *iface)
 
static ULONG WINAPI MimeFilterProtocol_Release (IInternetProtocol *iface)
 
static HRESULT WINAPI MimeFilterProtocol_Start (IInternetProtocol *iface, LPCWSTR szUrl, IInternetProtocolSink *pOIProtSink, IInternetBindInfo *pOIBindInfo, DWORD grfPI, HANDLE_PTR dwReserved)
 
static HRESULT WINAPI MimeFilterProtocol_Continue (IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
 
static HRESULT WINAPI MimeFilterProtocol_Abort (IInternetProtocol *iface, HRESULT hrReason, DWORD dwOptions)
 
static HRESULT WINAPI MimeFilterProtocol_Terminate (IInternetProtocol *iface, DWORD dwOptions)
 
static HRESULT WINAPI MimeFilterProtocol_Suspend (IInternetProtocol *iface)
 
static HRESULT WINAPI MimeFilterProtocol_Resume (IInternetProtocol *iface)
 
static HRESULT WINAPI MimeFilterProtocol_Read (IInternetProtocol *iface, void *pv, ULONG cb, ULONG *pcbRead)
 
static HRESULT WINAPI MimeFilterProtocol_Seek (IInternetProtocol *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
 
static HRESULT WINAPI MimeFilterProtocol_LockRequest (IInternetProtocol *iface, DWORD dwOptions)
 
static HRESULT WINAPI MimeFilterProtocol_UnlockRequest (IInternetProtocol *iface)
 
static MimeFilterimpl_from_IInternetProtocolSink (IInternetProtocolSink *iface)
 
static HRESULT WINAPI MimeFilterSink_QueryInterface (IInternetProtocolSink *iface, REFIID riid, void **ppv)
 
static ULONG WINAPI MimeFilterSink_AddRef (IInternetProtocolSink *iface)
 
static ULONG WINAPI MimeFilterSink_Release (IInternetProtocolSink *iface)
 
static HRESULT WINAPI MimeFilterSink_Switch (IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
 
static HRESULT WINAPI MimeFilterSink_ReportProgress (IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText)
 
static HRESULT WINAPI MimeFilterSink_ReportData (IInternetProtocolSink *iface, DWORD grfBSCF, ULONG ulProgress, ULONG ulProgressMax)
 
static HRESULT WINAPI MimeFilterSink_ReportResult (IInternetProtocolSink *iface, HRESULT hrResult, DWORD dwError, LPCWSTR szResult)
 
HRESULT MimeFilter_Construct (IUnknown *pUnkOuter, LPVOID *ppobj)
 
static BOOL text_richtext_filter (const BYTE *b, DWORD size)
 
static BOOL text_html_filter (const BYTE *b, DWORD size)
 
static BOOL text_xml_filter (const BYTE *b, DWORD size)
 
static BOOL audio_basic_filter (const BYTE *b, DWORD size)
 
static BOOL audio_wav_filter (const BYTE *b, DWORD size)
 
static BOOL image_gif_filter (const BYTE *b, DWORD size)
 
static BOOL image_pjpeg_filter (const BYTE *b, DWORD size)
 
static BOOL image_tiff_filter (const BYTE *b, DWORD size)
 
static BOOL image_xpng_filter (const BYTE *b, DWORD size)
 
static BOOL image_bmp_filter (const BYTE *b, DWORD size)
 
static BOOL video_avi_filter (const BYTE *b, DWORD size)
 
static BOOL video_mpeg_filter (const BYTE *b, DWORD size)
 
static BOOL application_postscript_filter (const BYTE *b, DWORD size)
 
static BOOL application_pdf_filter (const BYTE *b, DWORD size)
 
static BOOL application_xzip_filter (const BYTE *b, DWORD size)
 
static BOOL application_xgzip_filter (const BYTE *b, DWORD size)
 
static BOOL application_java_filter (const BYTE *b, DWORD size)
 
static BOOL application_xmsdownload (const BYTE *b, DWORD size)
 
static BOOL is_text_plain_char (BYTE b)
 
static BOOL text_plain_filter (const BYTE *b, DWORD size)
 
static BOOL application_octet_stream_filter (const BYTE *b, DWORD size)
 
HRESULT find_mime_from_ext (const WCHAR *ext, WCHAR **ret)
 
static HRESULT find_mime_from_url (const WCHAR *url, WCHAR **ret)
 
static BOOL is_known_mime_type (const WCHAR *mime)
 
static HRESULT find_mime_from_buffer (const BYTE *buf, DWORD size, const WCHAR *proposed_mime, const WCHAR *url, WCHAR **ret_mime)
 
HRESULT WINAPI FindMimeFromData (LPBC pBC, LPCWSTR pwzUrl, LPVOID pBuffer, DWORD cbSize, LPCWSTR pwzMimeProposed, DWORD dwMimeFlags, LPWSTR *ppwzMimeOut, DWORD dwReserved)
 

Variables

static const IInternetProtocolVtbl MimeFilterProtocolVtbl
 
static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
 
static const WCHAR text_plainW [] = L"text/plain"
 
static const WCHAR app_octetstreamW [] = L"application/octet-stream"
 
struct {
   const WCHAR *   mime
 
   BOOL(*   filter )(const BYTE *, DWORD)
 
mime_filters_any_pos []
 
struct {
   const WCHAR *   mime
 
   BOOL(*   filter )(const BYTE *, DWORD)
 
mime_filters []
 

Function Documentation

◆ application_java_filter()

static BOOL application_java_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 391 of file mimefilter.c.

392{
393 return size > 4 && b[0] == 0xca && b[1] == 0xfe && b[2] == 0xba && b[3] == 0xbe;
394}
GLsizeiptr size
Definition: glext.h:5919
GLboolean GLboolean GLboolean b
Definition: glext.h:6204

◆ application_octet_stream_filter()

static BOOL application_octet_stream_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 420 of file mimefilter.c.

421{
422 return TRUE;
423}
#define TRUE
Definition: types.h:120

◆ application_pdf_filter()

static BOOL application_pdf_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 376 of file mimefilter.c.

377{
378 return size > 4 && b[0] == 0x25 && b[1] == 0x50 && b[2] == 0x44 && b[3] == 0x46;
379}

◆ application_postscript_filter()

static BOOL application_postscript_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 371 of file mimefilter.c.

372{
373 return size > 2 && b[0] == '%' && b[1] == '!';
374}

◆ application_xgzip_filter()

static BOOL application_xgzip_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 386 of file mimefilter.c.

387{
388 return size > 2 && b[0] == 0x1f && b[1] == 0x8b;
389}

◆ application_xmsdownload()

static BOOL application_xmsdownload ( const BYTE b,
DWORD  size 
)
static

Definition at line 396 of file mimefilter.c.

397{
398 return size > 2 && b[0] == 'M' && b[1] == 'Z';
399}

◆ application_xzip_filter()

static BOOL application_xzip_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 381 of file mimefilter.c.

382{
383 return size > 2 && b[0] == 0x50 && b[1] == 0x4b;
384}

◆ audio_basic_filter()

static BOOL audio_basic_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 307 of file mimefilter.c.

308{
309 return size > 4
310 && b[0] == '.' && b[1] == 's' && b[2] == 'n' && b[3] == 'd';
311}

◆ audio_wav_filter()

static BOOL audio_wav_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 313 of file mimefilter.c.

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}

◆ find_mime_from_buffer()

static HRESULT find_mime_from_buffer ( const BYTE buf,
DWORD  size,
const WCHAR proposed_mime,
const WCHAR url,
WCHAR **  ret_mime 
)
static

Definition at line 538 of file mimefilter.c.

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}
#define ARRAY_SIZE(A)
Definition: main.h:20
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
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
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
return ret
Definition: mutex.c:146
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
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
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define debugstr_w
Definition: kernel32.h:32
static const struct @611 mime_filters_any_pos[]
static BOOL is_known_mime_type(const WCHAR *mime)
Definition: mimefilter.c:521
static const struct @611 mime_filters[]
static HRESULT find_mime_from_url(const WCHAR *url, WCHAR **ret)
Definition: mimefilter.c:448
static BOOL is_text_plain_char(BYTE b)
Definition: mimefilter.c:401
BOOL(* filter)(const BYTE *, DWORD)
Definition: mimefilter.c:488
static const WCHAR text_plainW[]
Definition: mimefilter.c:483
static const WCHAR app_octetstreamW[]
Definition: mimefilter.c:484
const WCHAR * mime
Definition: mimefilter.c:487
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
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
short WCHAR
Definition: pedump.c:58
#define TRACE(s)
Definition: solgame.cpp:4

Referenced by FindMimeFromData().

◆ find_mime_from_ext()

HRESULT find_mime_from_ext ( const WCHAR ext,
WCHAR **  ret 
)

Definition at line 425 of file mimefilter.c.

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}
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_SUCCESS
Definition: deptool.c:10
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
static const WCHAR *const ext[]
Definition: module.c:53
#define L(x)
Definition: resources.c:13
unsigned long DWORD
Definition: ntddk_ex.h:95
GLuint res
Definition: glext.h:9613
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define HKEY_CLASSES_ROOT
Definition: winreg.h:10
unsigned char BYTE
Definition: xxhash.c:193

Referenced by FileProtocol_StartEx(), and find_mime_from_url().

◆ find_mime_from_url()

static HRESULT find_mime_from_url ( const WCHAR url,
WCHAR **  ret 
)
static

Definition at line 448 of file mimefilter.c.

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}
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT find_mime_from_ext(const WCHAR *ext, WCHAR **ret)
Definition: mimefilter.c:425
static PVOID ptr
Definition: dispmode.c:27

Referenced by find_mime_from_buffer(), and FindMimeFromData().

◆ FindMimeFromData()

HRESULT WINAPI FindMimeFromData ( LPBC  pBC,
LPCWSTR  pwzUrl,
LPVOID  pBuffer,
DWORD  cbSize,
LPCWSTR  pwzMimeProposed,
DWORD  dwMimeFlags,
LPWSTR ppwzMimeOut,
DWORD  dwReserved 
)

Definition at line 655 of file mimefilter.c.

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 WARN(fmt,...)
Definition: precomp.h:61
#define E_INVALIDARG
Definition: ddrawi.h:101
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
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
PVOID pBuffer

Referenced by ITSProtocol_Start(), MkProtocol_StartEx(), read_stream_data(), report_data(), and ResProtocol_Start().

◆ image_bmp_filter()

static BOOL image_bmp_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 350 of file mimefilter.c.

351{
352 return size >= 14
353 && b[0] == 0x42 && b[1] == 0x4d
354 && *(const DWORD *)(b+6) == 0;
355}

◆ image_gif_filter()

static BOOL image_gif_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 320 of file mimefilter.c.

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}

◆ image_pjpeg_filter()

static BOOL image_pjpeg_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 331 of file mimefilter.c.

332{
333 return size > 2 && b[0] == 0xff && b[1] == 0xd8;
334}

◆ image_tiff_filter()

static BOOL image_tiff_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 336 of file mimefilter.c.

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}
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807

◆ image_xpng_filter()

static BOOL image_xpng_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 344 of file mimefilter.c.

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}

◆ impl_from_IInternetProtocol()

◆ impl_from_IInternetProtocolSink()

static MimeFilter * impl_from_IInternetProtocolSink ( IInternetProtocolSink iface)
inlinestatic

◆ is_known_mime_type()

static BOOL is_known_mime_type ( const WCHAR mime)
static

Definition at line 521 of file mimefilter.c.

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}
#define FALSE
Definition: types.h:117

Referenced by find_mime_from_buffer().

◆ is_text_plain_char()

static BOOL is_text_plain_char ( BYTE  b)
inlinestatic

Definition at line 401 of file mimefilter.c.

402{
403 if(b < 0x20 && b != '\n' && b != '\r' && b != '\t')
404 return FALSE;
405 return TRUE;
406}

Referenced by find_mime_from_buffer(), and text_plain_filter().

◆ MimeFilter_Construct()

HRESULT MimeFilter_Construct ( IUnknown pUnkOuter,
LPVOID ppobj 
)

Definition at line 246 of file mimefilter.c.

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}
static const IInternetProtocolVtbl MimeFilterProtocolVtbl
Definition: mimefilter.c:164
static const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
Definition: mimefilter.c:236
#define calloc
Definition: rosglue.h:14
static void URLMON_LockModule(void)
Definition: urlmon_main.h:64

◆ MimeFilterProtocol_Abort()

static HRESULT WINAPI MimeFilterProtocol_Abort ( IInternetProtocol iface,
HRESULT  hrReason,
DWORD  dwOptions 
)
static

Definition at line 105 of file mimefilter.c.

107{
109 FIXME("(%p)->(%08lx %08lx)\n", This, hrReason, dwOptions);
110 return E_NOTIMPL;
111}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define E_NOTIMPL
Definition: ddrawi.h:99
static MimeFilter * impl_from_IInternetProtocol(IInternetProtocol *iface)
Definition: mimefilter.c:31
DWORD dwOptions
Definition: solitaire.cpp:25

◆ MimeFilterProtocol_AddRef()

static ULONG WINAPI MimeFilterProtocol_AddRef ( IInternetProtocol iface)
static

Definition at line 64 of file mimefilter.c.

65{
68 TRACE("(%p) ref=%ld\n", This, ref);
69 return ref;
70}
#define InterlockedIncrement
Definition: armddk.h:53
long LONG
Definition: pedump.c:60
Definition: send.c:48

◆ MimeFilterProtocol_Continue()

static HRESULT WINAPI MimeFilterProtocol_Continue ( IInternetProtocol iface,
PROTOCOLDATA *  pProtocolData 
)
static

Definition at line 98 of file mimefilter.c.

99{
101 FIXME("(%p)->(%p)\n", This, pProtocolData);
102 return E_NOTIMPL;
103}

◆ MimeFilterProtocol_LockRequest()

static HRESULT WINAPI MimeFilterProtocol_LockRequest ( IInternetProtocol iface,
DWORD  dwOptions 
)
static

Definition at line 150 of file mimefilter.c.

151{
153 FIXME("(%p)->(%08lx)\n", This, dwOptions);
154 return E_NOTIMPL;
155}

◆ MimeFilterProtocol_QueryInterface()

static HRESULT WINAPI MimeFilterProtocol_QueryInterface ( IInternetProtocol iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 36 of file mimefilter.c.

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}
const GUID IID_IUnknown
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
#define debugstr_guid
Definition: kernel32.h:35
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define E_NOINTERFACE
Definition: winerror.h:3479

◆ MimeFilterProtocol_Read()

static HRESULT WINAPI MimeFilterProtocol_Read ( IInternetProtocol iface,
void pv,
ULONG  cb,
ULONG pcbRead 
)
static

Definition at line 134 of file mimefilter.c.

136{
138 FIXME("(%p)->(%p %lu %p)\n", This, pv, cb, pcbRead);
139 return E_NOTIMPL;
140}
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118

◆ MimeFilterProtocol_Release()

static ULONG WINAPI MimeFilterProtocol_Release ( IInternetProtocol iface)
static

Definition at line 72 of file mimefilter.c.

73{
76
77 TRACE("(%p) ref=%ld\n", This, ref);
78
79 if(!ref) {
80 free(This);
81
83 }
84
85 return ref;
86}
#define InterlockedDecrement
Definition: armddk.h:52
static void URLMON_UnlockModule(void)
Definition: urlmon_main.h:65

◆ MimeFilterProtocol_Resume()

static HRESULT WINAPI MimeFilterProtocol_Resume ( IInternetProtocol iface)
static

Definition at line 127 of file mimefilter.c.

128{
130 FIXME("(%p)\n", This);
131 return E_NOTIMPL;
132}

◆ MimeFilterProtocol_Seek()

static HRESULT WINAPI MimeFilterProtocol_Seek ( IInternetProtocol iface,
LARGE_INTEGER  dlibMove,
DWORD  dwOrigin,
ULARGE_INTEGER plibNewPosition 
)
static

Definition at line 142 of file mimefilter.c.

144{
146 FIXME("(%p)->(%ld %ld %p)\n", This, dlibMove.u.LowPart, dwOrigin, plibNewPosition);
147 return E_NOTIMPL;
148}
struct _LARGE_INTEGER::@2527 u

◆ MimeFilterProtocol_Start()

static HRESULT WINAPI MimeFilterProtocol_Start ( IInternetProtocol iface,
LPCWSTR  szUrl,
IInternetProtocolSink pOIProtSink,
IInternetBindInfo pOIBindInfo,
DWORD  grfPI,
HANDLE_PTR  dwReserved 
)
static

Definition at line 88 of file mimefilter.c.

91{
93 FIXME("(%p)->(%s %p %p %08lx %Ix)\n", This, debugstr_w(szUrl), pOIProtSink,
94 pOIBindInfo, grfPI, dwReserved);
95 return E_NOTIMPL;
96}

◆ MimeFilterProtocol_Suspend()

static HRESULT WINAPI MimeFilterProtocol_Suspend ( IInternetProtocol iface)
static

Definition at line 120 of file mimefilter.c.

121{
123 FIXME("(%p)\n", This);
124 return E_NOTIMPL;
125}

◆ MimeFilterProtocol_Terminate()

static HRESULT WINAPI MimeFilterProtocol_Terminate ( IInternetProtocol iface,
DWORD  dwOptions 
)
static

Definition at line 113 of file mimefilter.c.

114{
116 FIXME("(%p)->(%08lx)\n", This, dwOptions);
117 return E_NOTIMPL;
118}

◆ MimeFilterProtocol_UnlockRequest()

static HRESULT WINAPI MimeFilterProtocol_UnlockRequest ( IInternetProtocol iface)
static

Definition at line 157 of file mimefilter.c.

158{
160 FIXME("(%p)\n", This);
161 return E_NOTIMPL;
162}

◆ MimeFilterSink_AddRef()

static ULONG WINAPI MimeFilterSink_AddRef ( IInternetProtocolSink iface)
static

Definition at line 192 of file mimefilter.c.

193{
195 return IInternetProtocol_AddRef(&This->IInternetProtocol_iface);
196}
static MimeFilter * impl_from_IInternetProtocolSink(IInternetProtocolSink *iface)
Definition: mimefilter.c:180

◆ MimeFilterSink_QueryInterface()

static HRESULT WINAPI MimeFilterSink_QueryInterface ( IInternetProtocolSink iface,
REFIID  riid,
void **  ppv 
)
static

Definition at line 185 of file mimefilter.c.

187{
189 return IInternetProtocol_QueryInterface(&This->IInternetProtocol_iface, riid, ppv);
190}

◆ MimeFilterSink_Release()

static ULONG WINAPI MimeFilterSink_Release ( IInternetProtocolSink iface)
static

Definition at line 198 of file mimefilter.c.

199{
201 return IInternetProtocol_Release(&This->IInternetProtocol_iface);
202}

◆ MimeFilterSink_ReportData()

static HRESULT WINAPI MimeFilterSink_ReportData ( IInternetProtocolSink iface,
DWORD  grfBSCF,
ULONG  ulProgress,
ULONG  ulProgressMax 
)
static

Definition at line 220 of file mimefilter.c.

222{
224 FIXME("(%p)->(%ld %lu %lu)\n", This, grfBSCF, ulProgress, ulProgressMax);
225 return E_NOTIMPL;
226}

◆ MimeFilterSink_ReportProgress()

static HRESULT WINAPI MimeFilterSink_ReportProgress ( IInternetProtocolSink iface,
ULONG  ulStatusCode,
LPCWSTR  szStatusText 
)
static

Definition at line 212 of file mimefilter.c.

214{
216 FIXME("(%p)->(%lu %s)\n", This, ulStatusCode, debugstr_w(szStatusText));
217 return E_NOTIMPL;
218}

◆ MimeFilterSink_ReportResult()

static HRESULT WINAPI MimeFilterSink_ReportResult ( IInternetProtocolSink iface,
HRESULT  hrResult,
DWORD  dwError,
LPCWSTR  szResult 
)
static

Definition at line 228 of file mimefilter.c.

230{
232 FIXME("(%p)->(%08lx %ld %s)\n", This, hrResult, dwError, debugstr_w(szResult));
233 return E_NOTIMPL;
234}

◆ MimeFilterSink_Switch()

static HRESULT WINAPI MimeFilterSink_Switch ( IInternetProtocolSink iface,
PROTOCOLDATA *  pProtocolData 
)
static

Definition at line 204 of file mimefilter.c.

206{
208 FIXME("(%p)->(%p)\n", This, pProtocolData);
209 return E_NOTIMPL;
210}

◆ text_html_filter()

static BOOL text_html_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 269 of file mimefilter.c.

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}

◆ text_plain_filter()

static BOOL text_plain_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 408 of file mimefilter.c.

409{
410 const BYTE *ptr;
411
412 for(ptr = b; ptr < b+size-1; ptr++) {
414 return FALSE;
415 }
416
417 return TRUE;
418}

◆ text_richtext_filter()

static BOOL text_richtext_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 264 of file mimefilter.c.

265{
266 return size > 5 && !memcmp(b, "{\\rtf", 5);
267}

◆ text_xml_filter()

static BOOL text_xml_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 293 of file mimefilter.c.

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}

◆ video_avi_filter()

static BOOL video_avi_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 357 of file mimefilter.c.

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}

◆ video_mpeg_filter()

static BOOL video_mpeg_filter ( const BYTE b,
DWORD  size 
)
static

Definition at line 364 of file mimefilter.c.

365{
366 return size > 4
367 && !b[0] && !b[1] && b[2] == 0x01
368 && (b[3] == 0xb3 || b[3] == 0xba);
369}

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( urlmon  )

Variable Documentation

◆ app_octetstreamW

const WCHAR app_octetstreamW[] = L"application/octet-stream"
static

Definition at line 484 of file mimefilter.c.

Referenced by find_mime_from_buffer().

◆ filter

BOOL(* filter) (const BYTE *, DWORD) ( const BYTE ,
DWORD   
)

Definition at line 488 of file mimefilter.c.

Referenced by find_mime_from_buffer().

◆ InternetProtocolSinkVtbl

const IInternetProtocolSinkVtbl InternetProtocolSinkVtbl
static
Initial value:
= {
}
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 WINAPI MimeFilterSink_Switch(IInternetProtocolSink *iface, PROTOCOLDATA *pProtocolData)
Definition: mimefilter.c:204
static ULONG WINAPI MimeFilterSink_Release(IInternetProtocolSink *iface)
Definition: mimefilter.c:198
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
static HRESULT WINAPI MimeFilterSink_ReportProgress(IInternetProtocolSink *iface, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: mimefilter.c:212

Definition at line 236 of file mimefilter.c.

Referenced by MimeFilter_Construct().

◆ mime

◆ 

const struct { ... } mime_filters[]
Initial value:
= {
{L"text/richtext", text_richtext_filter},
{L"audio/basic", audio_basic_filter},
{L"audio/wav", audio_wav_filter},
{L"image/gif", image_gif_filter},
{L"image/pjpeg", image_pjpeg_filter},
{L"image/tiff", image_tiff_filter},
{L"image/x-png", image_xpng_filter},
{L"image/bmp", image_bmp_filter},
{L"video/avi", video_avi_filter},
{L"video/mpeg", video_mpeg_filter},
{L"application/postscript", application_postscript_filter},
{L"application/pdf", application_pdf_filter},
{L"application/x-zip-compressed", application_xzip_filter},
{L"application/x-gzip-compressed", application_xgzip_filter},
{L"application/java", application_java_filter},
{L"application/x-msdownload", application_xmsdownload},
}
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 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 BOOL application_pdf_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:376
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 BOOL application_xgzip_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:386
static BOOL application_octet_stream_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:420
static BOOL application_xmsdownload(const BYTE *b, DWORD size)
Definition: mimefilter.c:396
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 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 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 BOOL image_xpng_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:344
static BOOL application_postscript_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:371

Referenced by find_mime_from_buffer(), and is_known_mime_type().

◆ 

const struct { ... } mime_filters_any_pos[]
Initial value:
= {
{L"text/html", text_html_filter},
{L"text/xml", text_xml_filter}
}
static BOOL text_html_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:269
static BOOL text_xml_filter(const BYTE *b, DWORD size)
Definition: mimefilter.c:293

Referenced by find_mime_from_buffer(), and is_known_mime_type().

◆ MimeFilterProtocolVtbl

const IInternetProtocolVtbl MimeFilterProtocolVtbl
static
Initial value:
= {
}
static HRESULT WINAPI MimeFilterProtocol_Read(IInternetProtocol *iface, void *pv, ULONG cb, ULONG *pcbRead)
Definition: mimefilter.c:134
static HRESULT WINAPI MimeFilterProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv)
Definition: mimefilter.c:36
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 HRESULT WINAPI MimeFilterProtocol_UnlockRequest(IInternetProtocol *iface)
Definition: mimefilter.c:157
static HRESULT WINAPI MimeFilterProtocol_LockRequest(IInternetProtocol *iface, DWORD dwOptions)
Definition: mimefilter.c:150
static HRESULT WINAPI MimeFilterProtocol_Suspend(IInternetProtocol *iface)
Definition: mimefilter.c:120
static HRESULT WINAPI MimeFilterProtocol_Continue(IInternetProtocol *iface, PROTOCOLDATA *pProtocolData)
Definition: mimefilter.c:98
static HRESULT WINAPI MimeFilterProtocol_Seek(IInternetProtocol *iface, LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER *plibNewPosition)
Definition: mimefilter.c:142
static HRESULT WINAPI MimeFilterProtocol_Terminate(IInternetProtocol *iface, DWORD dwOptions)
Definition: mimefilter.c:113
static HRESULT WINAPI MimeFilterProtocol_Resume(IInternetProtocol *iface)
Definition: mimefilter.c:127
static ULONG WINAPI MimeFilterProtocol_AddRef(IInternetProtocol *iface)
Definition: mimefilter.c:64
static ULONG WINAPI MimeFilterProtocol_Release(IInternetProtocol *iface)
Definition: mimefilter.c:72

Definition at line 164 of file mimefilter.c.

Referenced by MimeFilter_Construct().

◆ text_plainW

const WCHAR text_plainW[] = L"text/plain"
static

Definition at line 483 of file mimefilter.c.

Referenced by find_mime_from_buffer(), and test_FindMimeFromData().