diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in index 595b8fc502e..f09831e30ab 100644 --- a/dlls/shell32/Makefile.in +++ b/dlls/shell32/Makefile.in @@ -43,6 +43,7 @@ C_SRCS = \ shlexec.c \ shlfileop.c \ shlfolder.c \ + shlfsbind.c \ shlmenu.c \ shlview.c \ shpolicy.c \ diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h index 0636607fec6..e04c6af3052 100644 --- a/dlls/shell32/shell32_main.h +++ b/dlls/shell32/shell32_main.h @@ -94,6 +94,7 @@ HRESULT WINAPI IShellLink_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID HRESULT WINAPI ISF_Desktop_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI ISF_MyComputer_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); HRESULT WINAPI IDropTargetHelper_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv); +HRESULT WINAPI FileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC *ppV); /* kind of enumidlist */ #define EIDL_DESK 0 diff --git a/dlls/shell32/shlfsbind.c b/dlls/shell32/shlfsbind.c new file mode 100644 index 00000000000..2dc12968a04 --- /dev/null +++ b/dlls/shell32/shlfsbind.c @@ -0,0 +1,222 @@ +/* + * File System Bind Data object to use as parameter for the bind context to + * IShellFolder_ParseDisplayName + * + * Copyright 2003 Rolf Kalbermatter + * + * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ +#include "config.h" +#include "wine/port.h" + +#include + +#include "windef.h" +#include "winbase.h" +#include "winreg.h" +#include "winuser.h" +#include "shlobj.h" +#include "shell32_main.h" + +#include "debughlp.h" +#include "wine/debug.h" + +WINE_DEFAULT_DEBUG_CHANNEL(pidl); + +/*********************************************************************** + * IFileSystemBindData implementation + */ +typedef struct +{ + ICOM_VFIELD(IFileSystemBindData); + DWORD ref; + WIN32_FIND_DATAW findFile; +} IFileSystemBindDataImpl; + +static HRESULT WINAPI IFileSystemBindData_fnQueryInterface(IFileSystemBindData *iface, REFIID riid, LPVOID* ppvObj); +static ULONG WINAPI IFileSystemBindData_fnAddRef(IFileSystemBindData *iface); +static ULONG WINAPI IFileSystemBindData_fnRelease(IFileSystemBindData *iface); +static HRESULT WINAPI IFileSystemBindData_fnGetFindData(IFileSystemBindData *iface, WIN32_FIND_DATAW *pfd); +static HRESULT WINAPI IFileSystemBindData_fnSetFindData(IFileSystemBindData *iface, const WIN32_FIND_DATAW *pfd); + +static struct ICOM_VTABLE(IFileSystemBindData) sbvt = +{ + ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE + IFileSystemBindData_fnQueryInterface, + IFileSystemBindData_fnAddRef, + IFileSystemBindData_fnRelease, + IFileSystemBindData_fnGetFindData, + IFileSystemBindData_fnSetFindData, +}; + +static WCHAR wFileSystemBindData[] = {'F','i','l','e',' ','S','y','s','t','e','m',' ','B','i','n','d','D','a','t','a',0}; + +HRESULT WINAPI FileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC *ppV) +{ + IFileSystemBindDataImpl *sb; + HRESULT ret = E_OUTOFMEMORY; + + TRACE("%p, %p", pfd, ppV); + + if (!ppV) + return E_INVALIDARG; + + *ppV = NULL; + + sb = (IFileSystemBindDataImpl*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IFileSystemBindDataImpl)); + if (!sb) + return ret; + + sb->lpVtbl = &sbvt; + sb->ref = 1; + IFileSystemBindData_fnSetFindData((IFileSystemBindData*)sb, pfd); + + ret = CreateBindCtx(0, ppV); + if (SUCCEEDED(ret)) + { + BIND_OPTS bindOpts; + bindOpts.cbStruct = sizeof(BIND_OPTS); + bindOpts.grfFlags = 0; + bindOpts.grfMode = STGM_CREATE; + bindOpts.dwTickCountDeadline = 0; + IBindCtx_SetBindOptions(*ppV, &bindOpts); + IBindCtx_RegisterObjectParam(*ppV, wFileSystemBindData, (LPUNKNOWN)sb); + + IFileSystemBindData_Release((IFileSystemBindData*)sb); + } + else + HeapFree(GetProcessHeap(), 0, sb); + return ret; +} + +HRESULT WINAPI FileSystemBindData_GetFindData(LPBC pbc, WIN32_FIND_DATAW *pfd) +{ + LPUNKNOWN pUnk; + IFileSystemBindData *pfsbd = NULL; + HRESULT ret; + + TRACE("%p, %p", pbc, pfd); + + if (!pfd) + return E_INVALIDARG; + + ret = IBindCtx_GetObjectParam(pbc, wFileSystemBindData, &pUnk); + if (SUCCEEDED(ret)) + { + ret = IUnknown_QueryInterface(pUnk, &IID_IFileSystemBindData, (LPVOID *)&pfsbd); + if (SUCCEEDED(ret)) + { + ret = IFileSystemBindData_GetFindData(pfsbd, pfd); + IFileSystemBindData_Release(pfsbd); + } + IUnknown_Release(pUnk); + } + return ret; +} + +HRESULT WINAPI FileSystemBindData_SetFindData(LPBC pbc, const WIN32_FIND_DATAW *pfd) +{ + LPUNKNOWN pUnk; + IFileSystemBindData *pfsbd = NULL; + HRESULT ret; + + TRACE("%p, %p", pbc, pfd); + + ret = IBindCtx_GetObjectParam(pbc, wFileSystemBindData, &pUnk); + if (SUCCEEDED(ret)) + { + ret = IUnknown_QueryInterface(pUnk, &IID_IFileSystemBindData, (LPVOID *)&pfsbd); + if (SUCCEEDED(ret)) + { + ret = IFileSystemBindData_SetFindData(pfsbd, pfd); + IFileSystemBindData_Release(pfsbd); + } + IUnknown_Release(pUnk); + } + return ret;} + + + +static HRESULT WINAPI IFileSystemBindData_fnQueryInterface(IFileSystemBindData *iface, REFIID riid, LPVOID *ppV) +{ + ICOM_THIS(IFileSystemBindDataImpl, iface); + TRACE("(%p)->(\n\tIID:\t%s, %p)\n", This, debugstr_guid(riid), ppV); + + *ppV = NULL; + + if (IsEqualIID(riid, &IID_IUnknown)) + { + *ppV = This; + } + else if (IsEqualIID(riid, &IID_IFileSystemBindData)) + { + *ppV = (IFileSystemBindData*)This; + } + + if (*ppV) + { + IUnknown_AddRef((IUnknown*)(*ppV)); + TRACE("-- Interface: (%p)->(%p)\n", ppV, *ppV); + return S_OK; + } + TRACE("-- Interface: E_NOINTERFACE\n"); + return E_NOINTERFACE; +} + +static ULONG WINAPI IFileSystemBindData_fnAddRef(IFileSystemBindData *iface) +{ + ICOM_THIS(IFileSystemBindDataImpl, iface); + TRACE("(%p)\n", This); + return InterlockedIncrement(&This->ref); +} + +static ULONG WINAPI IFileSystemBindData_fnRelease(IFileSystemBindData *iface) +{ + ICOM_THIS(IFileSystemBindDataImpl, iface); + TRACE("(%p)\n", This); + + if (!InterlockedDecrement(&This->ref)) + { + TRACE(" destroying ISFBindPidl(%p)\n",This); + HeapFree(GetProcessHeap(), 0, This); + return 0; + } + return This->ref; +} + +static HRESULT WINAPI IFileSystemBindData_fnGetFindData(IFileSystemBindData *iface, WIN32_FIND_DATAW *pfd) +{ + ICOM_THIS(IFileSystemBindDataImpl, iface); + TRACE("(%p), %p\n", This, pfd); + + if (!pfd) + return E_INVALIDARG; + + memcpy(pfd, &This->findFile, sizeof(WIN32_FIND_DATAW)); + return NOERROR; +} + +static HRESULT WINAPI IFileSystemBindData_fnSetFindData(IFileSystemBindData *iface, const WIN32_FIND_DATAW *pfd) +{ + ICOM_THIS(IFileSystemBindDataImpl, iface); + TRACE("(%p), %p\n", This, pfd); + + if (pfd) + memcpy(&This->findFile, pfd, sizeof(WIN32_FIND_DATAW)); + else + memset(&This->findFile, 0, sizeof(WIN32_FIND_DATAW)); + return NOERROR; +} diff --git a/include/shlobj.h b/include/shlobj.h index 8f707b9c59c..8901dd22130 100644 --- a/include/shlobj.h +++ b/include/shlobj.h @@ -38,7 +38,6 @@ BOOL WINAPI SHGetPathFromIDListA (LPCITEMIDLIST pidl,LPSTR pszPath); BOOL WINAPI SHGetPathFromIDListW (LPCITEMIDLIST pidl,LPWSTR pszPath); #define SHGetPathFromIDList WINELIB_NAME_AW(SHGetPathFromIDList) - /***************************************************************************** * Predeclare interfaces */ @@ -651,6 +650,84 @@ typedef struct _DROPFILES #include +/***************************************************************************** + * IFileSystemBindData interface + */ +#ifndef __IFileSystemBindData_FWD_DEFINED__ +#define __IFileSystemBindData_FWD_DEFINED__ +typedef struct IFileSystemBindData IFileSystemBindData; +#endif + +typedef IFileSystemBindData *LPFILESYSTEMBINDDATA; + +#ifndef __IFileSystemBindData_INTERFACE_DEFINED__ +#define __IFileSystemBindData_INTERFACE_DEFINED__ + +DEFINE_GUID(IID_IFileSystemBindData, 0x01e18d10, 0x4d8b, 0x11d2, 0x85,0x5d, 0x00,0x60,0x08,0x05,0x93,0x67); +#if defined(__cplusplus) && !defined(CINTERFACE) +struct IFileSystemBindData : public IUnknown +{ + virtual HRESULT STDMETHODCALLTYPE GetFindData( + WIN32_FIND_DATAW* pfd) = 0; + + virtual HRESULT STDMETHODCALLTYPE SetFindData( + const WIN32_FIND_DATAW* pfd) = 0; + +}; +#else +typedef struct IFileSystemBindDataVtbl IFileSystemBindDataVtbl; +struct IFileSystemBindData { + const IFileSystemBindDataVtbl* lpVtbl; +}; +struct IFileSystemBindDataVtbl { + ICOM_MSVTABLE_COMPAT_FIELDS + + /*** IUnknown methods ***/ + HRESULT (STDMETHODCALLTYPE *QueryInterface)( + IFileSystemBindData* This, + REFIID riid, + void** ppvObject); + + ULONG (STDMETHODCALLTYPE *AddRef)( + IFileSystemBindData* This); + + ULONG (STDMETHODCALLTYPE *Release)( + IFileSystemBindData* This); + + /*** IFileSystemBindData methods ***/ + HRESULT (STDMETHODCALLTYPE *GetFindData)( + IFileSystemBindData* This, + WIN32_FIND_DATAW* pfd); + + HRESULT (STDMETHODCALLTYPE *SetFindData)( + IFileSystemBindData* This, + const WIN32_FIND_DATAW* pfd); + +}; + +/*** IUnknown methods ***/ +#define IFileSystemBindData_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b) +#define IFileSystemBindData_AddRef(p) (p)->lpVtbl->AddRef(p) +#define IFileSystemBindData_Release(p) (p)->lpVtbl->Release(p) +/*** IFileSystemBindData methods ***/ +#define IFileSystemBindData_GetFindData(p,a) (p)->lpVtbl->GetFindData(p,a) +#define IFileSystemBindData_SetFindData(p,a) (p)->lpVtbl->SetFindData(p,a) + +#endif + +#define IFileSystemBindData_METHODS \ + ICOM_MSVTABLE_COMPAT_FIELDS \ + /*** IUnknown methods ***/ \ + STDMETHOD_(HRESULT,QueryInterface)(THIS_ REFIID riid, void** ppvObject) PURE; \ + STDMETHOD_(ULONG,AddRef)(THIS) PURE; \ + STDMETHOD_(ULONG,Release)(THIS) PURE; \ + /*** IFileSystemBindData methods ***/ \ + STDMETHOD_(HRESULT,GetFindData)(THIS_ WIN32_FIND_DATAW* pfd) PURE; \ + STDMETHOD_(HRESULT,SetFindData)(THIS_ const WIN32_FIND_DATAW* pfd) PURE; + +#endif /* __IFileSystemBindData_INTERFACE_DEFINED__ */ + + #ifdef __cplusplus } /* extern "C" */ #endif /* defined(__cplusplus) */