shell32: Implement IPersistFolder2 for the desktop folder.
This commit is contained in:
parent
1d658d4bb7
commit
fb88e06e79
|
@ -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 );
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue