Jacek Caban : mshtml: Added separated structure to store request data.

Alexandre Julliard julliard at winehq.org
Thu Sep 26 15:44:07 CDT 2013


Module: wine
Branch: master
Commit: 29d27ef669349354ef829af24c13c83c45a0f8f5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=29d27ef669349354ef829af24c13c83c45a0f8f5

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Sep 26 17:34:49 2013 +0200

mshtml: Added separated structure to store request data.

---

 dlls/mshtml/binding.h  |   10 ++++--
 dlls/mshtml/navigate.c |   83 +++++++++++++++++++++++++++---------------------
 2 files changed, 54 insertions(+), 39 deletions(-)

diff --git a/dlls/mshtml/binding.h b/dlls/mshtml/binding.h
index d953541..cfae014 100644
--- a/dlls/mshtml/binding.h
+++ b/dlls/mshtml/binding.h
@@ -49,6 +49,12 @@ typedef struct {
     struct list request_headers;
 } nsChannel;
 
+typedef struct {
+    WCHAR *headers;
+    HGLOBAL post_data;
+    ULONG post_data_len;
+} request_data_t;
+
 typedef struct BSCallbackVtbl BSCallbackVtbl;
 
 struct BSCallback {
@@ -61,9 +67,7 @@ struct BSCallback {
 
     LONG ref;
 
-    LPWSTR headers;
-    HGLOBAL post_data;
-    ULONG post_data_len;
+    request_data_t request_data;
     ULONG readed;
     DWORD bindf;
     BOOL bindinfo_ready;
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 4e6ed61..4091529 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -228,6 +228,13 @@ static nsProtocolStream *create_nsprotocol_stream(void)
     return ret;
 }
 
+static void release_request_data(request_data_t *request_data)
+{
+    heap_free(request_data->headers);
+    if(request_data->post_data)
+        GlobalFree(request_data->post_data);
+}
+
 static inline BSCallback *impl_from_IBindStatusCallback(IBindStatusCallback *iface)
 {
     return CONTAINING_RECORD(iface, BSCallback, IBindStatusCallback_iface);
@@ -286,15 +293,13 @@ static ULONG WINAPI BindStatusCallback_Release(IBindStatusCallback *iface)
     TRACE("(%p) ref = %d\n", This, ref);
 
     if(!ref) {
-        if(This->post_data)
-            GlobalFree(This->post_data);
+        release_request_data(&This->request_data);
         if(This->mon)
             IMoniker_Release(This->mon);
         if(This->binding)
             IBinding_Release(This->binding);
         list_remove(&This->entry);
         list_init(&This->entry);
-        heap_free(This->headers);
 
         This->vtbl->destroy(This);
     }
@@ -396,15 +401,15 @@ static HRESULT WINAPI BindStatusCallback_GetBindInfo(IBindStatusCallback *iface,
     memset(pbindinfo, 0, size);
     pbindinfo->cbSize = size;
 
-    pbindinfo->cbstgmedData = This->post_data_len;
+    pbindinfo->cbstgmedData = This->request_data.post_data_len;
     pbindinfo->dwCodePage = CP_UTF8;
     pbindinfo->dwOptions = 0x80000;
 
-    if(This->post_data) {
+    if(This->request_data.post_data_len) {
         pbindinfo->dwBindVerb = BINDVERB_POST;
 
         pbindinfo->stgmedData.tymed = TYMED_HGLOBAL;
-        pbindinfo->stgmedData.u.hGlobal = This->post_data;
+        pbindinfo->stgmedData.u.hGlobal = This->request_data.post_data;
         pbindinfo->stgmedData.pUnkForRelease = (IUnknown*)&This->IBindStatusCallback_iface;
         IBindStatusCallback_AddRef(&This->IBindStatusCallback_iface);
     }
@@ -483,14 +488,14 @@ static HRESULT WINAPI HttpNegotiate_BeginningTransaction(IHttpNegotiate2 *iface,
     if(hres != S_FALSE)
         return hres;
 
-    if(This->headers) {
+    if(This->request_data.headers) {
         DWORD size;
 
-        size = (strlenW(This->headers)+1)*sizeof(WCHAR);
+        size = (strlenW(This->request_data.headers)+1)*sizeof(WCHAR);
         *pszAdditionalHeaders = CoTaskMemAlloc(size);
         if(!*pszAdditionalHeaders)
             return E_OUTOFMEMORY;
-        memcpy(*pszAdditionalHeaders, This->headers, size);
+        memcpy(*pszAdditionalHeaders, This->request_data.headers, size);
     }
 
     return S_OK;
@@ -1001,7 +1006,8 @@ HRESULT bind_mon_to_wstr(HTMLInnerWindow *window, IMoniker *mon, WCHAR **ret)
     return S_OK;
 }
 
-static HRESULT read_post_data_stream(nsChannelBSC *This, nsChannel *nschannel)
+static HRESULT read_post_data_stream(nsIInputStream *stream, BOOL contains_headers, struct list *headers_list,
+        request_data_t *request_data)
 {
     UINT64 available = 0;
     UINT32 data_len = 0;
@@ -1009,10 +1015,10 @@ static HRESULT read_post_data_stream(nsChannelBSC *This, nsChannel *nschannel)
     nsresult nsres;
     HRESULT hres = S_OK;
 
-    if(!nschannel->post_data_stream)
+    if(!stream)
         return S_OK;
 
-    nsres =  nsIInputStream_Available(nschannel->post_data_stream, &available);
+    nsres =  nsIInputStream_Available(stream, &available);
     if(NS_FAILED(nsres))
         return E_FAIL;
 
@@ -1020,13 +1026,13 @@ static HRESULT read_post_data_stream(nsChannelBSC *This, nsChannel *nschannel)
     if(!data)
         return E_OUTOFMEMORY;
 
-    nsres = nsIInputStream_Read(nschannel->post_data_stream, data, available, &data_len);
+    nsres = nsIInputStream_Read(stream, data, available, &data_len);
     if(NS_FAILED(nsres)) {
         GlobalFree(data);
         return E_FAIL;
     }
 
-    if(nschannel->post_data_contains_headers) {
+    if(contains_headers) {
         if(data_len >= 2 && data[0] == '\r' && data[1] == '\n') {
             post_data = data+2;
             data_len -= 2;
@@ -1038,21 +1044,23 @@ static HRESULT read_post_data_stream(nsChannelBSC *This, nsChannel *nschannel)
             post_data += data_len;
             for(ptr = data; ptr+4 < data+data_len; ptr++) {
                 if(!memcmp(ptr, "\r\n\r\n", 4)) {
-                    post_data = ptr+4;
+                    ptr += 2;
+                    post_data = ptr+2;
                     break;
                 }
             }
 
             data_len -= post_data-data;
 
-            size = MultiByteToWideChar(CP_ACP, 0, data, post_data-data, NULL, 0);
+            size = MultiByteToWideChar(CP_ACP, 0, data, ptr-data, NULL, 0);
             headers = heap_alloc((size+1)*sizeof(WCHAR));
             if(headers) {
-                MultiByteToWideChar(CP_ACP, 0, data, post_data-data, headers, size);
+                MultiByteToWideChar(CP_ACP, 0, data, ptr-data, headers, size);
                 headers[size] = 0;
-                hres = parse_headers(headers , &nschannel->request_headers);
+                if(headers_list)
+                    hres = parse_headers(headers, headers_list);
                 if(SUCCEEDED(hres))
-                    This->bsc.headers = headers;
+                    request_data->headers = headers;
                 else
                     heap_free(headers);
             }else {
@@ -1081,9 +1089,9 @@ static HRESULT read_post_data_stream(nsChannelBSC *This, nsChannel *nschannel)
         post_data = new_data;
     }
 
-    This->bsc.post_data = post_data;
-    This->bsc.post_data_len = data_len;
-    TRACE("post_data = %s\n", debugstr_a(This->bsc.post_data));
+    request_data->post_data = post_data;
+    request_data->post_data_len = data_len;
+    TRACE("post_data = %s\n", debugstr_an(request_data->post_data, request_data->post_data_len));
     return S_OK;
 }
 
@@ -1399,10 +1407,12 @@ static HRESULT nsChannelBSC_start_binding(BSCallback *bsc)
 static HRESULT nsChannelBSC_init_bindinfo(BSCallback *bsc)
 {
     nsChannelBSC *This = nsChannelBSC_from_BSCallback(bsc);
+    nsChannel *nschannel = This->nschannel;
     HRESULT hres;
 
-    if(This->nschannel && This->nschannel->post_data_stream) {
-        hres = read_post_data_stream(This, This->nschannel);
+    if(nschannel && nschannel->post_data_stream) {
+        hres = read_post_data_stream(nschannel->post_data_stream, nschannel->post_data_contains_headers,
+                &nschannel->request_headers, &This->bsc.request_data);
         if(FAILED(hres))
             return hres;
     }
@@ -1854,23 +1864,23 @@ HRESULT create_channelbsc(IMoniker *mon, const WCHAR *headers, BYTE *post_data,
     ret->is_doc_channel = is_doc_binding;
 
     if(headers) {
-        ret->bsc.headers = heap_strdupW(headers);
-        if(!ret->bsc.headers) {
+        ret->bsc.request_data.headers = heap_strdupW(headers);
+        if(!ret->bsc.request_data.headers) {
             IBindStatusCallback_Release(&ret->bsc.IBindStatusCallback_iface);
             return E_OUTOFMEMORY;
         }
     }
 
     if(post_data) {
-        ret->bsc.post_data = GlobalAlloc(0, post_data_size);
-        if(!ret->bsc.post_data) {
-            heap_free(ret->bsc.headers);
+        ret->bsc.request_data.post_data = GlobalAlloc(0, post_data_size);
+        if(!ret->bsc.request_data.post_data) {
+            release_request_data(&ret->bsc.request_data);
             IBindStatusCallback_Release(&ret->bsc.IBindStatusCallback_iface);
             return E_OUTOFMEMORY;
         }
 
-        memcpy(ret->bsc.post_data, post_data, post_data_size);
-        ret->bsc.post_data_len = post_data_size;
+        memcpy(ret->bsc.request_data.post_data, post_data, post_data_size);
+        ret->bsc.request_data.post_data_len = post_data_size;
     }
 
     TRACE("created %p\n", ret);
@@ -1994,12 +2004,12 @@ void channelbsc_set_channel(nsChannelBSC *This, nsChannel *channel, nsIStreamLis
         This->nscontext = context;
     }
 
-    if(This->bsc.headers) {
+    if(This->bsc.request_data.headers) {
         HRESULT hres;
 
-        hres = parse_headers(This->bsc.headers, &channel->request_headers);
-        heap_free(This->bsc.headers);
-        This->bsc.headers = NULL;
+        hres = parse_headers(This->bsc.request_data.headers, &channel->request_headers);
+        heap_free(This->bsc.request_data.headers);
+        This->bsc.request_data.headers = NULL;
         if(FAILED(hres))
             WARN("parse_headers failed: %08x\n", hres);
     }
@@ -2347,7 +2357,8 @@ HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url, nsChannel *nschanne
     }
 
     if(nschannel)
-        read_post_data_stream(callback, nschannel);
+        read_post_data_stream(nschannel->post_data_stream, nschannel->post_data_contains_headers,
+                &nschannel->request_headers, &callback->bsc.request_data);
 
     hres = CreateAsyncBindCtx(0, &callback->bsc.IBindStatusCallback_iface, NULL, &bindctx);
     if(SUCCEEDED(hres))




More information about the wine-cvs mailing list