ryMac @sdZddddgZdZdZdZdZyd d lmZmZWne k rjdZdZYnXd d Z d dZ dddZddddZdddZdddZddZddZddZedkrendS(uHConversions to/from quoted-printable transport encoding as per RFC 1521.uencodeudecodeu encodestringu decodestrings=iLs0123456789ABCDEFsi(ua2b_qpub2a_qpcCs\t|tst|dkr%|S|dkr5|S|tkp[d|koXdkn S(uDecide whether a particular byte ordinal needs to be quoted. The 'quotetabs' flag indicates whether embedded tabs and spaces should be quoted. Note that line-ending tabs and spaces are always encoded, as per RFC 1521. s s_s s~(u isinstanceubytesuAssertionErroruESCAPE(ucu quotetabsuheader((u+/opt/alt/python33/lib64/python3.3/quopri.pyu needsquotings   u needsquotingcCsWt|tr!t|dks'tt|}ttt|dt|dfS(uQuote a single character.ii(u isinstanceubytesulenuAssertionErroruorduESCAPEuHEX(uc((u+/opt/alt/python33/lib64/python3.3/quopri.pyuquote$s' uquotec Cstdk rA|j}t|d|d|}|j|dS|ddd}d}x=|j}|srPng} d} |d ddkr|dd}d} nxm|D]e} t| f} t| ||rt| } n|r | d kr | jd q| j| qW|dk r6||nt j | } xHt | t kr|| dt dd d | t dd} qHW| }q\|dk r||d | ndS(uRead 'input', apply quoted-printable encoding, and write to 'output'. 'input' and 'output' are files with readline() and write() methods. The 'quotetabs' flag indicates whether embedded tabs and spaces should be quoted. Note that line-ending tabs and spaces are always encoded, as per RFC 1521. The 'header' flag indicates whether we are encoding spaces as _ as per RFC 1522. u quotetabsuheaderNs cSs|rN|dddkrN|j|ddt|dd|n7|dkrt|jt||n|j||dS(Nis s.iii(uwriteuquote(usuoutputulineEnd((u+/opt/alt/python33/lib64/python3.3/quopri.pyuwrite=s 2 uencode..writesis s_ulineEnds= ii( ub2a_qpuNoneureaduwriteureadlineubytesu needsquotinguquoteuappendu EMPTYSTRINGujoinulenu MAXLINESIZE( uinputuoutputu quotetabsuheaderudatauodatauwriteuprevlineulineuoutlineustrippeducuthisline((u+/opt/alt/python33/lib64/python3.3/quopri.pyuencode,s@           cCsdtdk r"t|d|d|Sddlm}||}|}t|||||jS(Nu quotetabsuheaderi(uBytesIO(ub2a_qpuNoneuiouBytesIOuencodeugetvalue(usu quotetabsuheaderuBytesIOuinfpuoutfp((u+/opt/alt/python33/lib64/python3.3/quopri.pyu encodestringls   c Cstdk r;|j}t|d|}|j|dSd}x)|j}|sZPndt|}}|dkr||d|dkrd} |d}x=|dkr||d|dkr|d}qWnd} xd||krI|||d} | dkr/|r/|d }|d}q| tkrR|| }|d}q|d|krs| rsd} Pq|d|kr||dtkr|t}|d }q|d |kr2t||d|d r2t||d |d r2|tt ||d|d f}|d }q|| }|d}qW| sD|j|dd}qDqD|r|j|ndS( uRead 'input', apply quoted-printable decoding, and write to 'output'. 'input' and 'output' are files with readline() and write() methods. If 'header' is true, decode underscore as space (per RFC 1522).uheaderNsiis s s_s ii( ua2b_qpuNoneureaduwriteureadlineulenuESCAPEuishexubytesuunhex( uinputuoutputuheaderudatauodataunewulineuiunupartialuc((u+/opt/alt/python33/lib64/python3.3/quopri.pyudecodewsR    & )   $ L+   cCs^tdk rt|d|Sddlm}||}|}t||d||jS(Nuheaderi(uBytesIO(ua2b_qpuNoneuiouBytesIOudecodeugetvalue(usuheaderuBytesIOuinfpuoutfp((u+/opt/alt/python33/lib64/python3.3/quopri.pyu decodestrings   cCset|tstd|ko,dknpdd|koHdknpdd|kobdkSS(uDReturn true if the byte ordinal 'c' is a hexadecimal digit in ASCII.s0s9sasfsAsF(u isinstanceubytesuAssertionError(uc((u+/opt/alt/python33/lib64/python3.3/quopri.pyuishexsuishexcCsd}x|D]}t|f}d|ko9dknrMtd}nzd|koddknr|tdd}nKd |kod knrtd d}nd std t||d t||}q W|S(u.Get the integer value of a hexadecimal number.is0s9u0sasfuai sAsFunon-hex digit iF(ubytesuorduFalseuAssertionErrorurepr(usubitsucui((u+/opt/alt/python33/lib64/python3.3/quopri.pyuunhexs uunhexc )Cs;ddl}ddl}y)|j|jddd\}}Wni|jk r}zF|j|_t|tdtdtd|jdWYdd}~XnXd}d}x>|D]6\}}|dkrd}n|d krd}qqW|r,|r,|j|_td |jdn|s>d g}nd} x|D]} | d krl|jj } n^yt | d } WnHt k r}z(|jj d | |fd} wKWYdd}~XnXz6|rt | |jj nt| |jj |Wd| d kr| jnXqKW| r7|j| ndS(Niiutdu"usage: quopri [-t | -d] [file] ...u-t: quote tabsu-d: decode; default encodeiu-tu-du -t and -d are mutually exclusiveu-urbu%s: can't open (%s) (usysugetoptuargvuerrorustderrustdoutuprintuexitustdinubufferuopenuIOErroruwriteudecodeuencodeuclose( usysugetoptuoptsuargsumsgudecoutabsuouaustsufileufp((u+/opt/alt/python33/lib64/python3.3/quopri.pyumainsT  )               umainu__main__NF(u__doc__u__all__uESCAPEu MAXLINESIZEuHEXu EMPTYSTRINGubinasciiua2b_qpub2a_qpu ImportErroruNoneu needsquotinguquoteuFalseuencodeu encodestringudecodeu decodestringuishexuunhexumainu__name__(((u+/opt/alt/python33/lib64/python3.3/quopri.pyus*    @ +   .