| """macresource - Locate and open the resources needed for a script.""" | 
 |  | 
 | from Carbon import Res | 
 | import os | 
 | import sys | 
 |  | 
 | class ArgumentError(TypeError): pass | 
 | class ResourceFileNotFoundError(ImportError): pass | 
 |  | 
 | def need(restype, resid, filename=None, modname=None): | 
 | 	"""Open a resource file, if needed. restype and resid | 
 | 	are required parameters, and identify the resource for which to test. If it | 
 | 	is available we are done. If it is not available we look for a file filename | 
 | 	(default: modname with .rsrc appended) either in the same folder as | 
 | 	where modname was loaded from, or otherwise across sys.path. | 
 | 	 | 
 | 	Returns the refno of the resource file opened (or None)""" | 
 |  | 
 | 	if modname is None and filename is None: | 
 | 		raise ArgumentError, "Either filename or modname argument (or both) must be given" | 
 | 	 | 
 | 	if type(resid) is type(1): | 
 | 		try: | 
 | 			h = Res.GetResource(restype, resid) | 
 | 		except Res.Error: | 
 | 			pass | 
 | 		else: | 
 | 			return None | 
 | 	else: | 
 | 		try: | 
 | 			h = Res.GetNamedResource(restype, resid) | 
 | 		except Res.Error: | 
 | 			pass | 
 | 		else: | 
 | 			return None | 
 | 			 | 
 | 	# Construct a filename if we don't have one | 
 | 	if not filename: | 
 | 		if '.' in modname: | 
 | 			filename = modname.split('.')[-1] + '.rsrc' | 
 | 		else: | 
 | 			filename = modname + '.rsrc' | 
 | 	 | 
 | 	# Now create a list of folders to search | 
 | 	searchdirs = [] | 
 | 	if modname == '__main__': | 
 | 		# If we're main we look in the current directory | 
 | 		searchdirs = [os.curdir] | 
 | 	if sys.modules.has_key(modname): | 
 | 		mod = sys.modules[modname] | 
 | 		if hasattr(mod, '__file__'): | 
 | 			searchdirs = [os.path.split(mod.__file__)[0]] | 
 | 	if not searchdirs: | 
 | 		searchdirs = sys.path | 
 | 	 | 
 | 	# And look for the file | 
 | 	for dir in searchdirs: | 
 | 		pathname = os.path.join(dir, filename) | 
 | 		if os.path.exists(pathname): | 
 | 			break | 
 | 	else: | 
 | 		raise ResourceFileNotFoundError, filename | 
 | 	 | 
 | 	refno = Res.FSpOpenResFile(pathname, 1) | 
 | 	 | 
 | 	# And check that the resource exists now | 
 | 	if type(resid) is type(1): | 
 | 		h = Res.GetResource(restype, resid) | 
 | 	else: | 
 | 		h = Res.GetNamedResource(restype, resid) | 
 | 	return refno |