core (disco): added discoInfos and discoItems bridge methods

This commit is contained in:
Goffi 2014-04-01 21:14:57 +02:00
commit e95d04b69e
5 changed files with 63 additions and 2 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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])