blob: 73815aeb3fa4fd8b49d5e8775d3c809ab6003008 [file] [log] [blame]
Jack Jansen58fc91f2002-12-17 23:28:24 +00001"""macfs - Pure Python module designed to be backward compatible with
2macfs and MACFS.
3"""
4import sys
Jack Jansen6dd561b2002-12-26 21:09:39 +00005import struct
6import Carbon.Res
7import Carbon.File
Jack Jansen374c4352003-01-21 22:58:39 +00008import warnings
Jack Jansen58fc91f2002-12-17 23:28:24 +00009
Jack Jansenabeb7d52003-02-27 23:17:59 +000010warnings.warn("macfs is deprecated, use Carbon.File, Carbon.Folder or EasyDialogs",
11 DeprecationWarning, stacklevel=2)
Tim Peters182b5ac2004-07-18 06:16:08 +000012
Jack Jansen58fc91f2002-12-17 23:28:24 +000013# First step: ensure we also emulate the MACFS module, which contained
14# all the constants
15
16sys.modules['MACFS'] = sys.modules[__name__]
17
18# Import all those constants
Jack Jansen4235e712002-12-19 23:26:07 +000019from Carbon.Files import *
20from Carbon.Folders import *
Jack Jansen58fc91f2002-12-17 23:28:24 +000021
22# For some obscure historical reason these are here too:
23READ = 1
24WRITE = 2
25smAllScripts = -3
26
Jack Jansen2d0909b2003-01-15 22:36:16 +000027#
28# Find the epoch conversion for file dates in a way that works on OS9 and OSX
29import time
30if time.gmtime(0)[0] == 1970:
Jack Jansen0ae32202003-04-09 13:25:43 +000031 _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):
36 t = int(t) - _EPOCHCONVERT
37 if t < -0x7fffffff:
38 t = t + 0x10000000L
39 return (0, int(t), 0)
Jack Jansen2d0909b2003-01-15 22:36:16 +000040else:
Tim Peters182b5ac2004-07-18 06:16:08 +000041 def _utc2time(utc):
Jack Jansen0ae32202003-04-09 13:25:43 +000042 t = utc[1]
43 if t < 0:
44 t = t + 0x100000000L
45 return t
46 def _time2utc(t):
47 if t > 0x7fffffff:
48 t = t - 0x100000000L
49 return (0, int(t), 0)
Jack Jansen2d0909b2003-01-15 22:36:16 +000050
Jack Jansen4235e712002-12-19 23:26:07 +000051# The old name of the error object:
52error = Carbon.File.Error
Jack Jansen58fc91f2002-12-17 23:28:24 +000053
Jack Jansen6dd561b2002-12-26 21:09:39 +000054#
55# The various objects macfs used to export. We override them here, because some
56# of the method names are subtly different.
57#
Jack Jansen58fc91f2002-12-17 23:28:24 +000058class FSSpec(Carbon.File.FSSpec):
Jack Jansen0ae32202003-04-09 13:25:43 +000059 def as_fsref(self):
60 return FSRef(self)
Tim Peters182b5ac2004-07-18 06:16:08 +000061
Jack Jansen0ae32202003-04-09 13:25:43 +000062 def NewAlias(self, src=None):
63 return Alias(Carbon.File.NewAlias(src, self))
Tim Peters182b5ac2004-07-18 06:16:08 +000064
Jack Jansen0ae32202003-04-09 13:25:43 +000065 def GetCreatorType(self):
66 finfo = self.FSpGetFInfo()
67 return finfo.Creator, finfo.Type
Tim Peters182b5ac2004-07-18 06:16:08 +000068
Jack Jansen0ae32202003-04-09 13:25:43 +000069 def SetCreatorType(self, ctor, tp):
70 finfo = self.FSpGetFInfo()
71 finfo.Creator = ctor
72 finfo.Type = tp
73 self.FSpSetFInfo(finfo)
Tim Peters182b5ac2004-07-18 06:16:08 +000074
Jack Jansen0ae32202003-04-09 13:25:43 +000075 def GetFInfo(self):
76 return self.FSpGetFInfo()
Tim Peters182b5ac2004-07-18 06:16:08 +000077
Jack Jansen0ae32202003-04-09 13:25:43 +000078 def SetFInfo(self, info):
79 return self.FSpSetFInfo(info)
Tim Peters182b5ac2004-07-18 06:16:08 +000080
Jack Jansen0ae32202003-04-09 13:25:43 +000081 def GetDates(self):
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)
Tim Peters182b5ac2004-07-18 06:16:08 +000088
Jack Jansen0ae32202003-04-09 13:25:43 +000089 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)
Tim Peters182b5ac2004-07-18 06:16:08 +000096
Jack Jansen58fc91f2002-12-17 23:28:24 +000097class FSRef(Carbon.File.FSRef):
Jack Jansen0ae32202003-04-09 13:25:43 +000098 def as_fsspec(self):
99 return FSSpec(self)
Tim Peters182b5ac2004-07-18 06:16:08 +0000100
Jack Jansen58fc91f2002-12-17 23:28:24 +0000101class Alias(Carbon.File.Alias):
102
Jack Jansen0ae32202003-04-09 13:25:43 +0000103 def GetInfo(self, index):
104 return self.GetAliasInfo(index)
Tim Peters182b5ac2004-07-18 06:16:08 +0000105
Jack Jansen0ae32202003-04-09 13:25:43 +0000106 def Update(self, *args):
107 pass # print "Alias.Update not yet implemented"
Tim Peters182b5ac2004-07-18 06:16:08 +0000108
Jack Jansen0ae32202003-04-09 13:25:43 +0000109 def Resolve(self, src=None):
110 fss, changed = self.ResolveAlias(src)
111 return FSSpec(fss), changed
Tim Peters182b5ac2004-07-18 06:16:08 +0000112
Jack Jansen4235e712002-12-19 23:26:07 +0000113from Carbon.File import FInfo
Jack Jansen6dd561b2002-12-26 21:09:39 +0000114
115# Backward-compatible type names:
Jack Jansen58fc91f2002-12-17 23:28:24 +0000116FSSpecType = FSSpec
117FSRefType = FSRef
118AliasType = Alias
119FInfoType = FInfo
120
Jack Jansen6dd561b2002-12-26 21:09:39 +0000121# Global functions:
Jack Jansen58fc91f2002-12-17 23:28:24 +0000122def ResolveAliasFile(fss, chain=1):
Jack Jansen0ae32202003-04-09 13:25:43 +0000123 fss, isdir, isalias = Carbon.File.ResolveAliasFile(fss, chain)
124 return FSSpec(fss), isdir, isalias
Tim Peters182b5ac2004-07-18 06:16:08 +0000125
Jack Jansen58fc91f2002-12-17 23:28:24 +0000126def RawFSSpec(data):
Jack Jansen0ae32202003-04-09 13:25:43 +0000127 return FSSpec(rawdata=data)
Tim Peters182b5ac2004-07-18 06:16:08 +0000128
Jack Jansen58fc91f2002-12-17 23:28:24 +0000129def RawAlias(data):
Jack Jansen0ae32202003-04-09 13:25:43 +0000130 return Alias(rawdata=data)
Tim Peters182b5ac2004-07-18 06:16:08 +0000131
Jack Jansen58fc91f2002-12-17 23:28:24 +0000132def FindApplication(*args):
Jack Jansen0ae32202003-04-09 13:25:43 +0000133 raise NotImplementedError, "FindApplication no longer implemented"
Tim Peters182b5ac2004-07-18 06:16:08 +0000134
Jack Jansen58fc91f2002-12-17 23:28:24 +0000135def NewAliasMinimalFromFullPath(path):
Jack Jansen0ae32202003-04-09 13:25:43 +0000136 return Alias(Carbon.File.NewAliasMinimalFromFullPath(path, '', ''))
Tim Peters182b5ac2004-07-18 06:16:08 +0000137
Jack Jansen6dd561b2002-12-26 21:09:39 +0000138# Another global function:
139from Carbon.Folder import FindFolder
140
141#
142# Finally the old Standard File routine emulators.
143#
144
Jack Jansen6dd561b2002-12-26 21:09:39 +0000145_curfolder = None
146
Jack Jansen6dd561b2002-12-26 21:09:39 +0000147def StandardGetFile(*typelist):
Jack Jansen0ae32202003-04-09 13:25:43 +0000148 """Ask for an input file, optionally specifying 4-char file types that are
149 allowable"""
150 return PromptGetFile('', *typelist)
Tim Peters182b5ac2004-07-18 06:16:08 +0000151
Jack Jansen6dd561b2002-12-26 21:09:39 +0000152def PromptGetFile(prompt, *typelist):
Jack Jansen0ae32202003-04-09 13:25:43 +0000153 """Ask for an input file giving the user a prompt message. Optionally you can
154 specifying 4-char file types that are allowable"""
155 import EasyDialogs
156 warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen",
Jack Jansen374c4352003-01-21 22:58:39 +0000157 DeprecationWarning, stacklevel=2)
Jack Jansen0ae32202003-04-09 13:25:43 +0000158 if not typelist:
159 typelist = None
Tim Peters182b5ac2004-07-18 06:16:08 +0000160 fss = EasyDialogs.AskFileForOpen(message=prompt, wanted=FSSpec,
Jack Jansen0ae32202003-04-09 13:25:43 +0000161 typeList=typelist, defaultLocation=_handleSetFolder())
162 return fss, not fss is None
Jack Jansen6dd561b2002-12-26 21:09:39 +0000163
164def StandardPutFile(prompt, default=None):
Jack Jansen0ae32202003-04-09 13:25:43 +0000165 """Ask the user for an output file, with a prompt. Optionally you cn supply a
166 default output filename"""
167 import EasyDialogs
168 warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen",
Jack Jansen374c4352003-01-21 22:58:39 +0000169 DeprecationWarning, stacklevel=2)
Tim Peters182b5ac2004-07-18 06:16:08 +0000170 fss = EasyDialogs.AskFileForSave(wanted=FSSpec, message=prompt,
Jack Jansen0ae32202003-04-09 13:25:43 +0000171 savedFileName=default, defaultLocation=_handleSetFolder())
172 return fss, not fss is None
Tim Peters182b5ac2004-07-18 06:16:08 +0000173
Jack Jansen6dd561b2002-12-26 21:09:39 +0000174def SetFolder(folder):
Jack Jansen0ae32202003-04-09 13:25:43 +0000175 global _curfolder
176 warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen",
Jack Jansen374c4352003-01-21 22:58:39 +0000177 DeprecationWarning, stacklevel=2)
Jack Jansen0ae32202003-04-09 13:25:43 +0000178 if _curfolder:
179 rv = FSSpec(_curfolder)
180 else:
181 rv = None
182 _curfolder = folder
183 return rv
Tim Peters182b5ac2004-07-18 06:16:08 +0000184
Jack Jansen01524d02003-01-21 15:31:16 +0000185def _handleSetFolder():
Jack Jansen0ae32202003-04-09 13:25:43 +0000186 global _curfolder
187 rv = _curfolder
188 _curfolder = None
189 return rv
Tim Peters182b5ac2004-07-18 06:16:08 +0000190
Jack Jansen6dd561b2002-12-26 21:09:39 +0000191def GetDirectory(prompt=None):
Jack Jansen0ae32202003-04-09 13:25:43 +0000192 """Ask the user to select a folder. Optionally you can give a prompt."""
193 import EasyDialogs
194 warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen",
Jack Jansen374c4352003-01-21 22:58:39 +0000195 DeprecationWarning, stacklevel=2)
Tim Peters182b5ac2004-07-18 06:16:08 +0000196 fss = EasyDialogs.AskFolder(message=prompt, wanted=FSSpec,
Jack Jansen0ae32202003-04-09 13:25:43 +0000197 defaultLocation=_handleSetFolder())
198 return fss, not fss is None