diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 2003-01-28 23:53:40 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 2003-01-28 23:53:40 (GMT) |
commit | 2b88dec606511edb90d3a1efdaec03d19d75ff02 (patch) | |
tree | 9712f53c1906ca8f662eaa3dc1cea390f3693126 | |
parent | 60ffc2bafc401f7bea0c9619ddeb968ba95cb1eb (diff) | |
download | cpython-2b88dec606511edb90d3a1efdaec03d19d75ff02.zip cpython-2b88dec606511edb90d3a1efdaec03d19d75ff02.tar.gz cpython-2b88dec606511edb90d3a1efdaec03d19d75ff02.tar.bz2 |
Converted to not use macfs whenever possible.
-rw-r--r-- | Lib/plat-mac/aepack.py | 36 | ||||
-rw-r--r-- | Lib/plat-mac/macostools.py | 225 |
2 files changed, 132 insertions, 129 deletions
diff --git a/Lib/plat-mac/aepack.py b/Lib/plat-mac/aepack.py index dfb2953..6797473 100644 --- a/Lib/plat-mac/aepack.py +++ b/Lib/plat-mac/aepack.py @@ -20,7 +20,7 @@ from types import * from Carbon import AE from Carbon.AppleEvents import * import MacOS -import macfs +import Carbon.File import StringIO import aetypes from aetypes import mkenum, mktype @@ -59,8 +59,9 @@ unpacker_coercions = { # Some python types we need in the packer: # AEDescType = AE.AEDescType -FSSType = macfs.FSSpecType -AliasType = macfs.AliasType +FSSType = Carbon.File.FSSpecType +FSRefType = Carbon.File.FSRefType +AliasType = Carbon.File.AliasType def packkey(ae, key, value): if hasattr(key, 'which'): @@ -83,36 +84,35 @@ def pack(x, forcetype = None): if x == None: return AE.AECreateDesc('null', '') - t = type(x) - if t == AEDescType: + if isinstance(x, AEDescType): return x - if t == FSSType: + if isinstance(x, FSSType): return AE.AECreateDesc('fss ', x.data) - if t == AliasType: + if isinstance(x, AliasType): return AE.AECreateDesc('alis', x.data) - if t == IntType: + if isinstance(x, IntType): return AE.AECreateDesc('long', struct.pack('l', x)) - if t == FloatType: + if isinstance(x, FloatType): return AE.AECreateDesc('doub', struct.pack('d', x)) - if t == StringType: + if isinstance(x, StringType): return AE.AECreateDesc('TEXT', x) - if t == UnicodeType: + if isinstance(x, UnicodeType): data = t.encode('utf16') if data[:2] == '\xfe\xff': data = data[2:] return AE.AECreateDesc('utxt', data) - if t == ListType: + if isinstance(x, ListType): list = AE.AECreateList('', 0) for item in x: list.AEPutDesc(0, pack(item)) return list - if t == DictionaryType: + if isinstance(x, DictionaryType): record = AE.AECreateList('', 1) for key, value in x.items(): packkey(record, key, value) #record.AEPutParamDesc(key, pack(value)) return record - if t == InstanceType and hasattr(x, '__aepack__'): + if hasattr(x, '__aepack__'): return x.__aepack__() if hasattr(x, 'which'): return AE.AECreateDesc('TEXT', x.which) @@ -144,7 +144,7 @@ def unpack(desc, formodulename=""): record = desc.AECoerceDesc('reco') return mkaetext(unpack(record, formodulename)) if t == typeAlias: - return macfs.RawAlias(desc.data) + return Carbon.File.Alias(rawdata=desc.data) # typeAppleEvent returned as unknown if t == typeBoolean: return struct.unpack('b', desc.data)[0] @@ -165,7 +165,7 @@ def unpack(desc, formodulename=""): data = desc.data return struct.unpack('d', data)[0] if t == typeFSS: - return macfs.RawFSSpec(desc.data) + return Carbon.File.FSSpec(rawdata=desc.data) if t == typeInsertionLoc: record = desc.AECoerceDesc('reco') return mkinsertionloc(unpack(record, formodulename)) @@ -353,8 +353,8 @@ def _test(): None, ['a', 'list', 'of', 'strings'], {'key1': 'value1', 'key2':'value2'}, - macfs.FSSpec(':'), - macfs.FSSpec(':').NewAliasMinimal(), + Carbon.File.FSSpec(os.curdir), + Carbon.File.FSSpec(os.curdir).NewAliasMinimal(), aetypes.Enum('enum'), aetypes.Type('type'), aetypes.Keyword('kwrd'), diff --git a/Lib/plat-mac/macostools.py b/Lib/plat-mac/macostools.py index 8822ab8..1a59354 100644 --- a/Lib/plat-mac/macostools.py +++ b/Lib/plat-mac/macostools.py @@ -4,134 +4,137 @@ mkalias(src, dst) - Create a finder alias 'dst' pointing to 'src' copy(src, dst) - Full copy of 'src' to 'dst' """ -import macfs from Carbon import Res +from Carbon import File, Files import os -from MACFS import * +import sys import MacOS import time try: - openrf = MacOS.openrf + openrf = MacOS.openrf except AttributeError: - # Backward compatability - openrf = open + # Backward compatability + openrf = open Error = 'macostools.Error' -BUFSIZ=0x80000 # Copy in 0.5Mb chunks +BUFSIZ=0x80000 # Copy in 0.5Mb chunks + +COPY_FLAGS = (Files.kIsStationary|Files.kNameLocked|Files.kHasBundle| + Files.kIsInvisible|Files.kIsAlias) # # Not guaranteed to be correct or stay correct (Apple doesn't tell you # how to do this), but it seems to work. # def mkalias(src, dst, relative=None): - """Create a finder alias""" - srcfss = macfs.FSSpec(src) - # The next line will fail under unix-Python if the destination - # doesn't exist yet. We should change this code to be fsref-based. - dstfss = macfs.FSSpec(dst) - if relative: - relativefss = macfs.FSSpec(relative) - # ik mag er geen None in stoppen :-( - alias = srcfss.NewAlias(relativefss) - else: - alias = srcfss.NewAlias() - - if os.path.isdir(src): - cr, tp = 'MACS', 'fdrp' - else: - cr, tp = srcfss.GetCreatorType() - - Res.FSpCreateResFile(dstfss, cr, tp, -1) - h = Res.FSpOpenResFile(dstfss, 3) - resource = Res.Resource(alias.data) - resource.AddResource('alis', 0, '') - Res.CloseResFile(h) - - dstfinfo = dstfss.GetFInfo() - dstfinfo.Flags = dstfinfo.Flags|0x8000 # Alias flag - dstfss.SetFInfo(dstfinfo) - + """Create a finder alias""" + srcfsr = File.FSRef(src) + # The next line will fail under unix-Python if the destination + # doesn't exist yet. We should change this code to be fsref-based. + dstdir, dstname = os.path.split(dst) + if not dstdir: dstdir = os.curdir + dstdirfsr = File.FSRef(dstdir) + if relative: + relativefsr = File.FSRef(relative) + # ik mag er geen None in stoppen :-( + alias = File.FSNewAlias(relativefsr, srcfsr) + else: + alias = srcfsr.FSNewAliasMinimal() + + dstfsr, dstfss = Res.FSCreateResourceFile(dstdirfsr, unicode(dstname), + File.FSGetResourceForkName()) + h = Res.FSOpenResourceFile(dstfsr, File.FSGetResourceForkName(), 3) + resource = Res.Resource(alias.data) + resource.AddResource('alis', 0, '') + Res.CloseResFile(h) + + dstfinfo = dstfss.FSpGetFInfo() + dstfinfo.Flags = dstfinfo.Flags|0x8000 # Alias flag + dstfss.FSpSetFInfo(dstfinfo) + def mkdirs(dst): - """Make directories leading to 'dst' if they don't exist yet""" - if dst == '' or os.path.exists(dst): - return - head, tail = os.path.split(dst) - if os.sep == ':' and not ':' in head: - head = head + ':' - mkdirs(head) - os.mkdir(dst, 0777) - + """Make directories leading to 'dst' if they don't exist yet""" + if dst == '' or os.path.exists(dst): + return + head, tail = os.path.split(dst) + if os.sep == ':' and not ':' in head: + head = head + ':' + mkdirs(head) + os.mkdir(dst, 0777) + def touched(dst): - """Tell the finder a file has changed""" - file_fss = macfs.FSSpec(dst) - vRefNum, dirID, name = file_fss.as_tuple() - dir_fss = macfs.FSSpec((vRefNum, dirID, '')) - crdate, moddate, bkdate = dir_fss.GetDates() - now = time.time() - if now == moddate: - now = now + 1 - try: - dir_fss.SetDates(crdate, now, bkdate) - except macfs.error: - pass - + """Tell the finder a file has changed. No-op on MacOSX.""" + if sys.platform != 'mac': return + import macfs + file_fss = macfs.FSSpec(dst) + vRefNum, dirID, name = file_fss.as_tuple() + dir_fss = macfs.FSSpec((vRefNum, dirID, '')) + crdate, moddate, bkdate = dir_fss.GetDates() + now = time.time() + if now == moddate: + now = now + 1 + try: + dir_fss.SetDates(crdate, now, bkdate) + except macfs.error: + pass + def touched_ae(dst): - """Tell the finder a file has changed""" - import Finder - f = Finder.Finder() - file_fss = macfs.FSSpec(dst) - vRefNum, dirID, name = file_fss.as_tuple() - dir_fss = macfs.FSSpec((vRefNum, dirID, '')) - f.update(dir_fss) - + """Tell the finder a file has changed""" + pardir = os.path.split(dst)[0] + if not pardir: + pardir = os.curdir + import Finder + f = Finder.Finder() + f.update(File.FSRef(pardir)) + def copy(src, dst, createpath=0, copydates=1, forcetype=None): - """Copy a file, including finder info, resource fork, etc""" - if hasattr(src, 'as_pathname'): - src = src.as_pathname() - if hasattr(dst, 'as_pathname'): - dst = dst.as_pathname() - if createpath: - mkdirs(os.path.split(dst)[0]) - - ifp = open(src, 'rb') - ofp = open(dst, 'wb') - d = ifp.read(BUFSIZ) - while d: - ofp.write(d) - d = ifp.read(BUFSIZ) - ifp.close() - ofp.close() - - ifp = openrf(src, '*rb') - ofp = openrf(dst, '*wb') - d = ifp.read(BUFSIZ) - while d: - ofp.write(d) - d = ifp.read(BUFSIZ) - ifp.close() - ofp.close() - - srcfss = macfs.FSSpec(src) - dstfss = macfs.FSSpec(dst) - sf = srcfss.GetFInfo() - df = dstfss.GetFInfo() - df.Creator, df.Type = sf.Creator, sf.Type - if forcetype != None: - df.Type = forcetype - df.Flags = (sf.Flags & (kIsStationary|kNameLocked|kHasBundle|kIsInvisible|kIsAlias)) - dstfss.SetFInfo(df) - if copydates: - crdate, mddate, bkdate = srcfss.GetDates() - dstfss.SetDates(crdate, mddate, bkdate) - touched(dstfss) - + """Copy a file, including finder info, resource fork, etc""" + src = File.pathname(src) + dst = File.pathname(dst) + if createpath: + mkdirs(os.path.split(dst)[0]) + + ifp = open(src, 'rb') + ofp = open(dst, 'wb') + d = ifp.read(BUFSIZ) + while d: + ofp.write(d) + d = ifp.read(BUFSIZ) + ifp.close() + ofp.close() + + ifp = openrf(src, '*rb') + ofp = openrf(dst, '*wb') + d = ifp.read(BUFSIZ) + while d: + ofp.write(d) + d = ifp.read(BUFSIZ) + ifp.close() + ofp.close() + + srcfss = File.FSSpec(src) + dstfss = File.FSSpec(dst) + sf = srcfss.FSpGetFInfo() + df = dstfss.FSpGetFInfo() + df.Creator, df.Type = sf.Creator, sf.Type + if forcetype != None: + df.Type = forcetype + df.Flags = (sf.Flags & COPY_FLAGS) + dstfss.FSpSetFInfo(df) + if copydates: + srcfsr = File.FSRef(src) + dstfsr = File.FSRef(dst) + catinfo, _, _, _ = srcfsr.FSGetCatalogInfo(Files.kFSCatInfoAllDates) + dstfsr.FSSetCatalogInfo(Files.kFSCatInfoAllDates, catinfo) + touched(dstfss) + def copytree(src, dst, copydates=1): - """Copy a complete file tree to a new destination""" - if os.path.isdir(src): - mkdirs(dst) - files = os.listdir(src) - for f in files: - copytree(os.path.join(src, f), os.path.join(dst, f), copydates) - else: - copy(src, dst, 1, copydates) + """Copy a complete file tree to a new destination""" + if os.path.isdir(src): + mkdirs(dst) + files = os.listdir(src) + for f in files: + copytree(os.path.join(src, f), os.path.join(dst, f), copydates) + else: + copy(src, dst, 1, copydates) |