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