B
    €„Ø]e&  ã               @   sª   d dl Z d dlZd dlZd dlZd dlZyd dlmZ W n  ek
rX   d dlmZ Y nX G dd„ dƒZ	G dd„ dƒZ
G dd„ deƒZd	d
„ Zdd„ ZG dd„ de
ƒZdS )é    N)ÚStringIOc               @   s\   e Zd Ze d¡Ze d¡Ze d¡Ze d¡Ze d¡Z	e d¡Z
e d¡Ze d¡Zd	S )
ÚNSzhttp://lv2plug.in/ns/ext/atom#zhttp://drobilla.net/ns/ingen#z$http://drobilla.net/ns/ingen/errors#zhttp://lv2plug.in/ns/lv2core#zhttp://lv2plug.in/ns/ext/patch#z+http://www.w3.org/1999/02/22-rdf-syntax-ns#z%http://lv2plug.in/ns/ext/resize-port#z!http://www.w3.org/2001/XMLSchema#N)Ú__name__Ú
__module__Ú__qualname__ÚrdflibZ	NamespaceZatomÚingenÚingerrZlv2ÚpatchÚrdfZrszZxsd© r   r   ú(C:\git_repos\PolyDigit\UI\ingen\ingen.pyr      s   






r   c               @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )Ú	InterfacezThe core Ingen interfacec             C   s   d S )Nr   )ÚselfÚsubjectÚbodyr   r   r   Úput(   s    zInterface.putc             C   s   d S )Nr   )r   r   ÚremoveÚaddr   r   r   r
   +   s    zInterface.patchc             C   s   d S )Nr   )r   r   r   r   r   Úget.   s    zInterface.getc             C   s   d S )Nr   )r   r   ÚkeyÚvaluer   r   r   Úset1   s    zInterface.setc             C   s   d S )Nr   )r   ÚtailÚheadr   r   r   Úconnect4   s    zInterface.connectc             C   s   d S )Nr   )r   r   r   r   r   r   Ú
disconnect7   s    zInterface.disconnectc             C   s   d S )Nr   )r   r   r   r   r   Údelete:   s    zInterface.deleteN)r   r   r   Ú__doc__r   r
   r   r   r   r   r   r   r   r   r   r   &   s   r   c               @   s   e Zd Zdd„ ZdS )ÚErrorc             C   s   t  | d||f ¡ d S )Nz%s; cause: %s)Ú	ExceptionÚ__init__)r   ÚmsgÚcauser   r   r   r!   >   s    zError.__init__N)r   r   r   r!   r   r   r   r   r   =   s   r   c              C   sœ   t  d¡} | r| S tjdkr2t j dddddg¡S tjdkrLt j dd	g¡S tjd
kr†t j t j t  d¡d¡t j t  d¡d¡g¡S t j dddg¡S d S )NZLV2_PATHÚdarwinz~/Library/Audio/Plug-Ins/LV2z~/.lv2z/usr/local/lib/lv2z/usr/lib/lv2z/Library/Audio/Plug-Ins/LV2Zhaikuz/boot/common/add-ons/lv2Zwin32ÚAPPDATAZLV2ZCOMMONPROGRAMFILES)ÚosÚgetenvÚsysÚplatformÚpathsepÚjoinÚpath)r,   r   r   r   Úlv2_pathA   s&    



r-   c              C   sB   x<t ƒ  tj¡D ]*} tj tj | d¡¡}tj |¡r|S qW d S )Nz	ingen.lv2)r-   Úsplitr&   r*   r,   Úabspathr+   Úexists)ÚdÚbundler   r   r   Úingen_bundle_pathW   s
    r3   c               @   s–   e Zd Zd%dd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$S )&ÚRemoteúunix:///tmp/ingen.sockc             C   s"  d| _ |d | _t ¡ | _tj | j¡| _| j d| j¡ x$t	j
 ¡ D ]\}}| j ||¡ qFW | d¡r–t tjtj¡| _| j |tdƒd … ¡ nb| d¡rìt tjtj¡| _t d|tdƒd … ¡}|d t|d ƒf}| j |¡ ntd| ƒ‚tƒ }|�r| jjtj |d	¡d
d� d S )Né   ú/Úserverzunix://ztcp://z[:/]r   zUnsupported server URI `%sz
errors.ttlÚn3)Úformat)Zmsg_idÚserver_baser   ÚGraphÚmodelÚ	namespaceZNamespaceManagerÚ
ns_managerÚbindr   Ú__dict__ÚitemsÚ
startswithÚsocketZAF_UNIXZSOCK_STREAMÚsockr   ÚlenZAF_INETÚrer.   Úintr    r3   Úparser&   r,   r+   )r   ÚuriÚkÚvZparsedZaddrr2   r   r   r   r!   _   s&    



zRemote.__init__c             C   s   | j  ¡  d S )N)rE   Úclose)r   r   r   r   Ú__del__w   s    zRemote.__del__c             C   s0   d}x&| j  ¡ D ]\}}|d||f 7 }qW |S )NÚ z@prefix %s: <%s> .
)r?   Z
namespaces)r   ÚsrK   rL   r   r   r   Ú_get_prefixes_stringz   s    zRemote._get_prefixes_stringc             C   s    t jd dkrt|dƒS |S d S )Nr   é   zutf-8)r(   Úversion_infoÚbytes)r   r"   r   r   r   Ú	msgencode€   s    
zRemote.msgencodec             C   sŠ   x„|  d tjjtjjg¡D ]h}|d }| |tjjd ¡}| |tjjd ¡}i }x2|  |d d g¡D ]}| j	 
||d |d g¡ q`W qW |S )Nr   r6   é   )Útriplesr   r   Útyper
   ZPutr   r   r   r=   r   )r   ÚupdateÚir   r   r   Zdescr   r   r   Úupdate_model†   s    "zRemote.update_modelc             C   s*   |}|  | j¡r&|t| jƒd d … S |S )Nr6   )rC   r;   rF   )r   rJ   r,   r   r   r   Úuri_to_path�   s    zRemote.uri_to_pathc             C   sF   d}x<| j  dd¡ d¡}|r.t|d ƒdkr2P q||d 7 }qW |S )z4Read from socket until a null terminator is receivedrO   r6   r   zutf-8)rE   ÚrecvÚdecodeÚord)r   r"   Úcr   r   r   r]   –   s    zRemote.recvc                s6   ‡ fdd„‰ |g}x|  ˆ |¡D ]}||g7 }q W |S )Nc             3   sT   xN|  | d d g¡D ]:}t|d ƒtjkr|d | kr|d V  ˆ |d |ƒ qW d S )NrV   )rW   rX   r   ZBNode)ÚnodeÚgrZ   )Ú
blank_walkr   r   rc   ¢   s    
z(Remote.blank_closure.<locals>.blank_walk)ZtransitiveClosure)r   Zgraphra   ZclosureÚbr   )rc   r   Úblank_closure¡   s
    zRemote.blank_closurec             C   s`   | j  d tjjt |¡¡}|s,td| |ƒ‚| j  |tjjd ¡}|sRtd| |ƒ‚t||ƒ‚d S )Nzerror %dz%s)	r=   r   r   r	   Z	errorCoder   ZLiteralr   ZformatString)r   Úcoder#   ZklassZfmtr   r   r   Úraise_error®   s    zRemote.raise_errorc             C   s¼  |}t jd dkrt|dƒ}| j |  |¡¡ |  ¡ |  ¡  }tj	| j
d�}|jt|ƒddd� xZ| d¡D ]L}| d	¡rlt d
|¡}|rl| d¡}| d¡}| j
 | d¡| d¡¡ qlW g }	g }
xx| d tjjtjjg¡D ]\}|d }| |tjjd ¡}| |tjjd ¡}|
|g7 }
|	|g7 }	|dkrÞ|  t|ƒ|¡ qÞW g }x|	D ]}||  ||¡7 }�qHW x4|D ],}x$| |d d g¡D ]}| |¡ �q~W �qhW x|
D ]}| |¡ �qžW |   |¡S )Nr   rR   zutf-8)Znamespace_managerzingen:/r9   )r:   Ú
z@prefixz@prefix ([^:]*): <(.*)> *\.r6   rV   )!r(   rS   rT   rE   ÚsendrU   rQ   r]   r   r<   r?   rI   r   r.   rC   rG   ÚsearchZgroupr@   rW   r   r   rX   r
   ZResponser   r   r   rg   rH   re   r   r[   )r   r"   ZpayloadZresponse_strZresponse_modelÚlineZmatchÚnamerJ   ZblanksZresponse_descrZ   Zresponser   r   re   rd   Útr   r   r   ri   ¹   sB    








zRemote.sendc             C   s   |   d| ¡S )Nz)
[]
	a patch:Get ;
	patch:subject <%s> .
)ri   )r   r   r   r   r   r   ñ   s    z
Remote.getc             C   s   |   d||f ¡S )Nz?
[]
	a patch:Put ;
	patch:subject <%s> ;
	patch:body [
%s
	] .
)ri   )r   r   r   r   r   r   r   ø   s    z
Remote.putc             C   s   |   d|||f ¡S )NzX
[]
	a patch:Patch ;
	patch:subject <%s> ;
	patch:remove [
%s
	] ;
	patch:add [
%s
	] .
)ri   )r   r   r   r   r   r   r   r
     s    
zRemote.patchc             C   s   |   d|||f ¡S )NzU
[]
	a patch:Set ;
	patch:subject <%s> ;
	patch:property <%s> ;
    patch:value %s .
)ri   )r   r   r   r   r   r   r   r     s    z
Remote.setc             C   s    |   dtj ||g¡||f ¡S )Nzt
[]
	a patch:Put ;
	patch:subject <%s> ;
	patch:body [
		a ingen:Arc ;
		ingen:tail <%s> ;
		ingen:head <%s> ;
	] .
)ri   r&   r,   Úcommonprefix)r   r   r   r   r   r   r     s    	zRemote.connectc             C   s   |   d||f ¡S )Nza
[]
	a patch:Delete ;
	patch:body [
		a ingen:Arc ;
		ingen:tail <%s> ;
		ingen:head <%s> ;
	] .
)ri   )r   r   r   r   r   r   r   $  s    zRemote.disconnectc             C   s   |   d| ¡S )Nz,
[]
	a patch:Delete ;
	patch:subject <%s> .
)ri   )r   r   r   r   r   r   /  s    zRemote.deleteN)r5   )r   r   r   r!   rN   rQ   rU   r[   r\   r]   re   rg   ri   r   r   r
   r   r   r   r   r   r   r   r   r4   ^   s"   

8
	r4   )r&   r   rG   rD   r(   ZStringIO.StringIOr   ÚImportErrorÚior   r   r    r   r-   r3   r4   r   r   r   r   Ú<module>   s   
