
    Ϫf,                         d Z ddlZddlmZ ddlmZmZmZ  G d dej                        Z	 G d dej                        Zd	 Zd
 Zy)z]
Persistently cached objects for PB.

Maintainer: Glyph Lefkowitz

Future Plans: None known.
    N)defer)bananaflavorsjellyc                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	Publishablez6An object whose cached state persists across sessions.c                 2    | j                          || _        y )N)	republishpublishedID)selfr   s     8/usr/lib/python3/dist-packages/twisted/spread/publish.py__init__zPublishable.__init__   s    &    c                 6    t        j                          | _        y)z=Set the timestamp to current and (TODO) update all observers.N)time	timestampr   s    r   r
   zPublishable.republish   s    r   c                 $    | j                  |      S )
(internal))getStateToPublishForr   perspectives     r   view_getStateToPublishz"Publishable.view_getStateToPublish   s    ((55r   c                 "    | j                         S )z:Implement me to special-case your state for a perspective.)getStateToPublishr   s     r   r   z Publishable.getStateToPublishFor#   s    %%''r   c                 2    t        d| j                  z        )zBImplement me to return state to copy as part of the publish phase.z%s.getStateToPublishFor)NotImplementedError	__class__r   s    r   r   zPublishable.getStateToPublish'   s    !";dnn"LMMr   c                     |r'|j                   }|j                         j                  }nd}d}t        j                  ||       | j
                  ||| j                  dS )z6Get all necessary metadata to keep a clientside cache.None)remoter   r   servicer   )perspectiveName
getServiceserviceNamer   	ViewPointr   r   )r   r   observerpnamesnames        r   getStateToCacheAndObserveForz(Publishable.getStateToCacheAndObserveFor+   s`    //E**,88EEE ''T:++ 
 	
r   N)
__name__
__module____qualname____doc__r   r
   r   r   r   r*    r   r   r   r      s$    @'%6(N
r   r   c                   >    e Zd ZdZdZdZd
dZd Zd Zd Z	d Z
d Zy	)RemotePublishedz6The local representation of remote Publishable object.r   c                 x    dj                  | j                  | j                  t        | j                        |      S )Nz{}-{}-{}.{})formatr"   r   strr   )r   exts     r   getFileNamezRemotePublished.getFileNameC   s6    ##LL  !	
 	
r   c                    | j                   j                  |       g | _        	 t        | j	                         d      5 }|j                         }d d d        t        j                  t        j                              }|j                  | j                  k(  }|r#| j                  j                          d| _        y | j                  j                  d      j!                  | j                         y # 1 sw Y   xY w# t        $ r d}Y sw xY w)Nrbr      r   )__dict__update_activationListenersopenr6   readr   unjellyr   decoder   OSError_cbGotUpdate_wasCleanWhenLoadedr!   
callRemoteaddCallbacks)r   statedataFiledatanewselfrecents         r   setCopyableStatez RemotePublished.setCopyableStateK   s    U#$&!	9d&&($/ '8}}'
 mmFMM$$78G&&$..8Fg../'(D$KK""#67DDTEVEVW' ' 	F	s(   C> C2C> 2C;7C> >DDc                 X    | j                   j                         }|d= |d= |d= |d= |d= |S )Nbrokerr!   luidr<   isActivated)r:   copy)r   others     r   __getstate__zRemotePublished.__getstate__\   s?    ""$(O(O&M()- r   c                 t   | j                   j                  |       d| _        | j                  D ]
  } ||         g | _        | j	                          t        | j                         d      5 }|j                  t        j                  t        j                  |                    d d d        y # 1 sw Y   y xY w)Nr9   wb)r:   r;   rO   r<   	activatedr=   r6   writer   encoder   )r   newStatelistenerrG   s       r   rB   zRemotePublished._cbGotUpdateg   s    X&11 	HTN	$&!$""$d+ 	=xNN6==T):;<	= 	= 	=s   -8B..B7c                      y)znImplement this method if you want to be notified when your
        publishable subclass is activated.
        Nr/   r   s    r   rU   zRemotePublished.activatedr   s    r   c                 d    | j                   r	 ||        y| j                  j                  |       y)zZExternally register for notification when this publishable has received all relevant data.N)rO   r<   append)r   callbacks     r   callWhenActivatedz!RemotePublished.callWhenActivatedw   s&    TN%%,,X6r   N)pub)r+   r,   r-   r.   rO   rC   r6   rK   rR   rB   rU   r^   r/   r   r   r1   r1   =   s/    @K
X"		=
7r   r1   c                 t    t        j                         }| j                  t        |j                  |f       |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)
    )callbackArgs)r   DeferredrE   	_pubReadyerrback)dd2s     r   	whenReadyrg      s-     
	BNN9bjjuN=Ir   c                 :    | j                  |j                         y)r   N)r^   r]   )resultrf   s     r   rc   rc      s    
R[[)r   )r.   r   twisted.internetr   twisted.spreadr   r   r   	Cacheabler   RemoteCacher1   rg   rc   r/   r   r   <module>rn      sH   
  " 1 1&
'## &
R?7g)) ?7D*r   