diff --git a/frontends/src/bridge/DBus.py b/frontends/src/bridge/DBus.py
index 8b592dbd..856c4642 100644
--- a/frontends/src/bridge/DBus.py
+++ b/frontends/src/bridge/DBus.py
@@ -147,6 +147,9 @@ class DBusBridgeFrontend(BridgeFrontend):
def getVersion(self, ):
return unicode(self.db_core_iface.getVersion())
+ def getWaitingConf(self, profile_key):
+ return self.db_core_iface.getWaitingConf(profile_key)
+
def getWaitingSub(self, profile_key="@DEFAULT@"):
return self.db_core_iface.getWaitingSub(profile_key)
diff --git a/frontends/src/jp/jp b/frontends/src/jp/jp
index 5e82aa31..3c00e243 100755
--- a/frontends/src/jp/jp
+++ b/frontends/src/jp/jp
@@ -282,13 +282,13 @@ class JP():
return param_jid
- def askConfirmation(self, type, confirm_id, data, profile):
+ def askConfirmation(self, confirm_id, confirm_type, data, profile):
"""CB used for file transfer, accept files depending on parameters"""
if profile != self.profile:
debug("Ask confirmation ignored: not our profile")
return
answer_data={}
- if type == "FILE_TRANSFER":
+ if confirm_type == "FILE_TRANSFER":
if not self.options.wait_file:
return
if self.dest_jids and not JID(data['from']).short in [JID(_jid).short for _jid in self.dest_jids]:
@@ -308,7 +308,7 @@ class JP():
if not self.options.multiple and not self.options.progress:
#we just accept one file
self.loop.quit()
- elif type == "PIPE_TRANSFER":
+ elif confirm_type == "PIPE_TRANSFER":
if not self.options.pipe_in:
return
if self.dest_jids and not JID(data['from']).short in [JID(_jid).short for _jid in self.dest_jids]:
@@ -331,7 +331,12 @@ class JP():
def confirmation_reply(self):
"""Auto reply to confirmations requests"""
+ #we register incoming confirmation
self.bridge.register("askConfirmation", self.askConfirmation)
+
+ #and we ask those we have missed
+ for confirm_id, confirm_type, data in self.bridge.getWaitingConf(self.profile):
+ self.askConfirmation(confirm_id, confirm_type, data, self.profile)
def progressCB(self):
if self.transfer_data:
diff --git a/frontends/src/primitivus/chat.py b/frontends/src/primitivus/chat.py
index 7b95bf84..b908f775 100644
--- a/frontends/src/primitivus/chat.py
+++ b/frontends/src/primitivus/chat.py
@@ -327,5 +327,5 @@ class Chat(urwid.WidgetWrap, QuickChat):
full_jid = JID("%s/%s" % (self.target.short, last_resource))
else:
full_jid = self.target
- id = self.host.bridge.sendFile(full_jid, filepath, {}, self.host.profile)
- self.host.addProgress(id,filepath)
+ progress_id = self.host.bridge.sendFile(full_jid, filepath, {}, self.host.profile)
+ self.host.addProgress(progress_id,filepath)
diff --git a/frontends/src/primitivus/primitivus b/frontends/src/primitivus/primitivus
index cc828417..1bb33b8d 100755
--- a/frontends/src/primitivus/primitivus
+++ b/frontends/src/primitivus/primitivus
@@ -22,8 +22,10 @@ along with this program. If not, see .
import urwid
from urwid_satext import sat_widgets
+from urwid_satext.files_management import FileDialog
from sat_frontends.quick_frontend.quick_app import QuickApp
from sat_frontends.quick_frontend.quick_chat_list import QuickChatList
+from sat_frontends.quick_frontend.quick_utils import getNewPath
from sat_frontends.primitivus.profile_manager import ProfileManager
from sat_frontends.primitivus.contact_list import ContactList
from sat_frontends.primitivus.chat import Chat
@@ -35,6 +37,7 @@ import sat_frontends.primitivus.constants
import logging
from logging import debug, info, error
from sat.tools.jid import JID
+from os.path import join
### logging configuration FIXME: put this elsewhere ###
@@ -394,6 +397,38 @@ class PrimitivusApp(QuickApp):
#No notification left, we can hide the bar
self.main_widget.footer = self.editBar
+ def askConfirmation(self, confirmation_id, confirmation_type, data, profile):
+ if not self.check_profile(profile):
+ return
+ answer_data={}
+
+ def dir_selected_cb(path):
+ dest_path = join(path, data['filename'])
+ answer_data["dest_path"] = getNewPath(dest_path)
+ self.addProgress(confirmation_id, dest_path)
+ accept_cb(None)
+
+ def accept_file_transfer_cb(widget):
+ self.removePopUp()
+ pop_up_widget = FileDialog(dir_selected_cb, refuse_cb, title=_(u"Where do you want to save the file ?"), style=['dir'])
+ self.showPopUp(pop_up_widget)
+
+ def accept_cb(widget):
+ self.removePopUp()
+ self.bridge.confirmationAnswer(confirmation_id, True, answer_data, profile)
+
+ def refuse_cb(widget):
+ self.removePopUp()
+ self.bridge.confirmationAnswer(confirmation_id, False, answer_data, profile)
+
+ if confirmation_type == "FILE_TRANSFER":
+ pop_up_widget = sat_widgets.ConfirmDialog(_("The contact %(jid)s wants to send you the file %(filename)s\nDo you accept ?") % {'jid':data["from"], 'filename':data["filename"]}, no_cb=refuse_cb, yes_cb=accept_file_transfer_cb)
+ self.showPopUp(pop_up_widget)
+
+ elif confirmation_type == "YES/NO":
+ pop_up_widget = sat_widgets.ConfirmDialog(data["message"], no_cb=refuse_cb, yes_cb=accept_cb)
+ self.showPopUp(pop_up_widget)
+
def actionResult(self, type, id, data):
if not id in self.current_action_ids:
debug (_('unknown id, ignoring'))
diff --git a/frontends/src/quick_frontend/quick_app.py b/frontends/src/quick_frontend/quick_app.py
index ae08baca..92412e7f 100644
--- a/frontends/src/quick_frontend/quick_app.py
+++ b/frontends/src/quick_frontend/quick_app.py
@@ -147,6 +147,10 @@ class QuickApp(object):
callback=lambda watched: self.plug_profile_4(watched, autoconnect, profile), errback=self._getParamError)
def plug_profile_4(self, watched, autoconnect, profile):
+ if autoconnect and not self.bridge.isConnected(profile):
+ #Does the user want autoconnection ?
+ self.bridge.connect(profile)
+
self.profiles[profile]['watched'] = watched.split() #TODO: put this in a plugin
## misc ##
@@ -186,10 +190,11 @@ class QuickApp(object):
for subject_args in self.bridge.getRoomsSubjects(profile):
self.roomNewSubject(*subject_args, profile=profile)
-
- if autoconnect and not self.bridge.isConnected(profile):
- #Does the user want autoconnection ?
- self.bridge.connect(profile)
+
+ #Finaly, we get the waiting confirmation requests
+ for confirm_id, confirm_type, data in self.bridge.getWaitingConf(profile):
+ self.askConfirmation(confirm_id, confirm_type, data, profile)
+
def unplug_profile(self, profile):
@@ -546,7 +551,7 @@ class QuickApp(object):
self.contact_list.setCache(jid, 'avatar', filename)
self.contact_list.replace(jid)
- def askConfirmation(self, type, id, data, profile):
+ def askConfirmation(self, confirm_id, confirm_type, data, profile):
raise NotImplementedError
def actionResult(self, type, id, data):
diff --git a/frontends/src/quick_frontend/quick_utils.py b/frontends/src/quick_frontend/quick_utils.py
index 2e531b88..4f4058ba 100644
--- a/frontends/src/quick_frontend/quick_utils.py
+++ b/frontends/src/quick_frontend/quick_utils.py
@@ -20,6 +20,7 @@ along with this program. If not, see .
"""
from sat.tools.jid import JID
+from os.path import exists, splitext
def escapePrivate(ori_jid):
"""Escape a private jid"""
@@ -31,3 +32,16 @@ def unescapePrivate(escaped_jid):
escaped_split = tuple(escaped_jid[len(const_PRIVATE_PREFIX):].split('@'))
assert(len(escaped_split) == 3)
return JID("%s@%s/%s" % escaped_split)
+
+def getNewPath(path):
+ """ Check if path exists, and find a non existant path if needed """
+ idx = 2
+ if not exists(path):
+ return path
+ root, ext = splitext(path)
+ while True:
+ new_path = "%s_%d%s" % (root, idx, ext)
+ if not exists(new_path):
+ return new_path
+ idx+=1
+
diff --git a/frontends/src/wix/main_window.py b/frontends/src/wix/main_window.py
index 7ce9afb6..2013a7a4 100644
--- a/frontends/src/wix/main_window.py
+++ b/frontends/src/wix/main_window.py
@@ -223,7 +223,7 @@ class MainWindow(wx.Frame, QuickApp):
self.tools.Disable()
return
- def askConfirmation(self, confirmation_type, confirmation_id, data, profile):
+ def askConfirmation(self, confirmation_id, confirmation_type, data, profile):
#TODO: refactor this in QuickApp
if not self.check_profile(profile):
return