
    \d,                         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dS )z]
Persistently cached objects for PB.

Maintainer: Glyph Lefkowitz

Future Plans: None known.
    N)defer)bananaflavorsjellyc                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	Publishablez6An object whose cached state persists across sessions.c                 <    |                                   || _        d S )N)	republishpublishedID)selfr   s     6lib/python3.11/site-packages/twisted/spread/publish.py__init__zPublishable.__init__   s     &    c                 6    t          j                     | _        dS )z=Set the timestamp to current and (TODO) update all observers.N)time	timestampr   s    r   r
   zPublishable.republish   s    r   c                 ,    |                      |          S )
(internal))getStateToPublishForr   perspectives     r   view_getStateToPublishz"Publishable.view_getStateToPublish   s    ((555r   c                 *    |                                  S )z:Implement me to special-case your state for a perspective.)getStateToPublishr   s     r   r   z Publishable.getStateToPublishFor#   s    %%'''r   c                 0    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    !";dn"LMMMr   c                     |r!|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+   sd     	/E**,,8EEEE 'T::+ 
 
 	
r   N)
__name__
__module____qualname____doc__r   r
   r   r   r   r*    r   r   r   r      sw        @@' ' '% % %6 6 6( ( (N N 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d
S )RemotePublishedz6The local representation of remote Publishable object.r   pubc                 j    d                     | j        | j        t          | j                  |          S )Nz{}-{}-{}.{})formatr"   r   strr   )r   exts     r   getFileNamezRemotePublished.getFileNameC   s6    ##L !!	
 
 	
r   c                 &   | j                             |           g | _        	 t          |                                 d          5 }|                                }d d d            n# 1 swxY w Y   t          j        t          j	        |                    }|j
        | j
        k    }n# t          $ r d}Y nw xY w|r#|                     |j                    d| _        d S | j                            d                              | j                   d S )Nrbr      r   )__dict__update_activationListenersopenr7   readr   unjellyr   decoder   OSError_cbGotUpdate_wasCleanWhenLoadedr!   
callRemoteaddCallbacks)r   statedataFiledatanewselfrecents         r   setCopyableStatez RemotePublished.setCopyableStateK   sP   U###$&!	9d&&(($// '8}}' ' ' ' ' ' ' ' ' ' ' ' ' ' '
 mFM$$7$788G&$.8FF	  	 	 	FFF	
  	Xg.///'(D$$$K""#677DDTEVWWWWWs5   "B( A&B( &A**B( -A*.B( (B76B7c                 V    | 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                    | j                             |           d| _        | j        D ]} ||            g | _        |                                  t          |                                 d          5 }|                    t          j	        t          j
        |                                d d d            d S # 1 swxY w Y   d S )Nr:   wb)r;   r<   rP   r=   	activatedr>   r7   writer   encoder   )r   newStatelistenerrH   s       r   rC   zRemotePublished._cbGotUpdateg   s    X&&&1 	 	HHTNNNN$&!$""$$d++ 	=xNN6=T):):;;<<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=s   4:B;;B?B?c                     dS )znImplement this method if you want to be notified when your
        publishable subclass is activated.
        Nr/   r   s    r   rV   zRemotePublished.activatedr   s      r   c                 b    | j         r ||            dS | j                            |           dS )zZExternally register for notification when this publishable has received all relevant data.N)rP   r=   append)r   callbacks     r   callWhenActivatedz!RemotePublished.callWhenActivatedw   s;     	7HTNNNNN%,,X66666r   N)r2   )r+   r,   r-   r.   rP   rD   r7   rL   rS   rC   rV   r_   r/   r   r   r1   r1   =   s        @@K
 
 
 
X X X"	 	 		= 	= 	=  
7 7 7 7 7r   r1   c                 r    t          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   DeferredrF   	_pubReadyerrback)dd2s     r   	whenReadyrg      s2     
		BNN9bjuN===Ir   c                 :    |                      |j                   dS )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      s   
   " " " " " " 1 1 1 1 1 1 1 1 1 1&
 &
 &
 &
 &
'# &
 &
 &
R?7 ?7 ?7 ?7 ?7g) ?7 ?7 ?7D  * * * * *r   