Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/Cura.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArjen Hiemstra <ahiemstra@heimr.nl>2016-12-08 16:23:33 +0300
committerArjen Hiemstra <ahiemstra@heimr.nl>2016-12-08 16:23:33 +0300
commitae389742ff430d5861c0989e5e1122a7766da068 (patch)
treea3b9c0fff92b112c7f17b9523c33e68f11676913 /plugins/RemovableDriveOutputDevice
parentd3f58a049ba5675f2e7ce1f90614febf07b67987 (diff)
Update OSX removable drive code to handle 10.12 plist format
Fixes CURA-2618
Diffstat (limited to 'plugins/RemovableDriveOutputDevice')
-rw-r--r--plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py63
1 files changed, 41 insertions, 22 deletions
diff --git a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py
index c96bf8bacf..6d8b5021ae 100644
--- a/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py
+++ b/plugins/RemovableDriveOutputDevice/OSXRemovableDrivePlugin.py
@@ -17,41 +17,60 @@ class OSXRemovableDrivePlugin(RemovableDrivePlugin.RemovableDrivePlugin):
drives = {}
p = subprocess.Popen(["system_profiler", "SPUSBDataType", "-xml"], stdout = subprocess.PIPE)
plist = plistlib.loads(p.communicate()[0])
- p.wait()
- for entry in plist:
- if "_items" in entry:
- for item in entry["_items"]:
- for dev in item["_items"]:
- if "removable_media" in dev and dev["removable_media"] == "yes" and "volumes" in dev and len(dev["volumes"]) > 0:
- for vol in dev["volumes"]:
- if "mount_point" in vol:
- volume = vol["mount_point"]
- drives[volume] = os.path.basename(volume)
+ result = self._recursiveSearch(plist, "removable_media")
p = subprocess.Popen(["system_profiler", "SPCardReaderDataType", "-xml"], stdout=subprocess.PIPE)
plist = plistlib.loads(p.communicate()[0])
- p.wait()
- for entry in plist:
- if "_items" in entry:
- for item in entry["_items"]:
- for dev in item["_items"]:
- if "removable_media" in dev and dev["removable_media"] == "yes" and "volumes" in dev and len(dev["volumes"]) > 0:
- for vol in dev["volumes"]:
- if "mount_point" in vol:
- volume = vol["mount_point"]
- drives[volume] = os.path.basename(volume)
+ result.extend(self._recursiveSearch(plist, "removable_media"))
+
+ for drive in result:
+ # Ignore everything not explicitly marked as removable
+ if drive["removable_media"] != "yes":
+ continue
+
+ # Ignore any removable device that does not have an actual volume
+ if "volumes" not in drive or not drive["volumes"]:
+ continue
+
+ for volume in drive["volumes"]:
+ if not "mount_point" in volume:
+ continue
+
+ mount_point = volume["mount_point"]
+
+ if "_name" in volume:
+ drive_name = volume["_name"]
+ else:
+ drive_name = os.path.basename(mount_point)
+
+ drives[mount_point] = drive_name
return drives
def performEjectDevice(self, device):
p = subprocess.Popen(["diskutil", "eject", device.getId()], stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
output = p.communicate()
- Logger.log("d", "umount returned: %s.", repr(output))
return_code = p.wait()
if return_code != 0:
return False
else:
- return True \ No newline at end of file
+ return True
+
+ # Recursively search for key in a plist parsed by plistlib
+ def _recursiveSearch(self, plist, key):
+ result = []
+ for entry in plist:
+ if key in entry:
+ result.append(entry)
+ continue
+
+ if "_items" in entry:
+ result.extend(self._recursiveSearch(entry["_items"], key))
+
+ if "Media" in entry:
+ result.extend(self._recursiveSearch(entry["Media"], key))
+
+ return result