Module: wine Branch: master Commit: 4816929cfeb0018d7a3247237ea286f1d10df2be URL: http://source.winehq.org/git/wine.git/?a=commit;h=4816929cfeb0018d7a3247237e...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Nov 15 13:28:32 2011 +0100
ieframe: Added IDocObjectService::FireBeforeNavigate2 implementation.
---
dlls/ieframe/shellbrowser.c | 68 +++++++++++++++++++++++++++++++++++++++++- 1 files changed, 66 insertions(+), 2 deletions(-)
diff --git a/dlls/ieframe/shellbrowser.c b/dlls/ieframe/shellbrowser.c index be15613..a81fa16 100644 --- a/dlls/ieframe/shellbrowser.c +++ b/dlls/ieframe/shellbrowser.c @@ -21,6 +21,7 @@ #include <assert.h>
#include "ieframe.h" +#include "exdispid.h"
#include "wine/debug.h"
@@ -646,10 +647,73 @@ static HRESULT WINAPI DocObjectService_FireBeforeNavigate2( BOOL *pfCancel) { ShellBrowser *This = impl_from_IDocObjectService(iface); - FIXME("%p %p %s %x %s %p %d %s %d %p\n", This, pDispatch, debugstr_w(lpszUrl), + VARIANT var_url, var_flags, var_frame_name, var_post_data, var_post_data2, var_headers; + VARIANTARG params[7]; + DISPPARAMS dp = {params, NULL, 7, 0}; + VARIANT_BOOL cancel = VARIANT_FALSE; + SAFEARRAY *post_data; + + TRACE("%p %p %s %x %s %p %d %s %d %p\n", This, pDispatch, debugstr_w(lpszUrl), dwFlags, debugstr_w(lpszFrameName), pPostData, cbPostData, debugstr_w(lpszHeaders), fPlayNavSound, pfCancel); - return E_NOTIMPL; + + if(cbPostData) { + post_data = SafeArrayCreateVector(VT_UI1, 0, cbPostData); + memcpy(post_data->pvData, pPostData, cbPostData); + if(!post_data) + return E_OUTOFMEMORY; + }else { + post_data = NULL; + } + + V_VT(params) = VT_BOOL|VT_BYREF; + V_BOOLREF(params) = &cancel; + + V_VT(params+1) = (VT_BYREF|VT_VARIANT); + V_VARIANTREF(params+1) = &var_headers; + V_VT(&var_headers) = VT_BSTR; + V_BSTR(&var_headers) = lpszHeaders ? SysAllocString(lpszHeaders) : NULL; + + V_VT(params+2) = (VT_BYREF|VT_VARIANT); + V_VARIANTREF(params+2) = &var_post_data2; + V_VT(&var_post_data2) = (VT_BYREF|VT_VARIANT); + V_VARIANTREF(&var_post_data2) = &var_post_data; + + if(post_data) { + V_VT(&var_post_data) = VT_UI1|VT_ARRAY; + V_ARRAY(&var_post_data) = post_data; + }else { + V_VT(&var_post_data) = VT_EMPTY; + } + + V_VT(params+3) = (VT_BYREF|VT_VARIANT); + V_VARIANTREF(params+3) = &var_frame_name; + V_VT(&var_frame_name) = VT_BSTR; + V_BSTR(&var_frame_name) = NULL; + + V_VT(params+4) = (VT_BYREF|VT_VARIANT); + V_VARIANTREF(params+4) = &var_flags; + V_VT(&var_flags) = VT_I4; + V_I4(&var_flags) = 0; + + V_VT(params+5) = (VT_BYREF|VT_VARIANT); + V_VARIANTREF(params+5) = &var_url; + V_VT(&var_url) = VT_BSTR; + V_BSTR(&var_url) = SysAllocString(lpszUrl); + + V_VT(params+6) = (VT_DISPATCH); + V_DISPATCH(params+6) = This->doc_host->disp; + + TRACE(">>>\n"); + call_sink(This->doc_host->cps.wbe2, DISPID_BEFORENAVIGATE2, &dp); + TRACE("<<<\n"); + + SysFreeString(V_BSTR(&var_url)); + SysFreeString(V_BSTR(&var_headers)); + SafeArrayDestroy(post_data); + + *pfCancel = !!cancel; + return S_OK; }
static HRESULT WINAPI DocObjectService_FireNavigateComplete2(