diff options
Diffstat (limited to 'Swiften/Disco/CapsInfoGenerator.cpp')
-rw-r--r-- | Swiften/Disco/CapsInfoGenerator.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/Swiften/Disco/CapsInfoGenerator.cpp b/Swiften/Disco/CapsInfoGenerator.cpp index 67ed979..94f2a7a 100644 --- a/Swiften/Disco/CapsInfoGenerator.cpp +++ b/Swiften/Disco/CapsInfoGenerator.cpp @@ -10,9 +10,16 @@ #include "Swiften/Base/foreach.h" #include "Swiften/Elements/DiscoInfo.h" +#include "Swiften/Elements/FormField.h" #include "Swiften/StringCodecs/SHA1.h" #include "Swiften/StringCodecs/Base64.h" +namespace { + bool compareFields(Swift::FormField::ref f1, Swift::FormField::ref f2) { + return f1->getName() < f2->getName(); + } +} + namespace Swift { CapsInfoGenerator::CapsInfoGenerator(const String& node) : node_(node) { @@ -33,6 +40,23 @@ CapsInfo CapsInfoGenerator::generateCapsInfo(const DiscoInfo& discoInfo) const { serializedCaps += feature + "<"; } + foreach(Form::ref extension, discoInfo.getExtensions()) { + serializedCaps += extension->getFormType() + "<"; + std::vector<FormField::ref> fields(extension->getFields()); + std::sort(fields.begin(), fields.end(), &compareFields); + foreach(FormField::ref field, fields) { + if (field->getName() == "FORM_TYPE") { + continue; + } + serializedCaps += field->getName() + "<"; + std::vector<String> values(field->getRawValues()); + std::sort(values.begin(), values.end()); + foreach(const String& value, values) { + serializedCaps += value + "<"; + } + } + } + String version(Base64::encode(SHA1::getHash(serializedCaps))); return CapsInfo(node_, version, "sha-1"); } |