mirror of
https://github.com/correl/SleekXMPP.git
synced 2024-11-24 03:00:15 +00:00
Updated StanzaBase with documentation.
This commit is contained in:
parent
ca6ce26b0d
commit
a2c515bc97
1 changed files with 126 additions and 13 deletions
|
@ -893,6 +893,48 @@ class ElementBase(object):
|
||||||
|
|
||||||
|
|
||||||
class StanzaBase(ElementBase):
|
class StanzaBase(ElementBase):
|
||||||
|
|
||||||
|
"""
|
||||||
|
StanzaBase provides the foundation for all other stanza objects used by
|
||||||
|
SleekXMPP, and defines a basic set of interfaces common to nearly
|
||||||
|
all stanzas. These interfaces are the 'id', 'type', 'to', and 'from'
|
||||||
|
attributes. An additional interface, 'payload', is available to access
|
||||||
|
the XML contents of the stanza. Most stanza objects will provided more
|
||||||
|
specific interfaces, however.
|
||||||
|
|
||||||
|
Stanza Interface:
|
||||||
|
from -- A JID object representing the sender's JID.
|
||||||
|
id -- An optional id value that can be used to associate stanzas
|
||||||
|
with their replies.
|
||||||
|
payload -- The XML contents of the stanza.
|
||||||
|
to -- A JID object representing the recipient's JID.
|
||||||
|
type -- The type of stanza, typically will be 'normal', 'error',
|
||||||
|
'get', or 'set', etc.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
stream -- The XMLStream instance that will handle sending this stanza.
|
||||||
|
tag -- The namespaced version of the stanza's name.
|
||||||
|
|
||||||
|
Methods:
|
||||||
|
setType -- Set the type of the stanza.
|
||||||
|
getTo -- Return the stanza recipients JID.
|
||||||
|
setTo -- Set the stanza recipient's JID.
|
||||||
|
getFrom -- Return the stanza sender's JID.
|
||||||
|
setFrom -- Set the stanza sender's JID.
|
||||||
|
getPayload -- Return the stanza's XML contents.
|
||||||
|
setPayload -- Append to the stanza's XML contents.
|
||||||
|
delPayload -- Remove the stanza's XML contents.
|
||||||
|
clear -- Reset the stanza's XML contents.
|
||||||
|
reply -- Reset the stanza and modify the 'to' and 'from'
|
||||||
|
attributes to prepare for sending a reply.
|
||||||
|
error -- Set the stanza's type to 'error'.
|
||||||
|
unhandled -- Callback for when the stanza is not handled by a
|
||||||
|
stream handler.
|
||||||
|
exception -- Callback for if an exception is raised while
|
||||||
|
handling the stanza.
|
||||||
|
send -- Send the stanza using the stanza's stream.
|
||||||
|
"""
|
||||||
|
|
||||||
name = 'stanza'
|
name = 'stanza'
|
||||||
namespace = 'jabber:client'
|
namespace = 'jabber:client'
|
||||||
interfaces = set(('type', 'to', 'from', 'id', 'payload'))
|
interfaces = set(('type', 'to', 'from', 'id', 'payload'))
|
||||||
|
@ -901,6 +943,17 @@ class StanzaBase(ElementBase):
|
||||||
|
|
||||||
def __init__(self, stream=None, xml=None, stype=None,
|
def __init__(self, stream=None, xml=None, stype=None,
|
||||||
sto=None, sfrom=None, sid=None):
|
sto=None, sfrom=None, sid=None):
|
||||||
|
"""
|
||||||
|
Create a new stanza.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
stream -- Optional XMLStream responsible for sending this stanza.
|
||||||
|
xml -- Optional XML contents to initialize stanza values.
|
||||||
|
stype -- Optional stanza type value.
|
||||||
|
sto -- Optional string or JID object of the recipient's JID.
|
||||||
|
sfrom -- Optional string or JID object of the sender's JID.
|
||||||
|
sid -- Optional ID value for the stanza.
|
||||||
|
"""
|
||||||
self.stream = stream
|
self.stream = stream
|
||||||
if stream is not None:
|
if stream is not None:
|
||||||
self.namespace = stream.default_ns
|
self.namespace = stream.default_ns
|
||||||
|
@ -914,22 +967,69 @@ class StanzaBase(ElementBase):
|
||||||
self.tag = "{%s}%s" % (self.namespace, self.name)
|
self.tag = "{%s}%s" % (self.namespace, self.name)
|
||||||
|
|
||||||
def setType(self, value):
|
def setType(self, value):
|
||||||
|
"""
|
||||||
|
Set the stanza's 'type' attribute.
|
||||||
|
|
||||||
|
Only type values contained in StanzaBase.types are accepted.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
value -- One of the values contained in StanzaBase.types
|
||||||
|
"""
|
||||||
if value in self.types:
|
if value in self.types:
|
||||||
self.xml.attrib['type'] = value
|
self.xml.attrib['type'] = value
|
||||||
return self
|
return self
|
||||||
|
|
||||||
|
def getTo(self):
|
||||||
|
"""Return the value of the stanza's 'to' attribute."""
|
||||||
|
return JID(self._getAttr('to'))
|
||||||
|
|
||||||
|
def setTo(self, value):
|
||||||
|
"""
|
||||||
|
Set the 'to' attribute of the stanza.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
value -- A string or JID object representing the recipient's JID.
|
||||||
|
"""
|
||||||
|
return self._setAttr('to', str(value))
|
||||||
|
|
||||||
|
def getFrom(self):
|
||||||
|
"""Return the value of the stanza's 'from' attribute."""
|
||||||
|
return JID(self._getAttr('from'))
|
||||||
|
|
||||||
|
def setFrom(self, value):
|
||||||
|
"""
|
||||||
|
Set the 'from' attribute of the stanza.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
from -- A string or JID object representing the sender's JID.
|
||||||
|
"""
|
||||||
|
return self._setAttr('from', str(value))
|
||||||
|
|
||||||
def getPayload(self):
|
def getPayload(self):
|
||||||
|
"""Return a list of XML objects contained in the stanza."""
|
||||||
return self.xml.getchildren()
|
return self.xml.getchildren()
|
||||||
|
|
||||||
def setPayload(self, value):
|
def setPayload(self, value):
|
||||||
|
"""
|
||||||
|
Add XML content to the stanza.
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
value -- An XML object, or a stanza object.
|
||||||
|
"""
|
||||||
self.xml.append(value)
|
self.xml.append(value)
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def delPayload(self):
|
def delPayload(self):
|
||||||
|
"""Remove the XML contents of the stanza."""
|
||||||
self.clear()
|
self.clear()
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def clear(self):
|
def clear(self):
|
||||||
|
"""
|
||||||
|
Remove all XML element contents and plugins.
|
||||||
|
|
||||||
|
Any attribute values will be preserved.
|
||||||
|
"""
|
||||||
for child in self.xml.getchildren():
|
for child in self.xml.getchildren():
|
||||||
self.xml.remove(child)
|
self.xml.remove(child)
|
||||||
for plugin in list(self.plugins.keys()):
|
for plugin in list(self.plugins.keys()):
|
||||||
|
@ -937,6 +1037,12 @@ class StanzaBase(ElementBase):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def reply(self):
|
def reply(self):
|
||||||
|
"""
|
||||||
|
Reset the stanza and swap its 'from' and 'to' attributes to prepare
|
||||||
|
for sending a reply stanza.
|
||||||
|
|
||||||
|
For client streams, the 'from' attribute is removed.
|
||||||
|
"""
|
||||||
# if it's a component, use from
|
# if it's a component, use from
|
||||||
if self.stream and hasattr(self.stream, "is_component") and \
|
if self.stream and hasattr(self.stream, "is_component") and \
|
||||||
self.stream.is_component:
|
self.stream.is_component:
|
||||||
|
@ -948,35 +1054,42 @@ class StanzaBase(ElementBase):
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def error(self):
|
def error(self):
|
||||||
|
"""Set the stanza's type to 'error'."""
|
||||||
self['type'] = 'error'
|
self['type'] = 'error'
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def getTo(self):
|
|
||||||
return JID(self._getAttr('to'))
|
|
||||||
|
|
||||||
def setTo(self, value):
|
|
||||||
return self._setAttr('to', str(value))
|
|
||||||
|
|
||||||
def getFrom(self):
|
|
||||||
return JID(self._getAttr('from'))
|
|
||||||
|
|
||||||
def setFrom(self, value):
|
|
||||||
return self._setAttr('from', str(value))
|
|
||||||
|
|
||||||
def unhandled(self):
|
def unhandled(self):
|
||||||
|
"""
|
||||||
|
Called when no handlers have been registered to process this
|
||||||
|
stanza.
|
||||||
|
|
||||||
|
Meant to be overridden.
|
||||||
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def exception(self, e):
|
def exception(self, e):
|
||||||
|
"""
|
||||||
|
Handle exceptions raised during stanza processing.
|
||||||
|
|
||||||
|
Meant to be overridden.
|
||||||
|
"""
|
||||||
logging.exception('Error handling {%s}%s stanza' % (self.namespace,
|
logging.exception('Error handling {%s}%s stanza' % (self.namespace,
|
||||||
self.name))
|
self.name))
|
||||||
|
|
||||||
def send(self):
|
def send(self):
|
||||||
|
"""Queue the stanza to be sent on the XML stream."""
|
||||||
self.stream.sendRaw(self.__str__())
|
self.stream.sendRaw(self.__str__())
|
||||||
|
|
||||||
def __copy__(self):
|
def __copy__(self):
|
||||||
return self.__class__(xml=copy.deepcopy(self.xml), stream=self.stream)
|
"""
|
||||||
|
Return a copy of the stanza object that does not share the
|
||||||
|
same underlying XML object, but does share the same XML stream.
|
||||||
|
"""
|
||||||
|
return self.__class__(xml=copy.deepcopy(self.xml),
|
||||||
|
stream=self.stream)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
"""Serialize the stanza's XML to a string."""
|
||||||
return tostring(self.xml, xmlns='',
|
return tostring(self.xml, xmlns='',
|
||||||
stanza_ns=self.namespace,
|
stanza_ns=self.namespace,
|
||||||
stream=self.stream)
|
stream=self.stream)
|
||||||
|
|
Loading…
Reference in a new issue