| Index: third_party/twisted_8_1/twisted/words/xish/xmlstream.py
|
| diff --git a/third_party/twisted_8_1/twisted/words/xish/xmlstream.py b/third_party/twisted_8_1/twisted/words/xish/xmlstream.py
|
| deleted file mode 100644
|
| index 950a3927803fc30bd6a6845f169475939957e37d..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/words/xish/xmlstream.py
|
| +++ /dev/null
|
| @@ -1,211 +0,0 @@
|
| -# -*- test-case-name: twisted.words.test.test_xmlstream -*-
|
| -#
|
| -# Copyright (c) 2001-2007 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -"""
|
| -XML Stream processing.
|
| -
|
| -An XML Stream is defined as a connection over which two XML documents are
|
| -exchanged during the lifetime of the connection, one for each direction. The
|
| -unit of interaction is a direct child element of the root element (stanza).
|
| -
|
| -The most prominent use of XML Streams is Jabber, but this module is generically
|
| -usable. See Twisted Words for Jabber specific protocol support.
|
| -
|
| -Maintainer: U{Ralph Meijer<mailto:twisted@ralphm.ik.nu>}
|
| -"""
|
| -
|
| -from twisted.internet import protocol
|
| -from twisted.words.xish import domish, utility
|
| -
|
| -STREAM_CONNECTED_EVENT = intern("//event/stream/connected")
|
| -STREAM_START_EVENT = intern("//event/stream/start")
|
| -STREAM_END_EVENT = intern("//event/stream/end")
|
| -STREAM_ERROR_EVENT = intern("//event/stream/error")
|
| -
|
| -class XmlStream(protocol.Protocol, utility.EventDispatcher):
|
| - """ Generic Streaming XML protocol handler.
|
| -
|
| - This protocol handler will parse incoming data as XML and dispatch events
|
| - accordingly. Incoming stanzas can be handled by registering observers using
|
| - XPath-like expressions that are matched against each stanza. See
|
| - L{utility.EventDispatcher} for details.
|
| - """
|
| - def __init__(self):
|
| - utility.EventDispatcher.__init__(self)
|
| - self.stream = None
|
| - self.rawDataOutFn = None
|
| - self.rawDataInFn = None
|
| -
|
| - def _initializeStream(self):
|
| - """ Sets up XML Parser. """
|
| - self.stream = domish.elementStream()
|
| - self.stream.DocumentStartEvent = self.onDocumentStart
|
| - self.stream.ElementEvent = self.onElement
|
| - self.stream.DocumentEndEvent = self.onDocumentEnd
|
| -
|
| - ### --------------------------------------------------------------
|
| - ###
|
| - ### Protocol events
|
| - ###
|
| - ### --------------------------------------------------------------
|
| -
|
| - def connectionMade(self):
|
| - """ Called when a connection is made.
|
| -
|
| - Sets up the XML parser and dispatches the L{STREAM_CONNECTED_EVENT}
|
| - event indicating the connection has been established.
|
| - """
|
| - self._initializeStream()
|
| - self.dispatch(self, STREAM_CONNECTED_EVENT)
|
| -
|
| - def dataReceived(self, data):
|
| - """ Called whenever data is received.
|
| -
|
| - Passes the data to the XML parser. This can result in calls to the
|
| - DOM handlers. If a parse error occurs, the L{STREAM_ERROR_EVENT} event
|
| - is called to allow for cleanup actions, followed by dropping the
|
| - connection.
|
| - """
|
| - try:
|
| - if self.rawDataInFn:
|
| - self.rawDataInFn(data)
|
| - self.stream.parse(data)
|
| - except domish.ParserError:
|
| - self.dispatch(self, STREAM_ERROR_EVENT)
|
| - self.transport.loseConnection()
|
| -
|
| - def connectionLost(self, reason):
|
| - """ Called when the connection is shut down.
|
| -
|
| - Dispatches the L{STREAM_END_EVENT}.
|
| - """
|
| - self.dispatch(self, STREAM_END_EVENT)
|
| - self.stream = None
|
| -
|
| - ### --------------------------------------------------------------
|
| - ###
|
| - ### DOM events
|
| - ###
|
| - ### --------------------------------------------------------------
|
| -
|
| - def onDocumentStart(self, rootElement):
|
| - """ Called whenever the start tag of a root element has been received.
|
| -
|
| - Dispatches the L{STREAM_START_EVENT}.
|
| - """
|
| - self.dispatch(self, STREAM_START_EVENT)
|
| -
|
| - def onElement(self, element):
|
| - """ Called whenever a direct child element of the root element has
|
| - been received.
|
| -
|
| - Dispatches the received element.
|
| - """
|
| - self.dispatch(element)
|
| -
|
| - def onDocumentEnd(self):
|
| - """ Called whenever the end tag of the root element has been received.
|
| -
|
| - Closes the connection. This causes C{connectionLost} being called.
|
| - """
|
| - self.transport.loseConnection()
|
| -
|
| - def setDispatchFn(self, fn):
|
| - """ Set another function to handle elements. """
|
| - self.stream.ElementEvent = fn
|
| -
|
| - def resetDispatchFn(self):
|
| - """ Set the default function (C{onElement}) to handle elements. """
|
| - self.stream.ElementEvent = self.onElement
|
| -
|
| - def send(self, obj):
|
| - """ Send data over the stream.
|
| -
|
| - Sends the given C{obj} over the connection. C{obj} may be instances of
|
| - L{domish.Element}, L{unicode} and L{str}. The first two will be
|
| - properly serialized and/or encoded. L{str} objects must be in UTF-8
|
| - encoding.
|
| -
|
| - Note: because it is easy to make mistakes in maintaining a properly
|
| - encoded L{str} object, it is advised to use L{unicode} objects
|
| - everywhere when dealing with XML Streams.
|
| -
|
| - @param obj: Object to be sent over the stream.
|
| - @type obj: L{domish.Element}, L{domish} or L{str}
|
| -
|
| - """
|
| - if domish.IElement.providedBy(obj):
|
| - obj = obj.toXml()
|
| -
|
| - if isinstance(obj, unicode):
|
| - obj = obj.encode('utf-8')
|
| -
|
| - if self.rawDataOutFn:
|
| - self.rawDataOutFn(obj)
|
| -
|
| - self.transport.write(obj)
|
| -
|
| -
|
| -class XmlStreamFactoryMixin(object):
|
| - """
|
| - XmlStream factory mixin that takes care of event handlers.
|
| -
|
| - To make sure certain event observers are set up before incoming data is
|
| - processed, you can set up bootstrap event observers using C{addBootstrap}.
|
| -
|
| - The C{event} and C{fn} parameters correspond with the C{event} and
|
| - C{observerfn} arguments to L{utility.EventDispatcher.addObserver}.
|
| - """
|
| -
|
| - def __init__(self, *args, **kwargs):
|
| - self.bootstraps = []
|
| - self.args = args
|
| - self.kwargs = kwargs
|
| -
|
| - def buildProtocol(self, addr):
|
| - """
|
| - Create an instance of XmlStream.
|
| -
|
| - The returned instance will have bootstrap event observers registered
|
| - and will proceed to handle input on an incoming connection.
|
| - """
|
| - xs = self.protocol(*self.args, **self.kwargs)
|
| - xs.factory = self
|
| - for event, fn in self.bootstraps:
|
| - xs.addObserver(event, fn)
|
| - return xs
|
| -
|
| - def addBootstrap(self, event, fn):
|
| - """
|
| - Add a bootstrap event handler.
|
| - """
|
| - self.bootstraps.append((event, fn))
|
| -
|
| - def removeBootstrap(self, event, fn):
|
| - """
|
| - Remove a bootstrap event handler.
|
| - """
|
| - self.bootstraps.remove((event, fn))
|
| -
|
| -
|
| -class XmlStreamFactory(XmlStreamFactoryMixin,
|
| - protocol.ReconnectingClientFactory):
|
| - """
|
| - Factory for XmlStream protocol objects as a reconnection client.
|
| - """
|
| -
|
| - protocol = XmlStream
|
| -
|
| - def buildProtocol(self, addr):
|
| - """
|
| - Create a protocol instance.
|
| -
|
| - Overrides L{XmlStreamFactoryMixin.buildProtocol} to work with
|
| - a L{ReconnectingClientFactory}. As this is called upon having an
|
| - connection established, we are resetting the delay for reconnection
|
| - attempts when the connection is lost again.
|
| - """
|
| - self.resetDelay()
|
| - return XmlStreamFactoryMixin.buildProtocol(self, addr)
|
|
|