module to find the home file of a resource (handy for finding suitcase files when all you have is a resource)
git-svn-id: svn://svn.code.sf.net/p/fonttools/code/trunk@113 4cde692c-a291-49d1-8350-778aa11640f8
This commit is contained in:
parent
ca9679eded
commit
df83623cfe
94
Lib/fontTools/misc/homeResFile.py
Normal file
94
Lib/fontTools/misc/homeResFile.py
Normal file
@ -0,0 +1,94 @@
|
||||
"""Mac-only module to find the home file of a resource."""
|
||||
|
||||
import sstruct
|
||||
import array
|
||||
import calldll
|
||||
import macfs, Res
|
||||
|
||||
|
||||
def HomeResFile(res):
|
||||
"""Return a path to the file in which resource 'res' lives."""
|
||||
return GetFileLocation(res.HomeResFile())
|
||||
|
||||
|
||||
def GetFileLocation(refNum):
|
||||
"""Return a path to the open file identified with refNum."""
|
||||
pb = ParamBlock(refNum)
|
||||
return pb.getPath()
|
||||
|
||||
#
|
||||
# Internal cruft, adapted from MoreFiles
|
||||
#
|
||||
|
||||
_InterfaceLib = calldll.getlibrary("InterfaceLib")
|
||||
GetVRefNum = calldll.newcall(_InterfaceLib.GetVRefNum, "None", "InShort", "OutShort")
|
||||
_getInfo = calldll.newcall(_InterfaceLib.PBGetFCBInfoSync, "Short", "InLong")
|
||||
|
||||
|
||||
_FCBPBFormat = """
|
||||
qLink: l
|
||||
qType: h
|
||||
ioTrap: h
|
||||
ioCmdAddr: l
|
||||
ioCompletion: l
|
||||
ioResult: h
|
||||
ioNamePtr: l
|
||||
ioVRefNum: h
|
||||
ioRefNum: h
|
||||
filler: h
|
||||
ioFCBIndx: h
|
||||
filler1: h
|
||||
ioFCBFINm: l
|
||||
ioFCBFlags: h
|
||||
ioFCBStBlk: h
|
||||
ioFCBEOF: l
|
||||
ioFCBPLen: l
|
||||
ioFCBCrPs: l
|
||||
ioFCBVRefNum: h
|
||||
ioFCBClpSiz: l
|
||||
ioFCBParID: l
|
||||
"""
|
||||
|
||||
class ParamBlock:
|
||||
|
||||
"""Wrapper for the very low level FCBPB record."""
|
||||
|
||||
def __init__(self, refNum):
|
||||
self.__fileName = array.array("c", "\0" * 64)
|
||||
sstruct.unpack(_FCBPBFormat,
|
||||
"\0" * sstruct.calcsize(_FCBPBFormat), self)
|
||||
self.ioNamePtr = self.__fileName.buffer_info()[0]
|
||||
self.ioRefNum = refNum
|
||||
self.ioVRefNum = GetVRefNum(refNum)
|
||||
self.__haveInfo = 0
|
||||
|
||||
def getInfo(self):
|
||||
if self.__haveInfo:
|
||||
return
|
||||
data = sstruct.pack(_FCBPBFormat, self)
|
||||
buf = array.array("c", data)
|
||||
ptr = buf.buffer_info()[0]
|
||||
err = _getInfo(ptr)
|
||||
if err:
|
||||
raise Res.Error, ("can't get file info", err)
|
||||
sstruct.unpack(_FCBPBFormat, buf.tostring(), self)
|
||||
self.__haveInfo = 1
|
||||
|
||||
def getFileName(self):
|
||||
self.getInfo()
|
||||
data = self.__fileName.tostring()
|
||||
return data[1:ord(data[0])+1]
|
||||
|
||||
def getFSSpec(self):
|
||||
self.getInfo()
|
||||
vRefNum = self.ioVRefNum
|
||||
parID = self.ioFCBParID
|
||||
return macfs.FSSpec((vRefNum, parID, self.getFileName()))
|
||||
|
||||
def getPath(self):
|
||||
return self.getFSSpec().as_pathname()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
fond = Res.GetNamedResource("FOND", "Helvetica")
|
||||
print HomeResFile(fond)
|
Loading…
x
Reference in New Issue
Block a user