plugin XEP-0047, XEP-0096: In-Band Bystream plugin cleaning:

- some renaming, comments improvments, etc
    - progress callback is no more managed here, as it will be managed by application
    - no more file data is used, beside file_obj
    - a proper Deferred is used instead of success and error callbacks
    - more clean error sending method
    plugin XEP-0096 has been updated to handle changes. Its temporarily partially broken though
This commit is contained in:
Goffi 2015-09-25 19:19:12 +02:00
commit 7121b58961

View file

@ -26,6 +26,7 @@ from twisted.words.protocols.jabber import jid
from twisted.words.protocols import jabber
import os
from twisted.internet import reactor
from twisted.python import failure
from wokkel import data_form
@ -163,7 +164,9 @@ class XEP_0096(object):
elif stream_method == self.host.plugins["XEP-0047"].NAMESPACE:
file_obj = self._getFileObject(dest_path, can_range)
range_offset = file_obj.tell()
self.host.plugins["XEP-0047"].prepareToReceive(jid.JID(data['from']), sid, file_obj, int(data["size"]), self._transferSucceeded, self._transferFailed, profile)
d = self.host.plugins["XEP-0047"].createSession(file_obj, jid.JID(data['from']), sid, int(data["size"]), profile)
d.addCallback(self._transferSucceeded, sid, file_obj, self.host.plugins["XEP-0047"].NAMESPACE, profile)
d.addErrback(self._transferFailed, sid, file_obj, self.host.plugins["XEP-0047"].NAMESPACE, profile)
else:
log.error(_("Unknown stream method, this should not happen at this stage, cancelling transfer"))
del(client._xep_0096_waiting_for_approval[sid])
@ -184,7 +187,10 @@ class XEP_0096(object):
self.host.plugins["XEP-0095"].sendRejectedError(data["id"], data['from'], profile=profile)
del(client._xep_0096_waiting_for_approval[sid])
def _transferSucceeded(self, sid, file_obj, stream_method, profile):
def _transferSucceeded(self, dummy, sid, file_obj, stream_method, profile):
self.transferSucceeded(sid, file_obj, stream_method, profile)
def transferSucceeded(self, dummy, sid, file_obj, stream_method, profile):
"""Called by the stream method when transfer successfuly finished
@param id: stream id"""
client = self.host.getClient(profile)
@ -193,15 +199,19 @@ class XEP_0096(object):
del(client._xep_0096_waiting_for_approval[sid])
def _transferFailed(self, sid, file_obj, stream_method, reason, profile):
self.transferFailed(failure.Failure(Exception(reason)), sid, file_obj, stream_method, profile)
def transferFailed(self, failure, sid, file_obj, stream_method, profile):
"""Called when something went wrong with the transfer
@param id: stream id
@param reason: can be TIMEOUT, IO_ERROR, PROTOCOL_ERROR"""
"""
client = self.host.getClient(profile)
data, timeout, stream_method, failed_methods = client._xep_0096_waiting_for_approval[sid]
log.warning(_(u'Transfer %(id)s failed with stream method %(s_method)s: %(reason)s') % {
'id': sid,
's_method': stream_method,
'reason': reason})
'reason': unicode(failure)})
filepath = file_obj.name
file_obj.close()
os.remove(filepath)
@ -250,12 +260,14 @@ class XEP_0096(object):
file_obj = open(filepath, 'r')
if range_offset:
file_obj.seek(range_offset)
self.host.plugins["XEP-0065"].startStream(file_obj, jid.JID(IQ['from']), sid, range_length, self.sendSuccessCb, self.sendFailureCb, size, profile)
self.host.plugins["XEP-0065"].startStream(file_obj, jid.JID(IQ['from']), sid, range_length, self._sendSuccessCb, self._sendFailureCb, size, profile)
elif stream_method == self.host.plugins["XEP-0047"].NAMESPACE:
file_obj = open(filepath, 'r')
if range_offset:
file_obj.seek(range_offset)
self.host.plugins["XEP-0047"].startStream(file_obj, jid.JID(IQ['from']), sid, range_length, self.sendSuccessCb, self.sendFailureCb, size, profile)
d = self.host.plugins["XEP-0047"].startStream(file_obj, jid.JID(IQ['from']), sid, profile=profile)
d.addCallback(self.sendSuccessCb, sid, file_obj, self.host.plugins["XEP-0047"].NAMESPACE, profile)
d.addErrback(self.sendFailureCb, sid, file_obj, self.host.plugins["XEP-0047"].NAMESPACE, profile)
else:
log.warning(_("Invalid stream method received"))
@ -288,11 +300,17 @@ class XEP_0096(object):
offer.addCallback(self.fileCb, filepath, sid, size, profile)
return sid
def sendSuccessCb(self, sid, file_obj, stream_method, profile):
def _sendSuccessCb(self, sid, file_obj, stream_method, profile):
self.sendSuccessCb(sid, file_obj, stream_method, profile)
def sendSuccessCb(self, dummy, sid, file_obj, stream_method, profile):
log.info(_(u'Transfer %(sid)s successfuly finished [%(profile)s]')
% {"sid": sid, "profile": profile})
file_obj.close()
def sendFailureCb(self, sid, file_obj, stream_method, reason, profile):
def _sendFailureCb(self, sid, file_obj, stream_method, reason, profile):
self.sendFailureCb(failure.Failure(Exception(reason)), sid, file_obj, stream_method, profile)
def sendFailureCb(self, failure, sid, file_obj, stream_method, profile):
file_obj.close()
log.warning(_(u'Transfer %(id)s failed with stream method %(s_method)s: %(reason)s [%(profile)s]') % {'id': sid, "s_method": stream_method, 'reason': reason, 'profile': profile})
log.warning(_(u'Transfer %(id)s failed with stream method %(s_method)s: %(reason)s [%(profile)s]') % {'id': sid, "s_method": stream_method, 'reason': unicode(failure), 'profile': profile})