Module: wine Branch: master Commit: 19cb4bcd3640694c8901622d343f47bb08ec99f0 URL: http://source.winehq.org/git/wine.git/?a=commit;h=19cb4bcd3640694c8901622d34...
Author: Huw Davies huw@codeweavers.com Date: Mon Nov 26 12:03:35 2007 +0000
inetcomm: Implement IMimeBody:IsContentType.
---
dlls/inetcomm/mimeole.c | 53 +++++++++++++++++++++++++++++++++++++++- dlls/inetcomm/tests/mimeole.c | 7 +++++ 2 files changed, 58 insertions(+), 2 deletions(-)
diff --git a/dlls/inetcomm/mimeole.c b/dlls/inetcomm/mimeole.c index 71c621f..dea1597 100644 --- a/dlls/inetcomm/mimeole.c +++ b/dlls/inetcomm/mimeole.c @@ -101,6 +101,8 @@ typedef struct MimeBody struct list headers; struct list new_props; /* FIXME: This should be in a PropertySchema */ DWORD next_prop_id; + char *content_pri_type; + char *content_sub_type; } MimeBody;
static inline MimeBody *impl_from_IMimeBody( IMimeBody *iface ) @@ -343,6 +345,30 @@ static void read_value(header_t *header, char **cur) *cur = end; }
+static void init_content_type(MimeBody *body, header_t *header) +{ + char *slash; + DWORD len; + + if(header->prop->id != PID_HDR_CNTTYPE) + { + ERR("called with header %s\n", header->prop->name); + return; + } + + slash = strchr(header->value.pszVal, '/'); + if(!slash) + { + WARN("malformed context type value\n"); + return; + } + len = slash - header->value.pszVal; + body->content_pri_type = HeapAlloc(GetProcessHeap(), 0, len + 1); + memcpy(body->content_pri_type, header->value.pszVal, len); + body->content_pri_type[len] = '\0'; + body->content_sub_type = strdupA(slash + 1); +} + static HRESULT parse_headers(MimeBody *body, IStream *stm) { char *header_buf, *cur_header_ptr; @@ -357,6 +383,9 @@ static HRESULT parse_headers(MimeBody *body, IStream *stm) { read_value(header, &cur_header_ptr); list_add_tail(&body->headers, &header->entry); + + if(header->prop->id == PID_HDR_CNTTYPE) + init_content_type(body, header); }
HeapFree(GetProcessHeap(), 0, header_buf); @@ -448,6 +477,8 @@ static ULONG WINAPI MimeBody_Release(IMimeBody* iface) empty_header_list(&This->headers); empty_new_prop_list(&This->new_props);
+ HeapFree(GetProcessHeap(), 0, This->content_pri_type); + HeapFree(GetProcessHeap(), 0, This->content_sub_type); HeapFree(GetProcessHeap(), 0, This); }
@@ -631,8 +662,24 @@ static HRESULT WINAPI MimeBody_IsContentType( LPCSTR pszPriType, LPCSTR pszSubType) { - FIXME("stub\n"); - return E_NOTIMPL; + MimeBody *This = impl_from_IMimeBody(iface); + + TRACE("(%p)->(%s, %s)\n", This, debugstr_a(pszPriType), debugstr_a(pszSubType)); + if(pszPriType) + { + const char *pri = This->content_pri_type; + if(!pri) pri = "text"; + if(strcasecmp(pri, pszPriType)) return S_FALSE; + } + + if(pszSubType) + { + const char *sub = This->content_sub_type; + if(!sub) sub = "plain"; + if(strcasecmp(sub, pszSubType)) return S_FALSE; + } + + return S_OK; }
static HRESULT WINAPI MimeBody_BindToObject( @@ -875,6 +922,8 @@ HRESULT MimeBody_create(IUnknown *outer, void **obj) list_init(&This->headers); list_init(&This->new_props); This->next_prop_id = FIRST_CUSTOM_PROP_ID; + This->content_pri_type = NULL; + This->content_sub_type = NULL;
*obj = (IMimeBody *)&This->lpVtbl; return S_OK; diff --git a/dlls/inetcomm/tests/mimeole.c b/dlls/inetcomm/tests/mimeole.c index 0683356..2c814d2 100644 --- a/dlls/inetcomm/tests/mimeole.c +++ b/dlls/inetcomm/tests/mimeole.c @@ -113,6 +113,13 @@ static void test_CreateBody(void) IStream_Seek(in, off, STREAM_SEEK_CUR, &pos); ok(pos.LowPart == 328, "pos %u\n", pos.LowPart);
+ hr = IMimeBody_IsContentType(body, "multipart", "mixed"); + ok(hr == S_OK, "ret %08x\n", hr); + hr = IMimeBody_IsContentType(body, "text", "plain"); + ok(hr == S_FALSE, "ret %08x\n", hr); + hr = IMimeBody_IsContentType(body, NULL, "mixed"); + ok(hr == S_OK, "ret %08x\n", hr); + IMimeBody_Release(body); }