summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Disco/CapsInfoGenerator.cpp')
-rw-r--r--Swiften/Disco/CapsInfoGenerator.cpp24
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");
}