From: Daid Date: Wed, 3 Apr 2013 14:10:40 +0000 (+0200) Subject: Update SD drive list for MacOS, use the system_profiler to get information about... X-Git-Tag: 13.05~129^2 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=63d52d952f13f4d1e9bdf4c9c4ace448beb219a1;p=cura.git Update SD drive list for MacOS, use the system_profiler to get information about the connected USB devices. --- diff --git a/Cura/util/removableStorage.py b/Cura/util/removableStorage.py index 57651450..f1498586 100644 --- a/Cura/util/removableStorage.py +++ b/Cura/util/removableStorage.py @@ -3,6 +3,47 @@ import string import glob import os import stat +import subprocess +try: + from xml.etree import cElementTree as ElementTree +except: + from xml.etree import ElementTree + +def _parseStupidPListXML(e): + if e.tag == 'plist': + return _parseStupidPListXML(list(e)[0]) + if e.tag == 'array': + ret = [] + for c in list(e): + ret.append(_parseStupidPListXML(c)) + return ret + if e.tag == 'dict': + ret = {} + key = None + for c in list(e): + if c.tag == 'key': + key = c.text + elif key is not None: + ret[key] = _parseStupidPListXML(c) + key = None + return ret + if e.tag == 'true': + return True + if e.tag == 'false': + return False + return e.text + +def _findInTree(t, n): + ret = [] + if type(t) is dict: + if '_name' in t and t['_name'] == n: + ret.append(t) + for k, v in t.items(): + ret += _findInTree(v, n) + if type(t) is list: + for v in t: + ret += _findInTree(v, n) + return ret def getPossibleSDcardDrives(): drives = [] @@ -22,13 +63,21 @@ def getPossibleSDcardDrives(): drives.append(('%s (%s:)' % (volumeName, letter), letter + ':/', volumeName)) bitmask >>= 1 elif platform.system() == "Darwin": - for volume in glob.glob('/Volumes/*'): - if stat.S_ISLNK(os.lstat(volume).st_mode): - continue - #'Ejectable: Yes' in os.system('diskutil info \'%s\'' % (volume)) - drives.append((os.path.basename(volume), os.path.basename(volume), volume)) + p = subprocess.Popen(['system_profiler', 'SPUSBDataType', '-xml'], stdout=subprocess.PIPE) + xml = ElementTree.fromstring(p.communicate()[0]) + p.wait() + + xml = _parseStupidPListXML(xml) + for dev in _findInTree(xml, 'Mass Storage Device'): + 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.append((os.path.basename(volume), os.path.basename(volume), volume)) else: for volume in glob.glob('/media/*'): drives.append((os.path.basename(volume), os.path.basename(volume), volume)) return drives +if __name__ == '__main__': + print getPossibleSDcardDrives()