[1/2] scrrun: Add IFileSystem3 support (try 3)

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Fri Mar 30 05:29:23 CDT 2012


Hi,
Made IFileSystem to be static instance.

Changelog:
       scrrun: Add IFileSystem3 support


Best Regards
    Alistair Leslie-Hughes


-------------- next part --------------
>From f882ea81b593a10d6a4af9f061d146abb0d11332 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
Date: Tue, 20 Mar 2012 14:54:25 +1100
Subject: [PATCH] Add IFileSystem3 support
To: wine-patches <wine-patches at winehq.org>

---
 .gitignore               |    1 +
 dlls/scrrun/Makefile.in  |    7 +-
 dlls/scrrun/filesystem.c |  383 ++++++++++++++++++++++++++++++++++++++++++++++
 dlls/scrrun/scrrun.c     |   68 ++++++++-
 4 files changed, 454 insertions(+), 5 deletions(-)
 create mode 100644 dlls/scrrun/filesystem.c

diff --git a/.gitignore b/.gitignore
index d96c954..0708469 100644
--- a/.gitignore
+++ b/.gitignore
@@ -120,6 +120,7 @@ dlls/rpcrt4/epm_c.c
 dlls/rpcrt4/tests/server.h
 dlls/rpcrt4/tests/server_c.c
 dlls/rpcrt4/tests/server_s.c
+dlls/scrrun/scrrun.h
 dlls/shell32/AUTHORS
 dlls/sti/sti_wia.h
 dlls/sti/sti_wia_p.c
diff --git a/dlls/scrrun/Makefile.in b/dlls/scrrun/Makefile.in
index b4c988f..d2ceb87 100644
--- a/dlls/scrrun/Makefile.in
+++ b/dlls/scrrun/Makefile.in
@@ -1,9 +1,14 @@
 MODULE    = scrrun.dll
+IMPORTS   = uuid
 
-C_SRCS = scrrun.c
+C_SRCS = \
+	filesystem.c \
+	scrrun.c
 
 RC_SRCS = scrrun.rc
 
 IDL_TLB_SRCS = scrrun.idl
 
+IDL_H_SRCS = scrrun.idl
+
 @MAKE_DLL_RULES@
diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
new file mode 100644
index 0000000..65511bb
--- /dev/null
+++ b/dlls/scrrun/filesystem.c
@@ -0,0 +1,383 @@
+/*
+ * Copyright 2012 Alistair Leslie-Hughes
+ *
+ * iface library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * iface library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with iface library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+
+#include "config.h"
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "ole2.h"
+#include "dispex.h"
+#include "scrrun.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(scrrun);
+
+static HRESULT WINAPI filesys_QueryInterface(IFileSystem3 *iface, REFIID riid, void **ppvObject)
+{
+    TRACE("%p %s %p\n", iface, debugstr_guid(riid), ppvObject);
+
+    if ( IsEqualGUID( riid, &IID_IFileSystem3 ) ||
+         IsEqualGUID( riid, &IID_IFileSystem ) ||
+         IsEqualGUID( riid, &IID_IDispatch ) ||
+         IsEqualGUID( riid, &IID_IUnknown ) )
+    {
+        *ppvObject = iface;
+    }
+    else if ( IsEqualGUID( riid, &IID_IDispatchEx ))
+    {
+        TRACE("Interface IDispatchEx not supported - returning NULL\n");
+        *ppvObject = NULL;
+        return E_NOINTERFACE;
+    }
+    else if ( IsEqualGUID( riid, &IID_IObjectWithSite ))
+    {
+        TRACE("Interface IObjectWithSite not supported - returning NULL\n");
+        *ppvObject = NULL;
+        return E_NOINTERFACE;
+    }
+    else
+    {
+        FIXME("Unsupported interface %s\n", debugstr_guid(riid));
+        return E_NOINTERFACE;
+    }
+
+    IFileSystem3_AddRef(iface);
+
+    return S_OK;
+}
+
+static ULONG WINAPI filesys_AddRef(IFileSystem3 *iface)
+{
+    TRACE("%p\n", iface);
+
+    return 2;
+}
+
+static ULONG WINAPI filesys_Release(IFileSystem3 *iface)
+{
+    TRACE("%p\n", iface);
+
+    return 1;
+}
+
+static HRESULT WINAPI filesys_GetTypeInfoCount(IFileSystem3 *iface, UINT *pctinfo)
+{
+    TRACE("(%p)->(%p)\n", iface, pctinfo);
+
+    *pctinfo = 1;
+    return S_OK;
+}
+
+static HRESULT WINAPI filesys_GetTypeInfo(IFileSystem3 *iface, UINT iTInfo,
+                                        LCID lcid, ITypeInfo **ppTInfo)
+{
+    FIXME("(%p)->(%u %u %p)\n", iface, iTInfo, lcid, ppTInfo);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetIDsOfNames(IFileSystem3 *iface, REFIID riid,
+                                        LPOLESTR *rgszNames, UINT cNames,
+                                        LCID lcid, DISPID *rgDispId)
+{
+    FIXME("(%p)->(%s %p %u %u %p)\n", iface, debugstr_guid(riid), rgszNames, cNames,
+          lcid, rgDispId);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_Invoke(IFileSystem3 *iface, DISPID dispIdMember,
+                                      REFIID riid, LCID lcid, WORD wFlags,
+                                      DISPPARAMS *pDispParams, VARIANT *pVarResult,
+                                      EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", iface, dispIdMember, debugstr_guid(riid),
+          lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_get_Drives(IFileSystem3 *iface, IDriveCollection **ppdrives)
+{
+    FIXME("%p %p\n", iface, ppdrives);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_BuildPath(IFileSystem3 *iface, BSTR Path,
+                                            BSTR Name, BSTR *pbstrResult)
+{
+    FIXME("%p %s %s %p\n", iface, debugstr_w(Path), debugstr_w(Name), pbstrResult);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetDriveName(IFileSystem3 *iface, BSTR Path,
+                                            BSTR *pbstrResult)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(Path), pbstrResult);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetParentFolderName(IFileSystem3 *iface, BSTR Path,
+                                            BSTR *pbstrResult)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(Path), pbstrResult);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetFileName(IFileSystem3 *iface, BSTR Path,
+                                            BSTR *pbstrResult)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(Path), pbstrResult);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetBaseName(IFileSystem3 *iface, BSTR Path,
+                                            BSTR *pbstrResult)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(Path), pbstrResult);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetExtensionName(IFileSystem3 *iface, BSTR Path,
+                                            BSTR *pbstrResult)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(Path), pbstrResult);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetAbsolutePathName(IFileSystem3 *iface, BSTR Path,
+                                            BSTR *pbstrResult)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(Path), pbstrResult);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetTempName(IFileSystem3 *iface, BSTR *pbstrResult)
+{
+    FIXME("%p %p\n", iface, pbstrResult);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_DriveExists(IFileSystem3 *iface, BSTR DriveSpec,
+                                            VARIANT_BOOL *pfExists)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(DriveSpec), pfExists);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_FileExists(IFileSystem3 *iface, BSTR FileSpec,
+                                            VARIANT_BOOL *pfExists)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(FileSpec), pfExists);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_FolderExists(IFileSystem3 *iface, BSTR FolderSpec,
+                                            VARIANT_BOOL *pfExists)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(FolderSpec), pfExists);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetDrive(IFileSystem3 *iface, BSTR DriveSpec,
+                                            IDrive **ppdrive)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(DriveSpec), ppdrive);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetFile(IFileSystem3 *iface, BSTR FilePath,
+                                            IFile **ppfile)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(FilePath), ppfile);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetFolder(IFileSystem3 *iface, BSTR FolderPath,
+                                            IFolder **ppfolder)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(FolderPath), ppfolder);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetSpecialFolder(IFileSystem3 *iface,
+                                            SpecialFolderConst SpecialFolder,
+                                            IFolder **ppfolder)
+{
+    FIXME("%p %d %p\n", iface, SpecialFolder, ppfolder);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_DeleteFile(IFileSystem3 *iface, BSTR FileSpec,
+                                            VARIANT_BOOL Force)
+{
+    FIXME("%p %s %d\n", iface, debugstr_w(FileSpec), Force);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_DeleteFolder(IFileSystem3 *iface, BSTR FolderSpec,
+                                            VARIANT_BOOL Force)
+{
+    FIXME("%p %s %d\n", iface, debugstr_w(FolderSpec), Force);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_MoveFile(IFileSystem3 *iface, BSTR Source,
+                                            BSTR Destination)
+{
+    FIXME("%p %s %s\n", iface, debugstr_w(Source), debugstr_w(Destination));
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_MoveFolder(IFileSystem3 *iface,BSTR Source,
+                                            BSTR Destination)
+{
+    FIXME("%p %s %s\n", iface, debugstr_w(Source), debugstr_w(Destination));
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_CopyFile(IFileSystem3 *iface, BSTR Source,
+                                            BSTR Destination, VARIANT_BOOL OverWriteFiles)
+{
+    FIXME("%p %s %s %d\n", iface, debugstr_w(Source), debugstr_w(Destination), OverWriteFiles);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_CopyFolder(IFileSystem3 *iface, BSTR Source,
+                                            BSTR Destination, VARIANT_BOOL OverWriteFiles)
+{
+    FIXME("%p %s %s %d\n", iface, debugstr_w(Source), debugstr_w(Destination), OverWriteFiles);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_CreateFolder(IFileSystem3 *iface, BSTR Path,
+                                            IFolder **ppfolder)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(Path), ppfolder);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_CreateTextFile(IFileSystem3 *iface, BSTR FileName,
+                                            VARIANT_BOOL Overwrite, VARIANT_BOOL Unicode,
+                                            ITextStream **ppts)
+{
+    FIXME("%p %s %d %d %p\n", iface, debugstr_w(FileName), Overwrite, Unicode, ppts);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_OpenTextFile(IFileSystem3 *iface, BSTR FileName,
+                                            IOMode IOMode, VARIANT_BOOL Create,
+                                            Tristate Format, ITextStream **ppts)
+{
+    FIXME("%p %s %d %d %d %p\n", iface, debugstr_w(FileName), IOMode, Create, Format, ppts);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetStandardStream(IFileSystem3 *iface,
+                                            StandardStreamTypes StandardStreamType,
+                                            VARIANT_BOOL Unicode,
+                                            ITextStream **ppts)
+{
+    FIXME("%p %d %d %p\n", iface, StandardStreamType, Unicode, ppts);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI filesys_GetFileVersion(IFileSystem3 *iface, BSTR FileName,
+                                            BSTR *FileVersion)
+{
+    FIXME("%p %s %p\n", iface, debugstr_w(FileName), FileVersion);
+
+    return E_NOTIMPL;
+}
+
+static const struct IFileSystem3Vtbl filesys_vtbl =
+{
+    filesys_QueryInterface,
+    filesys_AddRef,
+    filesys_Release,
+    filesys_GetTypeInfoCount,
+    filesys_GetTypeInfo,
+    filesys_GetIDsOfNames,
+    filesys_Invoke,
+    filesys_get_Drives,
+    filesys_BuildPath,
+    filesys_GetDriveName,
+    filesys_GetParentFolderName,
+    filesys_GetFileName,
+    filesys_GetBaseName,
+    filesys_GetExtensionName,
+    filesys_GetAbsolutePathName,
+    filesys_GetTempName,
+    filesys_DriveExists,
+    filesys_FileExists,
+    filesys_FolderExists,
+    filesys_GetDrive,
+    filesys_GetFile,
+    filesys_GetFolder,
+    filesys_GetSpecialFolder,
+    filesys_DeleteFile,
+    filesys_DeleteFolder,
+    filesys_MoveFile,
+    filesys_MoveFolder,
+    filesys_CopyFile,
+    filesys_CopyFolder,
+    filesys_CreateFolder,
+    filesys_CreateTextFile,
+    filesys_OpenTextFile,
+    filesys_GetStandardStream,
+    filesys_GetFileVersion
+};
+
+static IFileSystem3 filesystem = { &filesys_vtbl };
+
+HRESULT WINAPI FileSystem_CreateInstance(IClassFactory *iface, IUnknown *outer, REFIID riid, void **ppv)
+{
+    TRACE("(%p %s %p)\n", outer, debugstr_guid(riid), ppv);
+
+    return IFileSystem3_QueryInterface(&filesystem, riid, ppv);
+}
diff --git a/dlls/scrrun/scrrun.c b/dlls/scrrun/scrrun.c
index c74832b..d1e2de2 100644
--- a/dlls/scrrun/scrrun.c
+++ b/dlls/scrrun/scrrun.c
@@ -15,6 +15,7 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
  */
+#define COBJMACROS
 
 #include "config.h"
 #include <stdarg.h>
@@ -24,12 +25,69 @@
 #include "ole2.h"
 #include "rpcproxy.h"
 
+#include <initguid.h>
+#include "scrrun.h"
+
 #include "wine/debug.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(scrrun);
 
 static HINSTANCE scrrun_instance;
 
+typedef HRESULT (*fnCreateInstance)(LPVOID *ppObj);
+
+extern HRESULT WINAPI FileSystem_CreateInstance(IClassFactory*,IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
+
+static HRESULT WINAPI scrruncf_QueryInterface(IClassFactory *iface, REFIID riid, LPVOID *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);
+        *ppv = iface;
+    }
+
+    if(*ppv) {
+        IUnknown_AddRef((IUnknown*)*ppv);
+        return S_OK;
+    }
+
+    FIXME("(%p)->(%s %p)\n", iface, debugstr_guid(riid), ppv);
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI scrruncf_AddRef(IClassFactory *iface )
+{
+    TRACE("(%p)\n", iface);
+    return 2;
+}
+
+static ULONG WINAPI scrruncf_Release(IClassFactory *iface )
+{
+    TRACE("(%p)\n", iface);
+    return 1;
+}
+
+static HRESULT WINAPI scrruncf_LockServer(IClassFactory *iface, BOOL fLock)
+{
+    TRACE("(%p)->(%x)\n", iface, fLock);
+    return S_OK;
+}
+
+static const struct IClassFactoryVtbl scrruncf_vtbl =
+{
+    scrruncf_QueryInterface,
+    scrruncf_AddRef,
+    scrruncf_Release,
+    FileSystem_CreateInstance,
+    scrruncf_LockServer
+};
+
+static IClassFactory FileSystemFactory = { &scrruncf_vtbl };
+
 BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved )
 {
     TRACE("%p, %u, %p\n", hinst, reason, reserved);
@@ -72,11 +130,13 @@ HRESULT WINAPI DllUnregisterServer(void)
 
 HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
 {
-    FIXME("(%s, %s, %p): stub\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
-    if(!ppv)
-        return E_INVALIDARG;
+    if(IsEqualGUID(&CLSID_FileSystemObject, rclsid)) {
+        TRACE("(CLSID_WshShell %s %p)\n", debugstr_guid(riid), ppv);
+        return IClassFactory_QueryInterface(&FileSystemFactory, riid, ppv);
+    }
 
-    return E_NOTIMPL;
+    FIXME("%s %s %p\n", debugstr_guid(rclsid), debugstr_guid(riid), ppv);
+    return CLASS_E_CLASSNOTAVAILABLE;
 }
 
 /***********************************************************************
-- 
1.7.5.4



More information about the wine-patches mailing list