#include "Swiften/Disco/CapsInfoGenerator.h" #include <algorithm> #include "Swiften/Base/foreach.h" #include "Swiften/Elements/DiscoInfo.h" #include "Swiften/StringCodecs/SHA1.h" #include "Swiften/StringCodecs/Base64.h" namespace Swift { CapsInfoGenerator::CapsInfoGenerator(const String& node) : node_(node) { } CapsInfo CapsInfoGenerator::generateCapsInfo(const DiscoInfo& discoInfo) const { String serializedCaps; std::vector<DiscoInfo::Identity> identities(discoInfo.getIdentities()); std::sort(identities.begin(), identities.end()); foreach (const DiscoInfo::Identity& identity, identities) { serializedCaps += identity.getCategory() + "/" + identity.getType() + "/" + identity.getLanguage() + "/" + identity.getName() + "<"; } std::vector<String> features(discoInfo.getFeatures()); std::sort(features.begin(), features.end()); foreach (const String& feature, features) { serializedCaps += feature + "<"; } String version(Base64::encode(SHA1::getBinaryHash(serializedCaps))); return CapsInfo(node_, version, "sha-1"); } }