78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """
 | |
|     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):
 | |
| 		if block and self['type'] in ('get', 'set'):
 | |
| 			waitfor = Waiter('IqWait_%s' % self['id'], MatcherId(self['id']))
 | |
| 			self.stream.registerHandler(waitfor)
 | |
| 			StanzaBase.send(self)
 | |
| 			return waitfor.wait(timeout)
 | |
| 		else:
 | |
| 			return StanzaBase.send(self)
 | 
