diff --git a/.gitignore b/.gitignore index d96c9544d60..070846935e7 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 b4c988f2b6a..d2ceb877a97 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 00000000000..a14d92662e7 --- /dev/null +++ b/dlls/scrrun/filesystem.c @@ -0,0 +1,383 @@ +/* + * Copyright 2012 Alistair Leslie-Hughes + * + * This 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. + * + * This 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 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 + +#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 c74832bf2df..d1e2de2f2a9 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 @@ -24,12 +25,69 @@ #include "ole2.h" #include "rpcproxy.h" +#include +#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; } /***********************************************************************