summaryrefslogtreecommitdiff
path: root/sleekxmpp/stanza/rootstanza.py
blob: e568b62b05f72751408c301b9427d0fce56529df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
"""
    SleekXMPP: The Sleek XMPP Library
    Copyright (C) 2010  Nathanael C. Fritz
    This file is part of SleekXMPP.

    See the file LICENSE for copying permission.
"""
from .. xmlstream.stanzabase import StanzaBase
from xml.etree import cElementTree as ET
from . error import Error
from .. exceptions import XMPPError
import traceback
import sys

class RootStanza(StanzaBase):

	def exception(self, e): #called when a handler raises an exception
		self.reply()
		if isinstance(e, XMPPError): # we raised this deliberately
			self['error']['condition'] = e.condition
			self['error']['text'] = e.text
			if e.extension is not None: # extended error tag
				extxml = ET.Element("{%s}%s" % (e.extension_ns, e.extension), e.extension_args)
				self['error'].xml.append(extxml)
				self['error']['type'] = e.etype
		else: # we probably didn't raise this on purpose, so send back a traceback
			self['error']['condition'] = 'undefined-condition'
			if sys.version_info < (3,0):
				self['error']['text'] = "SleekXMPP got into trouble."
			else:
				self['error']['text'] = traceback.format_tb(e.__traceback__)
		self.send()

# all jabber:client root stanzas should have the error plugin
RootStanza.plugin_attrib_map['error'] = Error
RootStanza.plugin_tag_map["{%s}%s" % (Error.namespace, Error.name)] = Error