"""macfs - Pure Python module designed to be backward compatible with macfs and MACFS. """ import sys import struct import Carbon.Res import Carbon.File import warnings warnings.warn("macfs is deprecated, use Carbon.File, Carbon.Folder or EasyDialogs", DeprecationWarning, stacklevel=2) # 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 # # Find the epoch conversion for file dates in a way that works on OS9 and OSX import time if time.gmtime(0)[0] == 1970: _EPOCHCONVERT = -((1970-1904)*365 + 17) * (24*60*60) + 0x100000000L def _utc2time(utc): t = utc[1] + _EPOCHCONVERT return int(t) def _time2utc(t): t = int(t) - _EPOCHCONVERT if t < -0x7fffffff: t = t + 0x10000000L return (0, int(t), 0) else: def _utc2time(utc): t = utc[1] if t < 0: t = t + 0x100000000L return t def _time2utc(t): if t > 0x7fffffff: t = t - 0x100000000L return (0, int(t), 0) # 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): catInfoFlags = kFSCatInfoCreateDate|kFSCatInfoContentMod|kFSCatInfoBackupDate catinfo, d1, d2, d3 = FSRef(self).FSGetCatalogInfo(catInfoFlags) cdate = catinfo.createDate mdate = catinfo.contentModDate bdate = catinfo.backupDate return _utc2time(cdate), _utc2time(mdate), _utc2time(bdate) def SetDates(self, cdate, mdate, bdate): catInfoFlags = kFSCatInfoCreateDate|kFSCatInfoContentMod|kFSCatInfoBackupDate catinfo = Carbon.File.FSCatalogInfo( createDate = _time2utc(cdate), contentModDate = _time2utc(mdate), backupDate = _time2utc(bdate)) FSRef(self).FSSetCatalogInfo(catInfoFlags, catinfo) 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): pass # 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. # _curfolder = None def StandardGetFile(*typelist): """Ask for an input file, optionally specifying 4-char file types that are allowable""" return PromptGetFile('', *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""" import EasyDialogs warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen", DeprecationWarning, stacklevel=2) if not typelist: typelist = None fss = EasyDialogs.AskFileForOpen(message=prompt, wanted=FSSpec, typeList=typelist, defaultLocation=_handleSetFolder()) return fss, not fss is None def StandardPutFile(prompt, default=None): """Ask the user for an output file, with a prompt. Optionally you cn supply a default output filename""" import EasyDialogs warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen", DeprecationWarning, stacklevel=2) fss = EasyDialogs.AskFileForSave(wanted=FSSpec, message=prompt, savedFileName=default, defaultLocation=_handleSetFolder()) return fss, not fss is None def SetFolder(folder): global _curfolder warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen", DeprecationWarning, stacklevel=2) if _curfolder: rv = FSSpec(_curfolder) else: rv = None _curfolder = folder return rv def _handleSetFolder(): global _curfolder rv = _curfolder _curfolder = None return rv def GetDirectory(prompt=None): """Ask the user to select a folder. Optionally you can give a prompt.""" import EasyDialogs warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen", DeprecationWarning, stacklevel=2) fss = EasyDialogs.AskFolder(message=prompt, wanted=FSSpec, defaultLocation=_handleSetFolder()) return fss, not fss is None