summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2010-09-14 16:17:30 (GMT)
committerRemko Tronçon <git@el-tramo.be>2010-09-14 19:48:53 (GMT)
commitef5a4dc3a5b0224628a225ef0dccc679287478be (patch)
tree126d8f752f18d3d5891cd32cacf2a21734ab0b92 /Swiften/Disco/CapsInfoGenerator.cpp
parent9ecba612d790c1f613dc959888f62e5d3575faae (diff)
downloadswift-ef5a4dc3a5b0224628a225ef0dccc679287478be.zip
swift-ef5a4dc3a5b0224628a225ef0dccc679287478be.tar.bz2
Add extended disco support to caps verifier.
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");
}