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