Add a “blocking” send_coroutine method to the Iq class
This commit is contained in:
parent
ffb2e05f21
commit
92e4bc752a
@ -9,6 +9,7 @@
|
|||||||
from slixmpp.stanza.rootstanza import RootStanza
|
from slixmpp.stanza.rootstanza import RootStanza
|
||||||
from slixmpp.xmlstream import StanzaBase, ET
|
from slixmpp.xmlstream import StanzaBase, ET
|
||||||
from slixmpp.xmlstream.handler import Waiter, Callback
|
from slixmpp.xmlstream.handler import Waiter, Callback
|
||||||
|
from slixmpp.xmlstream.asyncio import asyncio
|
||||||
from slixmpp.xmlstream.matcher import MatchIDSender, MatcherId
|
from slixmpp.xmlstream.matcher import MatchIDSender, MatcherId
|
||||||
from slixmpp.exceptions import IqTimeout, IqError
|
from slixmpp.exceptions import IqTimeout, IqError
|
||||||
|
|
||||||
@ -158,6 +159,64 @@ class Iq(RootStanza):
|
|||||||
new_iq['type'] = 'result'
|
new_iq['type'] = 'result'
|
||||||
return new_iq
|
return new_iq
|
||||||
|
|
||||||
|
@asyncio.coroutine
|
||||||
|
def send_coroutine(self, timeout=None):
|
||||||
|
"""Send an <iq> stanza over the XML stream.
|
||||||
|
|
||||||
|
Blocks (with asyncio) until a the reply is received.
|
||||||
|
Use with yield from iq.send_coroutine().
|
||||||
|
|
||||||
|
Overrides StanzaBase.send
|
||||||
|
|
||||||
|
Arguments:
|
||||||
|
|
||||||
|
timeout -- The length of time (in seconds) to wait for a
|
||||||
|
response before an IqTimeout is raised
|
||||||
|
"""
|
||||||
|
|
||||||
|
if self.stream.session_bind_event.is_set():
|
||||||
|
matcher = MatchIDSender({
|
||||||
|
'id': self['id'],
|
||||||
|
'self': self.stream.boundjid,
|
||||||
|
'peer': self['to']
|
||||||
|
})
|
||||||
|
else:
|
||||||
|
matcher = MatcherId(self['id'])
|
||||||
|
|
||||||
|
future = asyncio.Future()
|
||||||
|
|
||||||
|
def callback(result):
|
||||||
|
future.set_result(result)
|
||||||
|
|
||||||
|
def callback_timeout():
|
||||||
|
future.set_result(None)
|
||||||
|
|
||||||
|
handler_name = 'IqCallback_%s' % self['id']
|
||||||
|
|
||||||
|
if timeout:
|
||||||
|
self.callback = callback
|
||||||
|
self.stream.schedule('IqTimeout_%s' % self['id'],
|
||||||
|
timeout,
|
||||||
|
callback_timeout,
|
||||||
|
repeat=False)
|
||||||
|
handler = Callback(handler_name,
|
||||||
|
matcher,
|
||||||
|
self._handle_result,
|
||||||
|
once=True)
|
||||||
|
else:
|
||||||
|
handler = Callback(handler_name,
|
||||||
|
matcher,
|
||||||
|
callback,
|
||||||
|
once=True)
|
||||||
|
self.stream.register_handler(handler)
|
||||||
|
StanzaBase.send(self)
|
||||||
|
result = yield from future
|
||||||
|
if result is None:
|
||||||
|
raise IqTimeout(self)
|
||||||
|
if result['type'] == 'error':
|
||||||
|
raise IqError(result)
|
||||||
|
return result
|
||||||
|
|
||||||
def send(self, callback=None, timeout=None, timeout_callback=None):
|
def send(self, callback=None, timeout=None, timeout_callback=None):
|
||||||
"""Send an <iq> stanza over the XML stream.
|
"""Send an <iq> stanza over the XML stream.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user