1 | """macfs - Pure Python module designed to be backward compatible with
|
---|
2 | macfs and MACFS.
|
---|
3 | """
|
---|
4 | import sys
|
---|
5 | import struct
|
---|
6 | import Carbon.Res
|
---|
7 | import Carbon.File
|
---|
8 | import warnings
|
---|
9 |
|
---|
10 | warnings.warn("macfs is deprecated, use Carbon.File, Carbon.Folder or EasyDialogs",
|
---|
11 | DeprecationWarning, stacklevel=2)
|
---|
12 |
|
---|
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
|
---|
19 | from Carbon.Files import *
|
---|
20 | from Carbon.Folders import *
|
---|
21 |
|
---|
22 | # For some obscure historical reason these are here too:
|
---|
23 | READ = 1
|
---|
24 | WRITE = 2
|
---|
25 | smAllScripts = -3
|
---|
26 |
|
---|
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):
|
---|
36 | t = int(t) - _EPOCHCONVERT
|
---|
37 | if t < -0x7fffffff:
|
---|
38 | t = t + 0x10000000L
|
---|
39 | return (0, int(t), 0)
|
---|
40 | else:
|
---|
41 | def _utc2time(utc):
|
---|
42 | 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)
|
---|
50 |
|
---|
51 | # The old name of the error object:
|
---|
52 | error = Carbon.File.Error
|
---|
53 |
|
---|
54 | #
|
---|
55 | # The various objects macfs used to export. We override them here, because some
|
---|
56 | # of the method names are subtly different.
|
---|
57 | #
|
---|
58 | class FSSpec(Carbon.File.FSSpec):
|
---|
59 | def as_fsref(self):
|
---|
60 | return FSRef(self)
|
---|
61 |
|
---|
62 | def NewAlias(self, src=None):
|
---|
63 | return Alias(Carbon.File.NewAlias(src, self))
|
---|
64 |
|
---|
65 | def GetCreatorType(self):
|
---|
66 | finfo = self.FSpGetFInfo()
|
---|
67 | return finfo.Creator, finfo.Type
|
---|
68 |
|
---|
69 | def SetCreatorType(self, ctor, tp):
|
---|
70 | finfo = self.FSpGetFInfo()
|
---|
71 | finfo.Creator = ctor
|
---|
72 | finfo.Type = tp
|
---|
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):
|
---|
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)
|
---|
88 |
|
---|
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)
|
---|
96 |
|
---|
97 | class FSRef(Carbon.File.FSRef):
|
---|
98 | def as_fsspec(self):
|
---|
99 | return FSSpec(self)
|
---|
100 |
|
---|
101 | class Alias(Carbon.File.Alias):
|
---|
102 |
|
---|
103 | def GetInfo(self, index):
|
---|
104 | return self.GetAliasInfo(index)
|
---|
105 |
|
---|
106 | def Update(self, *args):
|
---|
107 | pass # print "Alias.Update not yet implemented"
|
---|
108 |
|
---|
109 | def Resolve(self, src=None):
|
---|
110 | fss, changed = self.ResolveAlias(src)
|
---|
111 | return FSSpec(fss), changed
|
---|
112 |
|
---|
113 | from Carbon.File import FInfo
|
---|
114 |
|
---|
115 | # Backward-compatible type names:
|
---|
116 | FSSpecType = FSSpec
|
---|
117 | FSRefType = FSRef
|
---|
118 | AliasType = Alias
|
---|
119 | FInfoType = FInfo
|
---|
120 |
|
---|
121 | # Global functions:
|
---|
122 | def ResolveAliasFile(fss, chain=1):
|
---|
123 | fss, isdir, isalias = Carbon.File.ResolveAliasFile(fss, chain)
|
---|
124 | return FSSpec(fss), isdir, isalias
|
---|
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):
|
---|
136 | return Alias(Carbon.File.NewAliasMinimalFromFullPath(path, '', ''))
|
---|
137 |
|
---|
138 | # Another global function:
|
---|
139 | from Carbon.Folder import FindFolder
|
---|
140 |
|
---|
141 | #
|
---|
142 | # Finally the old Standard File routine emulators.
|
---|
143 | #
|
---|
144 |
|
---|
145 | _curfolder = None
|
---|
146 |
|
---|
147 | def StandardGetFile(*typelist):
|
---|
148 | """Ask for an input file, optionally specifying 4-char file types that are
|
---|
149 | allowable"""
|
---|
150 | return PromptGetFile('', *typelist)
|
---|
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"""
|
---|
155 | import EasyDialogs
|
---|
156 | warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen",
|
---|
157 | DeprecationWarning, stacklevel=2)
|
---|
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
|
---|
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"""
|
---|
167 | import EasyDialogs
|
---|
168 | warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen",
|
---|
169 | DeprecationWarning, stacklevel=2)
|
---|
170 | fss = EasyDialogs.AskFileForSave(wanted=FSSpec, message=prompt,
|
---|
171 | savedFileName=default, defaultLocation=_handleSetFolder())
|
---|
172 | return fss, not fss is None
|
---|
173 |
|
---|
174 | def SetFolder(folder):
|
---|
175 | global _curfolder
|
---|
176 | warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen",
|
---|
177 | DeprecationWarning, stacklevel=2)
|
---|
178 | if _curfolder:
|
---|
179 | rv = FSSpec(_curfolder)
|
---|
180 | else:
|
---|
181 | rv = None
|
---|
182 | _curfolder = folder
|
---|
183 | return rv
|
---|
184 |
|
---|
185 | def _handleSetFolder():
|
---|
186 | global _curfolder
|
---|
187 | rv = _curfolder
|
---|
188 | _curfolder = None
|
---|
189 | return rv
|
---|
190 |
|
---|
191 | def GetDirectory(prompt=None):
|
---|
192 | """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",
|
---|
195 | DeprecationWarning, stacklevel=2)
|
---|
196 | fss = EasyDialogs.AskFolder(message=prompt, wanted=FSSpec,
|
---|
197 | defaultLocation=_handleSetFolder())
|
---|
198 | return fss, not fss is None
|
---|