Author: janderwald Date: Wed Aug 13 03:45:20 2008 New Revision: 35301
URL: http://svn.reactos.org/svn/reactos?rev=35301&view=rev Log: - implement deleting file using recyclebin api - play a sound on when requested using the user default for emptying recycle bin - rename shlfldr_mydocuments.c
Added: trunk/reactos/dll/win32/shell32/shfldr_mydocuments.c - copied unchanged from r35298, trunk/reactos/dll/win32/shell32/shlfldr_mydocuments.c Removed: trunk/reactos/dll/win32/shell32/shlfldr_mydocuments.c Modified: trunk/reactos/dll/win32/shell32/shell32.rbuild trunk/reactos/dll/win32/shell32/shellord.c trunk/reactos/dll/win32/shell32/shfldr_recyclebin.c
Modified: trunk/reactos/dll/win32/shell32/shell32.rbuild URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shell32.r... ============================================================================== --- trunk/reactos/dll/win32/shell32/shell32.rbuild [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shell32.rbuild [iso-8859-1] Wed Aug 13 03:45:20 2008 @@ -24,6 +24,7 @@ <library>version</library> <library>devmgr</library> <library>winspool</library> + <library>winmm</library> <file>authors.c</file> <file>autocomplete.c</file> <file>brsfolder.c</file> @@ -54,7 +55,7 @@ <file>shfldr_desktop.c</file> <file>shfldr_fs.c</file> <file>shfldr_mycomp.c</file> - <file>shlfldr_mydocuments.c</file> + <file>shfldr_mydocuments.c</file> <file>shfldr_printers.c</file> <file>shlexec.c</file> <file>shlfileop.c</file>
Modified: trunk/reactos/dll/win32/shell32/shellord.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shellord.... ============================================================================== --- trunk/reactos/dll/win32/shell32/shellord.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shellord.c [iso-8859-1] Wed Aug 13 03:45:20 2008 @@ -1962,14 +1962,18 @@
return FALSE; } - +/************************************************************************* + * SHStartNetConnectionDialog (SHELL32.@) + */ HRESULT WINAPI SHStartNetConnectionDialog(HWND hwnd, LPCSTR pszRemoteName, DWORD dwType) { FIXME("%p, %s, 0x%08x - stub\n", hwnd, debugstr_a(pszRemoteName), dwType);
return S_OK; } - +/************************************************************************* + * SHEmptyRecycleBinA (SHELL32.@) + */ HRESULT WINAPI SHEmptyRecycleBinA(HWND hwnd, LPCSTR pszRootPath, DWORD dwFlags) { LPWSTR szRootPathW = NULL; @@ -2001,16 +2005,55 @@
HRESULT WINAPI SHEmptyRecycleBinW(HWND hwnd, LPCWSTR pszRootPath, DWORD dwFlags) { - BOOL ret; + WCHAR szPath[MAX_PATH] = {0}; + DWORD dwSize, dwType; + LONG ret;
TRACE("%p, %s, 0x%08x\n", hwnd, debugstr_w(pszRootPath), dwFlags); - FIXME("0x%08x flags ignored\n", dwFlags); - - ret = EmptyRecycleBinW(pszRootPath); + + if (!(dwFlags & SHERB_NOCONFIRMATION)) + { + /* FIXME + * enumerate available files + * show confirmation dialog + */ + FIXME("show confirmation dialog\n"); + } + + if (dwFlags & SHERB_NOPROGRESSUI) + { + ret = EmptyRecycleBinW(pszRootPath); + } + else + { + /* FIXME + * show a progress dialog + */ + ret = EmptyRecycleBinW(pszRootPath); + } + if (!ret) return HRESULT_FROM_WIN32(GetLastError());
- /* FIXME: update icon? */ + if (!(dwFlags & SHERB_NOSOUND)) + { + dwSize = sizeof(szPath); + ret = RegGetValueW(HKEY_CURRENT_USER, + L"AppEvents\Schemes\Apps\Explorer\EmptyRecycleBin\.Current", + NULL, + RRF_RT_REG_EXPAND_SZ, + &dwType, + (PVOID)szPath, + &dwSize); + if (ret != ERROR_SUCCESS) + return S_OK; + + if (dwType != REG_EXPAND_SZ) /* type dismatch */ + return S_OK; + + szPath[(sizeof(szPath)/sizeof(WCHAR))-1] = L'\0'; + PlaySoundW(szPath, NULL, SND_FILENAME); + } return S_OK; }
Modified: trunk/reactos/dll/win32/shell32/shfldr_recyclebin.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shfldr_re... ============================================================================== --- trunk/reactos/dll/win32/shell32/shfldr_recyclebin.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shfldr_recyclebin.c [iso-8859-1] Wed Aug 13 03:45:20 2008 @@ -1109,8 +1109,7 @@ } else { - FIXME("implement delete\n"); - CloseRecycleBinHandle(Context.hDeletedFile); + DeleteFileHandleToRecycleBin(Context.hDeletedFile); return E_NOTIMPL; } } @@ -1647,5 +1646,8 @@ HRESULT WINAPI SHUpdateRecycleBinIcon(void) { FIXME("stub\n"); + + + return S_OK; }
Removed: trunk/reactos/dll/win32/shell32/shlfldr_mydocuments.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shlfldr_m... ============================================================================== --- trunk/reactos/dll/win32/shell32/shlfldr_mydocuments.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shlfldr_mydocuments.c (removed) @@ -1,920 +1,0 @@ - -/* - * Virtual MyDocuments Folder - * - * Copyright 2007 Johannes Anderwald - * - * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "config.h" -#include "wine/port.h" - -#include <stdlib.h> -#include <string.h> -#include <stdarg.h> -#include <stdio.h> - -#define COBJMACROS -#define NONAMELESSUNION -#define NONAMELESSSTRUCT - -#include "winerror.h" -#include "windef.h" -#include "winbase.h" -#include "winreg.h" -#include "wingdi.h" -#include "winuser.h" - -#include "ole2.h" -#include "shlguid.h" - -#include "enumidlist.h" -#include "pidl.h" -#include "undocshell.h" -#include "shell32_main.h" -#include "shresdef.h" -#include "shlwapi.h" -#include "shellfolder.h" -#include "wine/debug.h" -#include "debughlp.h" -#include "shfldr.h" - -WINE_DEFAULT_DEBUG_CHANNEL (mydocs); - -/*********************************************************************** -* MyDocumentsfolder implementation -*/ - -typedef struct { - const IShellFolder2Vtbl *lpVtbl; - const IPersistFolder2Vtbl *lpPF2; - LONG ref; - - /* both paths are parsible from the MyDocuments */ - LPWSTR sPathTarget; /* complete path to target used for enumeration and ChangeNotify */ - LPITEMIDLIST pidlRoot; /* absolute pidl */ - - UINT cfShellIDList; /* clipboardformat for IDropTarget */ - BOOL fAcceptFmt; /* flag for pending Drop */ -} IGenericSFImpl; - -#define _IUnknown_(This) (IShellFolder*)&(This->lpVtbl) -#define _IShellFolder_(This) (IShellFolder*)&(This->lpVtbl) - -static const shvheader MyDocumentsSFHeader[] = { - {IDS_SHV_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 15}, - {IDS_SHV_COLUMN2, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, - {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10}, - {IDS_SHV_COLUMN4, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 12}, - {IDS_SHV_COLUMN5, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 5} -}; - -#define MYDOCUMENTSSHELLVIEWCOLUMNS 5 - -/************************************************************************** - * ISF_MyDocuments_fnQueryInterface - * - * NOTES supports not IPersist/IPersistFolder - */ -static HRESULT WINAPI ISF_MyDocuments_fnQueryInterface( - IShellFolder2 * iface, REFIID riid, LPVOID * ppvObj) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - TRACE ("(%p)->(%s,%p)\n", This, shdebugstr_guid (riid), ppvObj); - - *ppvObj = NULL; - - if (IsEqualIID (riid, &IID_IUnknown) || - IsEqualIID (riid, &IID_IShellFolder) || - IsEqualIID (riid, &IID_IShellFolder2)) - { - *ppvObj = This; - } - else if (IsEqualIID (riid, &IID_IPersistFolder) || - IsEqualIID (riid, &IID_IPersistFolder2)) - { - *ppvObj = &This->lpPF2; - } - if (*ppvObj) - { - IUnknown_AddRef ((IUnknown *) (*ppvObj)); - TRACE ("-- Interface: (%p)->(%p)\n", ppvObj, *ppvObj); - return S_OK; - } - TRACE ("-- Interface: E_NOINTERFACE\n"); - return E_NOINTERFACE; -} - -static ULONG WINAPI ISF_MyDocuments_fnAddRef (IShellFolder2 * iface) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - ULONG refCount = InterlockedIncrement(&This->ref); - - TRACE ("(%p)->(count=%u)\n", This, refCount - 1); - - return refCount; -} - -static ULONG WINAPI ISF_MyDocuments_fnRelease (IShellFolder2 * iface) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - ULONG refCount = InterlockedDecrement(&This->ref); - - TRACE ("(%p)->(count=%u)\n", This, refCount + 1); - - if (!refCount) - { - TRACE ("-- destroying IShellFolder(%p)\n", This); - SHFree (This->pidlRoot); - HeapFree(GetProcessHeap(), 0, This->sPathTarget); - HeapFree(GetProcessHeap(), 0, This); - } - return refCount; -} - -static -HRESULT -WINAPI ISF_MyDocuments_fnParseDisplayName (IShellFolder2 * iface, - HWND hwndOwner, LPBC pbc, LPOLESTR lpszDisplayName, - DWORD * pchEaten, LPITEMIDLIST * ppidl, DWORD * pdwAttributes) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - WCHAR szElement[MAX_PATH]; - LPCWSTR szNext = NULL; - LPITEMIDLIST pidlTemp = NULL; - HRESULT hr = S_OK; - CLSID clsid; - - TRACE ("(%p)->(HWND=%p,%p,%p=%s,%p,pidl=%p,%p)\n", - This, hwndOwner, pbc, lpszDisplayName, debugstr_w(lpszDisplayName), - pchEaten, ppidl, pdwAttributes); - - if (!lpszDisplayName || !ppidl) - return E_INVALIDARG; - - *ppidl = 0; - - if (pchEaten) - *pchEaten = 0; /* strange but like the original */ - - if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':') - { - szNext = GetNextElementW (lpszDisplayName, szElement, MAX_PATH); - TRACE ("-- element: %s\n", debugstr_w (szElement)); - SHCLSIDFromStringW (szElement + 2, &clsid); - pidlTemp = _ILCreateGuid (PT_GUID, &clsid); - } - else if( (pidlTemp = SHELL32_CreatePidlFromBindCtx(pbc, lpszDisplayName)) ) - { - *ppidl = pidlTemp; - return S_OK; - } - else - { - /* it's a filesystem path on the desktop. Let a FSFolder parse it */ - - if (*lpszDisplayName) - { - WCHAR szPath[MAX_PATH]; - LPWSTR pathPtr; - - /* build a complete path to create a simple pidl */ - lstrcpynW(szPath, This->sPathTarget, MAX_PATH); - pathPtr = PathAddBackslashW(szPath); - if (pathPtr) - { - lstrcpynW(pathPtr, lpszDisplayName, MAX_PATH - (pathPtr - szPath)); - hr = _ILCreateFromPathW(szPath, &pidlTemp); - } - else - { - /* should never reach here, but for completeness */ - hr = HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); - } - } - else - pidlTemp = _ILCreateMyDocuments(); - - szNext = NULL; - } - - if (SUCCEEDED(hr) && pidlTemp) - { - if (szNext && *szNext) - { - hr = SHELL32_ParseNextElement(iface, hwndOwner, pbc, - &pidlTemp, (LPOLESTR) szNext, pchEaten, pdwAttributes); - } - else - { - if (pdwAttributes && *pdwAttributes) - hr = SHELL32_GetItemAttributes(_IShellFolder_ (This), - pidlTemp, pdwAttributes); - } - } - - *ppidl = pidlTemp; - - TRACE ("(%p)->(-- ret=0x%08x)\n", This, hr); - - return hr; -} - -/************************************************************************** - * CreateMyDocumentsEnumList() - */ -static BOOL CreateMyDocumentsEnumList(IEnumIDList *list, DWORD dwFlags) -{ - BOOL ret = TRUE; - WCHAR szPath[MAX_PATH] = {0}; - - TRACE("(%p)->(flags=0x%08x)\n", list, dwFlags); - - /* enumerate the elements in %windir%\desktop */ - ret = SHGetSpecialFolderPathW(0, szPath, CSIDL_PERSONAL, FALSE); - ret = ret && CreateFolderEnumList(list, szPath, dwFlags); - - return ret; -} - -/************************************************************************** - * ISF_MyDocuments_fnEnumObjects - */ -static HRESULT WINAPI ISF_MyDocuments_fnEnumObjects (IShellFolder2 * iface, - HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST * ppEnumIDList) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - TRACE ("(%p)->(HWND=%p flags=0x%08x pplist=%p)\n", - This, hwndOwner, dwFlags, ppEnumIDList); - - *ppEnumIDList = IEnumIDList_Constructor(); - if (*ppEnumIDList) - CreateMyDocumentsEnumList(*ppEnumIDList, dwFlags); - - TRACE ("-- (%p)->(new ID List: %p)\n", This, *ppEnumIDList); - - return *ppEnumIDList ? S_OK : E_OUTOFMEMORY; -} - -/************************************************************************** - * ISF_MyDocuments_fnBindToObject - */ -static HRESULT WINAPI ISF_MyDocuments_fnBindToObject (IShellFolder2 * iface, - LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - TRACE ("(%p)->(pidl=%p,%p,%s,%p)\n", - This, pidl, pbcReserved, shdebugstr_guid (riid), ppvOut); - - return SHELL32_BindToChild( This->pidlRoot, This->sPathTarget, pidl, riid, ppvOut ); -} - -/************************************************************************** - * ISF_MyDocuments_fnBindToStorage - */ -static -HRESULT -WINAPI -ISF_MyDocuments_fnBindToStorage (IShellFolder2 * iface, - LPCITEMIDLIST pidl, LPBC pbcReserved, REFIID riid, LPVOID * ppvOut) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - FIXME ("(%p)->(pidl=%p,%p,%s,%p) stub\n", - This, pidl, pbcReserved, shdebugstr_guid (riid), ppvOut); - - *ppvOut = NULL; - return E_NOTIMPL; -} - -/************************************************************************** - * ISF_MyDocuments_fnCompareIDs - */ -static HRESULT WINAPI ISF_MyDocuments_fnCompareIDs (IShellFolder2 * iface, - LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - int nReturn; - - TRACE ("(%p)->(0x%08lx,pidl1=%p,pidl2=%p)\n", This, lParam, pidl1, pidl2); - nReturn = SHELL32_CompareIDs (_IShellFolder_ (This), lParam, pidl1, pidl2); - TRACE ("-- %i\n", nReturn); - return nReturn; -} - -/************************************************************************** - * ISF_MyDocuments_fnCreateViewObject - */ -static HRESULT WINAPI ISF_MyDocuments_fnCreateViewObject (IShellFolder2 * iface, - HWND hwndOwner, REFIID riid, LPVOID * ppvOut) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - LPSHELLVIEW pShellView; - HRESULT hr = E_INVALIDARG; - - TRACE ("(%p)->(hwnd=%p,%s,%p)\n", - This, hwndOwner, shdebugstr_guid (riid), ppvOut); - - if (!ppvOut) - return hr; - - *ppvOut = NULL; - - if (IsEqualIID (riid, &IID_IDropTarget)) - { - WARN ("IDropTarget not implemented\n"); - hr = E_NOTIMPL; - } - else if (IsEqualIID (riid, &IID_IContextMenu)) - { - WARN ("IContextMenu not implemented\n"); - hr = E_NOTIMPL; - } - else if (IsEqualIID (riid, &IID_IShellView)) - { - pShellView = IShellView_Constructor ((IShellFolder *) iface); - if (pShellView) - { - hr = IShellView_QueryInterface (pShellView, riid, ppvOut); - IShellView_Release (pShellView); - } - } - TRACE ("-- (%p)->(interface=%p)\n", This, ppvOut); - return hr; -} - -/************************************************************************** - * ISF_MyDocuments_fnGetAttributesOf - */ -static HRESULT WINAPI ISF_MyDocuments_fnGetAttributesOf (IShellFolder2 * iface, - UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - HRESULT hr = S_OK; - static const DWORD dwMyDocumentsAttributes = - SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | - SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER; - - TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", - This, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0); - - if (!rgfInOut) - return E_INVALIDARG; - if (cidl && !apidl) - return E_INVALIDARG; - - if (*rgfInOut == 0) - *rgfInOut = ~0; - - if(cidl == 0) { - *rgfInOut &= dwMyDocumentsAttributes; - } else { - while (cidl > 0 && *apidl) { - pdump (*apidl); - if (_ILIsMyDocuments(*apidl)) { - *rgfInOut &= dwMyDocumentsAttributes; - } else { - SHELL32_GetItemAttributes (_IShellFolder_ (This), *apidl, rgfInOut); - } - apidl++; - cidl--; - } - } - /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ - *rgfInOut &= ~SFGAO_VALIDATE; - - TRACE ("-- result=0x%08x\n", *rgfInOut); - - return hr; -} - -/************************************************************************** - * ISF_MyDocuments_fnGetUIObjectOf - * - * PARAMETERS - * HWND hwndOwner, //[in ] Parent window for any output - * UINT cidl, //[in ] array size - * LPCITEMIDLIST* apidl, //[in ] simple pidl array - * REFIID riid, //[in ] Requested Interface - * UINT* prgfInOut, //[ ] reserved - * LPVOID* ppvObject) //[out] Resulting Interface - * - */ -static HRESULT WINAPI ISF_MyDocuments_fnGetUIObjectOf (IShellFolder2 * iface, - HWND hwndOwner, UINT cidl, LPCITEMIDLIST * apidl, - REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - LPITEMIDLIST pidl; - IUnknown *pObj = NULL; - HRESULT hr = E_INVALIDARG; - - TRACE ("(%p)->(%p,%u,apidl=%p,%s,%p,%p)\n", - This, hwndOwner, cidl, apidl, shdebugstr_guid (riid), prgfInOut, ppvOut); - - if (!ppvOut) - return hr; - - *ppvOut = NULL; - - if (IsEqualIID (riid, &IID_IContextMenu)) - { - hr = CDefFolderMenu_Create2(This->pidlRoot, hwndOwner, cidl, apidl, (IShellFolder*)iface, NULL, 0, NULL, (IContextMenu**)&pObj); - } - else if (IsEqualIID (riid, &IID_IDataObject) && (cidl >= 1)) - { - pObj = (LPUNKNOWN) IDataObject_Constructor( hwndOwner, - This->pidlRoot, apidl, cidl); - hr = S_OK; - } - else if (IsEqualIID (riid, &IID_IExtractIconA) && (cidl == 1)) - { - pidl = ILCombine (This->pidlRoot, apidl[0]); - pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl); - SHFree (pidl); - hr = S_OK; - } - else if (IsEqualIID (riid, &IID_IExtractIconW) && (cidl == 1)) - { - pidl = ILCombine (This->pidlRoot, apidl[0]); - pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl); - SHFree (pidl); - hr = S_OK; - } - else if (IsEqualIID (riid, &IID_IDropTarget) && (cidl >= 1)) - { - hr = IShellFolder_QueryInterface (iface, - &IID_IDropTarget, (LPVOID *) & pObj); - } - else if ((IsEqualIID(riid,&IID_IShellLinkW) || - IsEqualIID(riid,&IID_IShellLinkA)) && (cidl == 1)) - { - pidl = ILCombine (This->pidlRoot, apidl[0]); - hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj); - SHFree (pidl); - } - else - hr = E_NOINTERFACE; - - if (SUCCEEDED(hr) && !pObj) - hr = E_OUTOFMEMORY; - - *ppvOut = pObj; - TRACE ("(%p)->hr=0x%08x\n", This, hr); - return hr; -} - -static -HRESULT -WINAPI ISF_MyDocuments_fnGetDisplayNameOf (IShellFolder2 * iface, - LPCITEMIDLIST pidl, DWORD dwFlags, LPSTRRET strRet) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - HRESULT hr = S_OK; - LPWSTR pszPath; - - TRACE ("(%p)->(pidl=%p,0x%08x,%p)\n", This, pidl, dwFlags, strRet); - pdump (pidl); - - if (!strRet) - return E_INVALIDARG; - - pszPath = CoTaskMemAlloc((MAX_PATH +1) * sizeof(WCHAR)); - if (!pszPath) - return E_OUTOFMEMORY; - - ZeroMemory(pszPath, (MAX_PATH +1) * sizeof(WCHAR)); - - if (_ILIsMyDocuments (pidl)) - { - if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) && - (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING)) - strcpyW(pszPath, This->sPathTarget); - else - HCR_GetClassNameW(&CLSID_MyDocuments, pszPath, MAX_PATH); - TRACE("CP\n"); - } - else if (_ILIsPidlSimple (pidl)) - { - GUID const *clsid; - - if ((clsid = _ILGetGUIDPointer (pidl))) - { - if (GET_SHGDN_FOR (dwFlags) & SHGDN_FORPARSING) - { - int bWantsForParsing; - - /* - * We can only get a filesystem path from a shellfolder if the - * value WantsFORPARSING in CLSID\{...}\shellfolder exists. - * - * Exception: The MyComputer folder doesn't have this key, - * but any other filesystem backed folder it needs it. - */ - if (IsEqualIID (clsid, &CLSID_MyDocuments)) - { - bWantsForParsing = TRUE; - } - else - { - /* get the "WantsFORPARSING" flag from the registry */ - static const WCHAR clsidW[] = - { 'C','L','S','I','D','\',0 }; - static const WCHAR shellfolderW[] = - { '\','s','h','e','l','l','f','o','l','d','e','r',0 }; - static const WCHAR wantsForParsingW[] = - { 'W','a','n','t','s','F','o','r','P','a','r','s','i','n', - 'g',0 }; - WCHAR szRegPath[100]; - LONG r; - - lstrcpyW (szRegPath, clsidW); - SHELL32_GUIDToStringW (clsid, &szRegPath[6]); - lstrcatW (szRegPath, shellfolderW); - r = SHGetValueW(HKEY_CLASSES_ROOT, szRegPath, - wantsForParsingW, NULL, NULL, NULL); - if (r == ERROR_SUCCESS) - bWantsForParsing = TRUE; - else - bWantsForParsing = FALSE; - } - - if ((GET_SHGDN_RELATION (dwFlags) == SHGDN_NORMAL) && - bWantsForParsing) - { - /* - * we need the filesystem path to the destination folder. - * Only the folder itself can know it - */ - hr = SHELL32_GetDisplayNameOfChild (iface, pidl, dwFlags, - pszPath, - MAX_PATH); - TRACE("CP\n"); - } - else - { - /* parsing name like ::{...} */ - pszPath[0] = ':'; - pszPath[1] = ':'; - SHELL32_GUIDToStringW (clsid, &pszPath[2]); - TRACE("CP\n"); - } - } - else - { - /* user friendly name */ - HCR_GetClassNameW (clsid, pszPath, MAX_PATH); - TRACE("CP\n"); - } - } - else - { - int cLen = 0; - - /* file system folder or file rooted at the desktop */ - if ((GET_SHGDN_FOR(dwFlags) == SHGDN_FORPARSING) && - (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER)) - { - lstrcpynW(pszPath, This->sPathTarget, MAX_PATH - 1); - TRACE("CP %s\n", debugstr_w(pszPath)); - } - - if (!_ILIsDesktop(pidl)) - { - PathAddBackslashW(pszPath); - cLen = lstrlenW(pszPath); - _ILSimpleGetTextW(pidl, pszPath + cLen, MAX_PATH - cLen); - if (!_ILIsFolder(pidl)) - { - SHELL_FS_ProcessDisplayFilename(pszPath, dwFlags); - TRACE("CP\n"); - } - } - } - } - else - { - /* a complex pidl, let the subfolder do the work */ - hr = SHELL32_GetDisplayNameOfChild (iface, pidl, dwFlags, - pszPath, MAX_PATH); - TRACE("CP\n"); - } - - if (SUCCEEDED(hr)) - { - strRet->uType = STRRET_WSTR; - strRet->u.pOleStr = pszPath; - } - else - CoTaskMemFree(pszPath); - - TRACE ("-- (%p)->(%s,0x%08x)\n", This, debugstr_w(strRet->u.pOleStr), hr); - return hr; -} - -static HRESULT WINAPI ISF_MyDocuments_fnSetNameOf (IShellFolder2 * iface, - HWND hwndOwner, LPCITEMIDLIST pidl, /* simple pidl */ - LPCOLESTR lpName, DWORD dwFlags, LPITEMIDLIST * pPidlOut) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - FIXME ("(%p)->(%p,pidl=%p,%s,%u,%p)\n", This, hwndOwner, pidl, - debugstr_w (lpName), dwFlags, pPidlOut); - - return E_FAIL; -} - -static HRESULT WINAPI ISF_MyDocuments_fnGetDefaultSearchGUID(IShellFolder2 *iface, - GUID * pguid) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - FIXME ("(%p)\n", This); - return E_NOTIMPL; -} - -static HRESULT WINAPI ISF_MyDocuments_fnEnumSearches (IShellFolder2 *iface, - IEnumExtraSearch ** ppenum) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - FIXME ("(%p)\n", This); - return E_NOTIMPL; -} - -static -HRESULT -WINAPI -ISF_MyDocuments_fnGetDefaultColumn (IShellFolder2 * iface, - DWORD dwRes, ULONG * pSort, ULONG * pDisplay) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - TRACE ("(%p)\n", This); - - if (pSort) - *pSort = 0; - if (pDisplay) - *pDisplay = 0; - - return S_OK; -} -static -HRESULT -WINAPI -ISF_MyDocuments_fnGetDefaultColumnState (IShellFolder2 * iface, UINT iColumn, DWORD * pcsFlags) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - TRACE ("(%p)\n", This); - - if (!pcsFlags || iColumn >= MYDOCUMENTSSHELLVIEWCOLUMNS) - return E_INVALIDARG; - - *pcsFlags = MyDocumentsSFHeader[iColumn].pcsFlags; - - return S_OK; -} - -static -HRESULT -WINAPI -ISF_MyDocuments_fnGetDetailsEx (IShellFolder2 * iface, LPCITEMIDLIST pidl, const SHCOLUMNID * pscid, VARIANT * pv) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - FIXME ("(%p)\n", This); - - return E_NOTIMPL; -} - -static -HRESULT -WINAPI -ISF_MyDocuments_fnGetDetailsOf (IShellFolder2 * iface, LPCITEMIDLIST pidl, UINT iColumn, SHELLDETAILS * psd) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - - HRESULT hr = S_OK; - - TRACE ("(%p)->(%p %i %p)\n", This, pidl, iColumn, psd); - - if (!psd || iColumn >= MYDOCUMENTSSHELLVIEWCOLUMNS) - return E_INVALIDARG; - - if (!pidl) - { - psd->fmt = MyDocumentsSFHeader[iColumn].fmt; - psd->cxChar = MyDocumentsSFHeader[iColumn].cxChar; - psd->str.uType = STRRET_CSTR; - LoadStringA (shell32_hInstance, MyDocumentsSFHeader[iColumn].colnameid, - psd->str.u.cStr, MAX_PATH); - return S_OK; - } - - /* the data from the pidl */ - psd->str.uType = STRRET_CSTR; - switch (iColumn) - { - case 0: /* name */ - hr = IShellFolder_GetDisplayNameOf(iface, pidl, - SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); - break; - case 1: /* size */ - _ILGetFileSize (pidl, psd->str.u.cStr, MAX_PATH); - break; - case 2: /* type */ - _ILGetFileType (pidl, psd->str.u.cStr, MAX_PATH); - break; - case 3: /* date */ - _ILGetFileDate (pidl, psd->str.u.cStr, MAX_PATH); - break; - case 4: /* attributes */ - _ILGetFileAttributes (pidl, psd->str.u.cStr, MAX_PATH); - break; - } - - return hr; -} - -static -HRESULT -WINAPI -ISF_MyDocuments_fnMapColumnToSCID (IShellFolder2 * iface, UINT column, SHCOLUMNID * pscid) -{ - IGenericSFImpl *This = (IGenericSFImpl *)iface; - FIXME ("(%p)\n", This); - return E_NOTIMPL; -} - -static const IShellFolder2Vtbl vt_MCFldr_ShellFolder2 = -{ - ISF_MyDocuments_fnQueryInterface, - ISF_MyDocuments_fnAddRef, - ISF_MyDocuments_fnRelease, - ISF_MyDocuments_fnParseDisplayName, - ISF_MyDocuments_fnEnumObjects, - ISF_MyDocuments_fnBindToObject, - ISF_MyDocuments_fnBindToStorage, - ISF_MyDocuments_fnCompareIDs, - ISF_MyDocuments_fnCreateViewObject, - ISF_MyDocuments_fnGetAttributesOf, - ISF_MyDocuments_fnGetUIObjectOf, - ISF_MyDocuments_fnGetDisplayNameOf, - ISF_MyDocuments_fnSetNameOf, - /* ShellFolder2 */ - ISF_MyDocuments_fnGetDefaultSearchGUID, - ISF_MyDocuments_fnEnumSearches, - ISF_MyDocuments_fnGetDefaultColumn, - ISF_MyDocuments_fnGetDefaultColumnState, - ISF_MyDocuments_fnGetDetailsEx, - ISF_MyDocuments_fnGetDetailsOf, - ISF_MyDocuments_fnMapColumnToSCID -}; - -static inline IGenericSFImpl *impl_from_IPersistFolder2( IPersistFolder2 *iface ) -{ - return (IGenericSFImpl *)((char*)iface - FIELD_OFFSET(IGenericSFImpl, lpPF2)); -} - -static HRESULT WINAPI -ISF_MyDocuments_PersistFolder2_fnQueryInterface (IPersistFolder2 * iface, REFIID iid, LPVOID * ppvObj) -{ - IGenericSFImpl *This = impl_from_IPersistFolder2(iface); - - TRACE ("(%p)\n", This); - - return ISF_MyDocuments_fnQueryInterface ((IShellFolder2*)This, iid, ppvObj); -} - -static ULONG WINAPI -ISF_MyDocuments_PersistFolder2_fnAddRef (IPersistFolder2 * iface) -{ - IGenericSFImpl *This = impl_from_IPersistFolder2(iface); - - TRACE ("(%p)->(count=%u)\n", This, This->ref); - - return ISF_MyDocuments_fnAddRef((IShellFolder2*)This); -} - -static ULONG WINAPI -ISF_MyDocuments_PersistFolder2_fnRelease (IPersistFolder2 * iface) -{ - IGenericSFImpl *This = impl_from_IPersistFolder2(iface); - - TRACE ("(%p)->(count=%u)\n", This, This->ref); - - return ISF_MyDocuments_fnRelease ((IShellFolder2*)This); -} - -static HRESULT WINAPI -ISF_MyDocuments_PersistFolder2_fnGetClassID (IPersistFolder2 * iface, CLSID * lpClassId) -{ - IGenericSFImpl *This = impl_from_IPersistFolder2(iface); - - static GUID const CLSID_MyDocuments = - { 0x450d8fba, 0xad25, 0x11d0, {0x98,0xa8,0x08,0x00,0x36,0x1b,0x11,0x03} }; - - TRACE ("(%p)\n", This); - - if (!lpClassId) - return E_POINTER; - - memcpy(lpClassId, &CLSID_MyDocuments, sizeof(GUID)); - - return S_OK; -} -static HRESULT WINAPI -ISF_MyDocuments_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_MyDocuments_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_MyDocuments_PersistFolder2_fnQueryInterface, - ISF_MyDocuments_PersistFolder2_fnAddRef, - ISF_MyDocuments_PersistFolder2_fnRelease, - ISF_MyDocuments_PersistFolder2_fnGetClassID, - ISF_MyDocuments_PersistFolder2_fnInitialize, - ISF_MyDocuments_PersistFolder2_fnGetCurFolder, -}; - - -/************************************************************************** - * ISF_MyDocuments_Constructor - */ -HRESULT WINAPI ISF_MyDocuments_Constructor ( - IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv) -{ - static IGenericSFImpl *cached_sf; - WCHAR szMyPath[MAX_PATH]; - - TRACE ("unkOut=%p %s\n", pUnkOuter, shdebugstr_guid (riid)); - - if (!ppv) - return E_POINTER; - if (pUnkOuter) - return CLASS_E_NOAGGREGATION; - - if (!cached_sf) - { - IGenericSFImpl *sf; - - if (!SHGetSpecialFolderPathW( 0, szMyPath, CSIDL_PERSONAL, TRUE )) - return E_UNEXPECTED; - - sf = LocalAlloc( LMEM_ZEROINIT, sizeof (IGenericSFImpl) ); - if (!sf) - return E_OUTOFMEMORY; - - sf->ref = 1; - sf->lpVtbl = &vt_MCFldr_ShellFolder2; - sf->lpPF2 = &vt_FSFldr_PersistFolder2; - sf->pidlRoot = _ILCreateMyDocuments(); /* my qualified pidl */ - sf->sPathTarget = SHAlloc( (lstrlenW(szMyPath) + 1)*sizeof(WCHAR) ); - lstrcpyW( sf->sPathTarget, szMyPath ); - - if (InterlockedCompareExchangePointer((void *)&cached_sf, sf, NULL) != NULL) - { - /* some other thread already been here */ - SHFree( sf->pidlRoot ); - SHFree( sf->sPathTarget ); - LocalFree( sf ); - } - } - - return IUnknown_QueryInterface( _IUnknown_(cached_sf), riid, ppv ); -}