summaryrefslogtreecommitdiffstats
path: root/lib/Python/Lib/send2trash/plat_osx.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Python/Lib/send2trash/plat_osx.py')
-rw-r--r--lib/Python/Lib/send2trash/plat_osx.py48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/Python/Lib/send2trash/plat_osx.py b/lib/Python/Lib/send2trash/plat_osx.py
new file mode 100644
index 000000000..fa2c2c85c
--- /dev/null
+++ b/lib/Python/Lib/send2trash/plat_osx.py
@@ -0,0 +1,48 @@
+# Copyright 2013 Hardcoded Software (http://www.hardcoded.net)
+
+# This software is licensed under the "BSD" License as described in the "LICENSE" file,
+# which should be included with this package. The terms are also available at
+# http://www.hardcoded.net/licenses/bsd_license
+
+from __future__ import unicode_literals
+
+from ctypes import cdll, byref, Structure, c_char, c_char_p
+from ctypes.util import find_library
+
+from .compat import binary_type
+
+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(path):
+ if not isinstance(path, binary_type):
+ path = path.encode('utf-8')
+ 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)