From e95d04b69ed04345904f6df889a8706a339cf169 Mon Sep 17 00:00:00 2001 From: Goffi Date: Tue, 1 Apr 2014 21:14:57 +0200 Subject: [PATCH] core (disco): added discoInfos and discoItems bridge methods --- frontends/src/bridge/DBus.py | 6 +++++ src/bridge/DBus.py | 12 ++++++++++ .../bridge_constructor/bridge_template.ini | 23 ++++++++++++++++++- src/core/sat_main.py | 2 ++ src/memory/disco.py | 22 +++++++++++++++++- 5 files changed, 63 insertions(+), 2 deletions(-) diff --git a/frontends/src/bridge/DBus.py b/frontends/src/bridge/DBus.py index 34001da0..33f3d643 100644 --- a/frontends/src/bridge/DBus.py +++ b/frontends/src/bridge/DBus.py @@ -119,6 +119,12 @@ class DBusBridgeFrontend(BridgeFrontend): def delContact(self, entity_jid, profile_key="@DEFAULT@"): return self.db_core_iface.delContact(entity_jid, profile_key) + def discoInfos(self, entity_jid, profile_key, callback=None, errback=None): + return self.db_core_iface.discoInfos(entity_jid, profile_key, reply_handler=callback, error_handler=lambda err:errback(err._dbus_error_name[len(const_ERROR_PREFIX)+1:])) + + def discoItems(self, entity_jid, profile_key, callback=None, errback=None): + return self.db_core_iface.discoItems(entity_jid, profile_key, reply_handler=callback, error_handler=lambda err:errback(err._dbus_error_name[len(const_ERROR_PREFIX)+1:])) + def disconnect(self, profile_key="@DEFAULT@"): return self.db_core_iface.disconnect(profile_key) diff --git a/src/bridge/DBus.py b/src/bridge/DBus.py index 12ea6f1f..871bea59 100755 --- a/src/bridge/DBus.py +++ b/src/bridge/DBus.py @@ -233,6 +233,18 @@ class DbusObject(dbus.service.Object): def delContact(self, entity_jid, profile_key="@DEFAULT@"): return self._callback("delContact", unicode(entity_jid), unicode(profile_key)) + @dbus.service.method(const_INT_PREFIX+const_CORE_SUFFIX, + in_signature='ss', out_signature='(asa(sss))', + async_callbacks=('callback', 'errback')) + def discoInfos(self, entity_jid, profile_key, callback=None, errback=None): + return self._callback("discoInfos", unicode(entity_jid), unicode(profile_key), callback=callback, errback=errback) + + @dbus.service.method(const_INT_PREFIX+const_CORE_SUFFIX, + in_signature='ss', out_signature='a(sss)', + async_callbacks=('callback', 'errback')) + def discoItems(self, entity_jid, profile_key, callback=None, errback=None): + return self._callback("discoItems", unicode(entity_jid), unicode(profile_key), callback=callback, errback=errback) + @dbus.service.method(const_INT_PREFIX+const_CORE_SUFFIX, in_signature='s', out_signature='', async_callbacks=None) diff --git a/src/bridge/bridge_constructor/bridge_template.ini b/src/bridge/bridge_constructor/bridge_template.ini index 56cbfb21..489d1748 100644 --- a/src/bridge/bridge_constructor/bridge_template.ini +++ b/src/bridge/bridge_constructor/bridge_template.ini @@ -584,7 +584,7 @@ doc_return=dict with progress information: [getMenus] type=method category=core -sig_in= si +sig_in=si sig_out=a(ssasas) doc=Get all additional menus doc_param_0=language: language in which the menu should be translated (empty string for default) @@ -607,3 +607,24 @@ doc_param_0=menu_id: id of the menu (same as callback_id) doc_param_1=language: language in which the menu should be translated (empty string for default) doc_return=Translated help string +[discoInfos] +async= +type=method +category=core +sig_in=ss +sig_out=(asa(sss)) +doc=Discover infos on an entity +doc_param_0=entity_jid: JID to discover +doc_param_1=%(doc_profile_key)s +doc_return=discovery data + +[discoItems] +async= +type=method +category=core +sig_in=ss +sig_out=a(sss) +doc=Discover items of an entity +doc_param_0=entity_jid: JID to discover +doc_param_1=%(doc_profile_key)s +doc_return=array of tuple (entity, node identifier, name) diff --git a/src/core/sat_main.py b/src/core/sat_main.py index 7ff846b7..c6e3ba22 100644 --- a/src/core/sat_main.py +++ b/src/core/sat_main.py @@ -135,6 +135,8 @@ class SAT(service.Service): self.bridge.register("getProgress", self.getProgress) self.bridge.register("getMenus", self.getMenus) self.bridge.register("getMenuHelp", self.getMenuHelp) + self.bridge.register("discoInfos", self.memory.disco._discoInfos) + self.bridge.register("discoItems", self.memory.disco._discoItems) self.memory.initialized.addCallback(self._postMemoryInit) diff --git a/src/memory/disco.py b/src/memory/disco.py index 9b4bee42..8dff42da 100755 --- a/src/memory/disco.py +++ b/src/memory/disco.py @@ -114,7 +114,7 @@ class Discovery(object): @param jid_: jid of the target, or None for profile's server @param profile_key: %(doc_profile_key)s - @return: a Deferred which fire disco.DiscoInfo + @return: a Deferred which fire disco.DiscoItems """ client = self.host.getClient(profile_key) if jid_ is None: @@ -212,3 +212,23 @@ class Discovery(object): cap_hash = b64encode(sha1(''.join(s)).digest()) debug(_('Capability hash generated: [%s]') % cap_hash) return cap_hash + + @defer.inlineCallbacks + def _discoInfos(self, entity_jid_s, profile_key=C.PROF_KEY_NONE): + """ Discovery method for the bridge + @param entity_jid_s: entity we want to discover + + @return: list of tu""" + entity = jid.JID(entity_jid_s) + disco_infos = yield self.getInfos(entity, profile_key) + defer.returnValue((disco_infos.features, [(cat, type_, name or '') for (cat, type_), name in disco_infos.identities.items()])) + + @defer.inlineCallbacks + def _discoItems(self, entity_jid_s, profile_key=C.PROF_KEY_NONE): + """ Discovery method for the bridge + @param entity_jid_s: entity we want to discover + + @return: list of tu""" + entity = jid.JID(entity_jid_s) + disco_items = yield self.getItems(entity, profile_key) + defer.returnValue([(item.entity.full(), item.nodeIdentifier or '', item.name or '') for item in disco_items])