plugin upload, XEP-0363: splitted fileUpload in fileUpload + upload:

fileUpload is used by external frontends, while upload can be used by frontends. upload return in addition to the progress_id a download_d Deferred which fire with URI when file is uploaded.
    changed option ignore-tls-errors to ignore_tls_errors.
This commit is contained in:
Goffi 2016-01-22 20:24:17 +01:00
commit 94ec775019

View file

@ -41,7 +41,7 @@ PLUGIN_INFO = {
UPLOADING = D_(u'Please select a file to upload')
UPLOADING_TITLE = D_(u'File upload')
BOOL_OPTIONS = ('ignore-tls-errors',)
BOOL_OPTIONS = ('ignore_tls_errors',)
class UploadPlugin(object):
@ -54,6 +54,7 @@ class UploadPlugin(object):
self._upload_callbacks = []
def _fileUpload(self, filepath, filename, upload_jid_s='', options=None, profile=C.PROF_KEY_NONE):
client = self.host.getClient(profile)
upload_jid = jid.JID(upload_jid_s) if upload_jid_s else None
if options is None:
options = {}
@ -64,10 +65,31 @@ class UploadPlugin(object):
except KeyError:
pass
return self.fileUpload(filepath, filename or None, upload_jid, options or None, profile)
return self.fileUpload(client, filepath, filename or None, upload_jid, options or None)
@defer.inlineCallbacks
def fileUpload(self, filepath, filename, upload_jid, options, profile=C.PROF_KEY_NONE):
def fileUpload(self, client, filepath, filename, upload_jid, options):
"""Send a file using best available method
parameters are the same as for [upload]
@return (dict): action dictionary, with progress id in case of success, else xmlui message
"""
def uploadCb(data):
progress_id, dummy = data
return {'progress': progress_id}
def uploadEb(fail):
msg = unicode(fail)
log.warning(msg)
return {'xmlui': xml_tools.note(u"Can't upload file", msg, C.XMLUI_DATA_LVL_WARNING).toXml()}
d = self.upload(filepath, filename, upload_jid, options, client.profile)
d.addCallback(uploadCb)
d.addErrback(uploadEb)
return d
@defer.inlineCallbacks
def upload(self, client, filepath, filename=None, upload_jid=None, options=None):
"""Send a file using best available method
@param filepath(str): absolute path to the file
@ -76,26 +98,28 @@ class UploadPlugin(object):
@param upload_jid(jid.JID, None): upload capable entity jid,
or None to use autodetected, if possible
@param options(dict): option to use for the upload, may be:
- ignore-tls-errors(bool): True to ignore SSL/TLS certificate verification
- ignore_tls_errors(bool): True to ignore SSL/TLS certificate verification
used only if HTTPS transport is needed
@param profile: %(doc_profile)s
@return (dict): action dictionary, with progress id in case of success, else xmlui message
@return (tuple[unicode,D(unicode)]): progress_id and a Deferred which fire download URL
when upload is finished
"""
if options is None:
options = {}
if not os.path.isfile(filepath):
raise exceptions.DataError(u"The given path doesn't link to a file")
for method_name, available_cb, upload_cb, priority in self._upload_callbacks:
try:
upload_jid = yield available_cb(upload_jid, profile)
upload_jid = yield available_cb(upload_jid, client.profile)
except exceptions.NotFound:
continue # no entity managing this extension found
log.info(u"{name} method will be used to upload the file".format(name=method_name))
progress_id = yield defer.maybeDeferred(upload_cb, filepath, filename, upload_jid, options, profile)
defer.returnValue({'progress': progress_id})
# if we reach this point, no entity handling any known upload method has been found
msg = u"Can't find any method to upload a file"
log.warning(msg)
defer.returnValue({'xmlui': xml_tools.note(u"Can't upload file", msg, C.XMLUI_DATA_LVL_WARNING).toXml()})
log.info(u"{name} method will be used to upload the file".format(name=method_name))
progress_id_d, download_d = yield defer.maybeDeferred(upload_cb, filepath, filename, upload_jid, options, client.profile)
progress_id = yield progress_id_d
defer.returnValue((progress_id, download_d))
raise exceptions.NotFound(u"Can't find any method to upload a file")
def register(self, method_name, available_cb, upload_cb, priority=0):
"""Register a fileUploading method
@ -105,7 +129,10 @@ class UploadPlugin(object):
the callback must take two arguments: upload_jid (can be None) and profile
the callback must return the first entity found (being upload_jid or one of its components)
exceptions.NotFound must be raised if no entity has been found
@param upload_cb(callable): method to upload a file (must have the same signature as [fileUpload])
@param upload_cb(callable): method to upload a file
must have the same signature as [fileUpload]
must return a tuple with progress_id and a Deferred which fire download URL when
upload is finished
@param priority(int): pririoty of this method, the higher available will be used
"""
assert method_name
@ -113,7 +140,7 @@ class UploadPlugin(object):
if method_name == data[0]:
raise exceptions.ConflictError(u'A method with this name is already registered')
self._upload_callbacks.append((method_name, available_cb, upload_cb, priority))
self._upload_callbacks.sort(key=lambda data: data[2], reverse=True)
self._upload_callbacks.sort(key=lambda data: data[3], reverse=True)
def unregister(self, method_name):
for idx, data in enumerate(self._upload_callbacks):