mshtml: Allow post data and headers to be passed to create_channelbsc.
authorJacek Caban <jacek@codeweavers.com>
Wed, 3 Mar 2010 13:53:49 +0000 (14:53 +0100)
committerAlexandre Julliard <julliard@winehq.org>
Wed, 3 Mar 2010 14:28:43 +0000 (15:28 +0100)
dlls/mshtml/mshtml_private.h
dlls/mshtml/navigate.c
dlls/mshtml/nsio.c
dlls/mshtml/persist.c

index 8f91d38ae2267b531936d2802816de6bca0dfd42..bf6561c200d906d57dd49bc945fbe9796863911a 100644 (file)
@@ -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*);
index b3ca1b0a0c2af653b0d9e92a1f97a39dd266f3ed..e326e3c8bd796a77748d151d1429d3d3002a8844 100644 (file)
@@ -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;
 }
 
index 3a5c4fe22f037af8b7dd804b5a1d896d8da4561c..a53bc3f63b974643772a08d327a189b7879e3dc5 100644 (file)
@@ -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);
 
index 86b0f02fa768e9135c8f4f76fc9462cb00a1c4fd..d903ac7d0c94795a37d289292d9fab37d5a971f7 100644 (file)
@@ -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 */