Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 1 | """macfs - Pure Python module designed to be backward compatible with |
| 2 | macfs and MACFS. |
| 3 | """ |
| 4 | import sys |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 5 | import struct |
| 6 | import Carbon.Res |
| 7 | import Carbon.File |
Jack Jansen | 374c435 | 2003-01-21 22:58:39 +0000 | [diff] [blame] | 8 | import warnings |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 9 | |
Jack Jansen | abeb7d5 | 2003-02-27 23:17:59 +0000 | [diff] [blame^] | 10 | warnings.warn("macfs is deprecated, use Carbon.File, Carbon.Folder or EasyDialogs", |
| 11 | DeprecationWarning, stacklevel=2) |
| 12 | |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 13 | # First step: ensure we also emulate the MACFS module, which contained |
| 14 | # all the constants |
| 15 | |
| 16 | sys.modules['MACFS'] = sys.modules[__name__] |
| 17 | |
| 18 | # Import all those constants |
Jack Jansen | 4235e71 | 2002-12-19 23:26:07 +0000 | [diff] [blame] | 19 | from Carbon.Files import * |
| 20 | from Carbon.Folders import * |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 21 | |
| 22 | # For some obscure historical reason these are here too: |
| 23 | READ = 1 |
| 24 | WRITE = 2 |
| 25 | smAllScripts = -3 |
| 26 | |
Jack Jansen | 2d0909b | 2003-01-15 22:36:16 +0000 | [diff] [blame] | 27 | # |
| 28 | # Find the epoch conversion for file dates in a way that works on OS9 and OSX |
| 29 | import time |
| 30 | if time.gmtime(0)[0] == 1970: |
| 31 | _EPOCHCONVERT = -((1970-1904)*365 + 17) * (24*60*60) + 0x100000000L |
| 32 | def _utc2time(utc): |
| 33 | t = utc[1] + _EPOCHCONVERT |
| 34 | return int(t) |
| 35 | def _time2utc(t): |
Jack Jansen | 32417e7 | 2003-01-22 14:04:18 +0000 | [diff] [blame] | 36 | t = int(t) - _EPOCHCONVERT |
Jack Jansen | 2d0909b | 2003-01-15 22:36:16 +0000 | [diff] [blame] | 37 | if t < -0x7fffffff: |
| 38 | t = t + 0x10000000L |
| 39 | return (0, int(t), 0) |
| 40 | else: |
Jack Jansen | cbdffce | 2003-01-29 09:56:56 +0000 | [diff] [blame] | 41 | def _utc2time(utc): |
| 42 | t = utc[1] |
| 43 | if t < 0: |
| 44 | t = t + 0x100000000L |
| 45 | return t |
Jack Jansen | 32417e7 | 2003-01-22 14:04:18 +0000 | [diff] [blame] | 46 | def _time2utc(t): |
| 47 | if t > 0x7fffffff: |
| 48 | t = t - 0x100000000L |
| 49 | return (0, int(t), 0) |
Jack Jansen | 2d0909b | 2003-01-15 22:36:16 +0000 | [diff] [blame] | 50 | |
Jack Jansen | 4235e71 | 2002-12-19 23:26:07 +0000 | [diff] [blame] | 51 | # The old name of the error object: |
| 52 | error = Carbon.File.Error |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 53 | |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 54 | # |
| 55 | # The various objects macfs used to export. We override them here, because some |
| 56 | # of the method names are subtly different. |
| 57 | # |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 58 | class FSSpec(Carbon.File.FSSpec): |
Jack Jansen | 4235e71 | 2002-12-19 23:26:07 +0000 | [diff] [blame] | 59 | def as_fsref(self): |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 60 | return FSRef(self) |
| 61 | |
| 62 | def NewAlias(self, src=None): |
Jack Jansen | 4235e71 | 2002-12-19 23:26:07 +0000 | [diff] [blame] | 63 | return Alias(Carbon.File.NewAlias(src, self)) |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 64 | |
| 65 | def GetCreatorType(self): |
| 66 | finfo = self.FSpGetFInfo() |
Jack Jansen | 4235e71 | 2002-12-19 23:26:07 +0000 | [diff] [blame] | 67 | return finfo.Creator, finfo.Type |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 68 | |
| 69 | def SetCreatorType(self, ctor, tp): |
| 70 | finfo = self.FSpGetFInfo() |
Jack Jansen | 4235e71 | 2002-12-19 23:26:07 +0000 | [diff] [blame] | 71 | finfo.Creator = ctor |
| 72 | finfo.Type = tp |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 73 | self.FSpSetFInfo(finfo) |
| 74 | |
| 75 | def GetFInfo(self): |
| 76 | return self.FSpGetFInfo() |
| 77 | |
| 78 | def SetFInfo(self, info): |
| 79 | return self.FSpSetFInfo(info) |
| 80 | |
| 81 | def GetDates(self): |
Jack Jansen | 2d0909b | 2003-01-15 22:36:16 +0000 | [diff] [blame] | 82 | catInfoFlags = kFSCatInfoCreateDate|kFSCatInfoContentMod|kFSCatInfoBackupDate |
| 83 | catinfo, d1, d2, d3 = FSRef(self).FSGetCatalogInfo(catInfoFlags) |
| 84 | cdate = catinfo.createDate |
| 85 | mdate = catinfo.contentModDate |
| 86 | bdate = catinfo.backupDate |
| 87 | return _utc2time(cdate), _utc2time(mdate), _utc2time(bdate) |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 88 | |
Jack Jansen | 2d0909b | 2003-01-15 22:36:16 +0000 | [diff] [blame] | 89 | def SetDates(self, cdate, mdate, bdate): |
| 90 | catInfoFlags = kFSCatInfoCreateDate|kFSCatInfoContentMod|kFSCatInfoBackupDate |
| 91 | catinfo = Carbon.File.FSCatalogInfo( |
| 92 | createDate = _time2utc(cdate), |
| 93 | contentModDate = _time2utc(mdate), |
| 94 | backupDate = _time2utc(bdate)) |
| 95 | FSRef(self).FSSetCatalogInfo(catInfoFlags, catinfo) |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 96 | |
| 97 | class FSRef(Carbon.File.FSRef): |
Jack Jansen | 4235e71 | 2002-12-19 23:26:07 +0000 | [diff] [blame] | 98 | def as_fsspec(self): |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 99 | return FSSpec(self) |
| 100 | |
| 101 | class Alias(Carbon.File.Alias): |
| 102 | |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 103 | def GetInfo(self, index): |
| 104 | return self.GetAliasInfo(index) |
| 105 | |
| 106 | def Update(self, *args): |
Jack Jansen | 27d19c4 | 2003-01-08 16:32:29 +0000 | [diff] [blame] | 107 | pass # print "Alias.Update not yet implemented" |
Jack Jansen | 4235e71 | 2002-12-19 23:26:07 +0000 | [diff] [blame] | 108 | |
| 109 | def Resolve(self, src=None): |
Jack Jansen | 315e9be | 2002-12-26 20:46:54 +0000 | [diff] [blame] | 110 | fss, changed = self.ResolveAlias(src) |
| 111 | return FSSpec(fss), changed |
Jack Jansen | 4235e71 | 2002-12-19 23:26:07 +0000 | [diff] [blame] | 112 | |
| 113 | from Carbon.File import FInfo |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 114 | |
| 115 | # Backward-compatible type names: |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 116 | FSSpecType = FSSpec |
| 117 | FSRefType = FSRef |
| 118 | AliasType = Alias |
| 119 | FInfoType = FInfo |
| 120 | |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 121 | # Global functions: |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 122 | def ResolveAliasFile(fss, chain=1): |
Jack Jansen | 315e9be | 2002-12-26 20:46:54 +0000 | [diff] [blame] | 123 | fss, isdir, isalias = Carbon.File.ResolveAliasFile(fss, chain) |
| 124 | return FSSpec(fss), isdir, isalias |
Jack Jansen | 58fc91f | 2002-12-17 23:28:24 +0000 | [diff] [blame] | 125 | |
| 126 | def RawFSSpec(data): |
| 127 | return FSSpec(rawdata=data) |
| 128 | |
| 129 | def RawAlias(data): |
| 130 | return Alias(rawdata=data) |
| 131 | |
| 132 | def FindApplication(*args): |
| 133 | raise NotImplementedError, "FindApplication no longer implemented" |
| 134 | |
| 135 | def NewAliasMinimalFromFullPath(path): |
Jack Jansen | 315e9be | 2002-12-26 20:46:54 +0000 | [diff] [blame] | 136 | return Alias(Carbon.File.NewAliasMinimalFromFullPath(path, '', '')) |
Jack Jansen | 4235e71 | 2002-12-19 23:26:07 +0000 | [diff] [blame] | 137 | |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 138 | # Another global function: |
| 139 | from Carbon.Folder import FindFolder |
| 140 | |
| 141 | # |
| 142 | # Finally the old Standard File routine emulators. |
| 143 | # |
| 144 | |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 145 | _curfolder = None |
| 146 | |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 147 | def StandardGetFile(*typelist): |
| 148 | """Ask for an input file, optionally specifying 4-char file types that are |
| 149 | allowable""" |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 150 | return PromptGetFile('', *typelist) |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 151 | |
| 152 | def PromptGetFile(prompt, *typelist): |
| 153 | """Ask for an input file giving the user a prompt message. Optionally you can |
| 154 | specifying 4-char file types that are allowable""" |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 155 | import EasyDialogs |
Jack Jansen | 374c435 | 2003-01-21 22:58:39 +0000 | [diff] [blame] | 156 | warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen", |
| 157 | DeprecationWarning, stacklevel=2) |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 158 | if not typelist: |
| 159 | typelist = None |
| 160 | fss = EasyDialogs.AskFileForOpen(message=prompt, wanted=FSSpec, |
| 161 | typeList=typelist, defaultLocation=_handleSetFolder()) |
| 162 | return fss, not fss is None |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 163 | |
| 164 | def StandardPutFile(prompt, default=None): |
| 165 | """Ask the user for an output file, with a prompt. Optionally you cn supply a |
| 166 | default output filename""" |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 167 | import EasyDialogs |
Jack Jansen | 374c435 | 2003-01-21 22:58:39 +0000 | [diff] [blame] | 168 | warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen", |
| 169 | DeprecationWarning, stacklevel=2) |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 170 | fss = EasyDialogs.AskFileForSave(wanted=FSSpec, message=prompt, |
| 171 | savedFileName=default, defaultLocation=_handleSetFolder()) |
| 172 | return fss, not fss is None |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 173 | |
| 174 | def SetFolder(folder): |
| 175 | global _curfolder |
Jack Jansen | 374c435 | 2003-01-21 22:58:39 +0000 | [diff] [blame] | 176 | warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen", |
| 177 | DeprecationWarning, stacklevel=2) |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 178 | if _curfolder: |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 179 | rv = FSSpec(_curfolder) |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 180 | else: |
| 181 | rv = None |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 182 | _curfolder = folder |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 183 | return rv |
| 184 | |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 185 | def _handleSetFolder(): |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 186 | global _curfolder |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 187 | rv = _curfolder |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 188 | _curfolder = None |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 189 | return rv |
Jack Jansen | 6dd561b | 2002-12-26 21:09:39 +0000 | [diff] [blame] | 190 | |
| 191 | def GetDirectory(prompt=None): |
| 192 | """Ask the user to select a folder. Optionally you can give a prompt.""" |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 193 | import EasyDialogs |
Jack Jansen | 374c435 | 2003-01-21 22:58:39 +0000 | [diff] [blame] | 194 | warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen", |
| 195 | DeprecationWarning, stacklevel=2) |
Jack Jansen | 01524d0 | 2003-01-21 15:31:16 +0000 | [diff] [blame] | 196 | fss = EasyDialogs.AskFolder(message=prompt, wanted=FSSpec, |
| 197 | defaultLocation=_handleSetFolder()) |
| 198 | return fss, not fss is None |