[PATCH] shell32: Don't use Carbon on Mac OS to find the Trash.

Chip Davis cdavis at codeweavers.com
Thu Jul 19 15:37:21 CDT 2018


July 19, 2018 3:34 PM, "Ken Thomases" <ken at codeweavers.com> wrote:

> On Jul 19, 2018, at 3:16 PM, Chip Davis <cdavis at 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



More information about the wine-devel mailing list