summaryrefslogtreecommitdiff
path: root/sleekxmpp/xmlstream
diff options
context:
space:
mode:
Diffstat (limited to 'sleekxmpp/xmlstream')
-rw-r--r--sleekxmpp/xmlstream/stanzabase.py68
-rw-r--r--sleekxmpp/xmlstream/tostring.py60
-rw-r--r--sleekxmpp/xmlstream/tostring26.py65
3 files changed, 133 insertions, 60 deletions
diff --git a/sleekxmpp/xmlstream/stanzabase.py b/sleekxmpp/xmlstream/stanzabase.py
index feb9b268..480e9602 100644
--- a/sleekxmpp/xmlstream/stanzabase.py
+++ b/sleekxmpp/xmlstream/stanzabase.py
@@ -1,6 +1,12 @@
from xml.etree import cElementTree as ET
import logging
import traceback
+import sys
+
+if sys.version_info < (3,0):
+ from . import tostring26 as tostring
+else:
+ from . import tostring
xmltester = type(ET.Element('xml'))
@@ -23,7 +29,7 @@ class JID(object):
def __str__(self):
return self.jid
-class ElementBase(object):
+class ElementBase(tostring.ToString):
name = 'stanza'
plugin_attrib = 'plugin'
namespace = 'jabber:client'
@@ -333,63 +339,5 @@ class StanzaBase(ElementBase):
logging.error(traceback.format_tb(e))
def send(self):
- self.stream.sendRaw(str(self))
-
- def __str__(self, xml=None, xmlns='', stringbuffer=''):
- if xml is None:
- xml = self.xml
- newoutput = [stringbuffer]
- #TODO respect ET mapped namespaces
- itag = xml.tag.split('}', 1)[-1]
- if '}' in xml.tag:
- ixmlns = xml.tag.split('}', 1)[0][1:]
- else:
- ixmlns = ''
- nsbuffer = ''
- if xmlns != ixmlns and ixmlns != '' and ixmlns != self.namespace:
- if self.stream is not None and ixmlns in self.stream.namespace_map:
- if self.stream.namespace_map[ixmlns] != '':
- itag = "%s:%s" % (self.stream.namespace_map[ixmlns], itag)
- else:
- nsbuffer = """ xmlns="%s\"""" % ixmlns
- if ixmlns not in ('', xmlns, self.namespace):
- nsbuffer = """ xmlns="%s\"""" % ixmlns
- newoutput.append("<%s" % itag)
- newoutput.append(nsbuffer)
- for attrib in xml.attrib:
- if '{' not in attrib:
- newoutput.append(""" %s="%s\"""" % (attrib, self.xmlesc(xml.attrib[attrib])))
- if len(xml) or xml.text or xml.tail:
- newoutput.append(">")
- if xml.text:
- newoutput.append(self.xmlesc(xml.text))
- if len(xml):
- for child in xml.getchildren():
- newoutput.append(self.__str__(child, ixmlns))
- newoutput.append("</%s>" % (itag, ))
- if xml.tail:
- newoutput.append(self.xmlesc(xml.tail))
- elif xml.text:
- newoutput.append(">%s</%s>" % (self.xmlesc(xml.text), itag))
- else:
- newoutput.append(" />")
- return ''.join(newoutput)
+ self.stream.sendRaw(self.__str__())
- def xmlesc(self, text):
- text = list(text)
- cc = 0
- matches = ('&', '<', '"', '>', "'")
- for c in text:
- if c in matches:
- if c == '&':
- text[cc] = '&amp;'
- elif c == '<':
- text[cc] = '&lt;'
- elif c == '>':
- text[cc] = '&gt;'
- elif c == "'":
- text[cc] = '&apos;'
- else:
- text[cc] = '&quot;'
- cc += 1
- return ''.join(text)
diff --git a/sleekxmpp/xmlstream/tostring.py b/sleekxmpp/xmlstream/tostring.py
new file mode 100644
index 00000000..6603cbb8
--- /dev/null
+++ b/sleekxmpp/xmlstream/tostring.py
@@ -0,0 +1,60 @@
+
+class ToString(object):
+ def __str__(self, xml=None, xmlns='', stringbuffer=''):
+ if xml is None:
+ xml = self.xml
+ newoutput = [stringbuffer]
+ #TODO respect ET mapped namespaces
+ itag = xml.tag.split('}', 1)[-1]
+ if '}' in xml.tag:
+ ixmlns = xml.tag.split('}', 1)[0][1:]
+ else:
+ ixmlns = ''
+ nsbuffer = ''
+ if xmlns != ixmlns and ixmlns != '' and ixmlns != self.namespace:
+ if self.stream is not None and ixmlns in self.stream.namespace_map:
+ if self.stream.namespace_map[ixmlns] != '':
+ itag = "%s:%s" % (self.stream.namespace_map[ixmlns], itag)
+ else:
+ nsbuffer = """ xmlns="%s\"""" % ixmlns
+ if ixmlns not in ('', xmlns, self.namespace):
+ nsbuffer = """ xmlns="%s\"""" % ixmlns
+ newoutput.append("<%s" % itag)
+ newoutput.append(nsbuffer)
+ for attrib in xml.attrib:
+ if '{' not in attrib:
+ newoutput.append(""" %s="%s\"""" % (attrib, self.xmlesc(xml.attrib[attrib])))
+ if len(xml) or xml.text or xml.tail:
+ newoutput.append(">")
+ if xml.text:
+ newoutput.append(self.xmlesc(xml.text))
+ if len(xml):
+ for child in xml.getchildren():
+ newoutput.append(self.__str__(child, ixmlns))
+ newoutput.append("</%s>" % (itag, ))
+ if xml.tail:
+ newoutput.append(self.xmlesc(xml.tail))
+ elif xml.text:
+ newoutput.append(">%s</%s>" % (self.xmlesc(xml.text), itag))
+ else:
+ newoutput.append(" />")
+ return ''.join(newoutput)
+
+ def xmlesc(self, text):
+ text = list(text)
+ cc = 0
+ matches = ('&', '<', '"', '>', "'")
+ for c in text:
+ if c in matches:
+ if c == '&':
+ text[cc] = '&amp;'
+ elif c == '<':
+ text[cc] = '&lt;'
+ elif c == '>':
+ text[cc] = '&gt;'
+ elif c == "'":
+ text[cc] = '&apos;'
+ else:
+ text[cc] = '&quot;'
+ cc += 1
+ return ''.join(text)
diff --git a/sleekxmpp/xmlstream/tostring26.py b/sleekxmpp/xmlstream/tostring26.py
new file mode 100644
index 00000000..9711c300
--- /dev/null
+++ b/sleekxmpp/xmlstream/tostring26.py
@@ -0,0 +1,65 @@
+import types
+
+class ToString(object):
+ def __str__(self, xml=None, xmlns='', stringbuffer=''):
+ if xml is None:
+ xml = self.xml
+ newoutput = [stringbuffer]
+ #TODO respect ET mapped namespaces
+ itag = xml.tag.split('}', 1)[-1]
+ if '}' in xml.tag:
+ ixmlns = xml.tag.split('}', 1)[0][1:]
+ else:
+ ixmlns = ''
+ nsbuffer = ''
+ if xmlns != ixmlns and ixmlns != u'' and ixmlns != self.namespace:
+ if self.stream is not None and ixmlns in self.stream.namespace_map:
+ if self.stream.namespace_map[ixmlns] != u'':
+ itag = "%s:%s" % (self.stream.namespace_map[ixmlns], itag)
+ else:
+ nsbuffer = """ xmlns="%s\"""" % ixmlns
+ if ixmlns not in ('', xmlns, self.namespace):
+ nsbuffer = """ xmlns="%s\"""" % ixmlns
+ newoutput.append("<%s" % itag)
+ newoutput.append(nsbuffer)
+ for attrib in xml.attrib:
+ if '{' not in attrib:
+ newoutput.append(""" %s="%s\"""" % (attrib, self.xmlesc(xml.attrib[attrib])))
+ if len(xml) or xml.text or xml.tail:
+ newoutput.append(u">")
+ if xml.text:
+ newoutput.append(self.xmlesc(xml.text))
+ if len(xml):
+ for child in xml.getchildren():
+ newoutput.append(self.__str__(child, ixmlns))
+ newoutput.append(u"</%s>" % (itag, ))
+ if xml.tail:
+ newoutput.append(self.xmlesc(xml.tail))
+ elif xml.text:
+ newoutput.append(">%s</%s>" % (self.xmlesc(xml.text), itag))
+ else:
+ newoutput.append(" />")
+ return u''.join(newoutput)
+
+ def xmlesc(self, text):
+ if type(text) != types.UnicodeType:
+ text = list(unicode(text, 'utf-8', 'ignore'))
+ else:
+ text = list(text)
+
+ cc = 0
+ matches = (u'&', u'<', u'"', u'>', u"'")
+ for c in text:
+ if c in matches:
+ if c == u'&':
+ text[cc] = u'&amp;'
+ elif c == u'<':
+ text[cc] = u'&lt;'
+ elif c == u'>':
+ text[cc] = u'&gt;'
+ elif c == u"'":
+ text[cc] = u'&apos;'
+ else:
+ text[cc] = u'&quot;'
+ cc += 1
+ return ''.join(text)