shell32: Implement IPersistFolder2 for the desktop folder.

This commit is contained in:
David Hedberg 2010-07-18 14:34:56 +02:00 committed by Alexandre Julliard
parent 1d658d4bb7
commit fb88e06e79
2 changed files with 87 additions and 21 deletions

View File

@ -65,7 +65,7 @@ extern HRESULT WINAPI IEParseDisplayNameWithBCW(DWORD codepage, LPCWSTR lpszDisp
typedef struct { typedef struct {
const IShellFolder2Vtbl *lpVtbl; const IShellFolder2Vtbl *lpVtbl;
const IPersistVtbl *lpVtblIPersist; const IPersistFolder2Vtbl *lpVtblPF2;
LONG ref; LONG ref;
/* both paths are parsible from the desktop */ /* both paths are parsible from the desktop */
@ -76,9 +76,9 @@ typedef struct {
BOOL fAcceptFmt; /* flag for pending Drop */ BOOL fAcceptFmt; /* flag for pending Drop */
} IDesktopFolderImpl; } IDesktopFolderImpl;
static inline IDesktopFolderImpl *impl_from_IPersist( IPersist *iface ) static inline IDesktopFolderImpl *impl_from_IPersistFolder2( IPersistFolder2 *iface )
{ {
return (IDesktopFolderImpl *)((char*)iface - FIELD_OFFSET(IDesktopFolderImpl, lpVtblIPersist)); return (IDesktopFolderImpl *)((char*)iface - FIELD_OFFSET(IDesktopFolderImpl, lpVtblPF2));
} }
static const shvheader desktop_header[] = { static const shvheader desktop_header[] = {
@ -94,7 +94,6 @@ static const shvheader desktop_header[] = {
/************************************************************************** /**************************************************************************
* ISF_Desktop_fnQueryInterface * ISF_Desktop_fnQueryInterface
* *
* NOTES supports not IPersistFolder
*/ */
static HRESULT WINAPI ISF_Desktop_fnQueryInterface( static HRESULT WINAPI ISF_Desktop_fnQueryInterface(
IShellFolder2 * iface, REFIID riid, LPVOID * ppvObj) IShellFolder2 * iface, REFIID riid, LPVOID * ppvObj)
@ -111,9 +110,11 @@ static HRESULT WINAPI ISF_Desktop_fnQueryInterface(
{ {
*ppvObj = This; *ppvObj = This;
} }
else if (IsEqualIID (riid, &IID_IPersist)) else if (IsEqualIID (riid, &IID_IPersist) ||
IsEqualIID (riid, &IID_IPersistFolder) ||
IsEqualIID (riid, &IID_IPersistFolder2))
{ {
*ppvObj = &This->lpVtblIPersist; *ppvObj = &This->lpVtblPF2;
} }
if (*ppvObj) if (*ppvObj)
@ -877,37 +878,56 @@ static const IShellFolder2Vtbl vt_MCFldr_ShellFolder2 =
/************************************************************************** /**************************************************************************
* IPersist * IPersist
*/ */
static HRESULT WINAPI ISF_Desktop_IPersist_fnQueryInterface( static HRESULT WINAPI ISF_Desktop_IPersistFolder2_fnQueryInterface(
IPersist *iface, REFIID riid, LPVOID *ppvObj) IPersistFolder2 *iface, REFIID riid, LPVOID *ppvObj)
{ {
IDesktopFolderImpl *This = impl_from_IPersist( iface ); IDesktopFolderImpl *This = impl_from_IPersistFolder2( iface );
return IShellFolder2_QueryInterface((IShellFolder2*)This, riid, ppvObj); return IShellFolder2_QueryInterface((IShellFolder2*)This, riid, ppvObj);
} }
static ULONG WINAPI ISF_Desktop_IPersist_fnAddRef(IPersist *iface) static ULONG WINAPI ISF_Desktop_IPersistFolder2_fnAddRef(
IPersistFolder2 *iface)
{ {
IDesktopFolderImpl *This = impl_from_IPersist( iface ); IDesktopFolderImpl *This = impl_from_IPersistFolder2( iface );
return IShellFolder2_AddRef((IShellFolder2*)This); return IShellFolder2_AddRef((IShellFolder2*)This);
} }
static ULONG WINAPI ISF_Desktop_IPersist_fnRelease(IPersist *iface) static ULONG WINAPI ISF_Desktop_IPersistFolder2_fnRelease(
IPersistFolder2 *iface)
{ {
IDesktopFolderImpl *This = impl_from_IPersist( iface ); IDesktopFolderImpl *This = impl_from_IPersistFolder2( iface );
return IShellFolder2_Release((IShellFolder2*)This); return IShellFolder2_Release((IShellFolder2*)This);
} }
static HRESULT WINAPI ISF_Desktop_IPersist_fnGetClassID(IPersist *iface, CLSID *clsid) static HRESULT WINAPI ISF_Desktop_IPersistFolder2_fnGetClassID(
IPersistFolder2 *iface, CLSID *clsid)
{ {
*clsid = CLSID_ShellDesktop; *clsid = CLSID_ShellDesktop;
return S_OK; return S_OK;
} }
static HRESULT WINAPI ISF_Desktop_IPersistFolder2_fnInitialize(
static const IPersistVtbl vt_IPersist = IPersistFolder2 *iface, LPCITEMIDLIST pidl)
{ {
ISF_Desktop_IPersist_fnQueryInterface, IDesktopFolderImpl *This = impl_from_IPersistFolder2( iface );
ISF_Desktop_IPersist_fnAddRef, FIXME ("(%p)->(%p) stub\n", This, pidl);
ISF_Desktop_IPersist_fnRelease, return E_NOTIMPL;
ISF_Desktop_IPersist_fnGetClassID }
static HRESULT WINAPI ISF_Desktop_IPersistFolder2_fnGetCurFolder(
IPersistFolder2 *iface, LPITEMIDLIST *ppidl)
{
IDesktopFolderImpl *This = impl_from_IPersistFolder2( iface );
*ppidl = ILClone(This->pidlRoot);
return S_OK;
}
static const IPersistFolder2Vtbl vt_IPersistFolder2 =
{
ISF_Desktop_IPersistFolder2_fnQueryInterface,
ISF_Desktop_IPersistFolder2_fnAddRef,
ISF_Desktop_IPersistFolder2_fnRelease,
ISF_Desktop_IPersistFolder2_fnGetClassID,
ISF_Desktop_IPersistFolder2_fnInitialize,
ISF_Desktop_IPersistFolder2_fnGetCurFolder
}; };
/************************************************************************** /**************************************************************************
@ -939,7 +959,7 @@ HRESULT WINAPI ISF_Desktop_Constructor (
sf->ref = 1; sf->ref = 1;
sf->lpVtbl = &vt_MCFldr_ShellFolder2; sf->lpVtbl = &vt_MCFldr_ShellFolder2;
sf->lpVtblIPersist = &vt_IPersist; sf->lpVtblPF2 = &vt_IPersistFolder2;
sf->pidlRoot = _ILCreateDesktop(); /* my qualified pidl */ sf->pidlRoot = _ILCreateDesktop(); /* my qualified pidl */
sf->sPathTarget = SHAlloc( (lstrlenW(szMyPath) + 1)*sizeof(WCHAR) ); sf->sPathTarget = SHAlloc( (lstrlenW(szMyPath) + 1)*sizeof(WCHAR) );
lstrcpyW( sf->sPathTarget, szMyPath ); lstrcpyW( sf->sPathTarget, szMyPath );

View File

@ -2014,6 +2014,26 @@ static void test_SHCreateShellItem(void)
IShellItem_Release(shellitem); IShellItem_Release(shellitem);
} }
ret = pSHCreateShellItem(NULL, desktopfolder, pidl_testfile, &shellitem);
ok(SUCCEEDED(ret), "SHCreateShellItem returned %x\n", ret);
if (SUCCEEDED(ret))
{
ret = IShellItem_QueryInterface(shellitem, &IID_IPersistIDList, (void**)&persistidl);
ok(SUCCEEDED(ret), "QueryInterface returned %x\n", ret);
if (SUCCEEDED(ret))
{
ret = IPersistIDList_GetIDList(persistidl, &pidl_test);
ok(SUCCEEDED(ret), "GetIDList returned %x\n", ret);
if (SUCCEEDED(ret))
{
ok(ILIsEqual(pidl_testfile, pidl_test), "id lists are not equal\n");
pILFree(pidl_test);
}
IPersistIDList_Release(persistidl);
}
IShellItem_Release(shellitem);
}
DeleteFileA(".\\testfile"); DeleteFileA(".\\testfile");
pILFree(pidl_abstestfile); pILFree(pidl_abstestfile);
pILFree(pidl_testfile); pILFree(pidl_testfile);
@ -2084,6 +2104,7 @@ static void test_desktop_IPersist(void)
{ {
IShellFolder *desktop; IShellFolder *desktop;
IPersist *persist; IPersist *persist;
IPersistFolder2 *ppf2;
CLSID clsid; CLSID clsid;
HRESULT hr; HRESULT hr;
@ -2107,6 +2128,31 @@ static void test_desktop_IPersist(void)
IPersist_Release(persist); IPersist_Release(persist);
} }
hr = IShellFolder_QueryInterface(desktop, &IID_IPersistFolder2, (void**)&ppf2);
ok(hr == S_OK || broken(hr == E_NOINTERFACE) /* pre-Vista */, "failed %08x\n", hr);
if(SUCCEEDED(hr))
{
IPersistFolder *ppf;
LPITEMIDLIST pidl;
hr = IShellFolder_QueryInterface(desktop, &IID_IPersistFolder, (void**)&ppf);
ok(hr == S_OK, "IID_IPersistFolder2 without IID_IPersistFolder.\n");
if(SUCCEEDED(hr))
IPersistFolder_Release(ppf);
todo_wine {
hr = IPersistFolder2_Initialize(ppf2, NULL);
ok(hr == S_OK, "got %08x\n", hr);
}
pidl = NULL;
hr = IPersistFolder2_GetCurFolder(ppf2, &pidl);
ok(hr == S_OK, "got %08x\n", hr);
ok(pidl != NULL, "pidl was NULL.\n");
if(SUCCEEDED(hr)) pILFree(pidl);
IPersistFolder2_Release(ppf2);
}
IShellFolder_Release(desktop); IShellFolder_Release(desktop);
} }