Mercurial > libervia-backend
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)) |