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