July 19, 2018 3:34 PM, "Ken Thomases" ken@codeweavers.com wrote:
On Jul 19, 2018, at 3:16 PM, Chip Davis cdavis@codeweavers.com wrote:
BOOL TRASH_CanTrashFile(LPCWSTR wszPath) {
- char *unix_path;
- OSStatus status;
- FSRef ref;
- FSCatalogInfo catalogInfo;
- char *unix_path, *trash_path;
- const char *base_name;
- BOOL can_trash;
- struct stat st;
TRACE("(%s)\n", debugstr_w(wszPath));
if (!(unix_path = wine_get_unix_file_name(wszPath))) return FALSE;
- status = FSPathMakeRef((UInt8*)unix_path, &ref, NULL);
- if (!(trash_path = TRASH_GetTrashPath(unix_path, &base_name)))
- {
- heap_free(unix_path);
- return FALSE;
- }
- can_trash = stat(trash_path, &st) == 0;
heap_free(unix_path);
- if (status == noErr)
- status = FSGetCatalogInfo(&ref, kFSCatInfoVolume, &catalogInfo, NULL,
- NULL, NULL);
- if (status == noErr)
- status = FSFindFolder(catalogInfo.volume, kTrashFolderType,
- kCreateFolder, &ref);
The old code would attempt to create the Trash folder if it doesn't exist, but your new code doesn't.
Yeah, I realized that after I sent this. Will fix.
- return (status == noErr);
- heap_free(trash_path);
- return can_trash;
}
BOOL TRASH_TrashFile(LPCWSTR wszPath) {
- char *unix_path;
- OSStatus status;
- char *unix_path, *trash_path;
- const char *base_name;
- int res;
TRACE("(%s)\n", debugstr_w(wszPath)); if (!(unix_path = wine_get_unix_file_name(wszPath))) return FALSE;
- if (!(trash_path = TRASH_GetTrashPath(unix_path, &base_name)))
- {
- heap_free(unix_path);
- return FALSE;
- }
- status = FSPathMoveObjectToTrashSync(unix_path, NULL, kFSFileOperationSkipPreflight);
- lstrcatA(trash_path, "/");
- lstrcatA(trash_path, base_name);
trash_path is just big enough for the path to the Trash directory. You can't concatenate to it without reallocating it larger.
Actually, that's why I added the size of the base_name to the total size--specifically so I could do that.
- res = rename(unix_path, trash_path);
heap_free(unix_path);
- return (status == noErr);
- heap_free(trash_path);
- return (res != -1);
}
-Ken
Chip