| 14 | | _xmlJabberHeader = '''<?xml version="1.0" encoding="UTF-8" ?><stream:stream to="%s" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams">''' |
|---|
| 15 | | _xmlJabberFooter = '''</stream:stream>''' |
|---|
| | 13 | class jabber_stream(jabber_base.jabber_node): |
|---|
| | 14 | def __init__(self, client, namespace, node, attributes): |
|---|
| | 15 | jabber_base.jabber_node.__init__(self, client, namespace, node, attributes) |
|---|
| | 16 | self.__namespace__ = namespace |
|---|
| | 17 | self.__node__ = node |
|---|
| | 18 | self.__dict__.update(attributes) |
|---|
| | 19 | client.stream.settings = self |
|---|
| 17 | | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| 18 | | #~ Classes |
|---|
| | 21 | class jabber_stream_error(XMLObjectify._Objectified): |
|---|
| | 22 | e_jabber_stream_error = 'jabber_stream_error' |
|---|
| | 23 | |
|---|
| | 24 | def __init__(self, client, namespace, node, attributes): |
|---|
| | 25 | self._client = client |
|---|
| | 26 | XMLObjectify._Objectified.__init__(self, namespace, node, attributes) |
|---|
| | 27 | |
|---|
| | 28 | def _xmlInitComplete(self): |
|---|
| | 29 | self._client.Shutdown() |
|---|
| | 30 | raise self.e_jabber_stream_error, ''.join(self._toXML()) |
|---|
| | 31 | |
|---|
| 21 | | class jabber_node(_Objectified): |
|---|
| 22 | | def _xmlInitComplete(self): |
|---|
| 23 | | print |
|---|
| 24 | | print '~~~~~~~~~~~~~~~~~~~~' |
|---|
| 25 | | print |
|---|
| 26 | | print '\n'.join(self._toXML()) |
|---|
| 27 | | |
|---|
| 28 | | class jabber_iq_node(_Objectified): |
|---|
| 29 | | def _xmlInitComplete(self): |
|---|
| 30 | | print |
|---|
| 31 | | print '~~~ IQ ~~~~~~~~~~~~~' |
|---|
| 32 | | print |
|---|
| 33 | | print '\n'.join(self._toXML()) |
|---|
| 34 | | |
|---|
| 35 | | |
|---|
| 36 | | class client(XMLBuilderMixin): |
|---|
| 37 | | _reJabberURL = re.compile('''(?:jabber://)?(\w+(?:\w|\.)*\w+)(?::(\d+))?''') |
|---|
| 38 | | dictJabberNodes = { |
|---|
| 39 | | ('jabber:client', 'iq'): jabber_iq_node, |
|---|
| 40 | | } |
|---|
| 41 | | ServerJID = None |
|---|
| 42 | | |
|---|
| 43 | | def __init__(self, JabberServerURL): |
|---|
| 44 | | XMLBuilderMixin.__init__(self) |
|---|
| 45 | | self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) |
|---|
| 46 | | params = client._reJabberURL.split(JabberServerURL)[1:3] |
|---|
| 47 | | self._socket.connect((params[0], params[1] or 5222)) |
|---|
| 48 | | self.ServerJID = params[0] |
|---|
| 49 | | |
|---|
| 50 | | self._parser = ParserCreate('ASCII', self._seperator) |
|---|
| 51 | | self._parser.returns_unicode = 0 |
|---|
| 52 | | self._parser.StartElementHandler = self._start_element |
|---|
| 53 | | self._parser.EndElementHandler = self._end_element |
|---|
| 54 | | self._parser.CharacterDataHandler = self._char_data |
|---|
| 55 | | |
|---|
| 56 | | self.Send(_xmlJabberHeader % self.ServerJID) |
|---|
| 57 | | |
|---|
| 58 | | def __del__(self): |
|---|
| 59 | | self.Send(_xmlJabberFooter) |
|---|
| 60 | | print 'Disconnecting %r from %s' % (self, self.ServerJID) |
|---|
| 61 | | |
|---|
| 62 | | def _GetElementFactory(self, namespace, node, attributes): |
|---|
| 63 | | if len(self._elements) > 1: |
|---|
| 64 | | return _Objectified |
|---|
| 65 | | else: |
|---|
| 66 | | return self.dictJabberNodes.get((namespace, node), jabber_node) |
|---|
| 67 | | |
|---|
| 68 | | def __call__(self, *args, **kw): |
|---|
| 69 | | return apply(self.Process, args, kw) |
|---|
| 70 | | |
|---|
| 71 | | def Process(self): |
|---|
| 72 | | data = self._socket.recv(8192) |
|---|
| 73 | | self._parser.Parse(data) |
|---|
| 74 | | |
|---|
| 75 | | def Send(self, xmlData): |
|---|
| 76 | | return self.SendImmediate(xmlData) |
|---|
| 77 | | |
|---|
| 78 | | def SendImmediate(self, xmlData): |
|---|
| 79 | | data = xmlData[:] |
|---|
| 80 | | while data: |
|---|
| 81 | | nSent = self._socket.send(data) |
|---|
| 82 | | data = data[nSent:] |
|---|
| | 34 | class jabber_node(XMLObjectify._Objectified): |
|---|
| | 35 | def __init__(self, client, namespace, node, attributes): |
|---|
| | 36 | self._client = client |
|---|
| | 37 | XMLObjectify._Objectified.__init__(self, namespace, node, attributes) |
|---|
| 91 | | jc = client(dictLogin['server']) |
|---|
| 92 | | jc.Process() |
|---|
| 93 | | jc.Send('''<iq type="set" to="%(server)s"><query xmlns="jabber:iq:auth"> |
|---|
| 94 | | <username>%(login)s</username> |
|---|
| 95 | | <password>%(password)s</password> |
|---|
| 96 | | <resource>Python-Test</resource> |
|---|
| 97 | | </query></iq>''' % dictLogin) |
|---|
| 98 | | jc.Send('''<presence type="available" />''') |
|---|
| 99 | | jc.Send(''' |
|---|
| 100 | | <iq type="get" to="%s"><query xmlns="jabber:iq:roster"> |
|---|
| 101 | | </query></iq>''' % jc.ServerJID) |
|---|
| 102 | | jc.Process() |
|---|
| 103 | | return jc |
|---|
| | 45 | class jabber_client_presence(jabber_node): |
|---|
| | 46 | def _xmlInitComplete(self): |
|---|
| | 47 | subject, resource = self._client.GetPresence(self.from_) |
|---|
| | 48 | setattr(subject, resource, self) |
|---|
| | 49 | self._client.stream.presence = self |
|---|
| | 55 | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| | 56 | #~ Jabber Client Class |
|---|
| | 57 | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| | 58 | |
|---|
| | 59 | class client(jabber_base.client): |
|---|
| | 60 | DefaultJabberNode = jabber_node |
|---|
| | 61 | JabberNodeMap = { |
|---|
| | 62 | ('http://etherx.jabber.org/streams', 'stream'): jabber_stream, |
|---|
| | 63 | ('http://etherx.jabber.org/streams', 'error'): jabber_stream_error, |
|---|
| | 64 | |
|---|
| | 65 | ('jabber:client', 'iq'): jabber_client_iq, |
|---|
| | 66 | ('jabber:client', 'message'): jabber_client_message, |
|---|
| | 67 | ('jabber:client', 'presence'): jabber_client_presence, |
|---|
| | 68 | } |
|---|
| | 69 | |
|---|
| | 70 | def __init__(self, *args, **kw): |
|---|
| | 71 | self._PresenceMap = {} |
|---|
| | 72 | self.stream = SubjectObserver.AttributedSubject() |
|---|
| | 73 | apply(jabber_base.client.__init__, (self,) + args, kw) |
|---|
| | 74 | |
|---|
| | 75 | def GetPresence(self, JID): |
|---|
| | 76 | lstJID = jabber_base.reJabberJID.split(JID)[1:-1] |
|---|
| | 77 | tupleJID = tuple(lstJID[:-1]) |
|---|
| | 78 | resource = lstJID[-1] |
|---|
| | 79 | return self._PresenceMap.setdefault(tupleJID, SubjectObserver.AttributedSubject()), resource or '__default__' |
|---|
| | 80 | |
|---|
| | 81 | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| | 82 | #~ Testing |
|---|
| | 83 | #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|---|
| | 84 | |
|---|
| | 85 | if __name__=='__main__': |
|---|
| | 86 | import jabber_test |
|---|
| | 87 | |
|---|