[1/2] scrrun: Moved creating filesystem object to its own function

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Tue Sep 18 22:24:13 CDT 2012


Hi,


Changelog:
     scrrun: Moved creating filesystem object to its own function


Best Regards
  Alistair Leslie-Hughes
-------------- next part --------------
>From b3d2b41dfa6b39075761d5ef6fcb85f58c267792 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Sun, 23 Sep 2012 11:57:14 +1000
Subject: [PATCH] Moved creating filesystem object to its own function
To: wine-patches <wine-patches at winehq.org>

---
 dlls/scrrun/filesystem.c     |    4 +-
 dlls/scrrun/scrrun.c         |  113 ++++++++++++++++++++++++++++++++++--------
 dlls/scrrun/scrrun_private.h |    2 +-
 3 files changed, 95 insertions(+), 24 deletions(-)

diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index ade3310..104a032 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -403,9 +403,9 @@ static const struct IFileSystem3Vtbl filesys_vtbl =
 
 static IFileSystem3 filesystem = { &filesys_vtbl };
 
-HRESULT WINAPI FileSystem_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
+HRESULT create_filesystem(REFIID riid, LPVOID *ppv )
 {
-    TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv);
+    TRACE("(%s %p)\n", debugstr_guid(riid), ppv);
 
     return IFileSystem3_QueryInterface(&filesystem, riid, ppv);
 }
diff --git a/dlls/scrrun/scrrun.c b/dlls/scrrun/scrrun.c
index d5ea369..2558b30 100644
--- a/dlls/scrrun/scrrun.c
+++ b/dlls/scrrun/scrrun.c
@@ -35,22 +35,34 @@ WINE_DEFAULT_DEBUG_CHANNEL(scrrun);
 
 static HINSTANCE scrrun_instance;
 
-typedef HRESULT (*fnCreateInstance)(LPVOID *ppObj);
+typedef HRESULT (*fnCreateInstance)(REFIID riid, LPVOID *ppObj);
+
+typedef struct scrruncf
+{
+    IClassFactory    IClassFactory_iface;
+    LONG ref;
+
+    fnCreateInstance pfnCreateInstance;
+
+    CLSID clsid;
+} scrruncf;
+
+static inline scrruncf *impl_from_IClassFactory( IClassFactory *iface )
+{
+    return CONTAINING_RECORD(iface, scrruncf, IClassFactory_iface);
+}
 
 static HRESULT WINAPI scrruncf_QueryInterface(IClassFactory *iface, REFIID riid, LPVOID *ppv )
 {
+    TRACE("%s %p\n", debugstr_guid(riid), ppv);
+
     *ppv = NULL;
 
-    if(IsEqualGUID(&IID_IUnknown, riid)) {
-        TRACE("(%p)->(IID_IUnknown %p)\n", iface, ppv);
-        *ppv = iface;
-    }else if(IsEqualGUID(&IID_IClassFactory, riid)) {
-        TRACE("(%p)->(IID_IClassFactory %p)\n", iface, ppv);
+    if(IsEqualGUID(&IID_IUnknown, riid) || 
+        IsEqualGUID(&IID_IClassFactory, riid))
+    {
+        IClassFactory_AddRef( iface );
         *ppv = iface;
-    }
-
-    if(*ppv) {
-        IUnknown_AddRef((IUnknown*)*ppv);
         return S_OK;
     }
 
@@ -60,14 +72,55 @@ static HRESULT WINAPI scrruncf_QueryInterface(IClassFactory *iface, REFIID riid,
 
 static ULONG WINAPI scrruncf_AddRef(IClassFactory *iface )
 {
-    TRACE("(%p)\n", iface);
-    return 2;
+    scrruncf *This = impl_from_IClassFactory(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
+
+    TRACE("%p ref=%u\n", This, ref);
+
+    return ref;
 }
 
 static ULONG WINAPI scrruncf_Release(IClassFactory *iface )
 {
-    TRACE("(%p)\n", iface);
-    return 1;
+    scrruncf *This = impl_from_IClassFactory(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+
+    TRACE("%p ref=%u\n", This, ref);
+
+    if (ref == 0)
+    {
+        HeapFree(GetProcessHeap(), 0, This);
+    }
+
+    return ref;
+}
+
+static HRESULT WINAPI scrruncf_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
+{
+    scrruncf *This = impl_from_IClassFactory( iface );
+    HRESULT hr;
+    IUnknown *punk;
+
+    TRACE("%p %s %p\n", outer, debugstr_guid(riid), ppv );
+
+    *ppv = NULL;
+
+    if (outer)
+        return CLASS_E_NOAGGREGATION;
+
+    hr = This->pfnCreateInstance( &This->clsid, (LPVOID*) &punk );
+    if (SUCCEEDED(hr))
+    {
+        hr = IUnknown_QueryInterface( punk, riid, ppv );
+
+        IUnknown_Release( punk );
+    }
+    else
+    {
+        WARN("Cannot create an instance object. 0x%08x\n", hr);
+    }
+
+    return hr;
 }
 
 static HRESULT WINAPI scrruncf_LockServer(IClassFactory *iface, BOOL fLock)
@@ -81,12 +134,10 @@ static const struct IClassFactoryVtbl scrruncf_vtbl =
     scrruncf_QueryInterface,
     scrruncf_AddRef,
     scrruncf_Release,
-    FileSystem_CreateInstance,
+    scrruncf_CreateInstance,
     scrruncf_LockServer
 };
 
-static IClassFactory FileSystemFactory = { &scrruncf_vtbl };
-
 static ITypeLib *typelib;
 static ITypeInfo *typeinfos[LAST_tid];
 
@@ -194,13 +245,33 @@ HRESULT WINAPI DllUnregisterServer(void)
 
 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
 {
+    scrruncf *This;
+    HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
+
+    TRACE("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+
+    if(!ppv)
+        return E_INVALIDARG;
+
+    This = HeapAlloc(GetProcessHeap(), 0, sizeof(scrruncf));
+
+    This->IClassFactory_iface.lpVtbl = &scrruncf_vtbl;
+    This->pfnCreateInstance = NULL;
+    This->ref = 1;
+
     if(IsEqualGUID(&CLSID_FileSystemObject, rclsid)) {
-        TRACE("(CLSID_WshShell %s %p)\n", debugstr_guid(riid), ppv);
-        return IClassFactory_QueryInterface(&FileSystemFactory, riid, ppv);
+        TRACE("(CLSID_FileSystemObject %s %p)\n", debugstr_guid(riid), ppv);
+        This->pfnCreateInstance = &create_filesystem;
+        This->clsid = IID_IFileSystem3;
+    }
+
+    if(This->pfnCreateInstance != NULL)
+    {
+        hr = IClassFactory_QueryInterface( &This->IClassFactory_iface, riid, ppv );
+        IClassFactory_Release(&This->IClassFactory_iface);
     }
 
-    FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
-    return CLASS_E_CLASSNOTAVAILABLE;
+    return hr;
 }
 
 /***********************************************************************
diff --git a/dlls/scrrun/scrrun_private.h b/dlls/scrrun/scrrun_private.h
index fc700a6..100f4c0 100644
--- a/dlls/scrrun/scrrun_private.h
+++ b/dlls/scrrun/scrrun_private.h
@@ -18,7 +18,7 @@
 #ifndef _SCRRUN_PRIVATE_H_
 #define _SCRRUN_PRIVATE_H
 
-extern HRESULT WINAPI FileSystem_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
+extern HRESULT create_filesystem(REFIID riid, LPVOID *ppv) DECLSPEC_HIDDEN;
 
 typedef enum tid_t
 {
-- 
1.7.9.5



More information about the wine-patches mailing list