summaryrefslogtreecommitdiff
path: root/sleekxmpp/xmlstream
diff options
context:
space:
mode:
Diffstat (limited to 'sleekxmpp/xmlstream')
-rw-r--r--sleekxmpp/xmlstream/matcher/id.py2
-rw-r--r--sleekxmpp/xmlstream/matcher/stanzapath.py7
-rw-r--r--sleekxmpp/xmlstream/matcher/xmlmask.py2
-rw-r--r--sleekxmpp/xmlstream/matcher/xpath.py2
-rw-r--r--sleekxmpp/xmlstream/stanzabase.py33
-rw-r--r--sleekxmpp/xmlstream/xmlstream.py2
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))