[2/2] scrrun: Added a stub for IFolder interface

Nikolay Sivov nsivov at codeweavers.com
Mon Nov 5 07:39:34 CST 2012


Added a stub for IFolder interface

-------------- next part --------------
>From a4e0973b9899056cd9c3b3eddebbf199a8ea571f Mon Sep 17 00:00:00 2001
From: Nikolay Sivov <nsivov at codeweavers.com>
Date: Sun, 4 Nov 2012 16:59:00 -0500
Subject: [PATCH 2/2] Added a stub for IFolder interface

---
 dlls/scrrun/filesystem.c       |  325 +++++++++++++++++++++++++++++++++++++++-
 dlls/scrrun/scrrun.c           |    1 +
 dlls/scrrun/scrrun_private.h   |   11 ++
 dlls/scrrun/tests/filesystem.c |   32 +++-
 4 files changed, 362 insertions(+), 7 deletions(-)

diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c
index d79c061..5a10aa8 100644
--- a/dlls/scrrun/filesystem.c
+++ b/dlls/scrrun/filesystem.c
@@ -24,6 +24,7 @@
 #include "windef.h"
 #include "winbase.h"
 #include "ole2.h"
+#include "olectl.h"
 #include "dispex.h"
 #include "scrrun.h"
 #include "scrrun_private.h"
@@ -32,6 +33,309 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(scrrun);
 
+struct folder {
+    IFolder IFolder_iface;
+    LONG ref;
+};
+
+static inline struct folder *impl_from_IFolder(IFolder *iface)
+{
+    return CONTAINING_RECORD(iface, struct folder, IFolder_iface);
+}
+
+static HRESULT WINAPI folder_QueryInterface(IFolder *iface, REFIID riid, void **obj)
+{
+    struct folder *This = impl_from_IFolder(iface);
+
+    TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), obj);
+
+    *obj = NULL;
+
+    if (IsEqualGUID( riid, &IID_IFolder ) ||
+        IsEqualGUID( riid, &IID_IUnknown))
+    {
+        *obj = iface;
+        IFolder_AddRef(iface);
+    }
+    else
+        return E_NOINTERFACE;
+
+    return S_OK;
+}
+
+static ULONG WINAPI folder_AddRef(IFolder *iface)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    ULONG ref = InterlockedIncrement(&This->ref);
+    TRACE("(%p)->(%d)\n", This, ref);
+    return ref;
+}
+
+static ULONG WINAPI folder_Release(IFolder *iface)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    ULONG ref = InterlockedDecrement(&This->ref);
+    TRACE("(%p)->(%d)\n", This, ref);
+
+    if (!ref)
+        heap_free(This);
+
+    return ref;
+}
+
+static HRESULT WINAPI folder_GetTypeInfoCount(IFolder *iface, UINT *pctinfo)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    TRACE("(%p)->(%p)\n", This, pctinfo);
+    *pctinfo = 1;
+    return S_OK;
+}
+
+static HRESULT WINAPI folder_GetTypeInfo(IFolder *iface, UINT iTInfo,
+                                        LCID lcid, ITypeInfo **ppTInfo)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    TRACE("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
+    return get_typeinfo(IFolder_tid, ppTInfo);
+}
+
+static HRESULT WINAPI folder_GetIDsOfNames(IFolder *iface, REFIID riid,
+                                        LPOLESTR *rgszNames, UINT cNames,
+                                        LCID lcid, DISPID *rgDispId)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId);
+
+    hr = get_typeinfo(IFolder_tid, &typeinfo);
+    if(SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_GetIDsOfNames(typeinfo, rgszNames, cNames, rgDispId);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI folder_Invoke(IFolder *iface, DISPID dispIdMember,
+                                      REFIID riid, LCID lcid, WORD wFlags,
+                                      DISPPARAMS *pDispParams, VARIANT *pVarResult,
+                                      EXCEPINFO *pExcepInfo, UINT *puArgErr)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    ITypeInfo *typeinfo;
+    HRESULT hr;
+
+    TRACE("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
+           lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
+
+    hr = get_typeinfo(IFolder_tid, &typeinfo);
+    if(SUCCEEDED(hr))
+    {
+        hr = ITypeInfo_Invoke(typeinfo, iface, dispIdMember, wFlags,
+                pDispParams, pVarResult, pExcepInfo, puArgErr);
+        ITypeInfo_Release(typeinfo);
+    }
+
+    return hr;
+}
+
+static HRESULT WINAPI folder_get_Path(IFolder *iface, BSTR *path)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, path);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_Name(IFolder *iface, BSTR *name)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, name);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_put_Name(IFolder *iface, BSTR name)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%s): stub\n", This, debugstr_w(name));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_ShortPath(IFolder *iface, BSTR *path)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, path);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_ShortName(IFolder *iface, BSTR *name)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, name);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_Drive(IFolder *iface, IDrive **drive)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, drive);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_ParentFolder(IFolder *iface, IFolder **parent)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, parent);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_Attributes(IFolder *iface, FileAttribute *attr)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, attr);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_put_Attributes(IFolder *iface, FileAttribute attr)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(0x%x): stub\n", This, attr);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_DateCreated(IFolder *iface, DATE *date)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, date);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_DateLastModified(IFolder *iface, DATE *date)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, date);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_DateLastAccessed(IFolder *iface, DATE *date)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, date);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_Type(IFolder *iface, BSTR *type)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, type);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_Delete(IFolder *iface, VARIANT_BOOL force)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%x): stub\n", This, force);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_Copy(IFolder *iface, BSTR dest, VARIANT_BOOL overwrite)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%s %x): stub\n", This, debugstr_w(dest), overwrite);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_Move(IFolder *iface, BSTR dest)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%s): stub\n", This, debugstr_w(dest));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_IsRootFolder(IFolder *iface, VARIANT_BOOL *isroot)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, isroot);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_Size(IFolder *iface, VARIANT *size)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, size);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_SubFolders(IFolder *iface, IFolderCollection **folders)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, folders);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_get_Files(IFolder *iface, IFileCollection **files)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%p): stub\n", This, files);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI folder_CreateTextFile(IFolder *iface, BSTR filename, VARIANT_BOOL overwrite,
+    VARIANT_BOOL unicode, ITextStream **stream)
+{
+    struct folder *This = impl_from_IFolder(iface);
+    FIXME("(%p)->(%s %x %x %p): stub\n", This, debugstr_w(filename), overwrite, unicode, stream);
+    return E_NOTIMPL;
+}
+
+static const IFolderVtbl foldervtbl = {
+    folder_QueryInterface,
+    folder_AddRef,
+    folder_Release,
+    folder_GetTypeInfoCount,
+    folder_GetTypeInfo,
+    folder_GetIDsOfNames,
+    folder_Invoke,
+    folder_get_Path,
+    folder_get_Name,
+    folder_put_Name,
+    folder_get_ShortPath,
+    folder_get_ShortName,
+    folder_get_Drive,
+    folder_get_ParentFolder,
+    folder_get_Attributes,
+    folder_put_Attributes,
+    folder_get_DateCreated,
+    folder_get_DateLastModified,
+    folder_get_DateLastAccessed,
+    folder_get_Type,
+    folder_Delete,
+    folder_Copy,
+    folder_Move,
+    folder_get_IsRootFolder,
+    folder_get_Size,
+    folder_get_SubFolders,
+    folder_get_Files,
+    folder_CreateTextFile
+};
+
+static HRESULT create_folder(IFolder **folder)
+{
+    struct folder *This;
+
+    This = heap_alloc(sizeof(struct folder));
+    if (!This) return E_OUTOFMEMORY;
+
+    This->IFolder_iface.lpVtbl = &foldervtbl;
+    This->ref = 1;
+
+    *folder = &This->IFolder_iface;
+
+    return S_OK;
+}
+
 static HRESULT WINAPI filesys_QueryInterface(IFileSystem3 *iface, REFIID riid, void **ppvObject)
 {
     TRACE("%p %s %p\n", iface, debugstr_guid(riid), ppvObject);
@@ -92,7 +396,8 @@ static HRESULT WINAPI filesys_GetTypeInfo(IFileSystem3 *iface, UINT iTInfo,
                                         LCID lcid, ITypeInfo **ppTInfo)
 {
     TRACE("(%p)->(%u %u %p)\n", iface, iTInfo, lcid, ppTInfo);
-    return get_typeinfo(IFileSystem3_tid, ppTInfo);}
+    return get_typeinfo(IFileSystem3_tid, ppTInfo);
+}
 
 static HRESULT WINAPI filesys_GetIDsOfNames(IFileSystem3 *iface, REFIID riid,
                                         LPOLESTR *rgszNames, UINT cNames,
@@ -319,12 +624,22 @@ static HRESULT WINAPI filesys_CopyFolder(IFileSystem3 *iface, BSTR Source,
     return E_NOTIMPL;
 }
 
-static HRESULT WINAPI filesys_CreateFolder(IFileSystem3 *iface, BSTR Path,
-                                            IFolder **ppfolder)
+static HRESULT WINAPI filesys_CreateFolder(IFileSystem3 *iface, BSTR path,
+                                            IFolder **folder)
 {
-    FIXME("%p %s %p\n", iface, debugstr_w(Path), ppfolder);
+    BOOL ret;
 
-    return E_NOTIMPL;
+    TRACE("(%p)->(%s %p)\n", iface, debugstr_w(path), folder);
+
+    ret = CreateDirectoryW(path, NULL);
+    if (!ret)
+    {
+        *folder = NULL;
+        if (GetLastError() == ERROR_ALREADY_EXISTS) return CTL_E_FILEALREADYEXISTS;
+        return HRESULT_FROM_WIN32(GetLastError());
+    }
+
+    return create_folder(folder);
 }
 
 static HRESULT WINAPI filesys_CreateTextFile(IFileSystem3 *iface, BSTR FileName,
diff --git a/dlls/scrrun/scrrun.c b/dlls/scrrun/scrrun.c
index cd07027..a4e0904 100644
--- a/dlls/scrrun/scrrun.c
+++ b/dlls/scrrun/scrrun.c
@@ -104,6 +104,7 @@ static REFIID tid_ids[] = {
     &IID_NULL,
     &IID_IDictionary,
     &IID_IFileSystem3,
+    &IID_IFolder
 };
 
 static HRESULT load_typelib(void)
diff --git a/dlls/scrrun/scrrun_private.h b/dlls/scrrun/scrrun_private.h
index 0778831..4578c41 100644
--- a/dlls/scrrun/scrrun_private.h
+++ b/dlls/scrrun/scrrun_private.h
@@ -26,9 +26,20 @@ typedef enum tid_t
     NULL_tid,
     IDictionary_tid,
     IFileSystem3_tid,
+    IFolder_tid,
     LAST_tid
 } tid_t;
 
 HRESULT get_typeinfo(tid_t tid, ITypeInfo **typeinfo) DECLSPEC_HIDDEN;
 
+static inline void *heap_alloc(size_t len)
+{
+    return HeapAlloc(GetProcessHeap(), 0, len);
+}
+
+static inline BOOL heap_free(void *mem)
+{
+    return HeapFree(GetProcessHeap(), 0, mem);
+}
+
 #endif
diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c
index d557acf..d6c596c 100644
--- a/dlls/scrrun/tests/filesystem.c
+++ b/dlls/scrrun/tests/filesystem.c
@@ -22,6 +22,7 @@
 
 #include "windows.h"
 #include "ole2.h"
+#include "olectl.h"
 #include "oleauto.h"
 #include "dispex.h"
 
@@ -32,9 +33,9 @@
 
 static void test_interfaces(void)
 {
-    static const WCHAR pathW[] = {'p','a','t','h',0};
     static const WCHAR nonexistent_dirW[] = {
         'c', ':', '\\', 'N', 'o', 'n', 'e', 'x', 'i', 's', 't', 'e', 'n', 't', 0};
+    static const WCHAR pathW[] = {'p','a','t','h',0};
     static const WCHAR file_kernel32W[] = {
         '\\', 'k', 'e', 'r', 'n', 'e', 'l', '3', '2', '.', 'd', 'l', 'l', 0};
     HRESULT hr;
@@ -122,12 +123,39 @@ static void test_interfaces(void)
     IDispatch_Release(disp);
 }
 
+static void test_createfolder(void)
+{
+    IFileSystem3 *fs3;
+    HRESULT hr;
+    WCHAR pathW[MAX_PATH];
+    BSTR path;
+    IFolder *folder;
+
+    hr = CoCreateInstance(&CLSID_FileSystemObject, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
+            &IID_IFileSystem3, (void**)&fs3);
+    if(FAILED(hr)) {
+        win_skip("Could not create FileSystem object: %08x\n", hr);
+        return;
+    }
+
+    /* create existing directory */
+    GetCurrentDirectoryW(sizeof(pathW)/sizeof(WCHAR), pathW);
+    path = SysAllocString(pathW);
+    folder = (void*)0xdeabeef;
+    hr = IFileSystem3_CreateFolder(fs3, path, &folder);
+    ok(hr == CTL_E_FILEALREADYEXISTS, "got 0x%08x\n", hr);
+    ok(folder == NULL, "got %p\n", folder);
+    SysFreeString(path);
+
+    IFileSystem3_Release(fs3);
+}
+
 START_TEST(filesystem)
 {
     CoInitialize(NULL);
 
     test_interfaces();
-
+    test_createfolder();
 
     CoUninitialize();
 }
-- 
1.7.10.4




More information about the wine-patches mailing list