Module: wine Branch: master Commit: 649c1793c0b13f00c40602febaa6fc3654c378ec URL: http://source.winehq.org/git/wine.git/?a=commit;h=649c1793c0b13f00c40602feba...
Author: Jacek Caban jacek@codeweavers.com Date: Thu Jun 23 13:44:17 2011 +0200
urlmon: Added support for IUri in IMoniker::Load implementation.
---
dlls/urlmon/umon.c | 48 +++++++++++++++++++++++++++++++++--------------- 1 files changed, 33 insertions(+), 15 deletions(-)
diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c index f6e167c..cff4190 100644 --- a/dlls/urlmon/umon.c +++ b/dlls/urlmon/umon.c @@ -139,9 +139,12 @@ static HRESULT WINAPI URLMoniker_IsDirty(IMoniker *iface) static HRESULT WINAPI URLMoniker_Load(IMoniker* iface,IStream* pStm) { URLMoniker *This = impl_from_IMoniker(iface); - HRESULT res; + WCHAR *new_uri_str; + IUri *new_uri; + BSTR new_url; ULONG size; ULONG got; + HRESULT hres;
TRACE("(%p,%p)\n",This,pStm);
@@ -153,22 +156,37 @@ static HRESULT WINAPI URLMoniker_Load(IMoniker* iface,IStream* pStm) * Writes a ULONG containing length of unicode string, followed * by that many unicode characters */ - res = IStream_Read(pStm, &size, sizeof(ULONG), &got); - if(SUCCEEDED(res)) { - if(got == sizeof(ULONG)) { - SysFreeString(This->URLName); - This->URLName = SysAllocStringLen(NULL, size/sizeof(WCHAR)); - if(!This->URLName) - res = E_OUTOFMEMORY; - else { - res = IStream_Read(pStm, This->URLName, size, NULL); - } - } - else - res = E_FAIL; + hres = IStream_Read(pStm, &size, sizeof(ULONG), &got); + if(FAILED(hres)) + return hres; + if(got != sizeof(ULONG)) + return E_FAIL; + + new_uri_str = heap_alloc(size+sizeof(WCHAR)); + if(!new_uri_str) + return E_OUTOFMEMORY; + + hres = IStream_Read(pStm, new_uri_str, size, NULL); + new_uri_str[size/sizeof(WCHAR)] = 0; + if(SUCCEEDED(hres)) + hres = CreateUri(new_uri_str, 0, 0, &new_uri); + heap_free(new_uri_str); + if(FAILED(hres)) + return hres; + + hres = IUri_GetDisplayUri(new_uri, &new_url); + if(FAILED(hres)) { + IUri_Release(new_uri); + return hres; }
- return res; + SysFreeString(This->URLName); + if(This->uri) + IUri_Release(This->uri); + + This->uri = new_uri; + This->URLName = new_url; + return S_OK; }
static HRESULT WINAPI URLMoniker_Save(IMoniker *iface, IStream* pStm, BOOL fClearDirty)