Module: wine Branch: master Commit: 22679a2419597fd65de45a3b0c4c132623bf2a48 URL: http://source.winehq.org/git/wine.git/?a=commit;h=22679a2419597fd65de45a3b0c...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Aug 3 21:40:56 2010 +0200
mshtml: Added support for custom post data type.
---
dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/navigate.c | 71 +++++++++++++++++++++++++++++++---------- dlls/mshtml/nsio.c | 24 +++++++++++--- 3 files changed, 73 insertions(+), 23 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 1e7bac8..2db2410 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -462,6 +462,7 @@ typedef struct {
nsWineURI *uri; nsIInputStream *post_data_stream; + BOOL parse_stream; nsILoadGroup *load_group; nsIInterfaceRequestor *notif_callback; nsISupports *owner; diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c index 239fbea..5cd63c1 100644 --- a/dlls/mshtml/navigate.c +++ b/dlls/mshtml/navigate.c @@ -1,5 +1,5 @@ /* - * Copyright 2006-2007 Jacek Caban for CodeWeavers + * Copyright 2006-2010 Jacek Caban for CodeWeavers * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -679,20 +679,48 @@ static HRESULT parse_headers(const WCHAR *headers, struct list *headers_list) return S_OK; }
+static HRESULT read_post_data_stream(nsIInputStream *stream, HGLOBAL *post_data, + ULONG *post_data_len) +{ + PRUint32 data_len = 0, available = 0; + char *data; + nsresult nsres; + + nsres = nsIInputStream_Available(stream, &available); + if(NS_FAILED(nsres)) + return E_FAIL; + + data = GlobalAlloc(0, available+1); + if(!data) + return E_OUTOFMEMORY; + + nsres = nsIInputStream_Read(stream, data, available, &data_len); + if(NS_FAILED(nsres)) { + GlobalFree(data); + return E_FAIL; + } + + data[data_len] = 0; + *post_data = data; + *post_data_len = data_len; + return S_OK; +} + static void parse_post_data(nsIInputStream *post_data_stream, LPWSTR *headers_ret, HGLOBAL *post_data_ret, ULONG *post_data_len_ret) { - PRUint32 post_data_len = 0, available = 0; + ULONG post_data_len; HGLOBAL post_data = NULL; LPWSTR headers = NULL; DWORD headers_len = 0, len; const char *ptr, *ptr2, *post_data_end; - - nsIInputStream_Available(post_data_stream, &available); - post_data = GlobalAlloc(0, available+1); - nsIInputStream_Read(post_data_stream, post_data, available, &post_data_len); + HRESULT hres;
- TRACE("post_data = %s\n", debugstr_an(post_data, post_data_len)); + hres = read_post_data_stream(post_data_stream, &post_data, &post_data_len); + if(FAILED(hres)) { + FIXME("read_post_data_stream failed: %08x\n", hres); + return; + }
ptr = ptr2 = post_data; post_data_end = (const char*)post_data+post_data_len; @@ -1088,20 +1116,27 @@ static HRESULT nsChannelBSC_start_binding(BSCallback *bsc) static HRESULT nsChannelBSC_init_bindinfo(BSCallback *bsc) { nsChannelBSC *This = NSCHANNELBSC_THIS(bsc); + HRESULT hres;
if(This->nschannel && This->nschannel->post_data_stream) { - WCHAR *headers; - HRESULT hres; + if(This->nschannel->parse_stream) { + WCHAR *headers;
- parse_post_data(This->nschannel->post_data_stream, &headers, &This->bsc.post_data, &This->bsc.post_data_len); + parse_post_data(This->nschannel->post_data_stream, &headers, + &This->bsc.post_data, &This->bsc.post_data_len);
- TRACE("headers = %s post_data = %s\n", debugstr_w(headers), - debugstr_an(This->bsc.post_data, This->bsc.post_data_len)); + hres = parse_headers(headers, &This->nschannel->request_headers); + heap_free(headers); + if(FAILED(hres)) + return hres; + }else { + hres = read_post_data_stream(This->nschannel->post_data_stream, + &This->bsc.post_data, &This->bsc.post_data_len); + if(FAILED(hres)) + return hres; + }
- hres = parse_headers(headers, &This->nschannel->request_headers); - heap_free(headers); - if(FAILED(hres)) - return hres; + TRACE("post_data = %s\n", debugstr_an(This->bsc.post_data, This->bsc.post_data_len)); }
return S_OK; diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c index 13dbc44..d288a6b 100644 --- a/dlls/mshtml/nsio.c +++ b/dlls/mshtml/nsio.c @@ -1323,17 +1323,31 @@ static nsresult NSAPI nsUploadChannel_SetUploadStream(nsIUploadChannel *iface, nsChannel *This = NSUPCHANNEL_THIS(iface); const char *content_type;
- TRACE("(%p)->(%p %s %d)\n", This, aStream, debugstr_nsacstr(aContentType), aContentLength); + static const WCHAR content_typeW[] = + {'C','o','n','t','e','n','t','-','T','y','p','e',0};
- if(This->post_data_stream) - nsIInputStream_Release(This->post_data_stream); + TRACE("(%p)->(%p %s %d)\n", This, aStream, debugstr_nsacstr(aContentType), aContentLength);
+ This->parse_stream = TRUE; if(aContentType) { nsACString_GetData(aContentType, &content_type); - if(*content_type) - FIXME("Unsupported aContentType argument: %s\n", debugstr_a(content_type)); + if(*content_type) { + WCHAR *ct; + + ct = heap_strdupAtoW(content_type); + if(!ct) + return NS_ERROR_UNEXPECTED; + + set_http_header(&This->request_headers, content_typeW, + sizeof(content_typeW)/sizeof(WCHAR), ct, strlenW(ct)); + heap_free(ct); + This->parse_stream = FALSE; + } }
+ if(This->post_data_stream) + nsIInputStream_Release(This->post_data_stream); + if(aContentLength != -1) FIXME("Unsupported acontentLength = %d\n", aContentLength);