summaryrefslogtreecommitdiff
path: root/sleekxmpp/xmlstream/handler
diff options
context:
space:
mode:
authorLance Stout <lancestout@gmail.com>2012-09-28 11:02:57 -0700
committerLance Stout <lancestout@gmail.com>2012-09-28 11:02:57 -0700
commita2c60a4911c64a8b40c39dfb9d74ed0eaed0e9b3 (patch)
tree40d99fd4b547e4f81e2c9c2b29682c6bb7ac7a06 /sleekxmpp/xmlstream/handler
parent73ce9a5eccb5fea6f9a6dd72410cdada2a43347f (diff)
parentee9c4abd08db06fd6dc808d48c43cd6d57bd1aa1 (diff)
downloadslixmpp-a2c60a4911c64a8b40c39dfb9d74ed0eaed0e9b3.tar.gz
slixmpp-a2c60a4911c64a8b40c39dfb9d74ed0eaed0e9b3.tar.bz2
slixmpp-a2c60a4911c64a8b40c39dfb9d74ed0eaed0e9b3.tar.xz
slixmpp-a2c60a4911c64a8b40c39dfb9d74ed0eaed0e9b3.zip
Merge branch 'master' into develop
Diffstat (limited to 'sleekxmpp/xmlstream/handler')
-rw-r--r--sleekxmpp/xmlstream/handler/__init__.py1
-rw-r--r--sleekxmpp/xmlstream/handler/collector.py66
2 files changed, 67 insertions, 0 deletions
diff --git a/sleekxmpp/xmlstream/handler/__init__.py b/sleekxmpp/xmlstream/handler/__init__.py
index 7bcf0b71..83c87f01 100644
--- a/sleekxmpp/xmlstream/handler/__init__.py
+++ b/sleekxmpp/xmlstream/handler/__init__.py
@@ -7,6 +7,7 @@
"""
from sleekxmpp.xmlstream.handler.callback import Callback
+from sleekxmpp.xmlstream.handler.collector import Collector
from sleekxmpp.xmlstream.handler.waiter import Waiter
from sleekxmpp.xmlstream.handler.xmlcallback import XMLCallback
from sleekxmpp.xmlstream.handler.xmlwaiter import XMLWaiter
diff --git a/sleekxmpp/xmlstream/handler/collector.py b/sleekxmpp/xmlstream/handler/collector.py
new file mode 100644
index 00000000..8f02f8c3
--- /dev/null
+++ b/sleekxmpp/xmlstream/handler/collector.py
@@ -0,0 +1,66 @@
+# -*- coding: utf-8 -*-
+"""
+ sleekxmpp.xmlstream.handler.collector
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Part of SleekXMPP: The Sleek XMPP Library
+
+ :copyright: (c) 2012 Nathanael C. Fritz, Lance J.T. Stout
+ :license: MIT, see LICENSE for more details
+"""
+
+import logging
+
+from sleekxmpp.util import Queue, QueueEmpty
+from sleekxmpp.xmlstream.handler.base import BaseHandler
+
+
+log = logging.getLogger(__name__)
+
+
+class Collector(BaseHandler):
+
+ """
+ The Collector handler allows for collecting a set of stanzas
+ that match a given pattern. Unlike the Waiter handler, a
+ Collector does not block execution, and will continue to
+ accumulate matching stanzas until told to stop.
+
+ :param string name: The name of the handler.
+ :param matcher: A :class:`~sleekxmpp.xmlstream.matcher.base.MatcherBase`
+ derived object for matching stanza objects.
+ :param stream: The :class:`~sleekxmpp.xmlstream.xmlstream.XMLStream`
+ instance this handler should monitor.
+ """
+
+ def __init__(self, name, matcher, stream=None):
+ BaseHandler.__init__(self, name, matcher, stream=stream)
+ self._payload = Queue()
+
+ def prerun(self, payload):
+ """Store the matched stanza when received during processing.
+
+ :param payload: The matched
+ :class:`~sleekxmpp.xmlstream.stanzabase.ElementBase` object.
+ """
+ self._payload.put(payload)
+
+ def run(self, payload):
+ """Do not process this handler during the main event loop."""
+ pass
+
+ def stop(self):
+ """
+ Stop collection of matching stanzas, and return the ones that
+ have been stored so far.
+ """
+ self._destroy = True
+ results = []
+ try:
+ while True:
+ results.append(self._payload.get(False))
+ except QueueEmpty:
+ pass
+
+ self.stream().remove_handler(self.name)
+ return results