homeResFile.py revision cd5aad92f23737ff93a110d5c73d624658a28da8
1df83623cfe09733750eed2c2ed5f4bde674bb9f9Just"""Mac-only module to find the home file of a resource."""
2df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
38413c108d21e8cf0e9059bbfffde8d13f2616340Behdad Esfahbodfrom fontTools.misc import sstruct
4df83623cfe09733750eed2c2ed5f4bde674bb9f9Justimport array
5df83623cfe09733750eed2c2ed5f4bde674bb9f9Justimport calldll
6df83623cfe09733750eed2c2ed5f4bde674bb9f9Justimport macfs, Res
7df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
8df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
9df83623cfe09733750eed2c2ed5f4bde674bb9f9Justdef HomeResFile(res):
10df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	"""Return a path to the file in which resource 'res' lives."""
11df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	return GetFileLocation(res.HomeResFile())
12df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
13df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
14df83623cfe09733750eed2c2ed5f4bde674bb9f9Justdef GetFileLocation(refNum):
15df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	"""Return a path to the open file identified with refNum."""
16df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	pb = ParamBlock(refNum)
17df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	return pb.getPath()
18df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
19df83623cfe09733750eed2c2ed5f4bde674bb9f9Just#
20df83623cfe09733750eed2c2ed5f4bde674bb9f9Just# Internal cruft, adapted from MoreFiles
21df83623cfe09733750eed2c2ed5f4bde674bb9f9Just#
22df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
23df83623cfe09733750eed2c2ed5f4bde674bb9f9Just_InterfaceLib = calldll.getlibrary("InterfaceLib")
24df83623cfe09733750eed2c2ed5f4bde674bb9f9JustGetVRefNum = calldll.newcall(_InterfaceLib.GetVRefNum, "None", "InShort", "OutShort")
25df83623cfe09733750eed2c2ed5f4bde674bb9f9Just_getInfo = calldll.newcall(_InterfaceLib.PBGetFCBInfoSync, "Short", "InLong")
26df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
27df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
28df83623cfe09733750eed2c2ed5f4bde674bb9f9Just_FCBPBFormat = """
29df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	qLink:        l
30df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	qType:        h
31df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioTrap:       h
32df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioCmdAddr:    l
33df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioCompletion: l
34df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioResult:     h
35df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioNamePtr:    l
36df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioVRefNum:    h
37df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioRefNum:     h
38df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	filler:       h
39df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioFCBIndx:    h
40df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	filler1:      h
41df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioFCBFINm:    l
42df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioFCBFlags:   h
43df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioFCBStBlk:   h
44df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioFCBEOF:     l
45df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioFCBPLen:    l
46df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioFCBCrPs:    l
47df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioFCBVRefNum: h
48df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioFCBClpSiz:  l
49df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	ioFCBParID:   l
50df83623cfe09733750eed2c2ed5f4bde674bb9f9Just"""
51df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
52df83623cfe09733750eed2c2ed5f4bde674bb9f9Justclass ParamBlock:
53df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
54df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	"""Wrapper for the very low level FCBPB record."""
55df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
56df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	def __init__(self, refNum):
57df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		self.__fileName = array.array("c", "\0" * 64)
58df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		sstruct.unpack(_FCBPBFormat,
59df83623cfe09733750eed2c2ed5f4bde674bb9f9Just				"\0" * sstruct.calcsize(_FCBPBFormat), self)
60df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		self.ioNamePtr = self.__fileName.buffer_info()[0]
61df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		self.ioRefNum = refNum
62df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		self.ioVRefNum = GetVRefNum(refNum)
63df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		self.__haveInfo = 0
64df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
65df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	def getInfo(self):
66df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		if self.__haveInfo:
67df83623cfe09733750eed2c2ed5f4bde674bb9f9Just			return
68df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		data = sstruct.pack(_FCBPBFormat, self)
69df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		buf = array.array("c", data)
70df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		ptr = buf.buffer_info()[0]
71df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		err = _getInfo(ptr)
72df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		if err:
73cd5aad92f23737ff93a110d5c73d624658a28da8Behdad Esfahbod			raise Res.Error("can't get file info", err)
74df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		sstruct.unpack(_FCBPBFormat, buf.tostring(), self)
75df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		self.__haveInfo = 1
76df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
77df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	def getFileName(self):
78df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		self.getInfo()
79df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		data = self.__fileName.tostring()
80df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		return data[1:ord(data[0])+1]
81df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
82df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	def getFSSpec(self):
83df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		self.getInfo()
84df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		vRefNum = self.ioVRefNum
85df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		parID = self.ioFCBParID
86df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		return macfs.FSSpec((vRefNum, parID, self.getFileName()))
87df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
88df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	def getPath(self):
89df83623cfe09733750eed2c2ed5f4bde674bb9f9Just		return self.getFSSpec().as_pathname()
90df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
91df83623cfe09733750eed2c2ed5f4bde674bb9f9Just
92df83623cfe09733750eed2c2ed5f4bde674bb9f9Justif __name__ == "__main__":
93df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	fond = Res.GetNamedResource("FOND", "Helvetica")
94df83623cfe09733750eed2c2ed5f4bde674bb9f9Just	print HomeResFile(fond)
95