U
    luf                     @   s   d Z ddlZddlm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azddlmZ W n ek
rx   eZY nX d	d
 Zdd ZG dd deZeZddgZdS )zDummy Frame object    N)Event)ETERM   )ffi)lib)
bufferablec                 C   s*   t | tkr| S t| ts"t| } |  S )zReturn content of obj as bytes)typebytes
isinstance
memoryviewtobytes)obj r   </tmp/pip-unpacked-wheel-h6ekxre8/zmq/backend/cffi/message.py_content   s
    
r   c                 C   sf   t  }| dkrb|tjkr(tj|n:|tjkr@tjtn"|t	krVtj
|ntj|dS )Nr   )CZ	zmq_errnoerrnoZEINTRzmqerrorZInterrruptedSystemCallEAGAINZAgainr   ZContextTerminatedZZMQError)rcerrr   r   r   	_check_rc!   s    

r   c                   @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZdddZdd Zdd Zd	d
 Zedd Zedd Zdd Zdd Zdd Zedd Zdd Zdd Zdd ZdS )FrameNFc           
      C   s  d| _ tdttd| _|r,tj| _	t
|tr>td|d krdt| j}t| d| _ d S || _t|tkr||| _t|| _t| j}| jj}|d kr|r||k rd}nd}|rt| j|}t| | jtt| j|d d < d| _ d S |rt }|| _t|| _	td kr.ddlma tdttd	}	t || j|	d _!tj"slt# t_"td
tj"|	d _$tdtj%j&|	d _'t(| j|||	}|dkrt)|	 t)| j t| d| _ d S )NTzzmq_msg_t[1]Z	zmq_msg_tz@Unicode strings are not allowed. Only: bytes, buffer interfaces.Fr   )gczzhint[1]Zzhintzmutex_t*zvoid*)*_failed_initr   castr   Zmallocsizeofzmq_msgr   Z_FINISHED_TRACKERtrackerr
   str	TypeErrorZzmq_msg_initr   _datar   r	   _bytesr   _bufferfrom_buffernbytesZzmq_msg_init_sizebufferzmq_msg_datar   tracker_eventZMessageTrackerzmq_gcZzmq.utils.garbager   storeidZ_push_mutexZmutex_allocatemutexZ_push_socketZ
underlyingsockZzmq_wrap_msg_init_datafree)
selfdatatrackcopyZcopy_thresholdr   Zc_dataZ
data_len_cZevthintr   r   r   __init__:   sh    





zFrame.__init__c                 C   s   | j s| js|   d S N)closedr   closer1   r   r   r   __del__   s    zFrame.__del__c                 C   sR   | j s| js| jd krd S d| _ t| j}t| j d | _|dkrNt| d S )NTr   )r8   r   r   r   Zzmq_msg_closer0   r   )r1   r   r   r   r   r9      s    zFrame.closec                 C   sB   | j dkr(tt| jt| j| _ | jdkr>t| j | _dS )zQone-time extract buffer from zmq_msg

        for Frames created by recv
        N)	r#   r   r(   r   r)   r   Zzmq_msg_sizer%   r   r:   r   r   r   _buffer_from_zmq_msg   s    

 

zFrame._buffer_from_zmq_msgc                 C   s   | j d kr|   | j S r7   )r%   r<   r:   r   r   r   r(      s    
zFrame.bufferc                 C   s   | j d kr| j | _ | j S r7   )r$   r(   r   r:   r   r   r   r	      s    
zFrame.bytesc                 C   s   | j jS r7   )r(   r'   r:   r   r   r   __len__   s    zFrame.__len__c                 C   s   | j t|kS r7   )r	   r   )r1   otherr   r   r   __eq__   s    zFrame.__eq__c                 C   s
   | j  S r7   )r	   decoder:   r   r   r   __str__   s    zFrame.__str__c                 C   s
   | j  S r7   )r    doner:   r   r   r   rB      s    z
Frame.donec                 C   s   | j S r7   )r(   )r1   flagsr   r   r   
__buffer__   s    zFrame.__buffer__c                 C   s   |   S )a<  Create a shallow copy of the message.

        This does not copy the contents of the Frame, just the pointer.
        This will increment the 0MQ ref count of the message, but not
        the ref count of the Python object. That is only done once when
        the Python is first turned into a 0MQ message.
        )	fast_copyr:   r   r   r   __copy__   s    zFrame.__copy__c                 C   s:   t  }t|j| j | j|_| j|_| j|_| j|_|S )zPFast shallow copy of the Frame.

        Does not copy underlying data.
        )r   r   Zzmq_msg_copyr   r#   r%   r*   r    )r1   Znew_msgr   r   r   rE      s    zFrame.fast_copy)NFNN)__name__
__module____qualname__r#   r    r8   Zmorer%   r$   r   r*   r   r6   r;   r9   r<   propertyr(   r	   r=   r?   rA   rB   rD   rF   rE   r   r   r   r   r   /   s2   
Q




r   Message)__doc__r   	threadingr   r   Z	zmq.errorZzmq.constantsr   Z_cffir   r   r   r+   Z__pypy__.bufferabler   Zmaybe_bufferableImportErrorobjectr   r   r   rK   __all__r   r   r   r   <module>   s$   
	 1