scrrun: Added a stub for IFolder interface.
This commit is contained in:
parent
f43b49fbed
commit
fee495d5fd
|
@ -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,
|
||||
|
|
|
@ -104,6 +104,7 @@ static REFIID tid_ids[] = {
|
|||
&IID_NULL,
|
||||
&IID_IDictionary,
|
||||
&IID_IFileSystem3,
|
||||
&IID_IFolder
|
||||
};
|
||||
|
||||
static HRESULT load_typelib(void)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue