| |
|
|
| |
| |
| |
|
|
| from __future__ import unicode_literals |
|
|
| from ctypes import cdll, byref, Structure, c_char, c_char_p |
| from ctypes.util import find_library |
|
|
| from send2trash.compat import binary_type |
| from send2trash.util import preprocess_paths |
|
|
| Foundation = cdll.LoadLibrary(find_library("Foundation")) |
| CoreServices = cdll.LoadLibrary(find_library("CoreServices")) |
|
|
| GetMacOSStatusCommentString = Foundation.GetMacOSStatusCommentString |
| GetMacOSStatusCommentString.restype = c_char_p |
| FSPathMakeRefWithOptions = CoreServices.FSPathMakeRefWithOptions |
| FSMoveObjectToTrashSync = CoreServices.FSMoveObjectToTrashSync |
|
|
| kFSPathMakeRefDefaultOptions = 0 |
| kFSPathMakeRefDoNotFollowLeafSymlink = 0x01 |
|
|
| kFSFileOperationDefaultOptions = 0 |
| kFSFileOperationOverwrite = 0x01 |
| kFSFileOperationSkipSourcePermissionErrors = 0x02 |
| kFSFileOperationDoNotMoveAcrossVolumes = 0x04 |
| kFSFileOperationSkipPreflight = 0x08 |
|
|
|
|
| class FSRef(Structure): |
| _fields_ = [("hidden", c_char * 80)] |
|
|
|
|
| def check_op_result(op_result): |
| if op_result: |
| msg = GetMacOSStatusCommentString(op_result).decode("utf-8") |
| raise OSError(msg) |
|
|
|
|
| def send2trash(paths): |
| paths = preprocess_paths(paths) |
| paths = [path.encode("utf-8") if not isinstance(path, binary_type) else path for path in paths] |
| for path in paths: |
| fp = FSRef() |
| opts = kFSPathMakeRefDoNotFollowLeafSymlink |
| op_result = FSPathMakeRefWithOptions(path, opts, byref(fp), None) |
| check_op_result(op_result) |
| opts = kFSFileOperationDefaultOptions |
| op_result = FSMoveObjectToTrashSync(byref(fp), None, opts) |
| check_op_result(op_result) |
|
|