Jacek Caban : urlmon: Make Binding object IUri-based.
Alexandre Julliard
julliard at winehq.org
Mon Nov 15 13:28:54 CST 2010
Module: wine
Branch: master
Commit: 29692adf40eb0ca9daad8665ca168688475b64af
URL: http://source.winehq.org/git/wine.git/?a=commit;h=29692adf40eb0ca9daad8665ca168688475b64af
Author: Jacek Caban <jacek at 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*);
More information about the wine-cvs
mailing list