Changeset 28
- Timestamp:
- 02/18/02 21:24:46 (7 years ago)
- Files:
-
- trunk/RBFoundation/RBFoundation/AttributedSubject.py (added)
- trunk/RBFoundation/RBFoundation/BidableSubject.py (added)
- trunk/RBFoundation/RBFoundation/CategorySubject.py (added)
- trunk/RBFoundation/RBFoundation/Observer.py (added)
- trunk/RBFoundation/RBFoundation/Subject.py (added)
- trunk/RBFoundation/RBFoundation/SubjectObserver.py (modified) (3 diffs)
- trunk/RBFoundation/RBFoundation/XMLObjectify.py (modified) (1 diff)
- trunk/RBJabber/RBJabber/Client.py (modified) (5 diffs)
- trunk/RBJabber/RBJabber/PresenceMap.py (modified) (1 diff)
- trunk/RBJabber/RBJabber/Test.py (modified) (2 diffs)
- trunk/RBJabber/RBJabber/iqQuery.py (modified) (2 diffs)
- trunk/RBJabber/RBJabber/iqResponse.py (modified) (2 diffs)
- trunk/RBSkinning/RBSkinning/SkinObject.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBFoundation/RBFoundation/SubjectObserver.py
r27 r28 3 3 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4 4 5 import weakref 5 from Subject import Subject 6 from CategorySubject import CategorySubject 7 from Observer import Observer, AssociativeObserver 8 from AttributedSubject import AttributedSubject, AttributedCategorySubject, t_AttributedSubject 9 from BidableSubject import BidableSubject, BidableCategorySubject, t_BidableSubject 6 10 7 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 8 #~ Title 9 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 11 AttributedBidableSubject = t_AttributedSubject(t_BidableSubject(Subject)) 12 AttributedBidableCategorySubject = t_AttributedSubject(t_BidableSubject(CategorySubject)) 10 13 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]) 14 BidableAttributedSubject = t_BidableSubject(t_AttributedSubject(Subject)) 15 BidableAttributedCategorySubject = t_BidableSubject(t_AttributedSubject(CategorySubject)) 127 16 128 17 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 135 24 def printo2(subject, UpdateDict): 136 25 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) 141 37 142 38 s1.UpdateObservers(Hello='World') … … 152 48 print "Unlocked" 153 49 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 154 59 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 155 60 trunk/RBFoundation/RBFoundation/XMLObjectify.py
r27 r28 11 11 12 12 class _Objectified(object): 13 _default_attributes = {} 14 13 15 def __init__(self, owner, parent, namespace, node, attributes): 14 16 self.__namespace__ = namespace 15 17 self.__node__ = node 16 self._attributes = attributes 18 self._attributes = self._default_attributes.copy() 19 self._attributes.update(attributes) 17 20 self._elements = [] 18 21 trunk/RBJabber/RBJabber/Client.py
r27 r28 12 12 13 13 class JabberNode(XMLObjectify._Objectified): 14 15 14 def __init__(self, client, parent, namespace, node, attributes): 16 15 self._client = weakref.proxy(client) 17 16 XMLObjectify._Objectified.__init__(self, client, parent, namespace, node, attributes) 18 17 18 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 19 20 class JabberClientNode(JabberNode): 19 21 def _xmlInitComplete(self): 20 22 if self.__namespace__ == 'jabber:client': … … 23 25 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 24 26 25 class JabberStream(Jabber Node):27 class JabberStream(JabberClientNode): 26 28 def _xmlInitStarted(self): 27 29 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 34 32 35 33 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 36 34 37 class JabberStreamError(Jabber Node):38 eJabberStreamError = ' jabber_stream_error'35 class JabberStreamError(JabberClientNode): 36 eJabberStreamError = 'JabberStreamError' 39 37 40 38 def _xmlInitComplete(self): … … 42 40 raise self.eJabberStreamError, ''.join(self._toXML()) 43 41 42 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 43 44 class JabberClientPresence(JabberClientNode): 45 _default_attributes = {'type':'available'} 46 47 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 48 49 class JabberClientMessage(JabberClientNode): 50 _default_attributes = {'type':'message'} 51 52 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 54 class JabberClientIQ(JabberClientNode): 55 _default_attributes = {} 56 44 57 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 58 #~ Jabber Client Class … … 51 64 ('http://etherx.jabber.org/streams', 'stream'): JabberStream, 52 65 ('http://etherx.jabber.org/streams', 'error'): JabberStreamError, 66 ('jabber:client', 'presence'): JabberClientPresence, 67 ('jabber:client', 'message'): JabberClientMessage, 68 ('jabber:client', 'iq'): JabberClientIQ, 53 69 } 54 70 … … 57 73 58 74 def __init__(self, *args, **kw): 59 self.stream = SubjectObserver. Subject()75 self.stream = SubjectObserver.CategorySubject() 60 76 apply(Base.Client.__init__, (self,) + args, kw) 61 77 trunk/RBJabber/RBJabber/PresenceMap.py
r27 r28 20 20 self.observer = SubjectObserver.AssociativeObserver() 21 21 self.observer.AddAssociation('presence', self._OnPresence) 22 self.observer.AddSubject(client.stream)22 client.stream.AddObserver('presence', self.observer) 23 23 return self 24 24 trunk/RBJabber/RBJabber/Test.py
r27 r28 66 66 process = SmartSelect() 67 67 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) 69 71 obs.AddAssociation('iq', _printIQ) 70 72 obs.AddAssociation('message', _printMessage) … … 72 74 process.append(jc) 73 75 for x in xrange(2): process(1) 74 jc.SendXML('''<presence type='available' />''')76 #jc.SendXML('''<presence type='available' />''') 75 77 for x in xrange(2): process(1) 76 78 trunk/RBJabber/RBJabber/iqQuery.py
r27 r28 30 30 # Unhook ourselves 31 31 self.JC().stream.RemoveObserver(self) 32 self.JC().stream.iq = None33 32 # Notify our callback 34 33 self.ReplyCallback(subject, 'iq', iq) … … 47 46 self._SetLink(1) 48 47 # Lets observer the jabber stream 49 self.JC().stream.AddObserver( self, bCallAddSubject=0)48 self.JC().stream.AddObserver('iq', self) 50 49 # Setup our match attributes 51 50 self.nsQuery = nsQuery trunk/RBJabber/RBJabber/iqResponse.py
r27 r28 26 26 # Unhook ourselves 27 27 self.JC().stream.RemoveObserver(self) 28 self.JC().stream.iq = None29 28 # Notify our callback 30 29 self.ReplyCallback(subject, 'iq', iq) … … 41 40 self._SelfLink(1) 42 41 # Lets observer the jabber stream 43 self.JC().stream.AddObserver( self, bCallAddSubject=0)42 self.JC().stream.AddObserver('iq', self) 44 43 # Setup our match attributes 45 44 self.nsQuery = nsQuery trunk/RBSkinning/RBSkinning/SkinObject.py
r20 r28 20 20 21 21 default_settings = {} 22 #__nCount = 023 22 24 23 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 40 39 41 40 self.object = None 42 #SkinObject.__nCount += 143 41 42 # SkinObject.__nCount += 1 43 #__nCount = 0 44 44 #def __del__(self): 45 45 # SkinObject.__nCount -= 1
