summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Sluift/ElementConvertors/DiscoInfoConvertor.cpp31
-rw-r--r--Sluift/ElementConvertors/DiscoInfoConvertor.h9
-rw-r--r--Sluift/LuaElementConvertors.cpp4
3 files changed, 37 insertions, 7 deletions
diff --git a/Sluift/ElementConvertors/DiscoInfoConvertor.cpp b/Sluift/ElementConvertors/DiscoInfoConvertor.cpp
index 2aa4a77..a528211 100644
--- a/Sluift/ElementConvertors/DiscoInfoConvertor.cpp
+++ b/Sluift/ElementConvertors/DiscoInfoConvertor.cpp
@@ -14,2 +14,4 @@
+#include <Swiften/Elements/Form.h>
+#include <Sluift/LuaElementConvertors.h>
#include <Sluift/Lua/LuaUtils.h>
@@ -18,3 +20,5 @@ using namespace Swift;
-DiscoInfoConvertor::DiscoInfoConvertor() : GenericLuaElementConvertor<DiscoInfo>("disco_info") {
+DiscoInfoConvertor::DiscoInfoConvertor(LuaElementConvertors* convertors) :
+ GenericLuaElementConvertor<DiscoInfo>("disco_info"),
+ convertors(convertors) {
}
@@ -54,3 +58,13 @@ std::shared_ptr<DiscoInfo> DiscoInfoConvertor::doConvertFromLua(lua_State* L) {
- // TODO: Extension
+ lua_getfield(L, -1, "extensions");
+ if (lua_istable(L, -1)) {
+ for (lua_pushnil(L); lua_next(L, -2); ) {
+ std::shared_ptr<Form> form = std::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"));
+ if (!!form) {
+ result->addExtension(form);
+ }
+ lua_pop(L, 1);
+ }
+ }
+ lua_pop(L, 1);
@@ -102,3 +116,12 @@ void DiscoInfoConvertor::doConvertToLua(lua_State* L, std::shared_ptr<DiscoInfo>
- // TODO: Extension
+ const std::vector<Form::ref>& extensions = payload->getExtensions();
+ if (!extensions.empty()) {
+ lua_createtable(L, boost::numeric_cast<int>(extensions.size()), 0);
+ for (size_t i = 0; i < extensions.size(); ++i) {
+ if (convertors->convertToLuaUntyped(L, extensions[i]) > 0) {
+ lua_rawseti(L, -2, boost::numeric_cast<int>(i+1));
+ }
+ }
+ lua_setfield(L, -2, "extensions");
+ }
}
@@ -117,2 +140,4 @@ boost::optional<LuaElementConvertor::Documentation> DiscoInfoConvertor::getDocum
"- `features`: array(string)\n"
+ "- `extensions`: array(table)\n"
+ "- `form`: string @{Form} (Optional)\n"
);
diff --git a/Sluift/ElementConvertors/DiscoInfoConvertor.h b/Sluift/ElementConvertors/DiscoInfoConvertor.h
index 34f8237..c1b2910 100644
--- a/Sluift/ElementConvertors/DiscoInfoConvertor.h
+++ b/Sluift/ElementConvertors/DiscoInfoConvertor.h
@@ -1,3 +1,3 @@
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2017 Isode Limited.
* All rights reserved.
@@ -14,5 +14,7 @@
namespace Swift {
+ class LuaElementConvertors;
+
class DiscoInfoConvertor : public GenericLuaElementConvertor<DiscoInfo> {
public:
- DiscoInfoConvertor();
+ DiscoInfoConvertor(LuaElementConvertors* convertors);
virtual ~DiscoInfoConvertor();
@@ -22,2 +24,5 @@ namespace Swift {
virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE;
+
+ private:
+ LuaElementConvertors* convertors;
};
diff --git a/Sluift/LuaElementConvertors.cpp b/Sluift/LuaElementConvertors.cpp
index aac4d93..db91761 100644
--- a/Sluift/LuaElementConvertors.cpp
+++ b/Sluift/LuaElementConvertors.cpp
@@ -1,3 +1,3 @@
/*
- * Copyright (c) 2013-2016 Isode Limited.
+ * Copyright (c) 2013-2017 Isode Limited.
* All rights reserved.
@@ -55,3 +55,3 @@ LuaElementConvertors::LuaElementConvertors() {
convertors.push_back(std::make_shared<SoftwareVersionConvertor>());
- convertors.push_back(std::make_shared<DiscoInfoConvertor>());
+ convertors.push_back(std::make_shared<DiscoInfoConvertor>(this));
convertors.push_back(std::make_shared<DiscoItemsConvertor>());