| """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 |