)Ej"2ddlmZddlZddlmZddlmZmZddlm Z ddl m Z Gdde Z Gd d e ZGd d eZd ZejeZdZejeZdZejeZdZejeZdS))BytesION)sstruct) bytesjointostr) OrderedDict)MutableMappingceZdZdS) ResourceErrorN)__name__ __module__ __qualname__GC:\PYTHON\MyICR_Suite\python\Lib\site-packages\fontTools/misc/macRes.pyr r sDrr ceZdZdZdZedZedZdZddZ dZ d Z d Z d Z d Zd ZdZdZdZedZdZdZdZdZdZdZdS)ResourceReaderaReader for Mac OS resource forks. Parses a resource fork and returns resources according to their type. If run on OS X, this will open the resource fork in the filesystem. Otherwise, it will open the file itself and attempt to read it as though it were a resource fork. The returned object can be indexed by type and iterated over, returning in each case a list of py:class:`Resource` objects representing all the resources of a certain type. cHt|_t|dr||_nb |||_|dS#t tf$r|||_YnwxYw|dS)zOpen a file Args: fileOrPath: Either an object supporting a ``read`` method, an ``os.PathLike`` object, or a string. readN) r _resourceshasattrfileopenResourceFork _readFiler IOError openDataFork)self fileOrPaths r__init__zResourceReader.__init__s&-- :v & & :"DII : 11*==    !7+ : : : --j99  : s.A+B  B ct|dr|}t|dzd5}|}dddn #1swxYwYt |}||_|S)N __fspath__z/..namedfork/rsrcrb)rr openrrname)pathresforkdatainfiles rrzResourceReader.openResourceFork0s 4 & & %??$$D $,,d 3 3 "w<<>>D " " " " " " " " " " " " " " "  sAA Act|d5}|}dddn #1swxYwYt|}||_|S)Nr!)r"rrr#)r$dataforkr&r's rrzResourceReader.openDataFork:s $   #==??D # # # # # # # # # # # # # # #  s 266cV||dSN)_readHeaderAndMap _readTypeListrs rrzResourceReader._readFileBs,     rNc|e |j|n#t$rtdwxYw|j|krtd |j|}n#t$rtdwxYwt ||krtd|S)Nz-Failed to seek offset ('offset' is too large)z#Failed to seek offset (reached EOF)z.Cannot read resource ('numBytes' is too large)z&Cannot read resource (not enough data))rseek OverflowErrorr tellrlen)rnumBytesoffsetr&s r_readzResourceReader._readFs   U v&&&&  U U U#$STTT Uy~~6))#$IJJJ R9>>(++DD R R R PQQ Q R t99  HII I s9)BBct|jd|t}t jt |||jdz}|t|}t jt|||j|j z|_ |j|j z|_ dS)Nr)rr0r6ResourceForkHeaderSizerunpackResourceForkHeader mapOffsetResourceMapHeaderSizeResourceMapHeadertypeListOffsetabsTypeListOffsetnameListOffsetabsNameListOffset)r headerDatar<resourceMapDatas rr,z ResourceReader._readHeaderAndMapVs qZZ 677 ):t<<<NR' **%:IFF(/4@@@!%$2E!E!%$2E!Erc|j}|d|}tjd|\|_|dz}t |jdzD]}|t |zz}|t |}tjt|}t|dd}||dz} |ddz} | || | } | |j |<dS) Nz>Htype mac-romanencoding refListOffsetnumRes) r@r6structr:numTypesrangeResourceTypeItemSizerResourceTypeItemr_readReferenceListr) rr@ numTypesDataabsTypeListOffset2iresTypeItemOffsetresTypeItemDataitemresTyperLrM resourcess rr-zResourceReader._readTypeListas 2zz!%677 !=|<<.2t}q()) 1 1A 25IA5M M "jj)=?PQQO>"2ODDDDL;???G-_0EEM(^a'F//OOI'0DOG $ $ 1 1rcg}t|D]d}|t|zz}|t|}t|}|||||e|Sr+)rPResourceRefItemSizer6Resource decompileappend) rrZrLrMr[rV refOffsetrefDataress rrSz!ResourceReader._readReferenceListps~ v " "A%(;a(??Ijj!4i@@G7##C MM'4 ( ( (   S ! ! ! !rc|j|Sr+rrrZs r __getitem__zResourceReader.__getitem__zsw''rc|j|=dSr+rerfs r __delitem__zResourceReader.__delitem__}s OG $ $ $rc||j|<dSr+re)rrZr[s r __setitem__zResourceReader.__setitem__s#,   rc*t|jSr+)r3rr.s r__len__zResourceReader.__len__s4?###rc*t|jSr+)iterrr.s r__iter__zResourceReader.__iter__sDO$$$rc4|jSr+)rkeysr.s rrrzResourceReader.keyss##%%%rcNt|jS)z6A list of the types of resources in the resource fork.)listrrrr.s rtypeszResourceReader.typess DO((**+++rcP t||S#t$rYdSwxYw)z/Return the number of resources of a given type.r)r3KeyErrorrfs rcountResourceszResourceReader.countResourcess; tG}%% %   11 s  %%ct||}|r ttd|dzSgS)z7Returns a list of indices of resources of a given type.rG)rxrtrP)rrZrMs r getIndiceszResourceReader.getIndicess>$$W--  a!,,-- -IrcBd||gDS)z6Return list of names of all resources of a given type.c*g|]}|j |jSr+)r#).0rcs r z+ResourceReader.getNames..s!RRRSSX=Q=Q=Q=Qr)getrfs rgetNameszResourceReader.getNamess$RRDHHWb$9$9RRRRrcl|dkrdS |||dz }n#ttf$rYdSwxYw|S)zReturn resource of given type located at an index ranging from 1 to the number of resources for that type, or None if not found. rGN)rw IndexError)rrZindexrcs rgetIndResourcezResourceReader.getIndResourcesW 1994 w- *CC*%   44  s 11cxt|d}||gD]}|j|kr|cSdS)z:Return the named resource of given type, else return None.rIrJN)rrr#)rrZr#rcs rgetNamedResourcezResourceReader.getNamedResourcesQTK00088GR((  Cx4  trcT|jjs|jdSdSr+)rclosedcloser.s rrzResourceReader.closes1y  IOO       rr+)r r r __doc__r staticmethodrrrr6r,r-rSrgrirkrmrprrpropertyrurxrzrrrrrrrrr s  *\\ F F F 1 1 1(((%%%---$$$%%%&&&,,X,SSS   rrc"eZdZdZ ddZdZdS)r^zRepresents a resource stored within a resource fork. Attributes: type: resource type. data: resource data. id: ID. name: resource name. attr: attributes. NcL||_||_||_||_||_dSr+)rHr&idr#attr)rrZresDataresIDresNameresAttrs rrzResource.__init__s+    rcXtjt||tjdt d|jg\|_|j|jz}tjd|d|\}|||_|jdkrdS|j |jz}tjd|d|\}tjd|z||\}t|d |_ dS) Nz>LBrGz>%ssrIrJ) rr:ResourceRefItemrNr dataOffsetr6r& nameOffsetrBrr#)rrbreader absDataOffset dataLength absNameOffset nameLengthr#s rr_zResource.decompiles666#]4E4?;S1T1TUU)DO;  dFLLM,J,JKK LL,, ?b F04?B  c6<<=+I+IJJ - 3V\\*5M5MNN$555 r)NNNNN)r r r rrr_rrrr^r^sHMQ 6 6 6 6 6rr^zb > # big endian dataOffset: L mapOffset: L dataLen: L mapLen: L zW > # big endian attr: H typeListOffset: H nameListOffset: H zX > # big endian type: 4s numRes: H refListOffset: H z > # big endian id: h nameOffset: h attr: B dataOffset: 3s reserved: L )iorrNfontTools.miscrfontTools.misc.textToolsrr collectionsrcollections.abcr Exceptionr robjectr^r;calcsizer9r>r=rRrQrr]rrrrsr """"""55555555######******     I   mmmmm^mmm` 6 6 6 6 6v 6 6 6F*)*<==)():;;(w'(899'g&77r