diff options
Diffstat (limited to 'sleekxmpp/xmlstream')
-rw-r--r-- | sleekxmpp/xmlstream/matcher/id.py | 2 | ||||
-rw-r--r-- | sleekxmpp/xmlstream/matcher/stanzapath.py | 7 | ||||
-rw-r--r-- | sleekxmpp/xmlstream/matcher/xmlmask.py | 2 | ||||
-rw-r--r-- | sleekxmpp/xmlstream/matcher/xpath.py | 2 | ||||
-rw-r--r-- | sleekxmpp/xmlstream/stanzabase.py | 33 | ||||
-rw-r--r-- | sleekxmpp/xmlstream/xmlstream.py | 2 |
6 files changed, 40 insertions, 8 deletions
diff --git a/sleekxmpp/xmlstream/matcher/id.py b/sleekxmpp/xmlstream/matcher/id.py index ec7597d4..44fad15c 100644 --- a/sleekxmpp/xmlstream/matcher/id.py +++ b/sleekxmpp/xmlstream/matcher/id.py @@ -3,4 +3,4 @@ from . import base class MatcherId(base.MatcherBase): def match(self, xml): - return xml.get('id') == self._criteria + return xml['id'] == self._criteria diff --git a/sleekxmpp/xmlstream/matcher/stanzapath.py b/sleekxmpp/xmlstream/matcher/stanzapath.py new file mode 100644 index 00000000..d036d0b8 --- /dev/null +++ b/sleekxmpp/xmlstream/matcher/stanzapath.py @@ -0,0 +1,7 @@ +from . import base +from xml.etree import cElementTree + +class StanzaPath(base.MatcherBase): + + def match(self, stanza): + return stanza.match(self._criteria) diff --git a/sleekxmpp/xmlstream/matcher/xmlmask.py b/sleekxmpp/xmlstream/matcher/xmlmask.py index e8e4df02..e4a22faa 100644 --- a/sleekxmpp/xmlstream/matcher/xmlmask.py +++ b/sleekxmpp/xmlstream/matcher/xmlmask.py @@ -16,6 +16,8 @@ class MatchXMLMask(base.MatcherBase): self.default_ns = ns def match(self, xml): + if hasattr(xml, 'xml'): + xml = xml.xml return self.maskcmp(xml, self._criteria, True) def maskcmp(self, source, maskobj, use_ns=False, default_ns='__no_ns__'): diff --git a/sleekxmpp/xmlstream/matcher/xpath.py b/sleekxmpp/xmlstream/matcher/xpath.py index 060d5df3..fe18a655 100644 --- a/sleekxmpp/xmlstream/matcher/xpath.py +++ b/sleekxmpp/xmlstream/matcher/xpath.py @@ -6,6 +6,8 @@ ignore_ns = False class MatchXPath(base.MatcherBase): def match(self, xml): + if hasattr(xml, 'xml'): + xml = xml.xml x = cElementTree.Element('x') x.append(xml) if not ignore_ns: diff --git a/sleekxmpp/xmlstream/stanzabase.py b/sleekxmpp/xmlstream/stanzabase.py index 277882e8..feb9b268 100644 --- a/sleekxmpp/xmlstream/stanzabase.py +++ b/sleekxmpp/xmlstream/stanzabase.py @@ -2,6 +2,8 @@ from xml.etree import cElementTree as ET import logging import traceback +xmltester = type(ET.Element('xml')) + class JID(object): def __init__(self, jid): self.jid = jid @@ -62,7 +64,10 @@ class ElementBase(object): def append(self, item): if not isinstance(item, ElementBase): - raise TypeError + if type(item) == xmltester: + return self.appendxml(item) + else: + raise TypeError self.xml.append(item.xml) self.iterables.append(item) return self @@ -86,11 +91,27 @@ class ElementBase(object): out.append('substanzas') return tuple(out) - def find(self, item): - return self.iterables.find(item) - - def match(self, xml): - return xml.tag == self.tag + def match(self, matchstring): + if isinstance(matchstring, str): + nodes = matchstring.split('/') + else: + nodes = matchstring + tagargs = nodes[0].split('@') + if tagargs[0] not in (self.plugins, self.name): return False + founditerable = False + for iterable in self.iterables: + founditerable = iterable.match(nodes[1:]) + if founditerable: break; + for evals in tagargs[1:]: + x,y = evals.split('=') + if self[x] != y: return False + if not founditerable and len(nodes) > 1: + next = nodes[1].split('@')[0] + if next in self.plugins: + return self.plugins[next].match(nodes[1:]) + else: + return False + return True def find(self, xpath): # for backwards compatiblity, expose elementtree interface return self.xml.find(xpath) diff --git a/sleekxmpp/xmlstream/xmlstream.py b/sleekxmpp/xmlstream/xmlstream.py index 0bf8b727..0cdfdf96 100644 --- a/sleekxmpp/xmlstream/xmlstream.py +++ b/sleekxmpp/xmlstream/xmlstream.py @@ -279,7 +279,7 @@ class XMLStream(object): stanza = StanzaBase(self, xmlobj) unhandled = True for handler in self.__handlers: - if handler.match(xmlobj): + if handler.match(stanza): handler.prerun(stanza) self.eventqueue.put(('stanza', handler, stanza)) if handler.checkDelete(): self.__handlers.pop(self.__handlers.index(handler)) |