B
    EDbÈ@  ã               @   s  d Z dZddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ddlmZ ddlmZmZmZmZmZ dd	lmZmZmZ dd
lmZ ddlmZmZ dd„ Zdd„ ZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!G dd„ deƒZ"eG dd„ deƒƒZ#dS )zXMLRPC-Interface for ladon.
z'Dennis Ploeger <develop@dieploegers.de>é    )ÚStringION)ÚUndefinedServiceMethod)ÚClientFault)Úexpose)ÚBaseInterfaceÚServiceDescriptorÚBaseRequestHandlerÚBaseResponseHandlerÚBaseFaultHandler)Úpytype_supportÚBytesIOÚPORTABLE_STRING)ÚNode)ÚparseStringÚgetDOMImplementationc             C   s$   t jd dkrt| dƒS t| ƒS d S )Nr   é   zutf-8)ÚsysÚversion_infor   )Zinstring© r   ú7G:\easytimepro\master/mysite/ladon\interfaces\xmlrpc.pyÚu   s    
r   c             C   sJ   t | ƒ}z2d}x(| |¡}d|kr&dS t|ƒ|k rP qW W d| ¡  X dS )a  Return true if the given filename is binary.
    @attention: based on http://bytes
    .com/topic/python/answers/21222-determine-file-type-binary-text on 6/08/2010
    @author: Trent Mick <TrentM@ActiveState.com>
    @author: Jorge Orpinel <jorge@orpinel.com>i   ú TNF)r   ÚreadÚlenÚclose)Ztest_stringZfinZ	CHUNKSIZEÚchunkr   r   r   Ú	is_binary"   s    


r   c               @   s0   e Zd ZdZdZg Zdd„ Zdd„ Zdd„ Zd	S )
ÚXMLRPCServiceDescriptorzcGenerate XRDL (based on
        http://code.google.com/p/xrdl/source/browse/documentation/xrdl.xsd)ztext/xmlc             C   s   y|j S    t|ƒj S d S )N)Ú__name__Útype)ÚselfÚ
type_classr   r   r   Ú_get_type_name=   s    z&XMLRPCServiceDescriptor._get_type_namec             C   sj   |dkrdS |dkrdS |dkr$dS |dkr0dS |d	kr<d
S || j krJ|S |dkrVdS |dkrbdS dS d S )N)ÚstrÚunicodeÚstring)ÚintZlongr&   )ÚfloatÚdoublezdatetime.timeZdateTime8601ÚboolÚboolean)ÚlistÚtupleÚsetÚarrayÚdictÚstructÚbase64)Ú_special_types)r    Z	type_namer   r   r   Ú_type_to_xmlrpcG   s"    
z'XMLRPCServiceDescriptor._type_to_xmlrpcc             C   sâ  |j }x|D ]}| j |  |¡¡ qW tƒ }	|	 d dd ¡}
|
j d|¡ |
j dd¡ |
j d|¡ |
 d¡}x| 	¡ D ]„\}}|
 d¡}| d|d ¡ xV|d D ]J}|\}}}|
 d	¡}| d|  
|  |¡¡¡ | |
 |¡¡ | |¡ q¤W | |¡ qxW |
j |¡ |
 d
¡}x²|D ]ª}| ¡ }|
 d¡}| d| ¡ ¡ | d|  
|  |d d ¡¡¡ xV| ¡ D ]J}|
 d¡}| d|  
|  |d ¡¡¡ | |
 |d ¡¡ | |¡ qlW | |¡ qW |
j |¡ |
j|dS )NZserviceZurlÚnsÚ ÚnameÚtypesr   Z
attributesÚmemberÚmethodsÚmethodÚresultZrtyper   Úparam)Úencoding)Ú	type_dictr2   Úappendr"   r   ÚcreateDocumentÚdocumentElementZsetAttributeÚcreateElementÚitemsr3   ÚappendChildÚcreateTextNodeZ	serializer6   ÚargsÚtoxml)r    ÚservicenameZservicenumberZtypemanagerZ
methodlistZservice_urlr=   r>   r!   ÚimplÚresp_docZtypes_elZ	type_infoZtype_elr8   Úmember_nameÚmember_typeZ
member_optÚ	member_elZ
methods_elr:   Zmethod_infoZ	method_elr<   Úparam_elr   r   r   Úgenerateo   sf    









z XMLRPCServiceDescriptor.generateN)	r   Ú
__module__Ú__qualname__Ú__doc__Ú_content_typer2   r"   r3   rO   r   r   r   r   r   6   s   
(r   c               @   s   e Zd Zdd„ Zdd„ ZdS )ÚXMLRPCRequestHandlerc             C   sž  d}x@t d|jjƒD ].}|j |¡jtjkrd}|j |¡}|j}qW |sNd}|dkrft|j	j
 ¡ ƒS |dkr‚t|j	j
 ¡ ƒdkS |dkršt|j	j
 ¡ ƒS |d	kr®|j	j
 ¡ S |d
krPi }| d¡}x„t d|jƒD ]t}| |¡}	|	 d¡}
|
jdkr tdƒ‚|
j	jtjkr td|
j	j ƒ‚|
j	j
 ¡ }|	 d¡}|  |¡}|||< qÔW |S |dkršg }| d¡}x,t d|jƒD ]}| |  | |¡¡¡ qvW |S dS )z'Turn a param node into a value
        Fr   Tr%   )Zi4r&   r*   é   r(   )zdateTime.iso8601r1   r%   r0   r8   r6   z$More than one name nodes in a structz:Unexpected Node type %d while parsing a struct member nameÚvaluer.   N)ÚrangeZ
childNodesÚlengthÚitemZnodeTyper   Z	TEXT_NODEZtagNamer&   Ú
firstChildÚdataÚstripr'   ÚgetElementsByTagNamer   Úget_param_valuer?   )r    ÚnodeZtype_definedZ
node_indexZ	type_nodeZcurrent_typeZreturn_dictÚmembersZmember_indexÚcurrent_memberZ	name_nodeÚkeyÚ
value_noderV   Zreturn_listÚvaluesZvalue_indexr   r   r   r^   Ý   sP    








z$XMLRPCRequestHandler.get_param_valuec             C   sÊ   di i}t |ƒ}| d¡}| d¡jj ¡ |d< | |d ¡d krXtd|jd|d  ƒ‚| |d ¡ 	¡ }| d¡}xPt
d|jƒD ]@}	| |	¡}
|
 d¡ d¡}|  |¡}||	 }||d |d	 < q‚W |S )
NrF   Z
methodNamer   Ú
methodnameÚxmlrpczUnknown method %sr<   rV   r6   )r   r]   rY   rZ   r[   r\   r:   r   rH   rF   rW   rX   r^   )r    ZreqÚsinfor=   Zreq_dictZreq_docÚmethod_namerF   ÚparamsZcurrent_paramr_   rc   rV   Zcurrent_argr   r   r   Úparse_request)  s$    



z"XMLRPCRequestHandler.parse_requestN)r   rP   rQ   r^   rj   r   r   r   r   rT   Û   s   LrT   c               @   s(   e Zd ZdZdZdZdd„ Zdd„ ZdS )ÚXMLRPCResponseHandlerztext/xmlFNc             C   sÐ  |  d¡}t|ttfƒrÞt|ƒrP|  d¡}| | t t|ƒ¡¡¡ | |¡ nŠ| j	 
|¡r‚|  d¡}| | |¡¡ | |¡ nXt|tƒr²|  d¡}| | |¡¡ | |¡ n(|  d¡}| | t|ƒ¡¡ | |¡ nît|tƒr|  d¡}| | |¡¡ | |¡ nºt|tƒrF|  d¡}| | |¡¡ | |¡ n†t|tƒrŠ|r^d}nd}|  d	¡}	|	 | |¡¡ | |	¡ nBt|tjƒrÆ|  d¡}| | | d
¡¡¡ | |¡ nt|tƒrd|  d¡}
xztdt| ¡ ƒƒD ]d}| ¡ | }|  || |¡}|  d¡}|  d¡}| | |¡¡ | |¡ | |¡ |
 |¡ qðW | |
¡ nht|tƒrÌ|  d¡}|  d¡}x2tdt|ƒƒD ] }|  || |¡}| |¡ q”W | |¡ | |¡ |S )NrV   r1   zdateTime.iso8601r%   r&   r(   rU   r   r*   z%Y%m%dT%H:%M:%Sr0   r8   r6   r.   r[   )rB   Ú
isinstancer#   r$   r   rD   rE   r1   Z	b64encodeÚdatetime_reÚmatchr   r&   r'   r)   ÚdatetimeÚtimeÚstrftimer/   rW   r   ÚkeysÚget_xml_valuer+   )r    rV   rJ   Úvalue_elZ	base64_elZdatetime_elZ	string_elZint_elZ	double_elZ
boolean_elÚ	struct_elra   Z
member_keyZmember_value_elrM   Zname_elZarray_elZdata_elZcurrent_valueZdata_value_elr   r   r   rs   Y  sŽ    


















z#XMLRPCResponseHandler.get_xml_valuec       
      C   st   t  d¡| _|d }tƒ }| d dd ¡}| d¡}| d¡}|  ||¡}	| |	¡ | |¡ |j |¡ |j	|dS )Nz\d{8}T\d{2}:\d{2}:\d{2}r;   ÚmethodResponseri   r<   )r=   )
ÚreÚcompilerm   r   r@   rB   rs   rD   rA   rG   )
r    Zres_dictrg   r=   rV   rI   rJ   Z	params_elrN   rt   r   r   r   Úbuild_responseÞ  s    



z$XMLRPCResponseHandler.build_response)r   rP   rQ   rS   Ú_stringify_res_dictrm   rs   ry   r   r   r   r   rk   S  s    rk   c               @   s   e Zd ZdZdZdd„ ZdS )ÚXMLRPCFaultHandlerztext/xmlFc             C   sj  |j r|j }nt ¡ }| dd¡}tƒ }| d dd ¡}| d¡}	| d¡}
| d¡}| d¡}| d¡}| | d	¡¡ | |¡ | d¡}| d
¡}| | d¡¡ | |¡ | |¡ | |¡ | d¡}| d¡}| | d¡¡ | |¡ | d¡}| d¡}| | |j	d | ¡¡ | |¡ | |¡ | |¡ |
 |¡ |	 |
¡ |j
 |	¡ |j|dS )Nz
Ú
rv   ZfaultrV   r0   r8   r6   Z	faultCoder&   Z99ZfaultStringr%   )r=   )ÚdetailÚ	tracebackÚ
format_excÚreplacer   r@   rB   rD   rE   ZfaultstringrA   rG   )r    Zservice_excrg   re   r=   Z
reflectionr}   rI   rJ   Zfault_elrt   ru   Zcode_member_elZcode_name_elZcode_value_elZcode_value_int_elZstring_member_elZstring_name_elZstring_value_elZstring_value_string_elr   r   r   Úbuild_fault_response÷  sJ    




















z'XMLRPCFaultHandler.build_fault_responseN)r   rP   rQ   rS   rz   r   r   r   r   r   r{   ó  s   r{   c               @   sD   e Zd Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZed	d
„ ƒZdS )ÚXMLRPCInterfacec             K   s,   t tttdœ}| |¡ tj| |f|Ž d S )N)Zservice_descriptorZrequest_handlerZresponse_handlerZfault_handler)r   rT   rk   r{   Úupdater   Ú__init__)r    rg   ÚkwZdef_kwr   r   r   r„   A  s    
zXMLRPCInterface.__init__c               C   s   dS )Nrf   r   r   r   r   r   Ú_interface_nameJ  s    zXMLRPCInterface._interface_namec             C   s   t  | ¡dkS )Nr   )r   Úcount)Útypr   r   r   Ú_accept_basetypeN  s    z XMLRPCInterface._accept_basetypec               C   s   dS )NTr   r   r   r   r   Ú_accept_listR  s    zXMLRPCInterface._accept_listc               C   s   dS )NTr   r   r   r   r   Ú_accept_dictV  s    zXMLRPCInterface._accept_dictN)	r   rP   rQ   r„   Ústaticmethodr†   r‰   rŠ   r‹   r   r   r   r   r‚   >  s
   	r‚   )$rR   Ú
__author__r   r1   rw   r   ro   r~   Z"mysite.ladon.exceptions.dispatcherr   Zmysite.ladon.exceptions.servicer   Zmysite.ladon.interfacesr   Zmysite.ladon.interfaces.baser   r   r   r	   r
   Zmysite.ladon.compatr   r   r   Zxml.domr   Zxml.dom.minidomr   r   r   r   r   rT   rk   r{   r‚   r   r   r   r   Ú<module>   s0    &x !K