Module: wine Branch: master Commit: 29692adf40eb0ca9daad8665ca168688475b64af URL: http://source.winehq.org/git/wine.git/?a=commit;h=29692adf40eb0ca9daad8665ca...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Nov 15 12:38:06 2010 +0100
urlmon: Make Binding object IUri-based.
---
dlls/urlmon/binding.c | 75 ++++++++++++++++++++------------------------- dlls/urlmon/umon.c | 21 +++++++++++- dlls/urlmon/urlmon_main.h | 4 +- 3 files changed, 54 insertions(+), 46 deletions(-)
diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c index c27213a..699bf98 100644 --- a/dlls/urlmon/binding.c +++ b/dlls/urlmon/binding.c @@ -18,6 +18,7 @@
#include "urlmon_main.h" #include "winreg.h" +#include "shlwapi.h"
#include "wine/debug.h"
@@ -889,10 +890,9 @@ static ULONG WINAPI Binding_Release(IBinding *iface) ReleaseBindInfo(&This->bindinfo); This->section.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&This->section); + SysFreeString(This->url); heap_free(This->mime); heap_free(This->redirect_url); - heap_free(This->url); - heap_free(This);
URLMON_UnlockModule(); @@ -1264,7 +1264,7 @@ static HRESULT WINAPI InternetBindInfo_GetBindString(IInternetBindInfo *iface, return hres; } case BINDSTRING_URL: { - DWORD size = (strlenW(This->url)+1) * sizeof(WCHAR); + DWORD size = (SysStringLen(This->url)+1) * sizeof(WCHAR);
if(!ppwzStr || !pcElFetched) return E_INVALIDARG; @@ -1399,42 +1399,29 @@ static HRESULT get_callback(IBindCtx *pbc, IBindStatusCallback **callback) return hres; }
-static BOOL is_urlmon_protocol(LPCWSTR url) -{ - static const WCHAR wszCdl[] = {'c','d','l'}; - static const WCHAR wszFile[] = {'f','i','l','e'}; - static const WCHAR wszFtp[] = {'f','t','p'}; - static const WCHAR wszGopher[] = {'g','o','p','h','e','r'}; - static const WCHAR wszHttp[] = {'h','t','t','p'}; - static const WCHAR wszHttps[] = {'h','t','t','p','s'}; - static const WCHAR wszMk[] = {'m','k'}; - - static const struct { - LPCWSTR scheme; - int len; - } protocol_list[] = { - {wszCdl, sizeof(wszCdl) /sizeof(WCHAR)}, - {wszFile, sizeof(wszFile) /sizeof(WCHAR)}, - {wszFtp, sizeof(wszFtp) /sizeof(WCHAR)}, - {wszGopher, sizeof(wszGopher)/sizeof(WCHAR)}, - {wszHttp, sizeof(wszHttp) /sizeof(WCHAR)}, - {wszHttps, sizeof(wszHttps) /sizeof(WCHAR)}, - {wszMk, sizeof(wszMk) /sizeof(WCHAR)} - }; - - unsigned int i; - int len = lstrlenW(url); +static BOOL is_urlmon_protocol(IUri *uri) +{ + DWORD scheme; + HRESULT hres;
- for(i=0; i < sizeof(protocol_list)/sizeof(protocol_list[0]); i++) { - if(len >= protocol_list[i].len - && !memcmp(url, protocol_list[i].scheme, protocol_list[i].len*sizeof(WCHAR))) - return TRUE; + hres = IUri_GetScheme(uri, &scheme); + if(FAILED(hres)) + return FALSE; + + switch(scheme) { + case URL_SCHEME_FILE: + case URL_SCHEME_FTP: + case URL_SCHEME_GOPHER: + case URL_SCHEME_HTTP: + case URL_SCHEME_HTTPS: + case URL_SCHEME_MK: + return TRUE; }
return FALSE; }
-static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, IBindCtx *pbc, +static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc, BOOL to_obj, REFIID riid, Binding **binding) { Binding *ret; @@ -1512,11 +1499,15 @@ static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, if(!(ret->bindf & BINDF_ASYNCHRONOUS)) { ret->bindf |= BINDF_NEEDFILE; ret->use_cache_file = TRUE; - }else if(!is_urlmon_protocol(url)) { + }else if(!is_urlmon_protocol(uri)) { ret->bindf |= BINDF_NEEDFILE; }
- ret->url = heap_strdupW(url); + hres = IUri_GetDisplayUri(uri, &ret->url); + if(FAILED(hres)) { + IBinding_Release(BINDING(ret)); + return hres; + }
if(binding_ctx) { ret->stgmed_buf = binding_ctx->stgmed_buf; @@ -1543,14 +1534,14 @@ static HRESULT Binding_Create(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, return S_OK; }
-static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, IBindCtx *pbc, +static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, IUri *uri, IBindCtx *pbc, BOOL to_obj, REFIID riid, Binding **ret) { Binding *binding = NULL; HRESULT hres; MSG msg;
- hres = Binding_Create(mon, binding_ctx, url, pbc, to_obj, riid, &binding); + hres = Binding_Create(mon, binding_ctx, uri, pbc, to_obj, riid, &binding); if(FAILED(hres)) return hres;
@@ -1569,7 +1560,7 @@ static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, I report_data(binding, BSCF_FIRSTDATANOTIFICATION | (binding_ctx->download_state == END_DOWNLOAD ? BSCF_LASTDATANOTIFICATION : 0), 0, 0); }else { - hres = IInternetProtocol_Start(binding->protocol, url, PROTSINK(binding), + hres = IInternetProtocolEx_StartEx(binding->protocol, uri, PROTSINK(binding), BINDINF(binding), PI_APARTMENTTHREADED|PI_MIMEVERIFICATION, 0);
TRACE("start ret %08x\n", hres); @@ -1595,7 +1586,7 @@ static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, I return S_OK; }
-HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv) +HRESULT bind_to_storage(IUri *uri, IBindCtx *pbc, REFIID riid, void **ppv) { Binding *binding = NULL, *binding_ctx; HRESULT hres; @@ -1604,7 +1595,7 @@ HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv)
binding_ctx = get_bctx_binding(pbc);
- hres = start_binding(NULL, binding_ctx, url, pbc, FALSE, riid, &binding); + hres = start_binding(NULL, binding_ctx, uri, pbc, FALSE, riid, &binding); if(binding_ctx) IBinding_Release(BINDING(binding_ctx)); if(FAILED(hres)) @@ -1626,14 +1617,14 @@ HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv) return hres; }
-HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv) +HRESULT bind_to_object(IMoniker *mon, IUri *uri, IBindCtx *pbc, REFIID riid, void **ppv) { Binding *binding; HRESULT hres;
*ppv = NULL;
- hres = start_binding(mon, NULL, url, pbc, TRUE, riid, &binding); + hres = start_binding(mon, NULL, uri, pbc, TRUE, riid, &binding); if(FAILED(hres)) return hres;
diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c index fea7b21..fbb00a4 100644 --- a/dlls/urlmon/umon.c +++ b/dlls/urlmon/umon.c @@ -200,6 +200,7 @@ static HRESULT WINAPI URLMoniker_BindToObject(IMoniker *iface, IBindCtx* pbc, IM { URLMoniker *This = MONIKER_THIS(iface); IRunningObjectTable *obj_tbl; + IUri *uri; HRESULT hres;
TRACE("(%p)->(%p,%p,%s,%p): stub\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppv); @@ -210,20 +211,36 @@ static HRESULT WINAPI URLMoniker_BindToObject(IMoniker *iface, IBindCtx* pbc, IM IRunningObjectTable_Release(obj_tbl); }
- return bind_to_object(iface, This->URLName, pbc, riid, ppv); + hres = CreateUri(This->URLName, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri); + if(FAILED(hres)) + return hres; + + hres = bind_to_object(iface, uri, pbc, riid, ppv); + + IUri_Release(uri); + return hres; }
static HRESULT WINAPI URLMoniker_BindToStorage(IMoniker* iface, IBindCtx* pbc, IMoniker* pmkToLeft, REFIID riid, void **ppvObject) { URLMoniker *This = MONIKER_THIS(iface); + IUri *uri; + HRESULT hres;
TRACE("(%p)->(%p %p %s %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObject);
if(pmkToLeft) FIXME("Unsupported pmkToLeft\n");
- return bind_to_storage(This->URLName, pbc, riid, ppvObject); + hres = CreateUri(This->URLName, Uri_CREATE_FILE_USE_DOS_PATH, 0, &uri); + if(FAILED(hres)) + return hres; + + hres = bind_to_storage(uri, pbc, riid, ppvObject); + + IUri_Release(uri); + return hres; }
static HRESULT WINAPI URLMoniker_Reduce(IMoniker *iface, IBindCtx *pbc, diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index 2d719cb..ea33f15 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -74,8 +74,8 @@ HINTERNET get_internet_session(IInternetBindInfo*); LPWSTR get_useragent(void); void free_session(void);
-HRESULT bind_to_storage(LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv); -HRESULT bind_to_object(IMoniker *mon, LPCWSTR url, IBindCtx *pbc, REFIID riid, void **ppv); +HRESULT bind_to_storage(IUri*,IBindCtx*,REFIID,void**); +HRESULT bind_to_object(IMoniker*,IUri*,IBindCtx*,REFIID,void**ppv);
HRESULT create_binding_protocol(BOOL,IInternetProtocolEx**); void set_binding_sink(IInternetProtocolEx*,IInternetProtocolSink*,IInternetBindInfo*);