Module: wine Branch: refs/heads/master Commit: 289e469e7c7e624bc70f0b43e8b971743926d90c URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=289e469e7c7e624bc70f0b43...
Author: Mikołaj Zalewski mikolaj@zalewski.pl Date: Thu Aug 3 19:04:11 2006 +0200
shell32: Add a Trash virtual folder.
---
dlls/shell32/Makefile.in | 1 + dlls/shell32/regsvr.c | 16 +++++++++ dlls/shell32/shell32_En.rc | 3 ++ dlls/shell32/shell32_main.h | 1 + dlls/shell32/shellole.c | 1 + dlls/shell32/shresdef.h | 5 +++ dlls/shell32/trash.c | 77 +++++++++++++++++++++++++++++++++++++++++++ dlls/shell32/xdg.h | 6 +++ 8 files changed, 110 insertions(+), 0 deletions(-)
diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in index 58376e9..54b2936 100644 --- a/dlls/shell32/Makefile.in +++ b/dlls/shell32/Makefile.in @@ -27,6 +27,7 @@ C_SRCS = \ folders.c \ iconcache.c \ pidl.c \ + recyclebin.c \ regsvr.c \ shell32_main.c \ shelllink.c \ diff --git a/dlls/shell32/regsvr.c b/dlls/shell32/regsvr.c index 6efb192..cb8f69b 100644 --- a/dlls/shell32/regsvr.c +++ b/dlls/shell32/regsvr.c @@ -660,6 +660,16 @@ static struct regsvr_coclass const cocla SFGAO_FILESYSANCESTOR|SFGAO_FOLDER|SFGAO_HASSUBFOLDER, SFGAO_FILESYSTEM }, + { &CLSID_RecycleBin, + "Trash", + IDS_RECYCLEBIN_FOLDER_NAME, + NULL, + "shell32.dll", + "Apartment", + SHELLFOLDER_ATTRIBUTES, + SFGAO_FOLDER|SFGAO_DROPTARGET|SFGAO_HASPROPSHEET, + 0 + }, { NULL } /* list terminator */ };
@@ -677,6 +687,7 @@ static struct regsvr_interface const int static const WCHAR wszDesktop[] = { 'D','e','s','k','t','o','p',0 }; static const WCHAR wszSlash[] = { '/', 0 }; static const WCHAR wszMyDocuments[] = { 'M','y',' ','D','o','c','u','m','e','n','t','s', 0 }; +static const WCHAR wszRecycleBin[] = { 'T','r','a','s','h', 0 };
static struct regsvr_namespace const namespace_extensions_list[] = { { @@ -689,6 +700,11 @@ static struct regsvr_namespace const nam wszDesktop, wszMyDocuments }, + { + &CLSID_RecycleBin, + wszDesktop, + wszRecycleBin + }, { NULL } };
diff --git a/dlls/shell32/shell32_En.rc b/dlls/shell32/shell32_En.rc index 03b31f6..7c7caaa 100644 --- a/dlls/shell32/shell32_En.rc +++ b/dlls/shell32/shell32_En.rc @@ -145,10 +145,13 @@ STRINGTABLE DISCARDABLE IDS_SHV_COLUMN9 "Comments" IDS_SHV_COLUMN10 "Owner" IDS_SHV_COLUMN11 "Group" + IDS_SHV_COLUMN_DELFROM "Original location" + IDS_SHV_COLUMN_DELDATE "Date deleted"
/* special folders */ IDS_DESKTOP "Desktop" IDS_MYCOMPUTER "My Computer" + IDS_RECYCLEBIN_FOLDER_NAME "Trash"
/* context menus */ IDS_VIEW_LARGE "Lar&ge Icons" diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h index 5bc8e64..4463da5 100644 --- a/dlls/shell32/shell32_main.h +++ b/dlls/shell32/shell32_main.h @@ -97,6 +97,7 @@ HRESULT WINAPI UnixFolder_Constructor(IU HRESULT WINAPI UnixDosFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); HRESULT WINAPI FolderShortcut_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); HRESULT WINAPI MyDocuments_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); +HRESULT WINAPI RecycleBin_Constructor(IUnknown * pUnkOuter, REFIID riif, LPVOID *ppv); HRESULT WINAPI ShellFSFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID *ppv); extern HRESULT CPanel_GetIconLocationW(LPITEMIDLIST, LPWSTR, UINT, int*); HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize); diff --git a/dlls/shell32/shellole.c b/dlls/shell32/shellole.c index d154cbe..b16be1b 100644 --- a/dlls/shell32/shellole.c +++ b/dlls/shell32/shellole.c @@ -74,6 +74,7 @@ static const struct { {&CLSID_UnixDosFolder, &UnixDosFolder_Constructor}, {&CLSID_FolderShortcut, &FolderShortcut_Constructor}, {&CLSID_MyDocuments, &MyDocuments_Constructor}, + {&CLSID_RecycleBin, &RecycleBin_Constructor}, {NULL,NULL} };
diff --git a/dlls/shell32/shresdef.h b/dlls/shell32/shresdef.h index 3f0e1d7..ab475eb 100644 --- a/dlls/shell32/shresdef.h +++ b/dlls/shell32/shresdef.h @@ -33,6 +33,8 @@ #define IDS_SHV_COLUMN8 14 #define IDS_SHV_COLUMN9 15 #define IDS_SHV_COLUMN10 16 #define IDS_SHV_COLUMN11 17 +#define IDS_SHV_COLUMN_DELFROM 18 +#define IDS_SHV_COLUMN_DELDATE 19
#define IDS_DESKTOP 20 #define IDS_MYCOMPUTER 21 @@ -91,6 +93,9 @@ #define IDS_TRASHITEM_TEXT 138 #define IDS_TRASHMULTIPLE_TEXT 139 #define IDS_CANTTRASH_TEXT 140
+/* Note: this string is referenced from the registry*/ +#define IDS_RECYCLEBIN_FOLDER_NAME 8964 + /* browse for folder dialog box */ #define IDD_STATUS 0x3743 #define IDD_TITLE 0x3742 diff --git a/dlls/shell32/trash.c b/dlls/shell32/trash.c index 0432694..d5d7fc3 100644 --- a/dlls/shell32/trash.c +++ b/dlls/shell32/trash.c @@ -306,3 +306,80 @@ BOOL TRASH_TrashFile(LPCWSTR wszPath) HeapFree(GetProcessHeap(), 0, unix_path); return result; } + +/* + * The item ID of a trashed element is built as follows: + * NUL byte - in most PIDLs the first byte is the type so we keep it constant + * WIN32_FIND_DATAW structure - with data about original file attributes + * bucket name - currently only an empty string meaning the home bucket is supported + * trash file name - a NUL-terminated string + */ +struct tagTRASH_ELEMENT +{ + TRASH_BUCKET *bucket; + LPSTR filename; +}; + +static HRESULT TRASH_CreateSimplePIDL(const TRASH_ELEMENT *element, const WIN32_FIND_DATAW *data, LPITEMIDLIST *pidlOut) +{ + LPITEMIDLIST pidl = SHAlloc(2+1+sizeof(WIN32_FIND_DATAW)+1+lstrlenA(element->filename)+1+2); + *pidlOut = NULL; + if (pidl == NULL) + return E_OUTOFMEMORY; + pidl->mkid.cb = (USHORT)(2+1+sizeof(WIN32_FIND_DATAW)+1+lstrlenA(element->filename)+1); + pidl->mkid.abID[0] = 0; + memcpy(pidl->mkid.abID+1, data, sizeof(WIN32_FIND_DATAW)); + pidl->mkid.abID[1+sizeof(WIN32_FIND_DATAW)] = 0; + lstrcpyA((LPSTR)(pidl->mkid.abID+1+sizeof(WIN32_FIND_DATAW)+1), element->filename); + *(USHORT *)(pidl->mkid.abID+1+sizeof(WIN32_FIND_DATAW)+1+lstrlenA(element->filename)+1) = 0; + *pidlOut = pidl; + return S_OK; +} + +/*********************************************************************** + * TRASH_UnpackItemID [Internal] + * + * DESCRITION: + * Extract the information stored in an Item ID. The TRASH_ELEMENT + * identifies the element in the Trash. The WIN32_FIND_DATA contains the + * information about the original file. The data->ftLastAccessTime contains + * the deletion time + * + * PARAMETER(S): + * [I] id : the ID of the item + * [O] element : the trash element this item id contains. Can be NULL if not needed + * [O] data : the WIN32_FIND_DATA of the original file. Can be NULL is not needed + */ +HRESULT TRASH_UnpackItemID(LPCSHITEMID id, TRASH_ELEMENT *element, WIN32_FIND_DATAW *data) +{ + if (id->cb < 2+1+sizeof(WIN32_FIND_DATAW)+2) + return E_INVALIDARG; + if (id->abID[0] != 0 || id->abID[1+sizeof(WIN32_FIND_DATAW)] != 0) + return E_INVALIDARG; + if (memchr(id->abID+1+sizeof(WIN32_FIND_DATAW)+1, 0, id->cb-(2+1+sizeof(WIN32_FIND_DATAW)+1)) == NULL) + return E_INVALIDARG; + + if (data != NULL) + *data = *(WIN32_FIND_DATAW *)(id->abID+1); + if (element != NULL) + { + element->bucket = home_trash; + element->filename = StrDupA((LPCSTR)(id->abID+1+sizeof(WIN32_FIND_DATAW)+1)); + if (element->filename == NULL) + return E_OUTOFMEMORY; + } + return S_OK; +} + +void TRASH_DisposeElement(TRASH_ELEMENT *element) +{ + if (element) + SHFree(element->filename); +} + +HRESULT TRASH_EnumItems(LPITEMIDLIST **pidls, int *count) +{ + *count = 0; + *pidls = SHAlloc(0); + return S_OK; +} diff --git a/dlls/shell32/xdg.h b/dlls/shell32/xdg.h index 46a8618..90f10f7 100644 --- a/dlls/shell32/xdg.h +++ b/dlls/shell32/xdg.h @@ -33,7 +33,13 @@ #define XDG_URLENCODE 0x1 BOOL XDG_WriteDesktopStringEntry(int fd, const char *keyName, DWORD dwFlags, const char *value);
/* implemented in trash.c */ +typedef struct tagTRASH_ELEMENT TRASH_ELEMENT; + BOOL TRASH_CanTrashFile(LPCWSTR wszPath); BOOL TRASH_TrashFile(LPCWSTR wszPath); +HRESULT TRASH_UnpackItemID(LPCSHITEMID id, TRASH_ELEMENT *element, WIN32_FIND_DATAW *data); +HRESULT TRASH_EnumItems(LPITEMIDLIST **pidls, int *count); +void TRASH_DisposeElement(TRASH_ELEMENT *element); +
#endif /* ndef __XDG_H__ */