Jacek Caban : urlmon: Added StdURLMoniker implementation.
Alexandre Julliard
julliard at winehq.org
Tue Mar 24 09:01:56 CDT 2009
Module: wine
Branch: master
Commit: a5b2075ef15c99deb914342c9672af699f401ef1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=a5b2075ef15c99deb914342c9672af699f401ef1
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Mar 23 18:30:47 2009 +0100
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 6b57e1f..f5c553b 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 28f43f5..0d30765 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 159b57d..ad1b07b 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 c5faa61..54c0435 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);
More information about the wine-cvs
mailing list