Changeset 32
- Timestamp:
- 02/19/02 23:39:40 (7 years ago)
- Files:
-
- trunk/RBFoundation/RBFoundation/XMLObjectify.py (modified) (1 diff)
- trunk/RBJabber/RBJabber/PresenceMap.py (modified) (1 diff)
- trunk/RBJabber/RBJabber/SubjectObserver/BidableSubject.py (modified) (1 diff)
- trunk/RBJabber/RBJabber/Test.py (modified) (4 diffs)
- trunk/RBJabber/RBJabber/iqQuery.py (modified) (3 diffs)
- trunk/RBJabber/RBJabber/iqResponse.py (modified) (3 diffs)
- trunk/RBJabber/RBJabber/iqTimeResponse.py (added)
- trunk/RBJabber/RBJabber/iqVersionResponse.py (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBFoundation/RBFoundation/XMLObjectify.py
r28 r32 64 64 return self._elements[-1] 65 65 66 def _addNewElement(self, namespace, node, **attributes): 67 namespace = namespace or self.__namespace__ 68 return self._addElement(namespace, node, _Objectified(self, self, namespace, node, attributes)) 69 66 70 def _addData(self, data): 67 71 self._elements.append(((self.__namespace__, ''), data)) trunk/RBJabber/RBJabber/PresenceMap.py
r28 r32 3 3 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4 4 5 from Foundation.Jabber.Base import reJabberJID 6 from Foundation import SubjectObserver 5 import weakref 7 6 8 7 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 9 8 10 class PresenceMap(dict): 11 observer = None 9 class PresenceMap: 10 def __init__(self, JC): 11 JC.stream.AddObserver('presence', self) 12 self.Map = {} 12 13 13 class PresenceSubject(dict, SubjectObserver.Subject): 14 def _setPresence(self, resource, presence): 15 self[resource] = presence 16 apply(self.UpdateObservers, tuple(), {resource: presence}) 14 def Update(self, subject, UpdateDict): 15 presence = UpdateDict.get('presence', None) 16 self.Map[presence.from_] = presence 17 17 18 def AddClient(self, client):19 if not self.observer:20 self.observer = SubjectObserver.AssociativeObserver()21 self.observer.AddAssociation('presence', self._OnPresence)22 client.stream.AddObserver('presence', self.observer)23 return self24 25 def _OnPresence(self, ClientStream, strPresnece, presence):26 subject, resource = self.GetPresenceSubject(presence.from_)27 subject[resource] = presence28 29 def GetPresenceSubject(self, JID):30 lstJID = reJabberJID.split(JID)[1:-1]31 JIDNoResource = '%s@%s' % tuple(lstJID[:2])32 resource = '/'.join([x for x in lstJID[2:] if x]) or None33 return self.setdefault(JIDNoResource, self.PresenceSubject()), resource34 35 def GetPresence(self, JID):36 subject, resource = self.GetPresenceSubject(JID)37 return subject.get(resource, None)38 39 trunk/RBJabber/RBJabber/SubjectObserver/BidableSubject.py
r30 r32 22 22 def UpdateObserver(self, observer, UpdateDict): 23 23 if observer: 24 priority = getattr(observer, 'Bid', 0) 25 if callable(priority): 26 priority = priority(self, UpdateDict) 27 if not self._bids or (priority > self._bids[0]): 28 self._bids = priority, [observer] 29 elif priority == self._bids[0]: 30 self._bids[-1].append(observer) 24 priority = getattr(observer, 'Bid', None) 25 if priority is None: 26 # This client does not payattention to bids... 27 observer.Update(self, UpdateDict) 28 else: 29 if callable(priority): 30 priority = priority(self, UpdateDict) 31 if priority: 32 if priority > self._bids[0]: 33 self._bids = priority, [observer] 34 elif priority == self._bids[0]: 35 self._bids[-1].append(observer) 31 36 return BidableSubjectMixin 32 37 trunk/RBJabber/RBJabber/Test.py
r28 r32 4 4 from iqQuery import iqQuery 5 5 from iqResponse import iqResponse 6 from iqTimeResponse import iqTimeResponse 7 from iqVersionResponse import iqVersionResponse 8 from pprint import pprint 6 9 7 10 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 25 28 print 26 29 30 def _printAuth(subject, name, value): 31 print 32 print "Authenticated" 33 print 34 27 35 def _printBrowse(subject, name, value): 28 36 print … … 38 46 print 39 47 40 def _print Time(subject, name, value):48 def _printVersion(subject, name, value): 41 49 print 42 print "Time Received!" 43 print value._toPrettyXML() 44 print 45 46 def _answerTime(subject, name, value): 47 print 48 print "Time Requested!" 50 print "Version Received!" 49 51 print value._toPrettyXML() 50 52 print … … 62 64 63 65 strXML = ''.join([('<%s>%s</%s>' % (s[0], s[1], s[0])) for s in dictLogin.iteritems()]) 64 iqQuery(jc, _print Roster).SendQuery("jabber:iq:auth", jc.ServerJID, 'set', strXML)66 iqQuery(jc, _printAuth).SendQuery("jabber:iq:auth", jc.ServerJID, 'set', strXML) 65 67 66 process = SmartSelect()67 68 obs = SubjectObserver.AssociativeObserver() 68 jc.stream.AddObserver('iq', obs)69 69 jc.stream.AddObserver('message', obs) 70 70 jc.stream.AddObserver('presence', obs) 71 obs.AddAssociation('iq', _printIQ)72 71 obs.AddAssociation('message', _printMessage) 73 72 obs.AddAssociation('presence', _printPresence) 73 74 pm = PresenceMap(jc) 75 76 process = SmartSelect() 74 77 process.append(jc) 75 78 for x in xrange(2): process(1) 76 #jc.SendXML('''<presence type='available' />''')79 jc.SendXML('''<presence type='available' />''') 77 80 for x in xrange(2): process(1) 78 81 79 82 iqQuery(jc, _printRoster).SendQuery("jabber:iq:roster") 80 iqQuery(jc, _printBrowse).SendQuery("jabber:iq:browse")81 iqQuery(jc, _printBrowse).SendQuery("jabber:iq:browse", 'shane.holloway@www.runeblade.com/Laptop')82 iq Query(jc, _printTime).SendQuery("jabber:iq:time", 'shane.holloway@www.runeblade.com/Laptop')83 iq Response(jc, _answerTime).AnswerQuery("jabber:iq:time")83 #iqQuery(jc, _printVersion).SendQuery("jabber:iq:version", 'shane.holloway@www.runeblade.com/Laptop') 84 #iqQuery(jc, _printVersion).SendQuery("jabber:iq:version", 'shane.holloway@myjabber.net') 85 iqTimeResponse(jc) 86 iqVersionResponse(jc, 'RuneBlade Foundation Jabber', '0.01') 84 87 while 1: process(1) 85 88 except KeyboardInterrupt: 86 89 jc.SendXML('''<presence type="unavailable" />''') 87 90 91 pprint(pm.Map) 92 88 93 _test('Python') 89 94 trunk/RBJabber/RBJabber/iqQuery.py
r28 r32 10 10 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 11 11 12 class iqQuery :13 def __init__(self, JabberClient , ReplyCallback):12 class iqQueryBase: 13 def __init__(self, JabberClient): 14 14 self.JC = weakref.ref(JabberClient) 15 self.ReplyCallback = ReplyCallback16 15 17 def Update(self, subject, UpdateDict):16 def Bid(self, subject, UpdateDict): 18 17 iq = UpdateDict.get('iq', None) 19 18 if iq: … … 27 26 if bMatch: bMatch = [q for q in iq._elements if q[0][0] == self.nsQuery] and 1 or 0 28 27 # then we have a match 29 if bMatch: 30 # Unhook ourselves 31 self.JC().stream.RemoveObserver(self) 32 # Notify our callback 33 self.ReplyCallback(subject, 'iq', iq) 34 # Unlink our self reference since we are done 35 self._SetLink(0) 28 return bMatch and 1 or 0 29 return 0 30 31 def Update(self, subject, UpdateDict): 32 # Unhook ourselves 33 self.JC().stream.RemoveObserver(self) 34 # Unlink our self reference since we are done 35 self._SetLink(0) 36 36 37 37 def _SetLink(self, bLink): … … 60 60 self.JC().SendXML(result) 61 61 62 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 64 class iqQuery(iqQueryBase): 65 def __init__(self, JabberClient, ReplyCallback): 66 iqQueryBase.__init__(self, JabberClient) 67 self.ReplyCallback = ReplyCallback 68 69 def Update(self, subject, UpdateDict): 70 # Notify our callback 71 self.ReplyCallback(subject, 'iq', UpdateDict['iq']) 72 iqQueryBase.Update(self, subject, UpdateDict) 73 trunk/RBJabber/RBJabber/iqResponse.py
r28 r32 10 10 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 11 11 12 class iqResponse :13 def __init__(self, JabberClient , ReplyCallback):12 class iqResponseBase: 13 def __init__(self, JabberClient): 14 14 self.JC = weakref.ref(JabberClient) 15 self.ReplyCallback = ReplyCallback16 15 17 def Update(self, subject, UpdateDict):16 def Bid(self, subject, UpdateDict): 18 17 iq = UpdateDict.get('iq', None) 19 18 if iq: … … 23 22 if bMatch: bMatch = [q for q in iq._elements if q[0][0] == self.nsQuery] and 1 or 0 24 23 # then we have a match 25 if bMatch:26 # Unhook ourselves27 self.JC().stream.RemoveObserver(self) 28 # Notify our callback29 self.ReplyCallback(subject, 'iq', iq)24 return bMatch and 1 or 0 25 return 0 26 27 def Update(self, subject, UpdateDict): 28 pass 30 29 31 30 def _SelfLink(self, bLink): … … 46 45 return self 47 46 47 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 48 49 class iqResponse(iqResponseBase): 50 def __init__(self, JabberClient, ReplyCallback): 51 iqResponseBase.__init__(self, JabberClient) 52 self.ReplyCallback = ReplyCallback 53 54 def Update(self, subject, UpdateDict): 55 # Notify our callback 56 self.ReplyCallback(subject, 'iq', UpdateDict['iq']) 57 58
