Jacek Caban : mshtml: Allow post data and headers to be passed to create_channelbsc.

Alexandre Julliard julliard at winehq.org
Wed Mar 3 11:15:47 CST 2010


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Mar  3 14:53:49 2010 +0100

mshtml: Allow post data and headers to be passed to create_channelbsc.

---

 dlls/mshtml/mshtml_private.h |    2 +-
 dlls/mshtml/navigate.c       |   52 ++++++++++++++++++++++++++++++++---------
 dlls/mshtml/nsio.c           |    4 ++-
 dlls/mshtml/persist.c        |    4 ++-
 4 files changed, 47 insertions(+), 15 deletions(-)

diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 8f91d38..bf6561c 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -745,7 +745,7 @@ void abort_document_bindings(HTMLDocumentNode*);
 
 HRESULT bind_mon_to_buffer(HTMLDocumentNode*,IMoniker*,void**,DWORD*);
 
-nsChannelBSC *create_channelbsc(IMoniker*);
+HRESULT create_channelbsc(IMoniker*,WCHAR*,BYTE*,DWORD,nsChannelBSC**);
 HRESULT channelbsc_load_stream(nsChannelBSC*,IStream*);
 void channelbsc_set_channel(nsChannelBSC*,nsChannel*,nsIStreamListener*,nsISupports*);
 IMoniker *get_channelbsc_mon(nsChannelBSC*);
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index b3ca1b0..e326e3c 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -1113,13 +1113,37 @@ static const BSCallbackVtbl nsChannelBSCVtbl = {
     nsChannelBSC_on_response
 };
 
-nsChannelBSC *create_channelbsc(IMoniker *mon)
+HRESULT create_channelbsc(IMoniker *mon, WCHAR *headers, BYTE *post_data, DWORD post_data_size, nsChannelBSC **retval)
 {
-    nsChannelBSC *ret = heap_alloc_zero(sizeof(*ret));
+    nsChannelBSC *ret;
+
+    ret = heap_alloc_zero(sizeof(*ret));
+    if(!ret)
+        return E_OUTOFMEMORY;
 
     init_bscallback(&ret->bsc, &nsChannelBSCVtbl, mon, BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA);
 
-    return ret;
+    if(headers) {
+        ret->bsc.headers = heap_strdupW(headers);
+        if(!ret->bsc.headers) {
+            IBindStatusCallback_Release(STATUSCLB(&ret->bsc));
+            return E_OUTOFMEMORY;
+        }
+    }
+
+    if(post_data) {
+        ret->bsc.post_data = GlobalAlloc(0, post_data_size);
+        if(!ret->bsc.headers) {
+            IBindStatusCallback_Release(STATUSCLB(&ret->bsc));
+            return E_OUTOFMEMORY;
+        }
+
+        memcpy(ret->bsc.post_data, post_data, post_data_size);
+        ret->bsc.post_data_len = post_data_size;
+    }
+
+    *retval = ret;
+    return S_OK;
 }
 
 IMoniker *get_channelbsc_mon(nsChannelBSC *This)
@@ -1229,8 +1253,8 @@ HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url,
         nsIInputStream *post_data_stream, DWORD hlnf)
 {
     IHlinkFrame *hlink_frame;
+    nsChannelBSC *callback;
     IServiceProvider *sp;
-    BSCallback *callback;
     IBindCtx *bindctx;
     IMoniker *mon;
     IHlink *hlink;
@@ -1247,16 +1271,20 @@ HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url,
     if(FAILED(hres))
         return hres;
 
-    callback = &create_channelbsc(NULL)->bsc;
+    hres = create_channelbsc(NULL, NULL, NULL, 0, &callback);
+    if(FAILED(hres)) {
+        IHlinkFrame_Release(hlink_frame);
+        return hres;
+    }
 
     if(post_data_stream) {
-        parse_post_data(post_data_stream, &callback->headers, &callback->post_data,
-                        &callback->post_data_len);
-        TRACE("headers = %s post_data = %s\n", debugstr_w(callback->headers),
-              debugstr_an(callback->post_data, callback->post_data_len));
+        parse_post_data(post_data_stream, &callback->bsc.headers, &callback->bsc.post_data,
+                        &callback->bsc.post_data_len);
+        TRACE("headers = %s post_data = %s\n", debugstr_w(callback->bsc.headers),
+              debugstr_an(callback->bsc.post_data, callback->bsc.post_data_len));
     }
 
-    hres = CreateAsyncBindCtx(0, STATUSCLB(callback), NULL, &bindctx);
+    hres = CreateAsyncBindCtx(0, STATUSCLB(&callback->bsc), NULL, &bindctx);
     if(SUCCEEDED(hres))
         hres = CoCreateInstance(&CLSID_StdHlink, NULL, CLSCTX_INPROC_SERVER,
                 &IID_IHlink, (LPVOID*)&hlink);
@@ -1272,14 +1300,14 @@ HRESULT hlink_frame_navigate(HTMLDocument *doc, LPCWSTR url,
             IHlink_SetTargetFrameName(hlink, wszBlank); /* FIXME */
         }
 
-        hres = IHlinkFrame_Navigate(hlink_frame, hlnf, bindctx, STATUSCLB(callback), hlink);
+        hres = IHlinkFrame_Navigate(hlink_frame, hlnf, bindctx, STATUSCLB(&callback->bsc), hlink);
 
         IMoniker_Release(mon);
     }
 
     IHlinkFrame_Release(hlink_frame);
     IBindCtx_Release(bindctx);
-    IBindStatusCallback_Release(STATUSCLB(callback));
+    IBindStatusCallback_Release(STATUSCLB(&callback->bsc));
     return hres;
 }
 
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 3a5c4fe..a53bc3f 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -826,8 +826,10 @@ static nsresult async_open(nsChannel *This, HTMLWindow *window, BOOL is_doc_chan
     if(is_doc_channel)
         set_current_mon(window, mon);
 
-    bscallback = create_channelbsc(mon);
+    hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback);
     IMoniker_Release(mon);
+    if(FAILED(hres))
+        return NS_ERROR_UNEXPECTED;
 
     channelbsc_set_channel(bscallback, This, listener, context);
 
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index 86b0f02..d903ac7 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -259,7 +259,9 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BO
     if(FAILED(hres))
         return hres;
 
-    bscallback = create_channelbsc(mon);
+    hres = create_channelbsc(mon, NULL, NULL, 0, &bscallback);
+    if(FAILED(hres))
+        return hres;
 
     hres = load_nsuri(This->window, nsuri, bscallback, LOAD_INITIAL_DOCUMENT_URI);
     nsISupports_Release((nsISupports*)nsuri); /* FIXME */




More information about the wine-cvs mailing list