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