From a5b2075ef15c99deb914342c9672af699f401ef1 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 23 Mar 2009 18:30:47 +0100 Subject: [PATCH] urlmon: Added StdURLMoniker implementation. --- dlls/urlmon/tests/url.c | 22 +++++++++++++++++++++ dlls/urlmon/umon.c | 40 +++++++++++++++++++++++++++------------ dlls/urlmon/urlmon_main.c | 5 ++++- dlls/urlmon/urlmon_main.h | 1 + 4 files changed, 55 insertions(+), 13 deletions(-) diff --git a/dlls/urlmon/tests/url.c b/dlls/urlmon/tests/url.c index 6b57e1f5913..f5c553b09ec 100644 --- a/dlls/urlmon/tests/url.c +++ b/dlls/urlmon/tests/url.c @@ -2571,6 +2571,25 @@ static void test_BindToStorage_fail(void) test_ReportResult(S_FALSE); } +static void test_StdURLMoniker(void) +{ + IMoniker *mon, *async_mon; + HRESULT hres; + + hres = CoCreateInstance(&IID_IInternet, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IMoniker, (void**)&mon); + ok(hres == S_OK, "Could not create IInternet instance: %08x\n", hres); + if(FAILED(hres)) + return; + + hres = IMoniker_QueryInterface(mon, &IID_IAsyncMoniker, (void**)&async_mon); + ok(hres == S_OK, "Could not get IAsyncMoniker iface: %08x\n", hres); + ok(mon == async_mon, "mon != async_mon\n"); + IMoniker_Release(async_mon); + + IMoniker_Release(mon); +} + static void gecko_installer_workaround(BOOL disable) { HKEY hkey; @@ -2622,6 +2641,9 @@ START_TEST(url) CoInitialize(NULL); + trace("test StdURLMoniker..."); + test_StdURLMoniker(); + trace("synchronous http test...\n"); test_BindToStorage(HTTP_TEST, FALSE, TYMED_ISTREAM); diff --git a/dlls/urlmon/umon.c b/dlls/urlmon/umon.c index 28f43f51d20..0d307653455 100644 --- a/dlls/urlmon/umon.c +++ b/dlls/urlmon/umon.c @@ -376,7 +376,7 @@ static HRESULT WINAPI URLMoniker_GetDisplayName(IMoniker *iface, IBindCtx *pbc, if(!ppszDisplayName) return E_INVALIDARG; - + /* FIXME: If this is a partial URL, try and get a URL moniker from SZ_URLCONTEXT in the bind context, then look at pmkToLeft to try and complete the URL */ @@ -436,19 +436,28 @@ static const IMonikerVtbl URLMonikerVtbl = URLMoniker_IsSystemMoniker }; -/****************************************************************************** - * URLMoniker_Construct (local function) - *******************************************************************************/ -static HRESULT URLMoniker_Construct(URLMoniker *This, LPCOLESTR lpszLeftURLName, LPCOLESTR lpszURLName) +static URLMoniker *alloc_moniker(void) +{ + URLMoniker *ret; + + ret = heap_alloc(sizeof(URLMoniker)); + if(!ret) + return NULL; + + ret->lpIMonikerVtbl = &URLMonikerVtbl; + ret->ref = 1; + ret->URLName = NULL; + + return ret; +} + +static HRESULT URLMoniker_Init(URLMoniker *This, LPCOLESTR lpszLeftURLName, LPCOLESTR lpszURLName) { HRESULT hres; DWORD sizeStr = 0; TRACE("(%p,%s,%s)\n",This,debugstr_w(lpszLeftURLName),debugstr_w(lpszURLName)); - This->lpIMonikerVtbl = &URLMonikerVtbl; - This->ref = 0; - This->URLName = heap_alloc(INTERNET_MAX_URL_LENGTH*sizeof(WCHAR)); if(lpszLeftURLName) @@ -473,6 +482,14 @@ static HRESULT URLMoniker_Construct(URLMoniker *This, LPCOLESTR lpszLeftURLName, return S_OK; } +HRESULT StdURLMoniker_Construct(IUnknown *outer, void **ppv) +{ + TRACE("(%p %p)\n", outer, ppv); + + *ppv = alloc_moniker(); + return *ppv ? S_OK : E_OUTOFMEMORY; +} + /*********************************************************************** * CreateURLMonikerEx (URLMON.@) * @@ -499,7 +516,7 @@ HRESULT WINAPI CreateURLMonikerEx(IMoniker *pmkContext, LPCWSTR szURL, IMoniker if (dwFlags & URL_MK_UNIFORM) FIXME("ignoring flag URL_MK_UNIFORM\n"); - if(!(obj = heap_alloc(sizeof(*obj)))) + if(!(obj = alloc_moniker())) return E_OUTOFMEMORY; if(pmkContext) { @@ -513,12 +530,11 @@ HRESULT WINAPI CreateURLMonikerEx(IMoniker *pmkContext, LPCWSTR szURL, IMoniker } } - hres = URLMoniker_Construct(obj, lefturl, szURL); + hres = URLMoniker_Init(obj, lefturl, szURL); CoTaskMemFree(lefturl); if(SUCCEEDED(hres)) hres = URLMoniker_QueryInterface((IMoniker*)obj, &IID_IMoniker, (void**)ppmk); - else - heap_free(obj); + IMoniker_Release((IMoniker*)obj); return hres; } diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c index 159b57dbcb3..ad1b07bd6f4 100644 --- a/dlls/urlmon/urlmon_main.c +++ b/dlls/urlmon/urlmon_main.c @@ -185,6 +185,8 @@ static const ClassFactory SecurityManagerCF = { &ClassFactoryVtbl, SecManagerImpl_Construct}; static const ClassFactory ZoneManagerCF = { &ClassFactoryVtbl, ZoneMgrImpl_Construct}; +static const ClassFactory StdURLMonikerCF = + { &ClassFactoryVtbl, StdURLMoniker_Construct}; struct object_creation_info { @@ -209,7 +211,8 @@ static const struct object_creation_info object_creation[] = { &CLSID_HttpSProtocol, CLASSFACTORY(&HttpSProtocolCF), wszHttps }, { &CLSID_MkProtocol, CLASSFACTORY(&MkProtocolCF), wszMk }, { &CLSID_InternetSecurityManager, CLASSFACTORY(&SecurityManagerCF), NULL }, - { &CLSID_InternetZoneManager, CLASSFACTORY(&ZoneManagerCF), NULL } + { &CLSID_InternetZoneManager, CLASSFACTORY(&ZoneManagerCF), NULL }, + { &CLSID_StdURLMoniker, CLASSFACTORY(&StdURLMonikerCF), NULL } }; static void init_session(BOOL init) diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h index c5faa6116bb..54c0435de8d 100644 --- a/dlls/urlmon/urlmon_main.h +++ b/dlls/urlmon/urlmon_main.h @@ -38,6 +38,7 @@ extern HINSTANCE URLMON_hInstance; extern HRESULT SecManagerImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT ZoneMgrImpl_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); +extern HRESULT StdURLMoniker_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT FileProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT HttpProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj); extern HRESULT HttpSProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj);