summaryrefslogtreecommitdiff
path: root/sleekxmpp/stanza/iq.py
blob: 2b3ca83b6a45a1e374242b59da6a873f2e25bf2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
"""
	SleekXMPP: The Sleek XMPP Library
	Copyright (C) 2010  Nathanael C. Fritz
	This file is part of SleekXMPP.

	See the file license.txt for copying permission.
"""
from .. xmlstream.stanzabase import StanzaBase
from xml.etree import cElementTree as ET
from . error import Error
from .. xmlstream.handler.waiter import Waiter
from .. xmlstream.matcher.id import MatcherId
from . rootstanza import RootStanza

class Iq(RootStanza):
	interfaces = set(('type', 'to', 'from', 'id','query'))
	types = set(('get', 'result', 'set', 'error'))
	name = 'iq'
	plugin_attrib = name
	namespace = 'jabber:client'

	def __init__(self, *args, **kwargs):
		StanzaBase.__init__(self, *args, **kwargs)
		if self['id'] == '':
			if self.stream is not None:
				self['id'] = self.stream.getNewId()
			else:
				self['id'] = '0'
	
	def unhandled(self):
		if self['type'] in ('get', 'set'):
			self.reply()
			self['error']['condition'] = 'feature-not-implemented'
			self['error']['text'] = 'No handlers registered for this request.'
			self.send()
	
	def setPayload(self, value):
		self.clear()
		StanzaBase.setPayload(self, value)
		return self
	
	def setQuery(self, value):
		query = self.xml.find("{%s}query" % value)
		if query is None and value:
			self.clear()
			query = ET.Element("{%s}query" % value)
			self.xml.append(query)
		return self
	
	def getQuery(self):
		for child in self.xml.getchildren():
			if child.tag.endswith('query'):
				ns =child.tag.split('}')[0]
				if '{' in ns:
					ns = ns[1:]
				return ns
		return ''
	
	def reply(self):
		self['type'] = 'result'
		StanzaBase.reply(self)
		return self
	
	def delQuery(self):
		for child in self.getchildren():
			if child.tag.endswith('query'):
				self.xml.remove(child)
		return self
	
	def send(self, block=True, timeout=10, priority=5, init=False):
		if block and self['type'] in ('get', 'set'):
			waitfor = Waiter('IqWait_%s' % self['id'], MatcherId(self['id']))
			self.stream.registerHandler(waitfor)
			StanzaBase.send(self, priority, init)
			return waitfor.wait(timeout)
		else:
			return StanzaBase.send(self, priority, init)