Changeset 28

Show
Ignore:
Timestamp:
02/18/02 21:24:46 (7 years ago)
Author:
sholloway
Message:

*** empty log message ***

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/RBFoundation/RBFoundation/SubjectObserver.py

    r27 r28  
    33#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    44 
    5 import weakref 
     5from Subject import Subject 
     6from CategorySubject import CategorySubject 
     7from Observer import Observer, AssociativeObserver 
     8from AttributedSubject import AttributedSubject, AttributedCategorySubject, t_AttributedSubject 
     9from BidableSubject import BidableSubject, BidableCategorySubject, t_BidableSubject 
    610 
    7 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    8 #~ Title  
    9 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     11AttributedBidableSubject = t_AttributedSubject(t_BidableSubject(Subject)) 
     12AttributedBidableCategorySubject = t_AttributedSubject(t_BidableSubject(CategorySubject)) 
    1013 
    11 class Subject(object): 
    12     def __init__(self): 
    13         self._observers = [] 
    14         self._cachedUpdates = {} 
    15         self._locked = [] 
    16  
    17     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    18     #~ Management  
    19     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    20      
    21     def AddObserver(self, observer, bUpdate=0, bCallAddSubject=1): 
    22         self._observers.append(weakref.ref(observer)) 
    23         if bCallAddSubject: 
    24             observer.AddSubject(self, bCallAddObserver=0) 
    25         if bUpdate: 
    26             self.UpdateObserver(observer, self._cachedUpdates) 
    27         return self 
    28  
    29     def RemoveObserver(self, observer): 
    30         wrobserver = weakref.ref(observer) 
    31         while wrobserver in self._observers: 
    32             self._observers.remove(wrobserver) 
    33         return self 
    34  
    35     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    36     #~ Update Callbacks 
    37     #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    38     
    39     def _ObserverList(self): 
    40         self._observers = [obs for obs in self._observers if obs()] 
    41         return self._observers 
    42  
    43     def UpdateObservers(self, **kw): 
    44         self.UpdateObserversEx(kw) 
    45  
    46     def UpdateObserversEx(self, kw): 
    47         self._cachedUpdates.update(kw) 
    48         if self._cachedUpdates and not self._locked: 
    49             _cachedUpdates, self._cachedUpdates = self._cachedUpdates, {} 
    50             lock = self.Lock() 
    51             for each in self._ObserverList(): 
    52                 self.UpdateObserver(each(), _cachedUpdates) 
    53  
    54     def UpdateObserver(self, observer, UpdateDict): 
    55         if observer: 
    56             observer.Update(self, UpdateDict) 
    57  
    58     def Lock(self): 
    59         class lock: 
    60             def __init__(self, lockedsubject): 
    61                 self.subject = lockedsubject 
    62                 self.subject._locked.append(id(self)) 
    63             def __del__(self): 
    64                 self.subject._locked.remove(id(self)) 
    65                 self.subject.UpdateObservers() 
    66         return lock(self) 
    67          
    68 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    69  
    70 class AttributedSubject(Subject): 
    71     def __init__(self): 
    72         Subject.__init__(self) 
    73         self._attributes = {} 
    74  
    75     def __getattribute__(self, name): 
    76         if '_' != name[0]: 
    77             result = self._attributes.get(name, None) 
    78             if result != None: 
    79                 return result 
    80         return Subject.__getattribute__(self, name) 
    81  
    82     def __setattr__(self, name, value): 
    83         if '_' != name[0]: 
    84             self._attributes[name] = value 
    85             apply(self.UpdateObservers, tuple(), {name: value}) 
    86         else: 
    87             return Subject.__setattr__(self, name, value) 
    88  
    89 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    90  
    91 class Observer(object): 
    92     def __init__(self, callback=None): 
    93         if callback: 
    94             self.SetUpdateCallback(callback) 
    95  
    96     def SetUpdateCallback(self, callback): 
    97         self.Update = callback 
    98         return self 
    99  
    100     def AddSubject(self, subject, bCallAddObserver=1): 
    101         if bCallAddObserver: 
    102             subject.AddObserver(self, bCallAddSubject=0) 
    103         return self 
    104  
    105     def Update(self, subject, UpdateDict): 
    106         print "On Update:", UpdateDict 
    107  
    108 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    109  
    110 class AssociativeObserver: 
    111     def __init__(self): 
    112         self._associations = {} 
    113  
    114     def AddSubject(self, subject, bCallAddObserver=1): 
    115         if bCallAddObserver: 
    116             subject.AddObserver(self, bCallAddSubject=0) 
    117         return self 
    118  
    119     def AddAssociation(self, Association, Callback): 
    120         self._associations.setdefault(Association, []).append(Callback) 
    121         return self 
    122  
    123     def Update(self, subject, UpdateDict): 
    124         for each in UpdateDict: 
    125             for callback in self._associations.get(each, []): 
    126                 callback(subject, each, UpdateDict[each]) 
     14BidableAttributedSubject = t_BidableSubject(t_AttributedSubject(Subject)) 
     15BidableAttributedCategorySubject = t_BidableSubject(t_AttributedSubject(CategorySubject)) 
    12716 
    12817#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    13524    def printo2(subject, UpdateDict): 
    13625        print "O2: ", UpdateDict 
    137     s1 = subject() 
    138     s2 = attributed_subject() 
    139     o1 = Observer(printo1).AddSubject(s1) 
    140     o2 = Observer(printo2).AddSubject(s1).AddSubject(s2) 
     26    def printo3(subject, UpdateDict): 
     27        print "O3: ", UpdateDict 
     28    s1 = Subject() 
     29    s2 = AttributedSubject() 
     30    s3 = AttributedCategorySubject() 
     31 
     32    o1 = Observer(printo1) 
     33    s1.AddObserver(o1) 
     34    o2 = Observer(printo2) 
     35    s1.AddObserver(o2) 
     36    s2.AddObserver(o2) 
    14137 
    14238    s1.UpdateObservers(Hello='World') 
     
    15248    print "Unlocked" 
    15349 
     50    o3 = Observer(printo3) 
     51    s3.AddObserver('CategoryA', o1) 
     52    s3.AddObserver('CategoryB', o2) 
     53    s3.AddObserver('CategoryC', o3) 
     54 
     55    s3.Nobody = 1 
     56    s3.CategoryA = 'Hello' 
     57    s3.CategoryC = 'Goodbye' 
     58 
    15459#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    15560 
  • trunk/RBFoundation/RBFoundation/XMLObjectify.py

    r27 r28  
    1111 
    1212class _Objectified(object): 
     13    _default_attributes = {} 
     14  
    1315    def __init__(self, owner, parent, namespace, node, attributes): 
    1416        self.__namespace__ = namespace 
    1517        self.__node__ = node 
    16         self._attributes = attributes 
     18        self._attributes = self._default_attributes.copy() 
     19        self._attributes.update(attributes) 
    1720        self._elements = [] 
    1821 
  • trunk/RBJabber/RBJabber/Client.py

    r27 r28  
    1212 
    1313class JabberNode(XMLObjectify._Objectified): 
    14  
    1514    def __init__(self, client, parent, namespace, node, attributes): 
    1615        self._client = weakref.proxy(client) 
    1716        XMLObjectify._Objectified.__init__(self, client, parent, namespace, node, attributes) 
    18          
     17 
     18#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     19 
     20class JabberClientNode(JabberNode): 
    1921    def _xmlInitComplete(self): 
    2022        if self.__namespace__ == 'jabber:client': 
     
    2325#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    2426 
    25 class JabberStream(JabberNode): 
     27class JabberStream(JabberClientNode): 
    2628    def _xmlInitStarted(self): 
    2729        self._client.stream.UpdateObservers(settings=self) 
    28  
    29     def _addElement(self, namespace, node, element): 
    30         pass 
    31  
    32     def _addData(self, data): 
    33         pass 
     30    def _addElement(self, namespace, node, element): pass 
     31    def _addData(self, data): pass 
    3432 
    3533#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    3634 
    37 class JabberStreamError(JabberNode): 
    38     eJabberStreamError = 'jabber_stream_error' 
     35class JabberStreamError(JabberClientNode): 
     36    eJabberStreamError = 'JabberStreamError' 
    3937 
    4038    def _xmlInitComplete(self): 
     
    4240        raise self.eJabberStreamError, ''.join(self._toXML()) 
    4341          
     42#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     43 
     44class JabberClientPresence(JabberClientNode): 
     45    _default_attributes = {'type':'available'} 
     46 
     47#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     48 
     49class JabberClientMessage(JabberClientNode): 
     50    _default_attributes = {'type':'message'} 
     51 
     52#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     53 
     54class JabberClientIQ(JabberClientNode): 
     55    _default_attributes = {} 
     56 
    4457#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    4558#~ Jabber Client Class 
     
    5164        ('http://etherx.jabber.org/streams', 'stream'): JabberStream, 
    5265        ('http://etherx.jabber.org/streams', 'error'): JabberStreamError, 
     66        ('jabber:client', 'presence'): JabberClientPresence, 
     67        ('jabber:client', 'message'): JabberClientMessage, 
     68        ('jabber:client', 'iq'): JabberClientIQ, 
    5369        } 
    5470 
     
    5773 
    5874    def __init__(self, *args, **kw): 
    59         self.stream = SubjectObserver.Subject() 
     75        self.stream = SubjectObserver.CategorySubject() 
    6076        apply(Base.Client.__init__, (self,) + args, kw) 
    6177         
  • trunk/RBJabber/RBJabber/PresenceMap.py

    r27 r28  
    2020            self.observer = SubjectObserver.AssociativeObserver() 
    2121            self.observer.AddAssociation('presence', self._OnPresence) 
    22         self.observer.AddSubject(client.stream
     22        client.stream.AddObserver('presence', self.observer
    2323        return self 
    2424 
  • trunk/RBJabber/RBJabber/Test.py

    r27 r28  
    6666        process = SmartSelect() 
    6767        obs = SubjectObserver.AssociativeObserver() 
    68         obs.AddSubject(jc.stream) 
     68        jc.stream.AddObserver('iq', obs) 
     69        jc.stream.AddObserver('message', obs) 
     70        jc.stream.AddObserver('presence', obs) 
    6971        obs.AddAssociation('iq', _printIQ) 
    7072        obs.AddAssociation('message', _printMessage) 
     
    7274        process.append(jc) 
    7375        for x in xrange(2): process(1) 
    74         jc.SendXML('''<presence type='available' />''') 
     76        #jc.SendXML('''<presence type='available' />''') 
    7577        for x in xrange(2): process(1) 
    7678 
  • trunk/RBJabber/RBJabber/iqQuery.py

    r27 r28  
    3030                # Unhook ourselves 
    3131                self.JC().stream.RemoveObserver(self) 
    32                 self.JC().stream.iq = None 
    3332                # Notify our callback 
    3433                self.ReplyCallback(subject, 'iq', iq) 
     
    4746        self._SetLink(1) 
    4847        # Lets observer the jabber stream 
    49         self.JC().stream.AddObserver(self, bCallAddSubject=0
     48        self.JC().stream.AddObserver('iq', self
    5049        # Setup our match attributes 
    5150        self.nsQuery = nsQuery 
  • trunk/RBJabber/RBJabber/iqResponse.py

    r27 r28  
    2626                # Unhook ourselves 
    2727                self.JC().stream.RemoveObserver(self) 
    28                 self.JC().stream.iq = None 
    2928                # Notify our callback 
    3029                self.ReplyCallback(subject, 'iq', iq) 
     
    4140        self._SelfLink(1) 
    4241        # Lets observer the jabber stream 
    43         self.JC().stream.AddObserver(self, bCallAddSubject=0
     42        self.JC().stream.AddObserver('iq', self
    4443        # Setup our match attributes 
    4544        self.nsQuery = nsQuery 
  • trunk/RBSkinning/RBSkinning/SkinObject.py

    r20 r28  
    2020 
    2121    default_settings = {} 
    22     #__nCount = 0 
    2322 
    2423    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
     
    4039 
    4140        self.object = None 
    42         #SkinObject.__nCount += 1 
    4341 
     42    #    SkinObject.__nCount += 1 
     43    #__nCount = 0 
    4444    #def __del__(self): 
    4545    #    SkinObject.__nCount -= 1