U
    
W[                     @   st   d Z ddlmZmZ ddlZddlmZ ddlmZm	Z	m
Z
 G dd de
jZG dd	 d	e
jZd
d Zdd ZdS )z]
Persistently cached objects for PB.

Maintainer: Glyph Lefkowitz

Future Plans: None known.
    )absolute_importdivisionN)defer)bananajellyflavorsc                   @   s@   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S )Publishablez;An object whose cached state persists across sessions.
    c                 C   s   |    || _d S )N)	republishpublishedID)selfr
    r   8/usr/lib/python3/dist-packages/twisted/spread/publish.py__init__   s    zPublishable.__init__c                 C   s   t   | _dS )zFSet the timestamp to current and (TODO) update all observers.
        N)time	timestampr   r   r   r   r	      s    zPublishable.republishc                 C   s
   |  |S )
(internal))getStateToPublishForr   perspectiver   r   r   view_getStateToPublish!   s    z"Publishable.view_getStateToPublishc                 C   s   |   S )zCImplement me to special-case your state for a perspective.
        )getStateToPublishr   r   r   r   r   %   s    z Publishable.getStateToPublishForc                 C   s   t d| j dS )zKImplement me to return state to copy as part of the publish phase.
        z%s.getStateToPublishForN)NotImplementedError	__class__r   r   r   r   r   *   s    zPublishable.getStateToPublishc                 C   s:   |r|j }| j}nd}d}t|| | j||| jdS )z?Get all necessary metadata to keep a clientside cache.
        None)remoter
   r   servicer   )ZperspectiveNameZ
getServiceZserviceNamer   Z	ViewPointr
   r   )r   r   ZobserverZpnameZsnamer   r   r   getStateToCacheAndObserveFor/   s    
z(Publishable.getStateToCacheAndObserveForN)
__name__
__module____qualname____doc__r   r	   r   r   r   r   r   r   r   r   r      s   r   c                   @   sJ   e Zd ZdZdZdZdddZdd Zdd	 Zd
d Z	dd Z
dd ZdS )RemotePublishedz;The local representation of remote Publishable object.
    r   pubc                 C   s   d| j | jt| j|f S )Nz%s-%s-%s.%s)r   r   strr
   )r   Zextr   r   r   getFileNameD   s    zRemotePublished.getFileNamec              	   C   s   | j | g | _z&t|  d}| }W 5 Q R X W n tk
rP   d}Y nX tt	
|}|j| jk}|r| |j  d| _n| jd| j d S )Nrbr      r   )__dict__update_activationListenersopenr%   readIOErrorr   Zunjellyr   decoder   _cbGotUpdate_wasCleanWhenLoadedr   Z
callRemoteaddCallbacks)r   statedataFiledataZrecentZnewselfr   r   r   setCopyableStateH   s    
z RemotePublished.setCopyableStatec                 C   s,   | j  }|d= |d= |d= |d= |d= |S )NZbrokerr   Zluidr*   isActivated)r(   copy)r   otherr   r   r   __getstate__Y   s    
zRemotePublished.__getstate__c              	   C   sh   | j | d| _| jD ]}||  qg | _|   t|  d}|t	t

|  W 5 Q R X d S )Nr'   wb)r(   r)   r6   r*   	activatedr+   r%   writer   encoder   )r   ZnewStateZlistenerr3   r   r   r   r/   d   s    

zRemotePublished._cbGotUpdatec                 C   s   dS )znImplement this method if you want to be notified when your
        publishable subclass is activated.
        Nr   r   r   r   r   r;   p   s    zRemotePublished.activatedc                 C   s    | j r||  n| j| dS )zcExternally register for notification when this publishable has received all relevant data.
        N)r6   r*   append)r   callbackr   r   r   callWhenActivatedu   s    
z!RemotePublished.callWhenActivatedN)r#   )r   r   r    r!   r6   r0   r%   r5   r9   r/   r;   r@   r   r   r   r   r"   ?   s   
r"   c                 C   s    t  }| jt|j|fd |S )aD  
    Wrap a deferred returned from a pb method in another deferred that
    expects a RemotePublished as a result.  This will allow you to wait until
    the result is really available.

    Idiomatic usage would look like::

        publish.whenReady(serverObject.getMeAPublishable()).addCallback(lookAtThePublishable)
    )ZcallbackArgs)r   ZDeferredr1   	_pubReadyZerrback)dd2r   r   r   	whenReady}   s
    

rD   c                 C   s   |  |j dS )r   N)r@   r?   )resultrC   r   r   r   rA      s    rA   )r!   Z
__future__r   r   r   Ztwisted.internetr   Ztwisted.spreadr   r   r   Z	Cacheabler   ZRemoteCacher"   rD   rA   r   r   r   r   <module>   s   *>