/* * Copyright (c) 2015-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include #include #include #include #include #include #include #include #include #include namespace Swift { FeatureOracle::FeatureOracle(EntityCapsProvider* capsProvider, PresenceOracle* presenceOracle) : capsProvider_(capsProvider), presenceOracle_(presenceOracle) { } Tristate FeatureOracle::isFileTransferSupported(const JID& jid) { DiscoInfo::ref discoInfo = getDiscoResultForJID(jid); if (discoInfo) { return FileTransferManager::isSupportedBy(discoInfo) ? Yes : No; } else { return Maybe; } } Tristate FeatureOracle::isMessageReceiptsSupported(const JID& jid) { return isFeatureSupported(jid, DiscoInfo::MessageDeliveryReceiptsFeature); } Tristate FeatureOracle::isMessageCorrectionSupported(const JID& jid) { return isFeatureSupported(jid, DiscoInfo::MessageCorrectionFeature); } DiscoInfo::ref FeatureOracle::getDiscoResultForJID(const JID& jid) { DiscoInfo::ref discoInfo; if (jid.isBare()) { // Calculate the common subset of disco features of all available results and return that. std::vector availablePresences = presenceOracle_->getAllPresence(jid); bool commonFeaturesInitialized = false; std::vector commonFeatures; foreach(Presence::ref presence, availablePresences) { DiscoInfo::ref presenceDiscoInfo = capsProvider_->getCaps(presence->getFrom()); if (presenceDiscoInfo) { std::vector features = presenceDiscoInfo->getFeatures(); if (!commonFeaturesInitialized) { commonFeatures = features; commonFeaturesInitialized = true; } else { std::vector featuresToRemove; foreach(const std::string& feature, commonFeatures) { if (std::find(features.begin(), features.end(), feature) == features.end()) { featuresToRemove.push_back(feature); } } foreach(const std::string& featureToRemove, featuresToRemove) { commonFeatures.erase(std::remove(commonFeatures.begin(), commonFeatures.end(), featureToRemove), commonFeatures.end()); } } } } discoInfo = std::make_shared(); foreach(const std::string& commonFeature, commonFeatures) { discoInfo->addFeature(commonFeature); } } else { // Return the disco result of the full JID. discoInfo = capsProvider_->getCaps(jid); } return discoInfo; } Tristate FeatureOracle::isFeatureSupported(const JID& jid, const std::string& feature) { DiscoInfo::ref discoInfo = getDiscoResultForJID(jid); if (discoInfo) { return discoInfo->hasFeature(feature) ? Yes : No; } else { return Maybe; } } }