plugins XEP-0234, file: moved file request dialog to file plugin
This commit is contained in:
parent
f21c94b205
commit
a022a36b5b
1 changed files with 112 additions and 98 deletions
|
|
@ -17,12 +17,13 @@
|
|||
# You should have received a copy of the GNU Affero General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from sat.core.i18n import _
|
||||
from sat.core.i18n import _, D_
|
||||
from sat.core.constants import Const as C
|
||||
from sat.core.log import getLogger
|
||||
log = getLogger(__name__)
|
||||
import os
|
||||
from sat.tools import xml_tools
|
||||
from twisted.internet import defer
|
||||
import os
|
||||
import uuid
|
||||
|
||||
|
||||
|
|
@ -37,6 +38,12 @@ This plugin manage the various ways of sending a file, and choose the best one."
|
|||
}
|
||||
|
||||
|
||||
CONFIRM = D_(u'{peer} wants to send the file "{name}" to you:\n{desc}\n\nThe file has a size of {size_human}\n\nDo you accept ?')
|
||||
CONFIRM_TITLE = D_(u'Confirm file transfer')
|
||||
CONFIRM_OVERWRITE = D_(u'File {} already exists, are you sure you want to overwrite ?')
|
||||
CONFIRM_OVERWRITE_TITLE = D_(u'File exists')
|
||||
|
||||
|
||||
class SatFile(object):
|
||||
"""A file-like object to have high level files manipulation"""
|
||||
# TODO: manage "with" statement
|
||||
|
|
@ -94,4 +101,85 @@ class FilePlugin(object):
|
|||
log.info(_("plugin File initialization"))
|
||||
self.host = host
|
||||
|
||||
# Dialogs with user
|
||||
# the overwrite check is done here
|
||||
|
||||
def _openFileWrite(self, file_path, transfer_data, file_data, profile):
|
||||
assert 'file_obj' not in transfer_data
|
||||
transfer_data['file_obj'] = SatFile(
|
||||
self.host,
|
||||
file_path,
|
||||
'w',
|
||||
size=file_data['size'],
|
||||
profile=profile,
|
||||
)
|
||||
|
||||
def _gotConfirmation(self, data, peer_jid, transfer_data, file_data, profile):
|
||||
"""Called when the permission and dest path have been received
|
||||
|
||||
@param peer_jid(jid.JID): jid of the file sender
|
||||
@param transfer_data(dict): same as for [self.getDestDir]
|
||||
@param file_data(dict): same as for [self.getDestDir]
|
||||
@param profile: %(doc_profile)s
|
||||
return (bool): True if copy is wanted and OK
|
||||
False if user wants to cancel
|
||||
if file exists ask confirmation and call again self._getDestDir if needed
|
||||
"""
|
||||
if data.get('cancelled', False):
|
||||
return False
|
||||
path = data['path']
|
||||
file_data['file_path'] = file_path = os.path.join(path, file_data['name'])
|
||||
log.debug(u'destination file path set to {}'.format(file_path))
|
||||
|
||||
# we manage case where file already exists
|
||||
if os.path.exists(file_path):
|
||||
def check_overwrite(overwrite):
|
||||
if overwrite:
|
||||
self._openFileWrite(file_path, transfer_data, file_data, profile)
|
||||
return True
|
||||
else:
|
||||
return self.getDestDir(peer_jid, transfer_data, file_data, profile)
|
||||
|
||||
exists_d = xml_tools.deferConfirm(
|
||||
self.host,
|
||||
_(CONFIRM_OVERWRITE).format(file_path),
|
||||
_(CONFIRM_OVERWRITE_TITLE),
|
||||
profile=profile)
|
||||
exists_d.addCallback(check_overwrite)
|
||||
return exists_d
|
||||
|
||||
self._openFileWrite(file_path, transfer_data, file_data, profile)
|
||||
return True
|
||||
|
||||
def getDestDir(self, peer_jid, transfer_data, file_data, profile):
|
||||
"""Request confirmation and destination dir to user
|
||||
|
||||
Overwrite confirmation is managed.
|
||||
if transfer is confirmed, 'file_obj' is added to transfer_data
|
||||
@param peer_jid(jid.JID): jid of the file sender
|
||||
@param filename(unicode): name of the file
|
||||
@param transfer_data(dict): data of the transfer session,
|
||||
it will be only used to store the file_obj.
|
||||
"file_obj" key *MUST NOT* exist before using getDestDir
|
||||
@param file_data(dict): information about the file to be transfered
|
||||
It MUST contain the following keys:
|
||||
- peer_jid (jid.JID): other peer jid
|
||||
- name (unicode): name of the file to trasnsfer
|
||||
the name must not be empty or contain a "/" character
|
||||
- size (int): size of the file
|
||||
It may content the key used in CONFIRM constant
|
||||
It *MUST NOT* contain the "peer" key
|
||||
"file_path" will be added to this dict once destination selected
|
||||
@param profile: %(doc_profile)s
|
||||
return (defer.Deferred): True if transfer is accepted
|
||||
"""
|
||||
filename = file_data['name']
|
||||
assert filename and not '/' in filename
|
||||
d = xml_tools.deferDialog(self.host,
|
||||
_(CONFIRM).format(peer=peer_jid.full(), **file_data),
|
||||
_(CONFIRM_TITLE),
|
||||
type_=C.XMLUI_DIALOG_FILE,
|
||||
options={C.XMLUI_DATA_FILETYPE: C.XMLUI_DATA_FILETYPE_DIR},
|
||||
profile=profile)
|
||||
d.addCallback(self._gotConfirmation, peer_jid, transfer_data, file_data, profile)
|
||||
return d
|
||||
|
|
|
|||
Loading…
Reference in a new issue