3
Z_ð]  ã               @   sŠ   d dl Z d dlZd dlmZmZmZmZmZ d dlm	Z	m
Z
mZmZ d dlmZ d dlZddgZejZG dd„ deƒZG dd	„ d	eƒZdS )
é    N)Ú_operation_on_closed_fileÚgreenpipe_docÚset_nonblockingÚsocketÚSOCKET_BLOCKING)Ú
trampolineÚnotify_closeÚnotify_openedÚIOClosed)Ú	get_errnoÚ_fileobjectÚ	GreenPipec                   s’   e Zd ZeZd‡ fdd„	Zedd„ ƒZdd„ Z‡ fd	d
„Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zd dd„Zeeddƒr‚d"dd„Zdd„ Z‡  ZS )#r   Úré   c                s¾   t |tjttf ƒs td| ƒ‚t |tjƒr8t||dƒ}t |tƒrR|}d| | _nBtj	|j
ƒ ƒ}|j| _|j|kr„td|j|f ƒ‚|j| _|jƒ  tt| ƒjt|ƒ||ƒ t| ƒ d| _d S )Nz2f(ile) should be int, str, unicode or file, not %rr   z<fd:%d>z-file.mode %r does not match mode parameter %r)Ú
isinstanceÚsixÚstring_typesÚintÚfileÚ	TypeErrorÚopenÚ_nameÚosÚdupÚfilenoÚnameÚmodeÚ
ValueErrorÚcloseÚsuperr   Ú__init__Ú_SocketDuckForFdr   Ú	softspace)ÚselfÚfr   Úbufsizer   )Ú	__class__© ú8/tmp/pip-build-yz_zf6az/eventlet/eventlet/greenio/py2.pyr       s     

zGreenPipe.__init__c             C   s   | j S )N)r   )r#   r'   r'   r(   r   .   s    zGreenPipe.namec             C   sB   d| j rdpd| jj| j| jt| ƒdk r6tjt| ƒ p<t| ƒf S )Nz<%s %s %r, mode %r at 0x%x>Úclosedr   r   )r)   r&   Ú__name__r   r   ÚidÚsysZmaxint)r#   r'   r'   r(   Ú__repr__2   s    zGreenPipe.__repr__c                s,   t t| ƒjƒ  xdD ]}t| |tƒ qW d S )Nr   ÚflushÚisattyÚnextÚreadÚreadintoÚreadlineÚ	readlinesÚseekÚtellÚtruncateÚwriteÚ
xreadlinesÚ__iter__Ú__next__Ú
writelines)r   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   )r   r   r   Úsetattrr   )r#   Úmethod)r&   r'   r(   r   :   s      zGreenPipe.closec             C   s   | S )Nr'   )r#   r'   r'   r(   Ú	__enter__B   s    zGreenPipe.__enter__c             G   s   | j ƒ  d S )N)r   )r#   Úargsr'   r'   r(   Ú__exit__E   s    zGreenPipe.__exit__c             C   s   t | jjƒ ƒS )N)ÚlenZ_rbufÚgetvalue)r#   r'   r'   r(   Ú_get_readahead_lenH   s    zGreenPipe._get_readahead_lenc             C   s   | j ƒ }|dkr| j|ƒ d S )Nr   )rD   r1   )r#   rB   r'   r'   r(   Ú_clear_readahead_bufK   s    zGreenPipe._clear_readahead_bufc             C   sT   | j ƒ  ytj| jƒ ddƒ| jƒ  S  tk
rN } zt|jŽ ‚W Y d d }~X nX d S )Nr   r   )r.   r   Úlseekr   rD   ÚOSErrorÚIOErrorr@   )r#   Úer'   r'   r(   r6   P   s
    zGreenPipe.tellr   c             C   sˆ   | j ƒ  |dkr |dkr | jƒ S |dkr4|| jƒ 8 }ytj| jƒ ||ƒ}W n, tk
rv } zt|jŽ ‚W Y d d }~X nX | j	ƒ  |S d S )Nr   r   )
r.   r6   rD   r   rF   r   rG   rH   r@   rE   )r#   ÚoffsetÚwhenceÚrvrI   r'   r'   r(   r5   W   s    zGreenPipe.seekr7   Nc             C   sl   | j ƒ  |dkr| jƒ }ytj| jƒ |ƒ}W n, tk
rX } zt|jŽ ‚W Y d d }~X nX | j|ƒ |S d S )Nr   éÿÿÿÿ)	r.   r6   r   Ú	ftruncater   rG   rH   r@   r5   )r#   ÚsizerL   rI   r'   r'   r(   r7   f   s    
zGreenPipe.truncatec             C   s@   yt j| jƒ ƒS  tk
r: } zt|jŽ ‚W Y d d }~X nX d S )N)r   r/   r   rG   rH   r@   )r#   rI   r'   r'   r(   r/   r   s    zGreenPipe.isattyrM   )r   rM   )r   rM   )rM   )r*   Ú
__module__Ú__qualname__r   Ú__doc__r    Úpropertyr   r-   r   r?   rA   rD   rE   r6   r5   Úgetattrr   r7   r/   Ú__classcell__r'   r'   )r&   r(   r      s   

c               @   sŒ   e Zd ZdZdZdd„ Zd!dd„Zd	d
„ Zedd„ ƒZ	dd„ Z
d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S )#r!   zuClass implementing all socket method used by _fileobject
    in cooperative manner using low level os I/O calls.
    r   c             C   s   || _ t|ƒ d| _d S )NF)Ú_filenor	   Ú_closed)r#   r   r'   r'   r(   r       s    z_SocketDuckForFd.__init__FNc             C   sF   | j rtƒ ‚yt|||||| jd�S  tk
r@   | jƒ  ‚ Y nX d S )N)r1   r8   ÚtimeoutÚtimeout_excZmark_as_closed)rW   r
   r   Ú_mark_as_closed)r#   Úfdr1   r8   rX   rY   r'   r'   r(   Ú_trampoline„   s    

z_SocketDuckForFd._trampolinec             C   s   | j }d| _ |S )NT)rW   )r#   Úcurrentr'   r'   r(   rZ   ’   s    z _SocketDuckForFd._mark_as_closedc             C   s   | S )Nr'   )r#   r'   r'   r(   Ú_sock—   s    z_SocketDuckForFd._sockc             C   s   | j S )N)rV   )r#   r'   r'   r(   r   ›   s    z_SocketDuckForFd.filenoc             C   sd   x^yt j| j|ƒ}|S  tk
rL } zt|ƒtkr<t|jŽ ‚W Y d d }~X nX | j| dd� qW d S )NT)r1   )	r   r1   rV   rG   r   r   rH   r@   r\   )r#   ÚbuflenÚdatarI   r'   r'   r(   Úrecvž   s    z_SocketDuckForFd.recvc             C   s.   |dkrt |ƒ}| j|ƒ}||d |…< t |ƒS )Nr   )rB   ra   )r#   ÚbufÚnbytesÚflagsr`   r'   r'   r(   Ú	recv_into¨   s
    
z_SocketDuckForFd.recv_intoc             C   s`   xZyt j| j|ƒS  tk
rV } z*t|ƒtkr:t|jŽ ‚nt| dd� W Y d d }~X qX qW d S )NT)r8   )	r   r8   rV   rG   r   r   rH   r@   r   )r#   r`   rI   r'   r'   r(   Úsend¯   s    z_SocketDuckForFd.sendc             C   sØ   t |ƒ}tj}| j}y|||ƒ}W n> tk
r` } z"t|ƒtjkrLt|j	Ž ‚d}W Y d d }~X nX xp||k rÒ| j
| dd� y|||||d … ƒ7 }W qd tk
rÎ } zt|ƒtjkr¾t|j	Ž ‚W Y d d }~X qdX qdW d S )Nr   T)r8   )rB   r   r8   rV   rG   r   ÚerrnoÚEAGAINrH   r@   r\   )r#   r`   Zlen_dataZos_writer   Ú
total_sentrI   r'   r'   r(   Úsendall¹   s     

z_SocketDuckForFd.sendallc             C   s   | j ƒ  d S )N)Ú_close)r#   r'   r'   r(   Ú__del__Ë   s    z_SocketDuckForFd.__del__c          	   C   s<   | j ƒ }|rd S t| jƒ ytj| jƒ W n   Y nX d S )N)rZ   r   rV   r   r   )r#   Z
was_closedr'   r'   r(   rk   Î   s    
z_SocketDuckForFd._closec             C   s   d| j j| jf S )Nz%s:%d)r&   r*   rV   )r#   r'   r'   r(   r-   Ú   s    z_SocketDuckForFd.__repr__c             C   s   |  j d7  _ d S )Nr   )Ú	_refcount)r#   r'   r'   r(   Ú_reuseÝ   s    z_SocketDuckForFd._reusec             C   s$   |  j d8  _ | j dkr | jƒ  d S )Nr   r   )rm   rk   )r#   r'   r'   r(   Ú_dropà   s    
z_SocketDuckForFd._drop)FFNN)r   r   )r*   rP   rQ   rR   rm   r    r\   rZ   rS   r^   r   ra   re   rf   rj   rl   rk   r-   rn   ro   r'   r'   r'   r(   r!   y   s    



r!   )rg   r   Zeventlet.greenio.baser   r   r   r   r   Zeventlet.hubsr   r   r	   r
   Zeventlet.supportr   r   Ú__all__r   r   Úobjectr!   r'   r'   r'   r(   Ú<module>   s   e