diff options
author | Jack Jansen <jack.jansen@cwi.nl> | 2002-12-30 22:04:23 (GMT) |
---|---|---|
committer | Jack Jansen <jack.jansen@cwi.nl> | 2002-12-30 22:04:23 (GMT) |
commit | 60087fb45092d9c199cea162e58d9193c7c1558c (patch) | |
tree | 05f3343e7707c4a4179e409506b39601279f04c1 /Lib/plat-mac/macfs.py | |
parent | c262a1f51ce89dbea4aeb072cf631686c47ed97f (diff) | |
download | cpython-60087fb45092d9c199cea162e58d9193c7c1558c.zip cpython-60087fb45092d9c199cea162e58d9193c7c1558c.tar.gz cpython-60087fb45092d9c199cea162e58d9193c7c1558c.tar.bz2 |
Moved most of Mac/Lib hierarchy to Lib/plat-mac: it can be used both
in MacPython-OS9 and MacPython-OSX (or the equivalent unix Python on
Mac OS X). The only items remaining in Mac/Lib are modules that are
meaningful only for MacPython-OS9 (CFM stuff, MacPython preferences
in resources, etc).
Diffstat (limited to 'Lib/plat-mac/macfs.py')
-rw-r--r-- | Lib/plat-mac/macfs.py | 231 |
1 files changed, 231 insertions, 0 deletions
diff --git a/Lib/plat-mac/macfs.py b/Lib/plat-mac/macfs.py new file mode 100644 index 0000000..3cf56d0 --- /dev/null +++ b/Lib/plat-mac/macfs.py @@ -0,0 +1,231 @@ +"""macfs - Pure Python module designed to be backward compatible with +macfs and MACFS. +""" +import sys +import struct +import Carbon.Res +import Carbon.File +import Nav + +# First step: ensure we also emulate the MACFS module, which contained +# all the constants + +sys.modules['MACFS'] = sys.modules[__name__] + +# Import all those constants +from Carbon.Files import * +from Carbon.Folders import * + +# For some obscure historical reason these are here too: +READ = 1 +WRITE = 2 +smAllScripts = -3 + +# The old name of the error object: +error = Carbon.File.Error + +# +# The various objects macfs used to export. We override them here, because some +# of the method names are subtly different. +# +class FSSpec(Carbon.File.FSSpec): + def as_fsref(self): + return FSRef(self) + + def NewAlias(self, src=None): + return Alias(Carbon.File.NewAlias(src, self)) + + def GetCreatorType(self): + finfo = self.FSpGetFInfo() + return finfo.Creator, finfo.Type + + def SetCreatorType(self, ctor, tp): + finfo = self.FSpGetFInfo() + finfo.Creator = ctor + finfo.Type = tp + self.FSpSetFInfo(finfo) + + def GetFInfo(self): + return self.FSpGetFInfo() + + def SetFInfo(self, info): + return self.FSpSetFInfo(info) + + def GetDates(self): + import os + statb = os.stat(self.as_pathname()) + return statb.st_ctime, statb.st_mtime, 0 + + def SetDates(self, *dates): + print "FSSpec.SetDates no longer implemented" + +class FSRef(Carbon.File.FSRef): + def as_fsspec(self): + return FSSpec(self) + +class Alias(Carbon.File.Alias): + + def GetInfo(self, index): + return self.GetAliasInfo(index) + + def Update(self, *args): + print "Alias.Update not yet implemented" + + def Resolve(self, src=None): + fss, changed = self.ResolveAlias(src) + return FSSpec(fss), changed + +from Carbon.File import FInfo + +# Backward-compatible type names: +FSSpecType = FSSpec +FSRefType = FSRef +AliasType = Alias +FInfoType = FInfo + +# Global functions: +def ResolveAliasFile(fss, chain=1): + fss, isdir, isalias = Carbon.File.ResolveAliasFile(fss, chain) + return FSSpec(fss), isdir, isalias + +def RawFSSpec(data): + return FSSpec(rawdata=data) + +def RawAlias(data): + return Alias(rawdata=data) + +def FindApplication(*args): + raise NotImplementedError, "FindApplication no longer implemented" + +def NewAliasMinimalFromFullPath(path): + return Alias(Carbon.File.NewAliasMinimalFromFullPath(path, '', '')) + +# Another global function: +from Carbon.Folder import FindFolder + +# +# Finally the old Standard File routine emulators. +# + +_movablemodal = 0 +_curfolder = None + +def _mktypelist(typelist): + # Workaround for OSX typeless files: + if 'TEXT' in typelist and not '\0\0\0\0' in typelist: + typelist = typelist + ('\0\0\0\0',) + if not typelist: + return None + data = 'Pyth' + struct.pack("hh", 0, len(typelist)) + for type in typelist: + data = data+type + return Carbon.Res.Handle(data) + +def StandardGetFile(*typelist): + """Ask for an input file, optionally specifying 4-char file types that are + allowable""" + return apply(PromptGetFile, (None,)+typelist) + +def PromptGetFile(prompt, *typelist): + """Ask for an input file giving the user a prompt message. Optionally you can + specifying 4-char file types that are allowable""" + args = {} + flags = 0x56 + typehandle = _mktypelist(typelist) + if typehandle: + args['typeList'] = typehandle + else: + flags = flags | 0x01 + if prompt: + args['message'] = prompt + args['preferenceKey'] = 'PyMC' + if _movablemodal: + args['eventProc'] = None + args['dialogOptionFlags'] = flags + _handleSetFolder(args) + try: + rr = Nav.NavChooseFile(args) + good = 1 + except Nav.error, arg: + if arg[0] != -128: # userCancelledErr + raise Nav.error, arg + good = 0 + fss = None + else: + if rr.selection: + fss = FSSpec(rr.selection[0]) + else: + fss = None + good = 0 +## if typehandle: +## typehandle.DisposeHandle() + return fss, good + +def StandardPutFile(prompt, default=None): + """Ask the user for an output file, with a prompt. Optionally you cn supply a + default output filename""" + args = {} + flags = 0x07 + if prompt: + args['message'] = prompt + args['preferenceKey'] = 'PyMC' + if _movablemodal: + args['eventProc'] = None + if default: + args['savedFileName'] = default + args['dialogOptionFlags'] = flags + _handleSetFolder(args) + try: + rr = Nav.NavPutFile(args) + good = 1 + except Nav.error, arg: + if arg[0] != -128: # userCancelledErr + raise Nav.error, arg + good = 0 + fss = None + else: + fss = FSSpec(rr.selection[0]) + return fss, good + +def SetFolder(folder): + global _curfolder + if _curfolder: + rv = _curfolder + else: + rv = None + _curfolder = FSSpec(folder) + return rv + +def _handleSetFolder(args): + global _curfolder + if not _curfolder: + return + import aepack + fss = _curfolder + aedesc = aepack.pack(fss) + args['defaultLocation'] = aedesc + _curfolder = None + +def GetDirectory(prompt=None): + """Ask the user to select a folder. Optionally you can give a prompt.""" + args = {} + flags = 0x17 + if prompt: + args['message'] = prompt + args['preferenceKey'] = 'PyMC' + if _movablemodal: + args['eventProc'] = None + args['dialogOptionFlags'] = flags + _handleSetFolder(args) + try: + rr = Nav.NavChooseFolder(args) + good = 1 + except Nav.error, arg: + if arg[0] != -128: # userCancelledErr + raise Nav.error, arg + good = 0 + fss = None + else: + fss = FSSpec(rr.selection[0]) + return fss, good + |