# HG changeset patch # User Goffi # Date 1472405038 -7200 # Node ID 046449cc2bff95dc65db0bcba8964e2d8784de41 # Parent b67aece4a667da8d691cf006225c9ce10f7aa08e core, bridge, frontends: removed deprecated bridge method askConfirmation, confirmationAnswer, actionResult, actionResultExt and getWaitingConf diff -r b67aece4a667 -r 046449cc2bff frontends/src/bridge/DBus.py --- a/frontends/src/bridge/DBus.py Sun Aug 28 18:24:45 2016 +0200 +++ b/frontends/src/bridge/DBus.py Sun Aug 28 19:23:58 2016 +0200 @@ -207,20 +207,6 @@ error_handler = lambda err:errback(dbus_to_bridge_exception(err)) return self.db_core_iface.asyncGetParamsValuesFromCategory(category, security_limit, profile_key, timeout=const_TIMEOUT, reply_handler=callback, error_handler=error_handler) - def confirmationAnswer(self, id, accepted, data, profile, callback=None, errback=None): - if callback is None: - error_handler = None - else: - if errback is None: - errback = log.error - error_handler = lambda err:errback(dbus_to_bridge_exception(err)) - kwargs={} - if callback is not None: - kwargs['timeout'] = const_TIMEOUT - kwargs['reply_handler'] = callback - kwargs['error_handler'] = error_handler - return self.db_core_iface.confirmationAnswer(id, accepted, data, profile, **kwargs) - def delContact(self, entity_jid, profile_key="@DEFAULT@", callback=None, errback=None): if callback is None: error_handler = None @@ -480,20 +466,6 @@ kwargs['error_handler'] = error_handler return unicode(self.db_core_iface.getVersion(**kwargs)) - def getWaitingConf(self, profile_key, callback=None, errback=None): - if callback is None: - error_handler = None - else: - if errback is None: - errback = log.error - error_handler = lambda err:errback(dbus_to_bridge_exception(err)) - kwargs={} - if callback is not None: - kwargs['timeout'] = const_TIMEOUT - kwargs['reply_handler'] = callback - kwargs['error_handler'] = error_handler - return self.db_core_iface.getWaitingConf(profile_key, **kwargs) - def getWaitingSub(self, profile_key="@DEFAULT@", callback=None, errback=None): if callback is None: error_handler = None diff -r b67aece4a667 -r 046449cc2bff frontends/src/primitivus/primitivus --- a/frontends/src/primitivus/primitivus Sun Aug 28 18:24:45 2016 +0200 +++ b/frontends/src/primitivus/primitivus Sun Aug 28 19:23:58 2016 +0200 @@ -28,7 +28,6 @@ import urwid from urwid.util import is_wide_char from urwid_satext import sat_widgets -from urwid_satext.files_management import FileDialog from sat_frontends.bridge.DBus import DBusBridgeFrontend from sat_frontends.quick_frontend.quick_app import QuickApp from sat_frontends.quick_frontend import quick_utils @@ -43,7 +42,6 @@ from sat_frontends.primitivus import config from sat_frontends.tools.misc import InputHistory from sat_frontends.tools import jid -from os.path import join import signal import sys @@ -744,78 +742,6 @@ def _actionManagerUnknownError(self): self.alert(_("Error"), _(u"Unmanaged action")) - def askConfirmationHandler(self, confirmation_id, confirmation_type, data, profile): - answer_data = {} - - def dir_selected_cb(path): - dest_path = join(path, data['filename']) - answer_data["dest_path"] = quick_utils.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 actionResultHandler(self, type_, id, data, profile): - # FIXME: to be removed - - if not id in self.current_action_ids: - log.debug (_('unknown id, ignoring')) - return - if type_ == "SUPPRESS": - self.current_action_ids.remove(id) - elif type_ == "XMLUI": - self.current_action_ids.remove(id) - log.debug (_("XML user interface received")) - misc = {} - #FIXME FIXME FIXME: must clean all this crap ! - title = _('Form') - if data['type'] == 'registration': - title = _('Registration') - misc['target'] = data['target'] - misc['action_back'] = self.bridge.gatewayRegister - ui = xmlui.create(self, title=title, xml_data=data['xml'], misc=misc, profile=profile) - if data['type'] == 'registration': - ui.show('popup') - else: - ui.show('window') - elif type_ == "ERROR": - self.current_action_ids.remove(id) - self.alert(_("Error"), unicode(data["message"])) #FIXME: remove unicode here when DBus Bridge will no return dbus.String anymore - elif type_ == "RESULT": - self.current_action_ids.remove(id) - if self.current_action_ids_cb.has_key(id): - callback = self.current_action_ids_cb[id] - del self.current_action_ids_cb[id] - callback(data) - elif type_ == "DICT_DICT": - self.current_action_ids.remove(id) - if self.current_action_ids_cb.has_key(id): - callback = self.current_action_ids_cb[id] - del self.current_action_ids_cb[id] - callback(data) - else: - log.error (_("FIXME FIXME FIXME: type [%s] not implemented") % type_) - raise NotImplementedError - def roomJoinedHandler(self, room_jid_s, room_nicks, user_nick, subject, profile): super(PrimitivusApp, self).roomJoinedHandler(room_jid_s, room_nicks, user_nick, subject, profile) # if self.selected_widget is None: diff -r b67aece4a667 -r 046449cc2bff frontends/src/quick_frontend/quick_app.py --- a/frontends/src/quick_frontend/quick_app.py Sun Aug 28 18:24:45 2016 +0200 +++ b/frontends/src/quick_frontend/quick_app.py Sun Aug 28 19:23:58 2016 +0200 @@ -46,6 +46,8 @@ class ProfileManager(object): """Class managing all data relative to one profile, and plugging in mechanism""" + # TODO: handle waiting XMLUI requests: getWaitingConf doesn't exist anymore + # and a way to keep some XMLUI request between sessions is expected in backend host = None bridge = None cache_keys_to_get = ['avatar'] @@ -136,13 +138,6 @@ self.host.presenceUpdateHandler(jabber_id, show, priority, statuses, self.profile) self.host.bridge.getEntityData(contact, ['avatar', 'nick'], self.profile, callback=lambda data, contact=contact: gotEntityData(data, contact), errback=lambda failure, contact=contact: log.debug(u"No cache data for {}".format(contact))) - #Finaly, we get the waiting confirmation requests - self.bridge.getWaitingConf(self.profile, callback=self._plug_profile_gotWaitingConf) - - def _plug_profile_gotWaitingConf(self, waiting_confs): - for confirm_id, confirm_type, data in waiting_confs: - self.host.askConfirmationHandler(confirm_id, confirm_type, data, self.profile) - # At this point, profile should be fully plugged # and we launch frontend specific method self.host.profilePlugged(self.profile) @@ -238,18 +233,14 @@ self.registerSignal("actionNew") self.registerSignal("newContact") self.registerSignal("messageNew") - self.registerSignal("newAlert") self.registerSignal("presenceUpdate") self.registerSignal("subscribe") self.registerSignal("paramUpdate") self.registerSignal("contactDeleted") self.registerSignal("entityDataUpdated") - self.registerSignal("askConfirmation") - self.registerSignal("actionResult") self.registerSignal("progressStarted") self.registerSignal("progressFinished") self.registerSignal("progressError") - self.registerSignal("actionResultExt", self.actionResultHandler) self.registerSignal("mucRoomJoined", iface="plugin") self.registerSignal("mucRoomLeft", iface="plugin") self.registerSignal("mucRoomUserChangedNick", iface="plugin") @@ -263,8 +254,6 @@ quick_games.Quiz.registerSignals(self) quick_games.Radiocol.registerSignals(self) - self.current_action_ids = set() # FIXME: to be removed - self.current_action_ids_cb = {} # FIXME: to be removed self._notif_id = 0 self._notifications = OrderedDict() self.media_dir = self.bridge.getConfig('', 'media_dir') @@ -485,9 +474,6 @@ # we want to be sure to have at least one QuickChat instance self.widgets.getOrCreateWidget(quick_chat.QuickChat, target, type_=C.CHAT_ONE2ONE, on_new_widget=None, profile=profile) - self.current_action_ids = set() # FIXME: to be removed - self.current_action_ids_cb = {} # FIXME: to be removed - if not from_jid in contact_list and from_jid.bare != self.profiles[profile].whoami.bare: #XXX: needed to show entities which haven't sent any # presence information and which are not in roster @@ -516,10 +502,6 @@ self.bridge.messageSend(unicode(to_jid), message, subject, mess_type, extra, profile_key, callback=callback, errback=errback) - def newAlertHandler(self, msg, title, alert_type, profile): - assert alert_type in ['INFO', 'ERROR'] - self.showDialog(unicode(msg), unicode(title), alert_type.lower()) - def setPresenceStatus(self, show='', status=None, profile=C.PROF_KEY_NONE): raise NotImplementedError @@ -788,12 +770,6 @@ self.callListeners('avatar', entity, filename, profile=profile) self.bridge.getAvatarFile(value, callback=gotFilename) - def askConfirmationHandler(self, confirm_id, confirm_type, data, profile): - raise NotImplementedError - - def actionResultHandler(self, type, id, data, profile): - raise NotImplementedError - def actionManager(self, action_data, callback=None, ui_show_cb=None, user_action=True, profile=C.PROF_KEY_NONE): """Handle backend action diff -r b67aece4a667 -r 046449cc2bff src/bridge/DBus.py --- a/src/bridge/DBus.py Sun Aug 28 18:24:45 2016 +0200 +++ b/src/bridge/DBus.py Sun Aug 28 19:23:58 2016 +0200 @@ -131,21 +131,6 @@ pass @dbus.service.signal(const_INT_PREFIX+const_CORE_SUFFIX, - signature='ssa{ss}s') - def actionResult(self, answer_type, id, data, profile): - pass - - @dbus.service.signal(const_INT_PREFIX+const_CORE_SUFFIX, - signature='ssa{sa{ss}}s') - def actionResultExt(self, answer_type, id, data, profile): - pass - - @dbus.service.signal(const_INT_PREFIX+const_CORE_SUFFIX, - signature='ssa{ss}s') - def askConfirmation(self, id, conf_type, data, profile): - pass - - @dbus.service.signal(const_INT_PREFIX+const_CORE_SUFFIX, signature='ss') def connected(self, profile, jid_s): pass @@ -171,11 +156,6 @@ pass @dbus.service.signal(const_INT_PREFIX+const_CORE_SUFFIX, - signature='ssss') - def newAlert(self, message, title, alert_type, profile): - pass - - @dbus.service.signal(const_INT_PREFIX+const_CORE_SUFFIX, signature='sa{ss}ass') def newContact(self, contact_jid, attributes, groups, profile): pass @@ -255,12 +235,6 @@ return self._callback("asyncGetParamsValuesFromCategory", unicode(category), security_limit, unicode(profile_key), callback=callback, errback=errback) @dbus.service.method(const_INT_PREFIX+const_CORE_SUFFIX, - in_signature='sba{ss}s', out_signature='', - async_callbacks=None) - def confirmationAnswer(self, id, accepted, data, profile): - return self._callback("confirmationAnswer", unicode(id), accepted, data, unicode(profile)) - - @dbus.service.method(const_INT_PREFIX+const_CORE_SUFFIX, in_signature='ss', out_signature='', async_callbacks=('callback', 'errback')) def delContact(self, entity_jid, profile_key="@DEFAULT@", callback=None, errback=None): @@ -387,12 +361,6 @@ return self._callback("getVersion", ) @dbus.service.method(const_INT_PREFIX+const_CORE_SUFFIX, - in_signature='s', out_signature='a(ssa{ss})', - async_callbacks=None) - def getWaitingConf(self, profile_key): - return self._callback("getWaitingConf", unicode(profile_key)) - - @dbus.service.method(const_INT_PREFIX+const_CORE_SUFFIX, in_signature='s', out_signature='a{ss}', async_callbacks=None) def getWaitingSub(self, profile_key="@DEFAULT@"): @@ -605,15 +573,6 @@ def actionNew(self, action_data, id, security_limit, profile): self.dbus_bridge.actionNew(action_data, id, security_limit, profile) - def actionResult(self, answer_type, id, data, profile): - self.dbus_bridge.actionResult(answer_type, id, data, profile) - - def actionResultExt(self, answer_type, id, data, profile): - self.dbus_bridge.actionResultExt(answer_type, id, data, profile) - - def askConfirmation(self, id, conf_type, data, profile): - self.dbus_bridge.askConfirmation(id, conf_type, data, profile) - def connected(self, profile, jid_s): self.dbus_bridge.connected(profile, jid_s) @@ -629,9 +588,6 @@ def messageNew(self, uid, timestamp, from_jid, to_jid, message, subject, mess_type, extra, profile): self.dbus_bridge.messageNew(uid, timestamp, from_jid, to_jid, message, subject, mess_type, extra, profile) - def newAlert(self, message, title, alert_type, profile): - self.dbus_bridge.newAlert(message, title, alert_type, profile) - def newContact(self, contact_jid, attributes, groups, profile): self.dbus_bridge.newContact(contact_jid, attributes, groups, profile) diff -r b67aece4a667 -r 046449cc2bff src/bridge/bridge_constructor/bridge_constructor.py --- a/src/bridge/bridge_constructor/bridge_constructor.py Sun Aug 28 18:24:45 2016 +0200 +++ b/src/bridge/bridge_constructor/bridge_constructor.py Sun Aug 28 19:23:58 2016 +0200 @@ -167,11 +167,13 @@ def getArguments(self, signature, name=None, default=None, unicode_protect=False): """Return arguments to user given a signature + @param signature: signature in the short form (using s,a,i,b etc) @param name: dictionary of arguments name like given by getArguments @param default: dictionary of default values, like given by getDefault @param unicode_protect: activate unicode protection on strings (return strings as unicode(str)) - @return: list of arguments that correspond to a signature (e.g.: "sss" return "arg1, arg2, arg3")""" + @return: list of arguments that correspond to a signature (e.g.: "sss" return "arg1, arg2, arg3") + """ idx = 0 attr_string = [] @@ -276,7 +278,6 @@ for section in sections: function = self.getValues(section) print ("Adding %s %s" % (section, function["type"])) - default = self.getDefault(section) async_msg = """
'''This method is asynchronous'''""" deprecated_msg = """
'''/!\ WARNING /!\ : This method is deprecated, please don't use it !'''""" signature_signal = \ @@ -516,7 +517,7 @@ 'a{i(ss)}': 'HistoryT', 'a(sss)': 'QList', 'a{sa{s(sia{ss})}}': 'PresenceStatusT', - 'a{sa{ss}}': 'ActionResultExtDataT'} + } def generateCoreSide(self): try: @@ -536,7 +537,6 @@ print ("Adding %s %s" % (section, function["type"])) new_elt = doc.createElement('method' if function["type"] == 'method' else 'signal') new_elt.setAttribute('name', section) - args_in_str = self.getArguments(function['sig_in']) idx = 0 args_doc = self.getArgumentsDoc(section) diff -r b67aece4a667 -r 046449cc2bff src/bridge/bridge_constructor/bridge_template.ini --- a/src/bridge/bridge_constructor/bridge_template.ini Sun Aug 28 18:24:45 2016 +0200 +++ b/src/bridge/bridge_constructor/bridge_template.ini Sun Aug 28 19:23:58 2016 +0200 @@ -54,19 +54,6 @@ - info_type: subtype for info messages doc_param_8=%(doc_profile)s -[newAlert] -deprecated= -type=signal -category=core -sig_in=ssss -doc=A new alert happened -doc_param_0=message: Body of the alert -doc_param_1=title: Title of the alert -doc_param_2=alert_type: Type of the alert, can be: - - INFO: Informative message - - ERROR: something went wrong -doc_param_3=%(doc_profile)s - [presenceUpdate] type=signal category=core @@ -105,19 +92,6 @@ doc_param_0=entity_jid: JID of the contact removed from roster doc_param_1=%(doc_profile)s -[askConfirmation] -deprecated= -type=signal -category=core -sig_in=ssa{ss}s -doc=A confirmation is needed for an action -doc_param_0=id: Id of the confirmation query -doc_param_1=conf_type: Type of the confirmation, can be: - - YES/NO: A question which need a yes or no answer - - FILE_TRANSFER: A confirmation is needed before transfering a file -doc_param_2=data: conf_type dependent data -doc_param_3=%(doc_profile)s - [actionNew] type=signal category=core @@ -138,33 +112,6 @@ doc_param_2=%(doc_security_limit)s doc_param_3=%(doc_profile)s -[actionResult] -deprecated= -type=signal -category=core -sig_in=ssa{ss}s -doc=Requested result of an action -doc_param_0=answer_type: Type of the answer, can be: - - SUPPRESS: The action is managed, the id MUST be removed from queue - - XMLUI: A SàT XMLUI interface is sent - - ERROR: Something went wrong when doing the action - - RESULT: General result, interpretation depend of the action -doc_param_1=id: Id of the action -doc_param_2=data: answer_type specific data -doc_param_3=%(doc_profile)s - -[actionResultExt] -deprecated= -type=signal -category=core -sig_in=ssa{sa{ss}}s -doc=Requested result of an action (Extended) -doc_param_0=answer_type: Same as for [actionResult] but with the following additional one: - - DICT_DICT: As RESULT, but returned as a dictionary of dictionary -doc_param_1=id: Id of the action -doc_param_2=data: answer_type specific data -doc_param_3=%(doc_profile)s - [entityDataUpdated] type=signal category=core @@ -432,16 +379,6 @@ doc_param_0=%(doc_profile_key)s doc_return=Dict where contact JID is the key, and value is the subscription type -[getWaitingConf] -type=method -category=core -sig_in=s -sig_out=a(ssa{ss}) -doc=Get confirmations requests in queue -doc_param_0=%(doc_profile_key)s -doc_return=List of confirmation request data, same as for [askConfirmation] - - [messageSend] async= type=method @@ -667,18 +604,6 @@ doc_param_0=%(doc_profile_key)s doc_return=list of data as for [actionNew] (without the profile) -[confirmationAnswer] -deprecated= -type=method -category=core -sig_in=sba{ss}s -sig_out= -doc=Give answer to a confirmation request -doc_param_0=id: id of the confirmation request -doc_param_1=accepted: True if the action is confirmed -doc_param_2=data: action specific data -doc_param_3=%(doc_profile)s - [progressGet] type=method category=core diff -r b67aece4a667 -r 046449cc2bff src/core/sat_main.py --- a/src/core/sat_main.py Sun Aug 28 18:24:45 2016 +0200 +++ b/src/core/sat_main.py Sun Aug 28 19:23:58 2016 +0200 @@ -53,7 +53,6 @@ def __init__(self): self._cb_map = {} # map from callback_id to callbacks self._menus = OrderedDict() # dynamic menus. key: callback_id, value: menu data (dictionnary) - self.__private_data = {} # used for internal callbacks (key = id) FIXME: to be removed self.initialised = defer.Deferred() self.profiles = {} self.plugins = {} @@ -85,7 +84,6 @@ self.bridge.register("getMainResource", self.memory._getMainResource) self.bridge.register("getPresenceStatuses", self.memory._getPresenceStatuses) self.bridge.register("getWaitingSub", self.memory.getWaitingSub) - self.bridge.register("getWaitingConf", self.getWaitingConf) self.bridge.register("messageSend", self._messageSend) self.bridge.register("getConfig", self._getConfig) self.bridge.register("setParam", self.setParam) @@ -104,7 +102,6 @@ self.bridge.register("isConnected", self.isConnected) self.bridge.register("launchAction", self.launchCallback) self.bridge.register("actionsGet", self.actionsGet) - self.bridge.register("confirmationAnswer", self.confirmationAnswer) self.bridge.register("progressGet", self._progressGet) self.bridge.register("progressGetAll", self._progressGetAll) self.bridge.register("getMenus", self.getMenus) @@ -519,15 +516,6 @@ ## XMPP methods ## - def getWaitingConf(self, profile_key=None): - assert profile_key - client = self.getClient(profile_key) - ret = [] - for conf_id in client._waiting_conf: - conf_type, data = client._waiting_conf[conf_id][:2] - ret.append((conf_id, conf_type, data)) - return ret - def generateMessageXML(self, data): """Generate stanza from message data @@ -796,51 +784,6 @@ ## Generic HMI ## - def actionResult(self, action_id, action_type, data, profile): - """Send the result of an action - @param action_id: same action_id used with action - @param action_type: result action_type ("PARAM", "SUCCESS", "ERROR", "XMLUI") - @param data: dictionary - """ - self.bridge.actionResult(action_type, action_id, data, profile) - - def actionResultExt(self, action_id, action_type, data, profile): - """Send the result of an action, extended version - @param action_id: same action_id used with action - @param action_type: result action_type /!\ only "DICT_DICT" for this method - @param data: dictionary of dictionaries - """ - if action_type != "DICT_DICT": - log.error(_("action_type for actionResultExt must be DICT_DICT, fixing it")) - action_type = "DICT_DICT" - self.bridge.actionResultExt(action_type, action_id, data, profile) - - def askConfirmation(self, conf_id, conf_type, data, cb, profile): - """Add a confirmation callback - @param conf_id: conf_id used to get answer - @param conf_type: confirmation conf_type ("YES/NO", "FILE_TRANSFER") - @param data: data (depend of confirmation conf_type) - @param cb: callback called with the answer - """ - # FIXME: use XMLUI and *callback methods for dialog - client = self.getClient(profile) - if conf_id in client._waiting_conf: - log.error(_("Attempt to register two callbacks for the same confirmation")) - else: - client._waiting_conf[conf_id] = (conf_type, data, cb) - self.bridge.askConfirmation(conf_id, conf_type, data, profile) - - def confirmationAnswer(self, conf_id, accepted, data, profile): - """Called by frontends to answer confirmation requests""" - client = self.getClient(profile) - log.debug(_(u"Received confirmation answer for conf_id [%(conf_id)s]: %(success)s") % {'conf_id': conf_id, 'success': _("accepted") if accepted else _("refused")}) - if conf_id not in client._waiting_conf: - log.error(_(u"Received an unknown confirmation (%(id)s for %(profile)s)") % {'id': conf_id, 'profile': profile}) - else: - cb = client._waiting_conf[conf_id][-1] - del client._waiting_conf[conf_id] - cb(conf_id, accepted, data, profile) - def _killAction(self, keep_id, client): log.debug(u"Killing action {} for timeout".format(keep_id)) client.actions[keep_id] diff -r b67aece4a667 -r 046449cc2bff src/core/xmpp.py --- a/src/core/xmpp.py Sun Aug 28 18:24:45 2016 +0200 +++ b/src/core/xmpp.py Sun Aug 28 19:23:58 2016 +0200 @@ -50,7 +50,6 @@ self.host_app = host_app self._mess_id_uid = {} # map from message id to uid use in history. Key: (full_jid,message_id) Value: uid self.conn_deferred = defer.Deferred() - self._waiting_conf = {} # callback called when a confirmation is received self._progress_cb = {} # callback called when a progress is requested (key = progress id) self.actions = {} # used to keep track of actions for retrieval (key = action_id)