Author: janderwald Date: Thu Nov 1 03:42:06 2007 New Revision: 30032
URL: http://svn.reactos.org/svn/reactos?rev=30032&view=rev Log: - implement IPersistFolder2 interface for desktop object - add a backslash when required - fixes deleting of objects on desktop
Modified: trunk/reactos/dll/win32/shell32/shfldr_desktop.c trunk/reactos/dll/win32/shell32/shv_item_cmenu.c
Modified: trunk/reactos/dll/win32/shell32/shfldr_desktop.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shfldr_de... ============================================================================== --- trunk/reactos/dll/win32/shell32/shfldr_desktop.c (original) +++ trunk/reactos/dll/win32/shell32/shfldr_desktop.c Thu Nov 1 03:42:06 2007 @@ -61,6 +61,7 @@
typedef struct { const IShellFolder2Vtbl *lpVtbl; + const IPersistFolder2Vtbl *lpPF2; LONG ref;
/* both paths are parsible from the desktop */ @@ -104,7 +105,11 @@ { *ppvObj = This; } - + else if (IsEqualIID (riid, &IID_IPersistFolder) || + IsEqualIID (riid, &IID_IPersistFolder2)) + { + *ppvObj = &This->lpPF2; + } if (*ppvObj) { IUnknown_AddRef ((IUnknown *) (*ppvObj)); @@ -843,6 +848,93 @@ ISF_Desktop_fnMapColumnToSCID };
+static inline IGenericSFImpl *impl_from_IPersistFolder2( IPersistFolder2 *iface ) +{ + return (IGenericSFImpl *)((char*)iface - FIELD_OFFSET(IGenericSFImpl, lpPF2)); +} + +static HRESULT WINAPI +ISF_Desktop_PersistFolder2_fnQueryInterface (IPersistFolder2 * iface, REFIID iid, + LPVOID * ppvObj) +{ + IGenericSFImpl *This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)\n", This); + + return ISF_Desktop_fnQueryInterface ((IShellFolder2*)This, iid, ppvObj); +} + +static ULONG WINAPI +ISF_Desktop_PersistFolder2_fnAddRef (IPersistFolder2 * iface) +{ + IGenericSFImpl *This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)->(count=%u)\n", This, This->ref); + + return ISF_Desktop_fnAddRef((IShellFolder2*)This); +} + +static ULONG WINAPI +ISF_Desktop_PersistFolder2_fnRelease (IPersistFolder2 * iface) +{ + IGenericSFImpl *This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)->(count=%u)\n", This, This->ref); + + return ISF_Desktop_fnRelease ((IShellFolder2*)This); +} + +static HRESULT WINAPI +ISF_Desktop_PersistFolder2_fnGetClassID (IPersistFolder2 * iface, CLSID * lpClassId) +{ + static GUID const CLSID_Desktop = + { 0x00021400, 0x0000, 0x0000, {0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46} }; + + IGenericSFImpl *This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)\n", This); + + if (!lpClassId) + return E_POINTER; + + memcpy(lpClassId, &CLSID_Desktop, sizeof(GUID)); + + return S_OK; +} +static HRESULT WINAPI +ISF_Desktop_PersistFolder2_fnInitialize (IPersistFolder2 * iface, LPCITEMIDLIST pidl) +{ + IGenericSFImpl *This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)->(%p)\n", This, pidl); + + return E_NOTIMPL; +} + +static HRESULT WINAPI +ISF_Desktop_PersistFolder2_fnGetCurFolder (IPersistFolder2 * iface, + LPITEMIDLIST * pidl) +{ + IGenericSFImpl *This = impl_from_IPersistFolder2(iface); + + TRACE ("(%p)->(%p)\n", This, pidl); + + if (!pidl) return E_POINTER; + *pidl = ILClone (This->pidlRoot); + return S_OK; +} + +static const IPersistFolder2Vtbl vt_FSFldr_PersistFolder2 = +{ + ISF_Desktop_PersistFolder2_fnQueryInterface, + ISF_Desktop_PersistFolder2_fnAddRef, + ISF_Desktop_PersistFolder2_fnRelease, + ISF_Desktop_PersistFolder2_fnGetClassID, + ISF_Desktop_PersistFolder2_fnInitialize, + ISF_Desktop_PersistFolder2_fnGetCurFolder, +}; + + /************************************************************************** * ISF_Desktop_Constructor */ @@ -872,6 +964,7 @@
sf->ref = 1; sf->lpVtbl = &vt_MCFldr_ShellFolder2; + sf->lpPF2 = &vt_FSFldr_PersistFolder2; sf->pidlRoot = _ILCreateDesktop(); /* my qualified pidl */ sf->sPathTarget = SHAlloc( (lstrlenW(szMyPath) + 1)*sizeof(WCHAR) ); lstrcpyW( sf->sPathTarget, szMyPath );
Modified: trunk/reactos/dll/win32/shell32/shv_item_cmenu.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shv_item_... ============================================================================== --- trunk/reactos/dll/win32/shell32/shv_item_cmenu.c (original) +++ trunk/reactos/dll/win32/shell32/shv_item_cmenu.c Thu Nov 1 03:42:06 2007 @@ -34,6 +34,7 @@ #include "shlobj.h" #include "objbase.h"
+#include "shlwapi.h" #include "shell32_main.h" #include "shellfolder.h" #include "debughlp.h" @@ -513,36 +514,39 @@ */ static void DoDelete(IContextMenu2 *iface, HWND hwnd) { - ItemCmImpl *This = (ItemCmImpl *)iface; WCHAR szPath[MAX_PATH]; WCHAR * szTarget; SHFILEOPSTRUCTW op; - LPSHELLBROWSER lpSB; - LPSHELLVIEW lpSV; - IPersistFolder3 * psf; + LPSHELLBROWSER lpSB; + LPSHELLVIEW lpSV; + IPersistFolder2 * psf; LPITEMIDLIST pidl; STRRET strTemp; - + ItemCmImpl *This = (ItemCmImpl *)iface; + if (IShellFolder2_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&psf) != S_OK) { ERR("Failed to get interface IID_IPersistFolder2\n"); return; } + if (IPersistFolder2_GetCurFolder(psf, &pidl) != S_OK) { ERR("IPersistFolder2_GetCurFolder failed\n"); - IShellFolder2_Release(psf); + IPersistFolder2_Release(psf); return; }
if (IShellFolder2_GetDisplayNameOf(This->pSFParent, pidl, SHGDN_FORPARSING, &strTemp) != S_OK) { ERR("IShellFolder_GetDisplayNameOf failed\n"); - IShellFolder2_Release(psf); + IPersistFolder2_Release(psf); return; } + szPath[MAX_PATH-1] = 0; StrRetToBufW(&strTemp, pidl, szPath, MAX_PATH); - IShellFolder2_Release(psf); + PathAddBackslashW(szPath); + IPersistFolder2_Release(psf);
szTarget = build_paths_list(szPath, This->cidl, This->apidl);
@@ -557,6 +561,7 @@ op.fFlags = FOF_ALLOWUNDO; SHFileOperationW(&op); } + ILFree(pidl); }
if ((lpSB = (LPSHELLBROWSER)SendMessageA(hwnd, CWM_GETISHELLBROWSER,0,0)))