Changeset 96
- Timestamp:
- 04/11/02 16:50:33 (6 years ago)
- Files:
-
- trunk/RBJabber/RBJabber/Client.py (modified) (4 diffs)
- trunk/RBJabber/RBJabber/JID.py (modified) (6 diffs)
- trunk/RBJabber/RBJabber/JabberConnection.py (modified) (2 diffs)
- trunk/RBJabber/RBJabber/JabberObserver.py (modified) (3 diffs)
- trunk/RBJabber/RBJabber/MessageRouter.py (modified) (2 diffs)
- trunk/RBJabber/RBJabber/SubscribeApproveResponse.py (modified) (2 diffs)
- trunk/RBJabber/RBJabber/Test.py (modified) (1 diff)
- trunk/RBJabber/RBJabber/iqAuthQuery.py (modified) (3 diffs)
- trunk/RBJabber/RBJabber/iqBrowseResponse.py (modified) (2 diffs)
- trunk/RBJabber/RBJabber/iqQuery.py (modified) (2 diffs)
- trunk/RBJabber/RBJabber/iqResponse.py (modified) (2 diffs)
- trunk/RBJabber/RBJabber/iqRosterQuery.py (modified) (2 diffs)
- trunk/RBJabber/RBJabber/iqTimeResponse.py (modified) (2 diffs)
- trunk/RBJabber/RBJabber/iqVersionResponse.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBJabber/RBJabber/Client.py
r66 r96 38 38 from xml.sax.saxutils import escape, quoteattr 39 39 from Foundation import XMLObjectify, SubjectObserver 40 import JID 40 41 import Base 41 import iqQuery42 import iqAuthQuery43 42 44 43 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 118 117 119 118 stream = None 119 SupportedNS = None 120 120 ClientMonitors = None 121 SupportedNS = None122 121 123 122 def __init__(self, *args, **kw): … … 126 125 apply(Base.Client.__init__, (self,) + args, kw) 127 126 127 self.SupportedNS = [] 128 128 self.ClientMonitors = [] 129 self.SupportedNS = []130 129 self.__NextID = 0 131 130 … … 135 134 136 135 def Authenticate(self, username, password, resource, callback=None): 137 if callback: 138 query = iqAuthQuery.iqAuthQuery(self, callback, username, password, resource) 139 else: query = iqAuthQuery.iqAuthQueryBase(self, username, password, resource) 136 import iqAuthQuery 137 query = iqAuthQuery.iqAuthQuery(self, username, password, resource, callback) 140 138 return query 141 139 142 140 def Register(self, username, password, callback=None): 141 import iqQuery 143 142 strXML = '<username>%s</username><password>%s</password>' % (username, password) 144 if callback: 145 query = iqQuery.iqQuery(self, callback) 146 else: query = iqQuery.iqQueryBase(self) 143 query = iqQuery.iqQuery(self, callback) 147 144 query.SendQuery("jabber:iq:register", '', 'set', strXML) 148 145 return query 149 146 150 def QueryRoster(self, callback): 151 if callback: 152 query = iqQuery.iqQuery(self, callback) 153 else: query = iqQuery.iqQueryBase(self) 154 query.SendQuery("jabber:iq:roster") 155 return query 147 def QueryRoster(self, callback=None): 148 import iqRosterQuery 149 return iqRosterQuery.iqRosterQuery(self, callback) 156 150 157 151 def BrowseJID(self, toJID, callback): 158 if callback: 159 query = iqQuery.iqQuery(self, callback) 160 else: query = iqQuery.iqQueryBase(self) 152 import iqQuery 153 query = iqQuery.iqQuery(self, callback) 161 154 query.SendQuery("jabber:iq:browse", toJID) 162 155 return query trunk/RBJabber/RBJabber/JID.py
r94 r96 45 45 _restrResource = '''\S+''' 46 46 reJabberURL = re.compile('''(?:jabber://)?(%s)''' % (_restrServer)) 47 reJabberJID = re.compile('''( %s)@(%s)(?:/(%s))?''' % (_restrID, _restrServer, _restrResource))47 reJabberJID = re.compile('''(?:(%s)@)?(%s)(?:/(%s))?''' % (_restrID, _restrServer, _restrResource)) 48 48 49 49 __all__ = ['reJabberURL', 'reJabberJID'] … … 55 55 def splitnorm(strJID, start=1, end=4): 56 56 result = reJabberJID.split(strJID)[start:end] 57 return [x .lower()for x in result[1-start:3-start]] + result[3-start:]57 return [x and x.lower() or x for x in result[1-start:3-start]] + result[3-start:] 58 58 59 59 def split(strJID, start=1, end=4): … … 72 72 return 0 == apply(cmp_, args, kw) 73 73 74 def contains(strJIDa, strJIDb): 75 jida = filter(None, splitnorm(strJIDa, end=4)) 76 jidb = filter(None, splitnorm(strJIDb, end=3))[-len(jida):] 77 return jida == jidb 78 74 79 def join(*args): 75 80 if isinstance(args[0], (tuple, list)): 76 81 args = tuple(args[0]) 77 82 args = filter(None, args) 78 if len(args) > 2:83 if len(args) == 3: 79 84 return JID('%s@%s/%s' % args) 80 elif args: return JID('%s@%s' % args) 85 elif len(args) == 2: 86 return JID('%s@%s' % args) 87 elif len(args) == 1: 88 return args[0] 81 89 else: return '' 82 90 … … 125 133 return cmp_(self, other) >= 0 126 134 135 def __contains__(self, other): 136 return contains(self, other) 137 127 138 def __hash__(self): 128 139 return hash(tuple(self.splitnorm())) … … 136 147 j2 = JID('User.Name@Jabber.org/Resource') 137 148 j3 = JID('User.Name@Jabber.org/ReSoUrCe') 149 j4 = JID('conference.jabber.org') 138 150 139 assert(j1 == j2) 140 assert(j1 >= j2) 141 assert(j1 <= j2) 142 assert(j1 != j3) 143 assert(j2 != j3) 144 assert(j3 < j1) 145 assert(j1 > j3) 146 assert(j3 < j2) 147 assert(j2 > j3) 148 assert(j1.splitnorm() == j2.splitnorm() != j3.splitnorm()) 149 assert(j1.splitnorm(1,3) == j2.splitnorm(1,3) == j3.splitnorm(1,3)) 150 assert(hash(j1) == hash(j2)) 151 assert(hash(j1) != hash(j3)) 152 assert(hash(j2) != hash(j3)) 151 assert j1 in JID('user.name@Jabber.org') 152 assert j3 in JID('JaBBer.org') 153 assert j2 not in j3 154 155 assert j4.normalize() == j4 156 assert j4.username() is None 157 assert j4.server() == j4 158 assert j4.resource() is None 159 assert j4.noresource() == j4 160 161 assert j1 == j2 162 assert j1 >= j2 163 assert j1 <= j2 164 assert j1 != j3 165 assert j2 != j3 166 assert j3 < j1 167 assert j1 > j3 168 assert j3 < j2 169 assert j2 > j3 170 assert j1.splitnorm() == j2.splitnorm() != j3.splitnorm() 171 assert j1.splitnorm(1,3) == j2.splitnorm(1,3) == j3.splitnorm(1,3) 172 assert hash(j1) == hash(j2) 173 assert hash(j1) != hash(j3) 174 assert hash(j2) != hash(j3) 153 175 154 176 dictTest = {} … … 156 178 dictTest[j2] = 1 157 179 dictTest[j3] = 1 158 assert(len(dictTest)==2) 180 # Length should be 2 because j2 and j1s' hashes should be identical 181 assert len(dictTest)==2 159 182 160 183 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ trunk/RBJabber/RBJabber/JabberConnection.py
r89 r96 79 79 self._socket.connect((params[0], port)) 80 80 self.fileno = self._socket.fileno 81 self.ServerJID = params[0]81 self.ServerJID = JID.JID(params[0]) 82 82 83 83 # Create our xml parser … … 98 98 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 99 100 def BuildJID(self, username='', server='', resource=''): 101 return JID.JID.join(username, server or self.ServerJID, resource) 102 100 103 def SendXML(self, xmlData): 101 104 self._sendData += xmlData trunk/RBJabber/RBJabber/JabberObserver.py
r94 r96 53 53 else: return 0 54 54 55 class MatchAttributes Ex(object):56 def __init__(self, attributes):55 class MatchAttributesRE(object): 56 def __init__(self, **attributes): 57 57 import re 58 58 self._MatchInfo = {} … … 69 69 else: return 1 70 70 71 class MatchAttributes( MatchAttributesEx):71 class MatchAttributes(object): 72 72 def __init__(self, **attributes): 73 super(MatchAttributes, self).__init__(attributes) 73 self._MatchInfo = attributes 74 75 def __call__(self, value): 76 for key, compareto in self._MatchInfo.iteritems(): 77 if compareto != getattr(value, key, None): 78 return 0 79 else: return 1 74 80 75 81 class MatchHasAttribute(object): … … 78 84 79 85 def __call__(self, value): 80 return hasattr( self._MatchInfo, value)86 return hasattr(value, self._MatchInfo) 81 87 82 88 class MatchHasNode(object): trunk/RBJabber/RBJabber/MessageRouter.py
r87 r96 35 35 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 36 36 37 from Foundation.SubjectObserver.Subject import Subject 38 from Foundation.SubjectObserver.Observer import Observer 39 from Foundation.SubjectObserver.BidableSubject import BidableSubjectMixin 40 import JID 37 from JabberSubject import FromJIDSubjectMixin 38 from Foundation.SubjectObserver.CategorySubject import CategorySubjectBaseMixin 41 39 42 40 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 44 42 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 43 46 class MessageRouterBase(BidableSubjectMixin): 47 def __init__(self, JC, MessageMapEntryClass=None): 48 self._observer = Observer(self.Update, self.Bid) 49 JC.stream.AddObserver('message', self._observer) 50 self._UpdateMap = {} 51 if not MessageMapEntryClass: 52 MessageMapEntryClass = Subject 53 self.MessageMapEntryClass = MessageMapEntryClass 54 55 def Update(self, subject, **UpdateDict): 56 pass 57 58 def Bid(self, subject, **UpdateDict): 59 message = UpdateDict.get('message', None) 60 for index in self._UpdateMapXForm(message): 61 UpdateSubject = self._UpdateMap.get(index, None) 62 if UpdateSubject: 63 for obs in UpdateSubject.Observers: 64 subject._GetBid(obs, UpdateDict) 65 66 def Get(self, index, bCreateSubject=1): 67 index = self._UpdateIndexXForm(index)[0] 68 result = self._UpdateMap.get(index, None) 69 if result is None and bCreateSubject: 70 result = self.MessageMapEntryClass() 71 self._UpdateMap[index] = result 72 return result 44 class MessageRouterByFrom(FromJIDSubjectMixin): 45 def __init__(self, JC): 46 JC.stream.AddObserver('message', self) 73 47 74 48 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 75 49 76 class MessageRouterBy From(MessageRouterBase):77 def _ UpdateIndexXForm(self, FromJID):78 return (JID.normalize(FromJID),)50 class MessageRouterByType(CategorySubjectBaseMixin): 51 def __init__(self, JC): 52 JC.stream.AddObserver('message', self) 79 53 80 def _UpdateMapXForm(self, node): 81 return self._UpdateIndexXForm(node.from_) 54 def Bid(self, subject, **UpdateDict): 55 for value in UpdateDict.itervalues(): 56 for obs in self._ObserverList(value.type): 57 subject._GetBid(obs, UpdateDict) 82 58 83 59 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 60 85 class MessageRouterBy Type(MessageRouterBase):86 def _ UpdateIndexXForm(self, index):87 return (index.lower(),)61 class MessageRouterByID(CategorySubjectBaseMixin): 62 def __init__(self, JC): 63 JC.stream.AddObserver('message', self) 88 64 89 def _UpdateMapXForm(self, node): 90 return self._UpdateIndexXForm(node.type) 65 def Bid(self, subject, **UpdateDict): 66 for value in UpdateDict.itervalues(): 67 for obs in self._ObserverList(value.id): 68 subject._GetBid(obs, UpdateDict) 91 69 92 70 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 93 71 94 class MessageRouterBy ID(MessageRouterBase):95 def _ UpdateIndexXForm(self, index):96 return (index.lower(),)72 class MessageRouterByThread(CategorySubjectBaseMixin): 73 def __init__(self, JC): 74 JC.stream.AddObserver('message', self) 97 75 98 def _UpdateMapXForm(self, node): 99 return self._UpdateIndexXForm(node.id) 76 def Bid(self, subject, **UpdateDict): 77 for value in UpdateDict.itervalues(): 78 thread = ':'.join(map(str, value.Elements(value='thread'))) 79 for obs in self._ObserverList(thread): 80 subject._GetBid(obs, UpdateDict) 100 81 101 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~102 103 class MessageRouterByThread(MessageRouterBase):104 def _UpdateIndexXForm(self, index):105 return (index.upper(),)106 107 def _UpdateMapXForm(self, node):108 thread = ':'.join(map(str, node.Elements(node='thread')))109 return self._UpdateIndexXForm(thread)110 trunk/RBJabber/RBJabber/SubscribeApproveResponse.py
r88 r96 36 36 37 37 import weakref 38 from Foundation.SubjectObserver.Observer import Observer39 from Foundation.WeakBind import BindCallable40 38 from xml.sax.saxutils import escape, quoteattr 39 import JabberObserver as JObs 40 import JID 41 41 42 42 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 44 44 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 45 46 class SubscribeApproveResponse: 47 BidValue = 1 48 49 def __init__(self, JabberClient): 50 self.JC = weakref.ref(JabberClient) 51 self._observer = Observer(self.Update, self.Bid) 52 self.JC().stream.AddObserver('presence', self._observer) 53 self._SelfLink(1) 46 class SubscribeApproveResponse(JObs.JabberObserver): 47 def __init__(self, JC, BidValue=1): 48 JObs.JabberObserver.__init__(self, self.ApprovePresence, JObs.MatchAttributesRE(type='^(?:subscribe|unsubscribe)$'), BidValue) 49 JC.stream.AddObserver('presence', self) 54 50 55 def Bid(self, subject, presence): 56 bMatch = presence.type in ['subscribe', 'unsubscribe'] 57 return bMatch and self.BidValue or 0 58 59 def Update(self, subject, presence): 51 def ApprovePresence(self, stream, presence): 60 52 presence.to = presence.from_ 61 53 del presence.from_ 62 54 presence.type += 'd' # set to subscribed/unsubscribed 63 self.JC().SendXML(presence._toPrettyXML())55 presence._client.SendXML(presence._toPrettyXML()) 64 56 65 def _SelfLink(self, bLink):66 cm = self.JC().ClientMonitors67 if bLink:68 if self not in cm: cm.append(self)69 else:70 if self in cm: cm.remove(self)71 trunk/RBJabber/RBJabber/Test.py
r95 r96 31 31 ##~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 32 32 33 from Client import * 34 from PresenceMap import PresenceMap 35 from MessageRouter import MessageRouterByType 36 from Foundation.SmartSelect import SmartSelect 37 from iqQuery import iqQuery 38 from iqResponse import iqResponse 39 from iqTimeResponse import iqTimeResponse 40 from iqVersionResponse import iqVersionResponse 41 from iqBrowseResponse import iqBrowseResponse 42 from iqRosterQuery import iqRosterQuery 43 from JabberSubject import FromJIDSubject 44 from SubscribeApproveResponse import SubscribeApproveResponse 45 from pprint import pprint 46 import sys 33 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 34 #~ Imports 35 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 36 37 import Client 38 import iqTimeResponse 39 import iqVersionResponse 40 import iqBrowseResponse 41 import SubscribeApproveResponse 42 43 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 44 #~ Definitions 45 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 46 47 def _test(server, username, password, resource='Foundation.Jabber.Test'): 48 try: 49 jc = Client.Client(server) 50 jc._SetDebug(sys.stdout, sys.stdout) 51 52 #jc.Register(username, password) 53 authq = jc.Authenticate(username, password, resource) 54 55 #pm = PresenceMap(jc) 56 57 jc.BrowseJID('www.runeblade.com', None) 58 59 jc.Presence() 60 61 jc.Roster = jc.QueryRoster() 62 63 jc.Responses = [] 64 jc.Responses.append(iqTimeResponse.iqTimeResponse(jc)) 65 jc.Responses.append(iqVersionResponse.iqVersionResponse(jc, 'RuneBlade Foundation Jabber Test', '0.2')) 66 jc.Responses.append(iqBrowseResponse.iqBrowseResponse(jc)) 67 jc.Responses.append(SubscribeApproveResponse.SubscribeApproveResponse(jc)) 68 69 while 1: jc.Process(0.5) 70 except KeyboardInterrupt: 71 jc.SendXML('''<presence type="unavailable" />''') 47 72 48 73 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 74 50 def _printMessage(subject, **UpdateDict): 51 print 52 print "Message from %r" % value.from_ 53 for value in UpdateDict.itervalues(): print value._toPrettyXML() 54 print 75 if __name__ == '__main__': 76 import sys 77 dictLogin = {'server':'www.runeblade.com', 'username':'shane.test1', 'password':'testing'} 78 strEval = ('","'.join(sys.argv[1:])).replace('=','":"') 79 if strEval: 80 strEval = ('{"%s"}'%strEval) 81 dictLogin.update(eval(strEval, {}, {})) 82 apply(_test, tuple(), dictLogin) 55 83 56 def _printTypedMessage(subject,**UpdateDict):57 value = UpdateDict['message']58 print59 print "$$$ Message from %r" % (value.from_)60 print value._toPrettyXML()61 print62 63 def _printIQ(subject, **UpdateDict):64 print65 print "IQ from %r" % getattr(value, 'from', '')66 for value in UpdateDict.itervalues(): print value._toPrettyXML()67 print68 69 def _printPresence(subject, **UpdateDict):70 print71 for value in UpdateDict.itervalues():72 print "Presence from %r" % value.from_.normalize()73 print value._toPrettyXML()74 print75 76 def _printRegister(subject, iq):77 print78 if iq.type == 'error':79 print 'Registration: Error -- %s' % iq.error[0]80 else: print 'Registration: Successful'81 print82 83 def _printAuth(subject, iq):84 print85 if iq.type == 'error':86 print 'Authorization: Error -- %s' % iq.error[0]87 else: print 'Authorization: Successful'88 print89 90 def _printBrowse(subject, **UpdateDict):91 print92 print "Browse"93 for value in UpdateDict.itervalues(): print value._toPrettyXML()94 print95 96 def _printRoster(subject, name, roster):97 print98 print "Roster Received!"99 for each in getattr(roster.query[0], 'item', []):100 print each._toPrettyXML()101 print102 103 def _printVersion(subject, **UpdateDict):104 print105 print "Version Received!"106 for value in UpdateDict.itervalues(): print value._toPrettyXML()107 print108 109 def _printIt(subject, **UpdateDict):110 print111 print "PRINT IT!!!"112 for value in UpdateDict.itervalues(): print value._toPrettyXML()113 print114 115 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~116 117 def _test(**dictLogin):118 try:119 import sys120 strEval = ('","'.join(sys.argv[1:])).replace('=','":"')121 if strEval:122 strEval = ('{"%s"}'%strEval)123 dictLogin.update(eval(strEval, {}, {}))124 125 jc = Client(dictLogin['server'])126 jc._SetDebug(sys.stdout, sys.stdout)127 process = SmartSelect()128 process.append(jc)129 del dictLogin['server']130 131 for x in xrange(2): process(1)132 133 dictLogin['callback'] = _printRegister134 dictRegister = dictLogin.copy()135 del dictRegister['resource']136 #apply(jc.Register, tuple(), dictRegister)137 138 dictLogin['callback'] = _printAuth139 apply(jc.Authenticate, tuple(), dictLogin)140 141 jc.stream.AddObserver('message', _printMessage)142 jc.stream.AddObserver('presence', _printPresence)143 144 def OnShanePresence(stream, presence): print "HELLO SHANE!!!"145 js = FromJIDSubject()146 jc.stream.AddObserver('presence', js)147 js.AddObserver('shane.holloway@www.runeblade.com', OnShanePresence)148 149 pm = PresenceMap(jc)150 router = MessageRouterByType(jc)151 obs = SubjectObserver.Observer.Observer(_printTypedMessage)152 obs.Bid = 10153 router.Get('message').AddObserver(obs)154 router.Get('groupchat').AddObserver(obs)155 #router.Get('chat').AddObserver(obs)156 router.Get('headline').AddObserver(obs)157 158 for x in xrange(2): process(1)159 jc.SendXML('''<presence type='available' />''')160 for x in xrange(2): process(1)161 162 jc.BrowseJID('www.runeblade.com', None)163 roster = iqRosterQuery(jc)164 #iqQuery(jc, _printRoster).SendQuery("jabber:iq:roster")165 #iqQuery(jc, _printVersion).SendQuery("jabber:iq:version", 'shane.holloway@www.runeblade.com/Laptop')166 #iqQuery(jc, _printVersion).SendQuery("jabber:iq:version", 'shane.holloway@myjabber.net')167 iqTimeResponse(jc)168 iqVersionResponse(jc, 'RuneBlade Foundation Jabber', '0.01')169 iqBrowseResponse(jc)170 SubscribeApproveResponse(jc)171 172 while 1: process(1)173 except KeyboardInterrupt:174 jc.SendXML('''<presence type="unavailable" />''')175 176 pprint(pm.ByJID)177 178 _test(server='www.runeblade.com', username='shane.test1', password='testing', resource='Python-Test')179 trunk/RBJabber/RBJabber/iqAuthQuery.py
r86 r96 35 35 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 36 36 37 import weakref 38 import select 39 import sha 40 from Foundation.SubjectObserver.Observer import Observer 37 import weakref, sha 38 from xml.sax.saxutils import escape, quoteattr 41 39 from Foundation.WeakBind import BindCallable 42 from xml.sax.saxutils import escape, quoteattr 43 from iqQuery import iqQueryBase, Subject 40 from iqQuery import iqQueryBase 44 41 45 42 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 47 44 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 48 45 49 class iqAuthQueryBase(iqQueryBase): 50 def __init__(self, JabberClient, username, password, resource): 51 self.JC = weakref.ref(JabberClient) 52 self._observer = Observer(self.Update, self.Bid) 53 self.JC().stream.AddObserver('iq', self._observer) 46 class iqAuthQuery(iqQueryBase): 47 def __init__(self, JC, username, password, resource, callback=None, BidValue=1): 48 self.OnAuthCallback = BindCallable(callback) 49 iqQueryBase.__init__(self, JC, self.OnAuthReply, BidValue) 54 50 55 51 while not self.JC()._elements: … … 60 56 61 57 self.JC().information.authorized = 0 62 self.JC().information.username = username 63 self.JC().information.resource = resource 64 self.JC().information.jid = '%s@%s/%s' % (username, self.JC().ServerJID, resource) 58 self.JC().information.jid = self.JC().BuildJID(username, None, resource) 65 59 66 self.idQuery = self.JC()._GetNextID() 67 self.JC().SendXML('''<iq type='set' id='%s'><query xmlns='jabber:iq:auth'>%s</query></iq>''' % (self.idQuery, xmlAuthInfo)) 68 self._SetLink(1) 60 self.SendQuery('jabber:iq:auth', typeQuery='set', xmlQueryPayload=xmlAuthInfo) 69 61 70 def Bid(self, subject, **UpdateDict): 71 iq = UpdateDict.get('iq', None) 72 if iq: 73 bMatch = iq.id == self.idQuery 74 if bMatch: bMatch = iq.type in ['result', 'error'] 75 return bMatch and 1 or -1 76 return -1 77 78 def Update(self, subject, **UpdateDict): 79 iq = UpdateDict['iq'] 62 def OnAuthReply(self, stream, iq): 80 63 if iq.type == 'result': 81 64 self.JC().information.authorized = 1 82 self._SetLink(0) 65 if self.OnAuthCallback: 66 self.OnAuthCallback(stream, iq) 83 67 84 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~85 86 class iqAuthQuerySubject(iqAuthQueryBase, Subject):87 def __init__(self, *args, **kw):88 apply(iqAuthQueryBase.__init__, (self, ) + args, kw)89 Subject.__init__(self)90 91 def Update(self, subject, **UpdateDict):92 # Notify our callback93 apply(iqAuthQueryBase.Update, (self, subject,), UpdateDict)94 self.UpdateObserversEx(UpdateDict)95 96 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~97 98 class iqAuthQuery(iqAuthQueryBase):99 def __init__(self, JabberClient, ReplyCallback, *args, **kw):100 apply(iqAuthQueryBase.__init__, (self, JabberClient) + args, kw)101 self.ReplyCallback = BindCallable(ReplyCallback)102 103 def Update(self, subject, **UpdateDict):104 # Notify our callback105 apply(iqAuthQueryBase.Update, (self, subject,), UpdateDict)106 apply(self.ReplyCallback, (subject,), UpdateDict)107 trunk/RBJabber/RBJabber/iqBrowseResponse.py
r66 r96 45 45 46 46 class iqBrowseResponse(iqResponseBase): 47 def __init__(self, JC, Bid =1):48 iqResponseBase.__init__(self, JC )47 def __init__(self, JC, BidValue=1): 48 iqResponseBase.__init__(self, JC, self.OnIQBrowseRequest, BidValue=BidValue) 49 49 self.AnswerQuery("jabber:iq:browse") 50 self.Bid = 151 50 52 def __call__(self, subject, **UpdateDict): 53 iq = UpdateDict['iq'] 51 def OnIQBrowseRequest(self, subject, iq): 54 52 iq.to = iq.from_ 55 53 del iq.from_ … … 61 59 strResult += '''</user></iq>''' 62 60 63 self.JC().SendXML(strResult)61 iq._client.SendXML(strResult) trunk/RBJabber/RBJabber/iqQuery.py
r88 r96 36 36 37 37 import weakref 38 from xml.sax.saxutils import escape, quoteattr 38 39 from Foundation.WeakBind import BindCallable 39 from Foundation.SubjectObserver.Subject import Subject 40 from Foundation.SubjectObserver.Observer import Observer 41 from xml.sax.saxutils import escape, quoteattr 40 import JabberObserver as JObs 42 41 import JID 43 42 … … 46 45 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 47 46 48 class iqQueryBase: 49 def __init__(self, JabberClient, BidValue=1): 50 self.BidValue = BidValue 51 if isinstance(JabberClient, weakref.ReferenceType): 52 self.JC = JabberClient 53 else: 54 self.JC = weakref.ref(JabberClient) 55 self._observer = Observer(self.Update, self.Bid) 47 class iqQueryBase(JObs.JabberObserver): 48 def __init__(self, JC, callback=None, BidValue=1): 49 JObs.JabberObserver.__init__(self, callback, BidValue=BidValue) 50 if isinstance(JC, weakref.ReferenceType): 51 self.JC = JC 52 else: self.JC = weakref.ref(JC) 53 self.JC().stream.AddObserver('iq', self) 56 54 57 def Bid(self, subject, iq): 58 if iq: 59 # if it is an iq with the same id 60 bMatch = iq.id == self.idQuery 61 # and a compatible type 62 if bMatch: bMatch = iq.type in ['result', 'error'] 63 # and a it matches the jid we sent it to 64 if bMatch: bMatch = (not self.jidQuery or JID.compare(iq.from_, self.jidQuery)) 65 # and the query result namespace is the same 66 # if bMatch: bMatch = [q for q in iq._elements if q[0][0] == self.nsQuery] and 1 or 0 67 # then we have a match 68 return bMatch and self.BidValue or 0 69 return 0 70 71 def Update(self, subject, **UpdateDict): 72 # Unhook ourselves 73 self.JC().stream.RemoveObserver(self._observer) 74 # Unlink our self reference since we are done 75 self._SetLink(0) 55 def SendQuery(self, nsQuery, jidQuery='', typeQuery='get', xmlQueryPayload='', idQuery=None, bSetLink=1): 56 # Get a new id 57 idQuery = idQuery or self.JC()._GetNextID() 76 58 77 def _SetLink(self, bLink):78 cm = self.JC().ClientMonitors79 if bLink:80 if self not in cm: cm.append(self)81 else:82 if self in cm: cm.remove(self)83 84 def SendQuery(self, nsQuery, jidQuery='', typeQuery='get', xmlQueryPayload=''):85 # Make a self reference while we are still querying86 self._SetLink(1)87 # Lets observer the jabber stream88 self.JC().stream.AddObserver('iq', self._observer)89 59 # Setup our match attributes 90 self.nsQuery = nsQuery 91 self.jidQuery = jidQuery 92 self.idQuery = self.JC()._GetNextID() 60 del self.Match[:] 61 if jidQuery: self.Match.append(JObs.MatchAttributes(from_=JID.JID(jidQuery))) 62 if idQuery: self.Match.append(JObs.MatchAttributes(id=idQuery)) 63 self.Match.append(JObs.MatchHasChildNamespace(nsQuery)) 64 93 65 # and finally send the query 94 self. _DoSendQuery({'type':typeQuery, 'id':self.idQuery, 'to':jidQuery}, nsQuery, xmlQueryPayload)66 self.JC().SendXML(self._BuildQuery(nsQuery, xmlQueryPayload, type=typeQuery, id=idQuery, to=jidQuery)) 95 67 return self 96 68 97 def _DoSendQuery(self, attrQuery, nsQuery, xmlQueryPayload): 69 def _BuildQuery(self, nsQuery, xmlQueryPayload, **attrQuery): 70 # Build the XML attribute string 98 71 strAttributes = ' '.join([ ('%s=%s' % (a[0], quoteattr(a[1]))) for a in attrQuery.iteritems() if a[1]] ) 99 result = '''<iq %s ><query xmlns=%s>%s</query></iq>''' % (strAttributes, quoteattr(nsQuery), xmlQueryPayload)100 self.JC().SendXML(result)72 # Return the built xml 73 return '''<iq %s ><query xmlns=%s>%s</query></iq>''' % (strAttributes, quoteattr(nsQuery), xmlQueryPayload) 101 74 102 75 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 103 76 104 class iqQuerySubject(iqQueryBase, Subject): 105 def __init__(self, JabberClient): 106 iqQueryBase.__init__(self, JabberClient) 107 Subject.__init__(self) 77 class iqQuery(iqQueryBase): 78 pass 108 79 109 def Update(self, subject, **UpdateDict):110 # Notify our callback111 apply(iqQueryBase.Update, (self, subject,), UpdateDict)112 self.UpdateObserversEx(UpdateDict)113 114 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~115 116 class iqQuery(iqQueryBase):117 def __init__(self, JabberClient, ReplyCallback):118 iqQueryBase.__init__(self, JabberClient)119 self.ReplyCallback = BindCallable(ReplyCallback)120 121 def Update(self, subject, **UpdateDict):122 # Notify our callback123 apply(iqQueryBase.Update, (self, subject,), UpdateDict)124 apply(self.ReplyCallback, (subject,), UpdateDict)125 trunk/RBJabber/RBJabber/iqResponse.py
r74 r96 36 36 37 37 import weakref 38 from Foundation.SubjectObserver.Observer import Observer38 from xml.sax.saxutils import escape, quoteattr 39 39 from Foundation.WeakBind import BindCallable 40 from xml.sax.saxutils import escape, quoteattr 40 import JabberObserver as JObs 41 import JID 41 42 42 43 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 44 45 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 45 46 46 class iqResponseBase: 47 BidValue = 1 48 49 def __init__(self, JabberClient): 50 self.JC = weakref.ref(JabberClient) 51 self._observer = Observer(self.Update, self.Bid) 47 class iqResponseBase(JObs.JabberObserver): 48 def __init__(self, JC, callback=None, BidValue=1): 49 JObs.JabberObserver.__init__(self, callback, BidValue=BidValue) 50 if isinstance(JC, weakref.ReferenceType): 51 self.JC = JC 52 else: self.JC = weakref.ref(JC) 53 self.JC().stream.AddObserver('iq', self) 52 54 53 def Bid(self, subject, **UpdateDict): 54 iq = UpdateDict.get('iq', None) 55 if iq: 56 # and a compatible type 57 bMatch = iq.type == self.typeQuery 58 # and the query result namespace is the same 59 if bMatch: bMatch = iq.Elements(namespace=self.nsQuery) and 1 or 0 60 # then we have a match 61 return bMatch and self.BidValue or 0 62 return 0 55 def AnswerQuery(self, nsQuery, typeQuery='get'): 56 # Lets observer the jabber stream 57 if nsQuery not in self.JC().SupportedNS: 58 self.JC().SupportedNS.append(nsQuery) 63 59 64 def Update(self, subject, **UpdateDict): 65 pass 60 del self.Match[:] 61 self.Match.append(JObs.MatchHasChildNamespace(nsQuery)) 62 self.Match.append(JObs.MatchAttributes(type=typeQuery)) 66 63 67 def _SelfLink(self, bLink):68 cm = self.JC().ClientMonitors69 if bLink:70 if self not in cm: cm.append(self)71 else:72 if self in cm: cm.remove(self)73 74 def AnswerQuery(self, nsQuery, typeQuery='get'):75 # Make a self reference while we are still querying76 self._SelfLink(1)77 # Lets observer the jabber stream78 self.JC().stream.AddObserver('iq', self._observer)79 self.JC().SupportedNS.append(nsQuery)80 64 # Setup our match attributes 81 self.nsQuery = nsQuery82 self.typeQuery = typeQuery83 65 return self 84 85 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~86 87 class iqResponse(iqResponseBase):88 def __init__(self, JabberClient, ReplyCallback):89 iqResponseBase.__init__(self, JabberClient)90 self.Update = BindCallable(ReplyCallback)91 66 trunk/RBJabber/RBJabber/iqRosterQuery.py
r87 r96 37 37 import weakref 38 38 from xml.sax.saxutils import escape, quoteattr 39 from Foundation.SubjectObserver.Observer import Observer 40 from iqQuery import iqQueryBase, Subject 39 from Foundation.WeakBind import BindCallable 40 from Foundation.SubjectObserver.CategorySubject import CategorySubject 41 from iqQuery import iqQueryBase 41 42 import JID 42 43 … … 45 46 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 46 47 47 class iqRosterQuery(iqQueryBase, Subject): 48 def __init__(self, JabberClient): 49 iqQueryBase.__init__(self, JabberClient) 50 Subject.__init__(self) 51 self._observer = Observer(self.Update, self.Bid) 52 self.JC().stream.AddObserver('iq', self._observer) 53 self.JC().SendXML('''<iq type='get'><query xmlns='jabber:iq:roster'/></iq>''') 48 class iqRosterQuery(iqQueryBase, CategorySubject): 49 def __init__(self, JC, callback=None, BidValue=1): 50 self.OnRosterCallback = BindCallable(callback) 51 iqQueryBase.__init__(self, JC, self.OnRosterInfo, BidValue) 52 CategorySubject.__init__(self) 53 self.SendQuery('jabber:iq:roster') 54 54 self.ByJID = {} 55 55 56 def Bid(self, subject, **UpdateDict): 57 iq = UpdateDict.get('iq', None) 58 if iq: 59 bMatch = iq.type in ['result', 'error'] 60 if bMatch: bMatch = iq.Elements(namespace='jabber:iq:roster') and 1 or 0 61 return bMatch and 1 or 0 62 return 0 63 64 def Update(self, subject, iq): 56 def OnRosterInfo(self, stream, iq): 65 57 RosterItems = getattr(iq.query[0], 'item', []) 66 58 for each in RosterItems: 67 self.ByJID[JID.join(JID.split(each.jid)[:2])] = each 59 self.ByJID[each.jid] = each 60 self.UpdateObserversEx({('rosteritem', each.jid):each}) 68 61 if RosterItems: 69 self.UpdateObservers(Roster=self.ByJID) 62 self.UpdateObservers(roster=self.ByJID) 63 if self.OnRosterCallback: 64 self.OnRosterCallback(stream, iq) 70 65 71 def Get(self, JID, default=None):72 return self.ByJID.get(JID. join(JID.split(JID)[:2]), default)66 def Get(self, jid, default=None): 67 return self.ByJID.get(JID.JID(jid), default) 73 68 trunk/RBJabber/RBJabber/iqTimeResponse.py
r66 r96 43 43 44 44 class iqTimeResponse(iqResponseBase): 45 def __init__(self, JC ):46 iqResponseBase.__init__(self, JC )45 def __init__(self, JC, BidValue=1): 46 iqResponseBase.__init__(self, JC, self.OnIQTimeRequest, BidValue) 47 47 self.AnswerQuery("jabber:iq:time") 48 48 49 def Update(self, subject, **UpdateDict): 50 iq = UpdateDict['iq'] 49 def OnIQTimeRequest(self, subject, iq): 51 50 iq.to = iq.from_ 52 51 del iq.from_ … … 60 59 strResult += '''</query></iq>''' 61 60 62 self.JC().SendXML(strResult)61 iq._client.SendXML(strResult) 63 62 trunk/RBJabber/RBJabber/iqVersionResponse.py
r81 r96 44 44 45 45 class iqVersionResponse(iqResponseBase): 46 def __init__(self, JC, Name, Version, Bid =1):47 iqResponseBase.__init__(self, JC )46 def __init__(self, JC, Name, Version, BidValue=1): 47 iqResponseBase.__init__(self, JC, self.OnIQVersionRequest, BidValue) 48 48 self.AnswerQuery("jabber:iq:version") 49 49 self.Name = Name 50 50 self.Versio
