summaryrefslogtreecommitdiffstats
path: root/Lib/plat-mac/macfs.py
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2002-12-30 22:04:23 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2002-12-30 22:04:23 (GMT)
commit60087fb45092d9c199cea162e58d9193c7c1558c (patch)
tree05f3343e7707c4a4179e409506b39601279f04c1 /Lib/plat-mac/macfs.py
parentc262a1f51ce89dbea4aeb072cf631686c47ed97f (diff)
downloadcpython-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.py231
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
+