Changeset 27
- Timestamp:
- 02/17/02 18:13:05 (7 years ago)
- Files:
-
- trunk/RBFoundation/RBFoundation/ContextApply.py (modified) (2 diffs)
- trunk/RBFoundation/RBFoundation/SubjectObserver.py (modified) (2 diffs)
- trunk/RBFoundation/RBFoundation/XMLObjectify.py (modified) (2 diffs)
- trunk/RBJabber/RBJabber/Client.py (modified) (3 diffs)
- trunk/RBJabber/RBJabber/JabberConnection.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 (added)
- trunk/RBJabber/RBJabber/iqResponse.py (added)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBFoundation/RBFoundation/ContextApply.py
r8 r27 1 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2 #~ Imports 3 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 4 5 import weakref 6 1 7 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2 8 #~ Tuple / Dictionary Join Functions for Smart Apply … … 68 74 ContextApply = ContextApply_p_s 69 75 76 class WeakInstanceApply: 77 def __init__(self, instance, method): 78 self.instance = weakref.ref(instance) 79 self.method = method 80 def __call__(self, *args, **kw): 81 return apply(self.method, (self.instance(), ) + args, kw) 82 70 83 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 84 #~ Test Section trunk/RBFoundation/RBFoundation/SubjectObserver.py
r25 r27 21 21 def AddObserver(self, observer, bUpdate=0, bCallAddSubject=1): 22 22 self._observers.append(weakref.ref(observer)) 23 if notbCallAddSubject:23 if bCallAddSubject: 24 24 observer.AddSubject(self, bCallAddObserver=0) 25 25 if bUpdate: … … 46 46 def UpdateObserversEx(self, kw): 47 47 self._cachedUpdates.update(kw) 48 if not self._locked: 48 if self._cachedUpdates and not self._locked: 49 _cachedUpdates, self._cachedUpdates = self._cachedUpdates, {} 50 lock = self.Lock() 49 51 for each in self._ObserverList(): 50 self.UpdateObserver(each(), self._cachedUpdates) 51 self._cachedUpdates = {} 52 self.UpdateObserver(each(), _cachedUpdates) 52 53 53 54 def UpdateObserver(self, observer, UpdateDict): trunk/RBFoundation/RBFoundation/XMLObjectify.py
r9 r27 64 64 self._elements.append(((self.__namespace__, ''), data)) 65 65 66 def _toPrettyXML(self, strSplit='', nsOuter=''): 67 return ''.join(self._toXML(strSplit, nsOuter)) 68 66 69 def _toXML(self, strSplit='', nsOuter=''): 67 70 result = ['<%s ' % self.__node__] … … 77 80 result.append(strSplit.join(each._toXML(strSplit, self.__namespace__))) 78 81 result.append('</%s>' % self.__node__) 79 else: result[-1] += ' >'82 else: result[-1] += '/>' 80 83 return result 81 84 trunk/RBJabber/RBJabber/Client.py
r25 r27 17 17 XMLObjectify._Objectified.__init__(self, client, parent, namespace, node, attributes) 18 18 19 def _xmlInitComplete(self): 20 if self.__namespace__ == 'jabber:client': 21 self._client.stream.UpdateObserversEx({self.__node__: self}) 22 19 23 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 20 24 … … 24 28 25 29 def _addElement(self, namespace, node, element): 26 if namespace == 'jabber:client': 27 self._client.stream.UpdateObserversEx({node: element}) 30 pass 28 31 29 32 def _addData(self, data): … … 50 53 } 51 54 55 stream = None 56 ClientMonitors = None 57 52 58 def __init__(self, *args, **kw): 53 59 self.stream = SubjectObserver.Subject() 54 60 apply(Base.Client.__init__, (self,) + args, kw) 61 62 self.ClientMonitors = [] 63 self.__NextID = 0 64 65 def _GetNextID(self): 66 self.__NextID += 1 67 return str(self.__NextID) 55 68 56 69 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ trunk/RBJabber/RBJabber/JabberConnection.py
r9 r27 5 5 from Foundation.XMLBuilder import XMLBuilderMixin, XMLBuilderObjectBase, ParserCreate 6 6 from Foundation import SmartSelect 7 from Foundation.ContextApply import WeakInstanceApply 7 8 import socket 8 9 import re … … 25 26 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 26 27 27 class JabberNode(XMLBuilderObjectBase):28 pass29 30 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~31 32 28 class Client(XMLBuilderMixin, SmartSelect.ClientBase): 33 29 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 36 32 37 33 ServerJID = None 38 DefaultJabberNode = JabberNode34 DefaultJabberNode = XMLBuilderObjectBase 39 35 JabberNodeMap = {} 40 36 … … 58 54 self._parser = ParserCreate('ASCII', self._seperator) 59 55 self._parser.returns_unicode = 0 60 self._parser.StartElementHandler = self._start_element61 self._parser.EndElementHandler = self._end_element62 self._parser.CharacterDataHandler = self._char_data56 self._parser.StartElementHandler = WeakInstanceApply(self, Client._start_element) 57 self._parser.EndElementHandler = WeakInstanceApply(self, Client._end_element) 58 self._parser.CharacterDataHandler = WeakInstanceApply(self, Client._char_data) 63 59 64 60 # Send the initial header … … 86 82 87 83 def _GetElementFactory(self, owner, parent, namespace, node, attributes): 88 if len(self._elements) <= 1: 89 result = self.JabberNodeMap.get((namespace, node), self.DefaultJabberNode) 90 else: result = self.DefaultJabberNode 84 result = self.JabberNodeMap.get((namespace, node), self.DefaultJabberNode) 91 85 return result 92 86 trunk/RBJabber/RBJabber/PresenceMap.py
r8 r27 30 30 lstJID = reJabberJID.split(JID)[1:-1] 31 31 JIDNoResource = '%s@%s' % tuple(lstJID[:2]) 32 resource = '/'.join( lstJID[2:]) or None32 resource = '/'.join([x for x in lstJID[2:] if x]) or None 33 33 return self.setdefault(JIDNoResource, self.PresenceSubject()), resource 34 34 trunk/RBJabber/RBJabber/Test.py
r25 r27 2 2 from PresenceMap import * 3 3 from Foundation.SmartSelect import SmartSelect 4 from iqQuery import iqQuery 5 from iqResponse import iqResponse 4 6 5 7 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 6 7 def _test(resource='Python-Test'):8 import sys9 strEval = ('{"%s"}'%'","'.join(sys.argv[1:])).replace('=','":"')10 dictLogin = eval(strEval, {}, {})11 dictLogin['resource'] = resource12 jc = Client(dictLogin['server'])13 jc.SendXML('''<iq type="set" to="%(server)s"><query xmlns="jabber:iq:auth">14 <username>%(login)s</username>15 <password>%(password)s</password>16 <resource>%(resource)s</resource>17 </query></iq>''' % dictLogin)18 return jc19 20 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~21 22 def _printIQ(subject, name, value):23 print24 print "IQ!"25 print '\n'.join(value._toXML())26 print27 8 28 9 def _printMessage(subject, name, value): 29 10 print 30 11 print "Message from %r" % value.from_ 31 for each in value._elements: 32 print '%s: %s' % (each[0], each[-1]) 12 print value._toPrettyXML() 13 print 14 15 def _printIQ(subject, name, value): 16 print 17 print "IQ from %r" % getattr(value, 'from', '') 18 print value._toPrettyXML() 33 19 print 34 20 … … 36 22 print 37 23 print "Presence from %r" % value.from_ 38 for each in value._elements: 39 print '%s: %s' % (each[0], each[-1]) 24 print value._toPrettyXML() 25 print 26 27 def _printBrowse(subject, name, value): 28 print 29 print "Browse" 30 print value._toPrettyXML() 31 print 32 33 def _printRoster(subject, name, roster): 34 print 35 print "Roster Received!" 36 for each in roster.query[0].item: 37 print each._toPrettyXML() 38 print 39 40 def _printTime(subject, name, value): 41 print 42 print "Time Received!" 43 print value._toPrettyXML() 44 print 45 46 def _answerTime(subject, name, value): 47 print 48 print "Time Requested!" 49 print value._toPrettyXML() 40 50 print 41 51 42 52 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 43 53 44 try: 45 process = SmartSelect() 46 jc = _test('Python') 47 #pm = PresenceMap().AddClient(jc) 48 obs = SubjectObserver.AssociativeObserver() 49 obs.AddSubject(jc.stream) 50 obs.AddAssociation('iq', _printIQ) 51 obs.AddAssociation('message', _printMessage) 52 obs.AddAssociation('presence', _printPresence) 53 process.append(jc) 54 for x in xrange(2): 55 process(1) 56 jc.SendXML('''<presence />''') 57 jc.SendXML('''<iq type="get" to="%s"><query xmlns="jabber:iq:roster"/></iq>''' % jc.ServerJID) 58 while 1: 59 process(1) 60 except KeyboardInterrupt: 61 jc.SendXML('''<presence type="unavailable" />''') 54 def _test(resource='Python-Test'): 55 try: 56 import sys 57 strEval = ('{"%s"}'%'","'.join(sys.argv[1:])).replace('=','":"') 58 dictLogin = eval(strEval, {}, {}) 59 dictLogin.setdefault('resource', resource) 60 jc = Client(dictLogin['server']) 61 del dictLogin['server'] 62 62 63 #print "Presence Map" 64 #for jid, subject in pm.iteritems(): 65 # print jid 66 # for resource, presence in pm[jid].iteritems(): 67 # print ' %s: %s' % (resource, getattr(presence, 'status', [''])[0]) 63 strXML = ''.join([('<%s>%s</%s>' % (s[0], s[1], s[0])) for s in dictLogin.iteritems()]) 64 iqQuery(jc, _printRoster).SendQuery("jabber:iq:auth", jc.ServerJID, 'set', strXML) 65 66 process = SmartSelect() 67 obs = SubjectObserver.AssociativeObserver() 68 obs.AddSubject(jc.stream) 69 obs.AddAssociation('iq', _printIQ) 70 obs.AddAssociation('message', _printMessage) 71 obs.AddAssociation('presence', _printPresence) 72 process.append(jc) 73 for x in xrange(2): process(1) 74 jc.SendXML('''<presence type='available' />''') 75 for x in xrange(2): process(1) 68 76 77 iqQuery(jc, _printRoster).SendQuery("jabber:iq:roster") 78 iqQuery(jc, _printBrowse).SendQuery("jabber:iq:browse") 79 iqQuery(jc, _printBrowse).SendQuery("jabber:iq:browse", 'shane.holloway@www.runeblade.com/Laptop') 80 iqQuery(jc, _printTime).SendQuery("jabber:iq:time", 'shane.holloway@www.runeblade.com/Laptop') 81 iqResponse(jc, _answerTime).AnswerQuery("jabber:iq:time") 82 while 1: process(1) 83 except KeyboardInterrupt: 84 jc.SendXML('''<presence type="unavailable" />''') 85 86 _test('Python') 87
