L i!.ddlmZddlZddlmZddlmZmZddlm Z ddl m Z Gdde Z Gd d e ZGd d eZd Zej$eZdZej$eZdZej$eZdZej$eZy))BytesION)sstruct) bytesjointostr) OrderedDict)MutableMappingc eZdZy) ResourceErrorN)__name__ __module__ __qualname__[/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/fontTools/misc/macRes.pyr r srr ceZdZdZdZedZedZdZddZ dZ d Z d Z d Z d Zd ZdZdZdZedZdZdZdZdZdZdZy)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. ct|_t|dr||_n( |j ||_|j y|j y#t tf$r|j||_Y8wxYw)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__sv&- :v &"DI : 11*=   "7+ : --j9  :s&A%BBct|dr|j}t|dzd5}|j}dddt }||_|S#1swYxYw)N __fspath__z/..namedfork/rsrcrb)rr openrrname)pathresforkdatainfiles rrzResourceReader.openResourceFork0s_ 4 &??$D $,,d 3 "w<<>D "   " "s AA"ct|d5}|j}dddt}||_|S#1swYxYw)Nr!)r"rrr#)r$dataforkr&r's rrzResourceReader.openDataFork:sC $  #==?D #   # #s :AcD|j|jyN)_readHeaderAndMap _readTypeListrs rrzResourceReader._readFileBs   rNc\|D |jj||jj |k7r td |jj |}t ||k7r td|S#t$r tdwxYw#t$r tdwxYw)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&yy~~6)#$IJJ R99>>(+D t9  HI I ! U#$STT U  R PQ Q RsA>B>BB+c|jjd|jt}t j t |||jdz}|jt|}t j t|||j|jz|_ |j|jz|_ y)Nr)rr0r6ResourceForkHeaderSizerunpackResourceForkHeader mapOffsetResourceMapHeaderSizeResourceMapHeadertypeListOffsetabsTypeListOffsetnameListOffsetabsNameListOffset)r headerDatar<resourceMapDatas rr,z ResourceReader._readHeaderAndMapVs qZZ 67 ):t<NNR' **%:IF(/4@!%$2E2E!E!%$2E2E!Erc|j}|jd|}tjd|\|_|dz}t |jdzD]}|t |zz}|jt |}tjt|}t|dd}||dz} |ddz} |j|| | } | |j|<y) Nz>Htype mac-romanencoding refListOffsetnumRes) r@r6structr:numTypesrangeResourceTypeItemSizerResourceTypeItemr_readReferenceListr) rr@ numTypesDataabsTypeListOffset2iresTypeItemOffsetresTypeItemDataitemresTyperLrM resourcess rr-zResourceReader._readTypeListas 22zz!%67 !==|<.2t}}q() 1A 25IA5M M "jj)=?PQO>>"2ODDDL;?G-_0EEM(^a'F//OI'0DOOG $ 1rcg}t|D]R}|t|zz}|jt|}t|}|j |||j |T|Sr+)rPResourceRefItemSizer6Resource decompileappend) rrZrLrMr[rV refOffsetrefDataress rrSz!ResourceReader._readReferenceListpsi v "A%(;a(??Ijj!4i@G7#C MM'4 (   S !  " rc |j|Sr+rrrZs r __getitem__zResourceReader.__getitem__zsw''rc|j|=yr+rerfs r __delitem__zResourceReader.__delitem__}s OOG $rc"||j|<yr+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__sDOO$$rc6|jjSr+)rkeysr.s rrrzResourceReader.keyss##%%rcHt|jjS)z6A list of the types of resources in the resource fork.)listrrrr.s rtypeszResourceReader.typessDOO((*++rc> t||S#t$rYywxYw)z/Return the number of resources of a given type.r)r3KeyErrorrfs rcountResourceszResourceReader.countResourcess( tG}% %  s  c\|j|}|rttd|dzSgS)z7Returns a list of indices of resources of a given type.rG)rxrtrP)rrZrMs r getIndiceszResourceReader.getIndicess0$$W- a!,- -Ircz|j|gDcgc]}|j|jc}Scc}w)z6Return list of names of all resources of a given type.)getr#)rrZrcs rgetNameszResourceReader.getNamess.$(HHWb$9RSSXX=QRRRs88cT|dkry |||dz }|S#ttf$rYywxYw)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.getIndResourcesE 19 w- *C *%  s ''crt|d}|j|gD]}|j|k(s|cSy)z:Return the named resource of given type, else return None.rIrJN)rr|r#)rrZr#rcs rgetNamedResourcezResourceReader.getNamedResources>TK088GR( Cxx4  rcf|jjs|jjyyr+)rclosedcloser.s rrzResourceReader.closes"yy IIOO  rr+)r r r __doc__r staticmethodrrrr6r,r-rSrgrirkrmrprrpropertyrurxrzr}rrrrrrrr s * F 1(%-$%&,,S rrc eZdZdZ ddZdZy)r^zRepresents a resource stored within a resource fork. Attributes: type: resource type. data: resource data. id: ID. name: resource name. attr: attributes. NcJ||_||_||_||_||_yr+)rHr&idr#attr)rrZresDataresIDresNameresAttrs rrzResource.__init__s'    rcftjt||tjdt d|j g\|_|j |j z}tjd|j d|\}|j ||_|jdk(ry|j|jz}tjd|j d|\}tjd|z|j |\}t|d |_ y) Nz>LBrGz>%ssrIrJ) rr:ResourceRefItemrNr dataOffsetr6r& nameOffsetrBrr#)rrbreader absDataOffset dataLength absNameOffset nameLengthr#s rr_zResource.decompiles6#]]4E4??;S1TU))DOO;  dFLLM,JK LL, ??b 004??B  c6<<=+IJ -- 3V\\*5MN$5 r)NNNNN)r r r rrr_rrrr^r^sMQ 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]rrrrs "5#* I m^m` 6v 6F*))*<=)(():;(w''(89'g&&7r