Skip to content
Snippets Groups Projects
Commit 6f9336dd authored by Rolf Kalbermatter's avatar Rolf Kalbermatter Committed by Alexandre Julliard
Browse files

Added IFileSystemBindData implementation.

parent 2a493336
No related branches found
No related tags found
No related merge requests found
...@@ -43,6 +43,7 @@ C_SRCS = \ ...@@ -43,6 +43,7 @@ C_SRCS = \
shlexec.c \ shlexec.c \
shlfileop.c \ shlfileop.c \
shlfolder.c \ shlfolder.c \
shlfsbind.c \
shlmenu.c \ shlmenu.c \
shlview.c \ shlview.c \
shpolicy.c \ shpolicy.c \
......
...@@ -94,6 +94,7 @@ HRESULT WINAPI IShellLink_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID ...@@ -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_Desktop_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
HRESULT WINAPI ISF_MyComputer_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 IDropTargetHelper_Constructor (IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);
HRESULT WINAPI FileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC *ppV);
/* kind of enumidlist */ /* kind of enumidlist */
#define EIDL_DESK 0 #define EIDL_DESK 0
......
/*
* 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 <stdarg.h>
#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;
}
...@@ -38,7 +38,6 @@ BOOL WINAPI SHGetPathFromIDListA (LPCITEMIDLIST pidl,LPSTR pszPath); ...@@ -38,7 +38,6 @@ BOOL WINAPI SHGetPathFromIDListA (LPCITEMIDLIST pidl,LPSTR pszPath);
BOOL WINAPI SHGetPathFromIDListW (LPCITEMIDLIST pidl,LPWSTR pszPath); BOOL WINAPI SHGetPathFromIDListW (LPCITEMIDLIST pidl,LPWSTR pszPath);
#define SHGetPathFromIDList WINELIB_NAME_AW(SHGetPathFromIDList) #define SHGetPathFromIDList WINELIB_NAME_AW(SHGetPathFromIDList)
/***************************************************************************** /*****************************************************************************
* Predeclare interfaces * Predeclare interfaces
*/ */
...@@ -651,6 +650,84 @@ typedef struct _DROPFILES ...@@ -651,6 +650,84 @@ typedef struct _DROPFILES
#include <poppack.h> #include <poppack.h>
/*****************************************************************************
* 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 #ifdef __cplusplus
} /* extern "C" */ } /* extern "C" */
#endif /* defined(__cplusplus) */ #endif /* defined(__cplusplus) */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment