source: vendor/python/2.5/Lib/plat-mac/macresource.py

Last change on this file was 3225, checked in by bird, 19 years ago

Python 2.5

File size: 4.9 KB
Line 
1"""macresource - Locate and open the resources needed for a script."""
2
3from Carbon import Res
4import os
5import sys
6import MacOS
7import macostools
8
9class ArgumentError(TypeError): pass
10class ResourceFileNotFoundError(ImportError): pass
11
12def need(restype, resid, filename=None, modname=None):
13 """Open a resource file, if needed. restype and resid
14 are required parameters, and identify the resource for which to test. If it
15 is available we are done. If it is not available we look for a file filename
16 (default: modname with .rsrc appended) either in the same folder as
17 where modname was loaded from, or otherwise across sys.path.
18
19 Returns the refno of the resource file opened (or None)"""
20
21 if modname is None and filename is None:
22 raise ArgumentError, "Either filename or modname argument (or both) must be given"
23
24 if type(resid) is type(1):
25 try:
26 h = Res.GetResource(restype, resid)
27 except Res.Error:
28 pass
29 else:
30 return None
31 else:
32 try:
33 h = Res.GetNamedResource(restype, resid)
34 except Res.Error:
35 pass
36 else:
37 return None
38
39 # Construct a filename if we don't have one
40 if not filename:
41 if '.' in modname:
42 filename = modname.split('.')[-1] + '.rsrc'
43 else:
44 filename = modname + '.rsrc'
45
46 # Now create a list of folders to search
47 searchdirs = []
48 if modname == '__main__':
49 # If we're main we look in the current directory
50 searchdirs = [os.curdir]
51 if sys.modules.has_key(modname):
52 mod = sys.modules[modname]
53 if hasattr(mod, '__file__'):
54 searchdirs = [os.path.dirname(mod.__file__)]
55 searchdirs.extend(sys.path)
56
57 # And look for the file
58 for dir in searchdirs:
59 pathname = os.path.join(dir, filename)
60 if os.path.exists(pathname):
61 break
62 else:
63 raise ResourceFileNotFoundError, filename
64
65 refno = open_pathname(pathname)
66
67 # And check that the resource exists now
68 if type(resid) is type(1):
69 h = Res.GetResource(restype, resid)
70 else:
71 h = Res.GetNamedResource(restype, resid)
72 return refno
73
74def open_pathname(pathname, verbose=0):
75 """Open a resource file given by pathname, possibly decoding an
76 AppleSingle file"""
77 try:
78 refno = Res.FSpOpenResFile(pathname, 1)
79 except Res.Error, arg:
80 if arg[0] in (-37, -39):
81 # No resource fork. We may be on OSX, and this may be either
82 # a data-fork based resource file or a AppleSingle file
83 # from the CVS repository.
84 try:
85 refno = Res.FSOpenResourceFile(pathname, u'', 1)
86 except Res.Error, arg:
87 if arg[0] != -199:
88 # -199 is "bad resource map"
89 raise
90 else:
91 return refno
92 # Finally try decoding an AppleSingle file
93 pathname = _decode(pathname, verbose=verbose)
94 refno = Res.FSOpenResourceFile(pathname, u'', 1)
95 else:
96 raise
97 return refno
98
99def resource_pathname(pathname, verbose=0):