comparison src/core/sat_main.py @ 2534:7da86e1633a5

core: new discoFindFeatures method which return all server services/roster entities implementing a set of features.
author Goffi <goffi@goffi.org>
date Sat, 24 Mar 2018 10:46:09 +0100
parents e8e1507049b7
children 27539029a662
comparison
equal deleted inserted replaced
2533:8d82a62fa098 2534:7da86e1633a5
116 self.bridge.register_method("menusGet", self.getMenus) 116 self.bridge.register_method("menusGet", self.getMenus)
117 self.bridge.register_method("menuHelpGet", self.getMenuHelp) 117 self.bridge.register_method("menuHelpGet", self.getMenuHelp)
118 self.bridge.register_method("menuLaunch", self._launchMenu) 118 self.bridge.register_method("menuLaunch", self._launchMenu)
119 self.bridge.register_method("discoInfos", self.memory.disco._discoInfos) 119 self.bridge.register_method("discoInfos", self.memory.disco._discoInfos)
120 self.bridge.register_method("discoItems", self.memory.disco._discoItems) 120 self.bridge.register_method("discoItems", self.memory.disco._discoItems)
121 self.bridge.register_method("discoFindByFeatures", self._findByFeatures)
121 self.bridge.register_method("saveParamsTemplate", self.memory.save_xml) 122 self.bridge.register_method("saveParamsTemplate", self.memory.save_xml)
122 self.bridge.register_method("loadParamsTemplate", self.memory.load_xml) 123 self.bridge.register_method("loadParamsTemplate", self.memory.load_xml)
123 self.bridge.register_method("sessionInfosGet", self.getSessionInfos) 124 self.bridge.register_method("sessionInfosGet", self.getSessionInfos)
124 self.bridge.register_method("namespacesGet", self.getNamespaces) 125 self.bridge.register_method("namespacesGet", self.getNamespaces)
125 126
668 return self.memory.disco.findServiceEntities(*args, **kwargs) 669 return self.memory.disco.findServiceEntities(*args, **kwargs)
669 670
670 def findFeaturesSet(self, *args, **kwargs): 671 def findFeaturesSet(self, *args, **kwargs):
671 return self.memory.disco.findFeaturesSet(*args, **kwargs) 672 return self.memory.disco.findFeaturesSet(*args, **kwargs)
672 673
674 def _findByFeatures(self, namespace, service, roster, own_jid, profile_key):
675 client = self.getClient(profile_key)
676 return self.findByFeatures(client, namespace, service, roster, own_jid)
677
678 @defer.inlineCallbacks
679 def findByFeatures(self, client, namespaces, service, roster, own_jid):
680 """retrieve all services or contacts managing a set a features
681
682 @param namespaces(list[unicode]): features which must be handled
683 @param service(bool): if True return service from our roster
684 @param roster(bool): if True, return entities in roster
685 full jid of all matching resources available will be returned
686 @param own_jid(bool): if True, return profile's jid resources
687 @return (tuple(dict[jid.JID(), tuple[unicode, unicode, unicode]]*3)): found entities in a tuple with:
688 - service entities
689 - own entities
690 - roster entities
691 """
692 if not namespaces:
693 raise exceptions.DataError("namespaces must not be empty")
694 found_service = {}
695 found_own = {}
696 found_roster = {}
697 if service:
698 services_jids = yield self.findFeaturesSet(client, namespaces)
699 for service_jid in services_jids:
700 infos = yield self.getDiscoInfos(client, service_jid)
701 identities = [(cat, type_, name or u'') for (cat, type_), name in infos.identities.iteritems()]
702 found_service[service_jid.full()] = identities
703
704 jids = []
705 if roster:
706 jids.extend(client.roster.getJids())
707 if own_jid:
708 jids.append(client.jid.userhostJID())
709
710 for found, jids in ((found_own, [client.jid.userhostJID()]),
711 (found_roster, client.roster.getJids())):
712 for jid_ in jids:
713 if jid_.resource:
714 resources = [jid_.resource]
715 else:
716 try:
717 resources = self.memory.getAllResources(client, jid_)
718 except exceptions.UnknownEntityError:
719 continue
720 for resource in resources:
721 full_jid = jid.JID(tuple=(jid_.user, jid_.host, resource))
722 infos = yield self.getDiscoInfos(client, full_jid)
723 if infos.features.issuperset(namespaces):
724 identities = [(cat, type_, name or u'') for (cat, type_), name in infos.identities.iteritems()]
725 found[full_jid.full()] = identities
726
727 defer.returnValue((found_service, found_own, found_roster))
673 728
674 ## Generic HMI ## 729 ## Generic HMI ##
675 730
676 def _killAction(self, keep_id, client): 731 def _killAction(self, keep_id, client):
677 log.debug(u"Killing action {} for timeout".format(keep_id)) 732 log.debug(u"Killing action {} for timeout".format(keep_id))