Piotr Caban : urlmon: Added CUri ClassFactory implementation.

Alexandre Julliard julliard at winehq.org
Fri Jan 13 11:44:31 CST 2012


Module: wine
Branch: master
Commit: 11abd08bb5eb2d36b270cdf5012c1a03a884d681
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=11abd08bb5eb2d36b270cdf5012c1a03a884d681

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Jan 13 14:29:47 2012 +0100

urlmon: Added CUri ClassFactory implementation.

---

 dlls/urlmon/uri.c             |   47 +++++++++++++++++++++++-----------------
 dlls/urlmon/urlmon_main.c     |    8 ++++++-
 dlls/urlmon/urlmon_main.h     |    2 +
 dlls/urlmon/urlmon_urlmon.idl |    7 ++++++
 4 files changed, 43 insertions(+), 21 deletions(-)

diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c
index 4c6747d..88d6e5b 100644
--- a/dlls/urlmon/uri.c
+++ b/dlls/urlmon/uri.c
@@ -5320,16 +5320,23 @@ static const IPersistStreamVtbl PersistStreamVtbl = {
     PersistStream_GetSizeMax
 };
 
-static Uri* create_uri_obj(void) {
+HRESULT Uri_Construct(IUnknown *pUnkOuter, LPVOID *ppobj)
+{
     Uri *ret = heap_alloc_zero(sizeof(Uri));
-    if(ret) {
-        ret->IUri_iface.lpVtbl = &UriVtbl;
-        ret->IUriBuilderFactory_iface.lpVtbl = &UriBuilderFactoryVtbl;
-        ret->IPersistStream_iface.lpVtbl = &PersistStreamVtbl;
-        ret->ref = 1;
-    }
 
-    return ret;
+    TRACE("(%p %p)\n", pUnkOuter, ppobj);
+
+    *ppobj = ret;
+    if(!ret)
+        return E_OUTOFMEMORY;
+
+    ret->IUri_iface.lpVtbl = &UriVtbl;
+    ret->IUriBuilderFactory_iface.lpVtbl = &UriBuilderFactoryVtbl;
+    ret->IPersistStream_iface.lpVtbl = &PersistStreamVtbl;
+    ret->ref = 1;
+
+    *ppobj = &ret->IUri_iface;
+    return S_OK;
 }
 
 /***********************************************************************
@@ -5387,10 +5394,10 @@ HRESULT WINAPI CreateUri(LPCWSTR pwzURI, DWORD dwFlags, DWORD_PTR dwReserved, IU
     if(dwFlags & ~supported_flags)
         FIXME("Ignoring unsupported flag(s) %x\n", dwFlags & ~supported_flags);
 
-    ret = create_uri_obj();
-    if(!ret) {
+    hr = Uri_Construct(NULL, (void**)&ret);
+    if(FAILED(hr)) {
         *ppURI = NULL;
-        return E_OUTOFMEMORY;
+        return hr;
     }
 
     /* Explicitly set the default flags if it doesn't cause a flag conflict. */
@@ -5547,10 +5554,10 @@ static HRESULT build_uri(const UriBuilder *builder, IUri **uri, DWORD create_fla
         return hr;
     }
 
-    ret = create_uri_obj();
-    if(!ret) {
+    hr = Uri_Construct(NULL, (void**)&ret);
+    if(FAILED(hr)) {
         *uri = NULL;
-        return E_OUTOFMEMORY;
+        return hr;
     }
 
     hr = generate_uri(builder, &data, ret, create_flags);
@@ -6115,10 +6122,10 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result,
 
         parse_uri(&data, 0);
 
-        ret = create_uri_obj();
-        if(!ret) {
+        hr = Uri_Construct(NULL, (void**)&ret);
+        if(FAILED(hr)) {
             *result = NULL;
-            return E_OUTOFMEMORY;
+            return hr;
         }
 
         if(extras & COMBINE_URI_FORCE_FLAG_USE) {
@@ -6319,12 +6326,12 @@ static HRESULT combine_uri(Uri *base, Uri *relative, DWORD flags, IUri **result,
 
         generate_raw_uri(&data, data.uri, raw_flags);
 
-        ret = create_uri_obj();
-        if(!ret) {
+        hr = Uri_Construct(NULL, (void**)&ret);
+        if(FAILED(hr)) {
             SysFreeString(data.uri);
             heap_free(path);
             *result = NULL;
-            return E_OUTOFMEMORY;
+            return hr;
         }
 
         if(flags & URL_DONT_SIMPLIFY)
diff --git a/dlls/urlmon/urlmon_main.c b/dlls/urlmon/urlmon_main.c
index 13c61de..edd6930 100644
--- a/dlls/urlmon/urlmon_main.c
+++ b/dlls/urlmon/urlmon_main.c
@@ -27,6 +27,7 @@
 #define NO_SHLWAPI_REG
 #include "shlwapi.h"
 #include "advpub.h"
+#include "initguid.h"
 
 #include "wine/debug.h"
 
@@ -34,6 +35,8 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(urlmon);
 
+DEFINE_GUID(CLSID_CUri, 0xDF2FCE13, 0x25EC, 0x45BB, 0x9D,0x4C, 0xCE,0xCD,0x47,0xC2,0x43,0x0C);
+
 LONG URLMON_refCount = 0;
 
 static HMODULE hCabinet = NULL;
@@ -292,6 +295,8 @@ static ClassFactory StdURLMonikerCF =
     { { &ClassFactoryVtbl }, StdURLMoniker_Construct};
 static ClassFactory MimeFilterCF =
     { { &ClassFactoryVtbl }, MimeFilter_Construct};
+static ClassFactory CUriCF =
+    { { &ClassFactoryVtbl }, Uri_Construct};
 
 struct object_creation_info
 {
@@ -318,7 +323,8 @@ static const struct object_creation_info object_creation[] =
     { &CLSID_InternetSecurityManager, &SecurityManagerCF.IClassFactory_iface, NULL    },
     { &CLSID_InternetZoneManager,     &ZoneManagerCF.IClassFactory_iface,     NULL    },
     { &CLSID_StdURLMoniker,           &StdURLMonikerCF.IClassFactory_iface,   NULL    },
-    { &CLSID_DeCompMimeFilter,        &MimeFilterCF.IClassFactory_iface,      NULL    }
+    { &CLSID_DeCompMimeFilter,        &MimeFilterCF.IClassFactory_iface,      NULL    },
+    { &CLSID_CUri,                    &CUriCF.IClassFactory_iface,            NULL    }
 };
 
 static void init_session(BOOL init)
diff --git a/dlls/urlmon/urlmon_main.h b/dlls/urlmon/urlmon_main.h
index b60d678..a185f10 100644
--- a/dlls/urlmon/urlmon_main.h
+++ b/dlls/urlmon/urlmon_main.h
@@ -47,6 +47,7 @@ extern HRESULT FtpProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) DECLSPE
 extern HRESULT GopherProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) DECLSPEC_HIDDEN;
 extern HRESULT MkProtocol_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) DECLSPEC_HIDDEN;
 extern HRESULT MimeFilter_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) DECLSPEC_HIDDEN;
+extern HRESULT Uri_Construct(IUnknown *pUnkOuter, LPVOID *ppobj) DECLSPEC_HIDDEN;
 
 extern BOOL WINAPI URLMON_DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI URLMON_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) DECLSPEC_HIDDEN;
@@ -54,6 +55,7 @@ extern HRESULT WINAPI URLMON_DllRegisterServer(void) DECLSPEC_HIDDEN;
 extern HRESULT WINAPI URLMON_DllUnregisterServer(void) DECLSPEC_HIDDEN;
 
 extern GUID const CLSID_PSFactoryBuffer DECLSPEC_HIDDEN;
+extern GUID const CLSID_CUri DECLSPEC_HIDDEN;
 
 /**********************************************************************
  * Dll lifetime tracking declaration for urlmon.dll
diff --git a/dlls/urlmon/urlmon_urlmon.idl b/dlls/urlmon/urlmon_urlmon.idl
index ad23dee..0ba5ce6 100644
--- a/dlls/urlmon/urlmon_urlmon.idl
+++ b/dlls/urlmon/urlmon_urlmon.idl
@@ -101,3 +101,10 @@ coclass PSFactoryBuffer { interface IPSFactoryBuffer; }
     uuid(8f6b0360-b80d-11d0-a9b3-006097942311)
 ]
 coclass DeCompMimeFilter { interface IInternetProtocol; interface IInternetProtocolSink; }
+
+[
+    helpstring("CUri"),
+    threading(apartment),
+    uuid(df2fce13-25ec-45bb-9d4c-cecd47c2430c)
+]
+coclass CUri { interface IUri; }




More information about the wine-cvs mailing list