Changeset 144
- Timestamp:
- 05/08/02 10:03:06 (6 years ago)
- Files:
-
- trunk/RBJabber/RBJabber/Client.py (modified) (5 diffs)
- trunk/RBJabber/RBJabber/ClientNodes.py (modified) (1 diff)
- trunk/RBJabber/RBJabber/Conference.py (modified) (1 diff)
- trunk/RBJabber/RBJabber/JabberConnection.py (modified) (8 diffs)
- trunk/RBJabber/RBJabber/SubjectObserver/AttributedSubject.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBJabber/RBJabber/Client.py
r143 r144 48 48 49 49 from xml.sax.saxutils import escape, quoteattr 50 from Foundation.Jabber import Base51 50 from Foundation.Jabber import ClientNodes 52 51 from Foundation.Jabber import JID 52 from Foundation.Jabber.Base import JabberConnection 53 53 from Foundation import SubjectObserver 54 54 … … 57 57 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 58 59 class Client( Base.BasicClient):59 class Client(JabberConnection): 60 60 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 61 #~ Constants / Variables / Etc. … … 85 85 def __init__(self, *args, **kw): 86 86 self.stream = SubjectObserver.BidableCategorySubject() 87 self.stream.IncludeSend = kw.get('xmlsend', 0) 88 self.stream.IncludeRecv = kw.get('xmlrecv', 0) 87 89 self.information = SubjectObserver.AttributedSubject.AttributedSubject() 88 apply(Base.BasicClient.__init__, (self,) + args, kw) 90 self.information.jid = JID.JID() 91 self.information.authorized = 0 92 apply(self.__super.__init__, (self,) + args, kw) 89 93 90 94 self.SupportedNS = [] … … 100 104 return str(self.__NextID) 101 105 106 def _SocketRecv(self, limit=8192): 107 """Overrides socket access so that stream events can be created.""" 108 result = self.__super._SocketRecv(self, limit) 109 if self.stream.IncludeRecv and result: self.stream.UpdateObservers(xmlrecv=result) 110 return result 111 112 def _SocketSend(self, data): 113 """Overrides socket access so that stream events can be created.""" 114 if self.stream.IncludeSend and data: self.stream.UpdateObservers(xmlsend=data) 115 return self.__super._SocketSend(self, data) 116 102 117 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 103 118 #~ Public Methods 104 119 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 120 121 def Shutdown(self): 122 """Politely disconnects the socket and parser from the jabber stream""" 123 self.__super.Shutdown(self) 124 self.information.jid = JID.JID() 125 self.information.authorized = 0 105 126 106 127 def Authenticate(self, username, password, resource, callback=None): … … 231 252 return self.Presence(toJID=toJID, type=type) 232 253 233 254 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 # Make a super 256 Client._Client__super = super(Client) 257 258 trunk/RBJabber/RBJabber/ClientNodes.py
r143 r144 103 103 104 104 def _xmlInitStarted(self): 105 self._client.ServerJID = self.from_ 105 106 self._client.stream.UpdateObservers(settings=self) 106 107 def _addElement(self, namespace, node, element): pass trunk/RBJabber/RBJabber/Conference.py
r143 r144 114 114 return self.JC().Query('jabber:iq:conference', toJID=self.ConferenceJID, type='get', callback=callback) 115 115 116 def JoinAs(self, Nick, Secret='', callback=None):116 def JoinAs(self, Nick, Secret='', Privacy=0, callback=None): 117 117 """Joins the conference using Nick(s), and Secret if need be. 118 118 119 119 Returns iqQuery object.""" 120 if not isinstance(Nick, (list, tuple)): Nick = (Nick,) 121 xmlNick = ''.join(['<nick>%s</nick>' % x for x in Nick]) 122 xmlSecret = Secret and ('<secret>%s</secret>' % Secret) or '' 120 xml = '' 121 if Nick: 122 if not isinstance(Nick, (list, tuple)): Nick = (Nick,) 123 xml = ''.join(['<nick>%s</nick>' % x for x in Nick]) 124 if Secret: xml += '<secret>%s</secret>' % Secret 125 if Privacy: xml += '<privacy/>' 126 123 127 self.Presence() 124 return self.JC().Query('jabber:iq:conference', toJID=self.ConferenceJID, type='set', xml=xmlNick + xmlSecret, callback=callback) 128 129 return self.JC().Query('jabber:iq:conference', toJID=self.ConferenceJID, type='set', xml=xml, callback=callback) 125 130 126 131 def ChangeNick(self, Nick, callback=None): trunk/RBJabber/RBJabber/JabberConnection.py
r143 r144 59 59 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 60 60 61 _xmlJabberHeader = '''<?xml version="1.0" encoding="UTF-8" ?><stream:stream to="%s" xmlns=" jabber:client" xmlns:stream="http://etherx.jabber.org/streams">'''61 _xmlJabberHeader = '''<?xml version="1.0" encoding="UTF-8" ?><stream:stream to="%s" xmlns="%s" xmlns:stream="http://etherx.jabber.org/streams">''' 62 62 _xmlJabberFooter = '''</stream:stream>''' 63 63 … … 66 66 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 67 67 68 class BasicClient(XMLBuilderMixin, SmartSelect.SmartSelectClientBase):68 class JabberConnection(XMLBuilderMixin, SmartSelect.SmartSelectClientBase): 69 69 """Very basic Jabber client, including: 70 70 - Smart select socket handling, … … 84 84 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 85 86 def __init__(self, JabberServerURL, port=5222, fileIn=None, fileOut=None): 86 def __init__(self, JabberServerURL, port=5222, ServerJID=None, namespace='jabber:client', fileIn=None, fileOut=None, **kw): 87 """Creates a Socket and XML parser to handle connection to a Jabber server. 88 89 JabberServerURL & port specify how the socket is connected to Jabber server, 90 ServerJID is to be set if the ServerJID is different than the JabberServerURL hostname, and 91 fileIn and fileOut should be file-like-objects to receive the influx and outflux streams. 92 93 """ 87 94 self._SetDebug(fileIn, fileOut) 88 95 … … 96 103 self._socket.connect((params[0], port)) 97 104 self.fileno = self._socket.fileno 98 self.ServerJID = JID.JID(params[0]) 105 106 self.ServerJID = JID.JID(ServerJID or params[0]) 99 107 100 108 # Create our xml parser … … 102 110 103 111 # Send the initial header 104 self.SendXML(_xmlJabberHeader % self.ServerJID)112 self.SendXML(_xmlJabberHeader % (self.ServerJID, namespace)) 105 113 106 114 def __del__(self): … … 165 173 def _ProcessRead(self): 166 174 """Called by the SmartSelect mechanism when the socket is ready to be read from.""" 167 data = self._ socket.recv(8192)175 data = self._SocketRecv() 168 176 if self._fileIn: print >> self._fileIn, data 169 177 self._parser.Parse(data) … … 174 182 def _ProcessWrite(self): 175 183 """Called by the SmartSelect mechanism when the socket is ready to be written to.""" 176 nSent = self._ socket.send(self._sendData)184 nSent = self._SocketSend(self._sendData) 177 185 if self._fileOut: print >> self._fileOut, self._sendData[:nSent] 178 186 self._sendData = self._sendData[nSent:] … … 187 195 self._sendData += xml 188 196 while self._sendData and select.select([], [self._socket], []): 189 nSent = self._ socket.send(self._sendData)197 nSent = self._SocketSend(self._sendData) 190 198 if self._fileOut: print >> self._fileOut, self._sendData[:nSent] 191 199 self._sendData = self._sendData[nSent:] 192 200 201 def _SocketRecv(self, limit=8192): 202 return self._socket.recv(limit) 203 204 def _SocketSend(self, data): 205 return self._socket.send(data) 206 193 207 # Keep the super around for speed 194 BasicClient._BasicClient__super = super(BasicClient)208 JabberConnection._JabberConnection__super = super(JabberConnection) trunk/RBJabber/RBJabber/SubjectObserver/AttributedSubject.py
r125 r144 71 71 72 72 class AttributedSubject(AttributedSubjectMixin, Subject): 73 pass 73 def AddObserver(self, observer, call=0): 74 Subject.AddObserver(self, observer) 75 if call: observer(self) 74 76
