diff options
Diffstat (limited to 'Sluift')
182 files changed, 8580 insertions, 8472 deletions
diff --git a/Sluift/Completer.h b/Sluift/Completer.h index 1e9defb..564c647 100644 --- a/Sluift/Completer.h +++ b/Sluift/Completer.h @@ -10,10 +10,10 @@ #include <vector> namespace Swift { - class Completer { - public: - virtual ~Completer(); + class Completer { + public: + virtual ~Completer(); - virtual std::vector<std::string> getCompletions(const std::string& buffer, int start, int end) = 0; - }; + virtual std::vector<std::string> getCompletions(const std::string& buffer, int start, int end) = 0; + }; } diff --git a/Sluift/Console.cpp b/Sluift/Console.cpp index 113e07b..ef0b1a4 100644 --- a/Sluift/Console.cpp +++ b/Sluift/Console.cpp @@ -1,21 +1,25 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/Console.h> -#include <lua.hpp> -#include <stdexcept> + +#include <cctype> #include <iostream> -#include <boost/optional.hpp> -#include <boost/lexical_cast.hpp> +#include <stdexcept> + #include <boost/algorithm/string/predicate.hpp> +#include <boost/lexical_cast.hpp> #include <boost/numeric/conversion/cast.hpp> +#include <boost/optional.hpp> + +#include <lua.hpp> + +#include <Sluift/Lua/LuaUtils.h> #include <Sluift/Terminal.h> #include <Sluift/tokenize.h> -#include <Sluift/Lua/LuaUtils.h> -#include <cctype> using namespace Swift; @@ -24,256 +28,256 @@ using namespace Swift; * Adds the backtrace to the error message. */ static int traceback(lua_State* L) { - if (!lua_isstring(L, 1)) { - return 1; - } - lua_getglobal(L, "debug"); - if (!lua_istable(L, -1)) { - lua_pop(L, 1); - return 1; - } - lua_getfield(L, -1, "traceback"); - if (!lua_isfunction(L, -1)) { - lua_pop(L, 2); - return 1; - } - lua_pushvalue(L, 1); - lua_pushinteger(L, 2); - lua_call(L, 2, 1); - return 1; + if (!lua_isstring(L, 1)) { + return 1; + } + lua_getglobal(L, "debug"); + if (!lua_istable(L, -1)) { + lua_pop(L, 1); + return 1; + } + lua_getfield(L, -1, "traceback"); + if (!lua_isfunction(L, -1)) { + lua_pop(L, 2); + return 1; + } + lua_pushvalue(L, 1); + lua_pushinteger(L, 2); + lua_call(L, 2, 1); + return 1; } Console::Console(lua_State* L, Terminal* terminal) : L(L), terminal(terminal), previousNumberOfReturnArguments(0) { - terminal->setCompleter(this); + terminal->setCompleter(this); } Console::~Console() { } void Console::run() { - while (true) { - lua_settop(L, 0); - try { - if (!readCommand()) { - return; - } - int result = call(L, 0, true); - if (result != 0) { - throw std::runtime_error(getErrorMessage()); - } - - // Clear the previous results - for (int i = 0; i < previousNumberOfReturnArguments; ++i) { - lua_pushnil(L); - lua_setglobal(L, ("_" + boost::lexical_cast<std::string>(i+1)).c_str()); - } - - // Store the results - for (int i = 0; i < lua_gettop(L); ++i) { - lua_pushvalue(L, i+1); - lua_setglobal(L, ("_" + boost::lexical_cast<std::string>(i+1)).c_str()); - } - previousNumberOfReturnArguments = lua_gettop(L); - - // Print results - if (lua_gettop(L) > 0) { - lua_getglobal(L, "print"); - lua_insert(L, 1); - if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0) { - throw std::runtime_error("Error calling 'print': " + getErrorMessage()); - } - } - } - catch (const std::exception& e) { - terminal->printError(e.what()); - } - } + while (true) { + lua_settop(L, 0); + try { + if (!readCommand()) { + return; + } + int result = call(L, 0, true); + if (result != 0) { + throw std::runtime_error(getErrorMessage()); + } + + // Clear the previous results + for (int i = 0; i < previousNumberOfReturnArguments; ++i) { + lua_pushnil(L); + lua_setglobal(L, ("_" + boost::lexical_cast<std::string>(i+1)).c_str()); + } + + // Store the results + for (int i = 0; i < lua_gettop(L); ++i) { + lua_pushvalue(L, i+1); + lua_setglobal(L, ("_" + boost::lexical_cast<std::string>(i+1)).c_str()); + } + previousNumberOfReturnArguments = lua_gettop(L); + + // Print results + if (lua_gettop(L) > 0) { + lua_getglobal(L, "print"); + lua_insert(L, 1); + if (lua_pcall(L, lua_gettop(L)-1, 0, 0) != 0) { + throw std::runtime_error("Error calling 'print': " + getErrorMessage()); + } + } + } + catch (const std::exception& e) { + terminal->printError(e.what()); + } + } } int Console::tryLoadCommand(const std::string& originalCommand) { - std::string command = originalCommand; + std::string command = originalCommand; - // Replace '=' by 'return' (for compatibility with Lua console) - if (boost::algorithm::starts_with(command, "=")) { - command = "return " + command.substr(1); - } + // Replace '=' by 'return' (for compatibility with Lua console) + if (boost::algorithm::starts_with(command, "=")) { + command = "return " + command.substr(1); + } - std::string commandAsExpression = "return " + command; + std::string commandAsExpression = "return " + command; - // Try to load the command as an expression - if (luaL_loadbuffer(L, commandAsExpression.c_str(), commandAsExpression.size(), "=stdin") == 0) { - return 0; - } - lua_pop(L, 1); + // Try to load the command as an expression + if (luaL_loadbuffer(L, commandAsExpression.c_str(), commandAsExpression.size(), "=stdin") == 0) { + return 0; + } + lua_pop(L, 1); - // Try to load the command as a regular command - return luaL_loadbuffer(L, command.c_str(), command.size(), "=stdin"); + // Try to load the command as a regular command + return luaL_loadbuffer(L, command.c_str(), command.size(), "=stdin"); } bool Console::readCommand() { - boost::optional<std::string> line = terminal->readLine(getPrompt(true)); - if (!line) { - return false; - } - std::string command = *line; - while (true) { - int result = tryLoadCommand(command); - - // Check if we need to read more - if (result == LUA_ERRSYNTAX) { - std::string errorMessage(lua_tostring(L, -1)); - if (boost::algorithm::ends_with(errorMessage, "'<eof>'")) { - lua_pop(L, 1); - - // Read another line - boost::optional<std::string> line = terminal->readLine(getPrompt(false)); - if (!line) { - return false; - } - command = command + "\n" + *line; - continue; - } - } - if (!command.empty()) { - terminal->addToHistory(command); - } - if (result != 0) { - throw std::runtime_error(getErrorMessage()); - } - return true; - } + boost::optional<std::string> line = terminal->readLine(getPrompt(true)); + if (!line) { + return false; + } + std::string command = *line; + while (true) { + int result = tryLoadCommand(command); + + // Check if we need to read more + if (result == LUA_ERRSYNTAX) { + std::string errorMessage(lua_tostring(L, -1)); + if (boost::algorithm::ends_with(errorMessage, "'<eof>'")) { + lua_pop(L, 1); + + // Read another line + boost::optional<std::string> line = terminal->readLine(getPrompt(false)); + if (!line) { + return false; + } + command = command + "\n" + *line; + continue; + } + } + if (!command.empty()) { + terminal->addToHistory(command); + } + if (result != 0) { + throw std::runtime_error(getErrorMessage()); + } + return true; + } } std::string Console::getErrorMessage() const { - if (lua_isnil(L, -1)) { - return "<null error>"; - } - const char* errorMessage = lua_tostring(L, -1); - return errorMessage ? errorMessage : "<error is not a string>"; + if (lua_isnil(L, -1)) { + return "<null error>"; + } + const char* errorMessage = lua_tostring(L, -1); + return errorMessage ? errorMessage : "<error is not a string>"; } int Console::call(lua_State* L, int numberOfArguments, bool keepResult) { - // Put traceback function on stack below call - int tracebackIndex = lua_gettop(L) - numberOfArguments; - lua_pushcfunction(L, traceback); - lua_insert(L, tracebackIndex); + // Put traceback function on stack below call + int tracebackIndex = lua_gettop(L) - numberOfArguments; + lua_pushcfunction(L, traceback); + lua_insert(L, tracebackIndex); - int result = lua_pcall(L, numberOfArguments, keepResult ? LUA_MULTRET : 0, tracebackIndex); + int result = lua_pcall(L, numberOfArguments, keepResult ? LUA_MULTRET : 0, tracebackIndex); - // Remove traceback - lua_remove(L, tracebackIndex); + // Remove traceback + lua_remove(L, tracebackIndex); - return result; + return result; } std::string Console::getPrompt(bool firstLine) const { - lua_getglobal(L,firstLine ? "_PROMPT" : "_PROMPT2"); - const char* rawPrompt = lua_tostring(L, -1); - std::string prompt; - if (rawPrompt) { - prompt = std::string(rawPrompt); - } - else { - prompt = firstLine ? "> " : ">> "; - } - lua_pop(L, 1); - return prompt; + lua_getglobal(L,firstLine ? "_PROMPT" : "_PROMPT2"); + const char* rawPrompt = lua_tostring(L, -1); + std::string prompt; + if (rawPrompt) { + prompt = std::string(rawPrompt); + } + else { + prompt = firstLine ? "> " : ">> "; + } + lua_pop(L, 1); + return prompt; } static void addMatchingTableKeys(lua_State* L, const std::string& match, std::vector<std::string>& result) { - for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { - const char* rawKey = lua_tostring(L, -2); - if (rawKey) { - std::string key(rawKey); - if (boost::starts_with(key, match) && !(match == "" && boost::starts_with(key, "_"))) { - result.push_back(key); - } - } - } + for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { + const char* rawKey = lua_tostring(L, -2); + if (rawKey) { + std::string key(rawKey); + if (boost::starts_with(key, match) && !(match == "" && boost::starts_with(key, "_"))) { + result.push_back(key); + } + } + } } static void addMatchingTableValues(lua_State* L, const std::string& match, std::vector<std::string>& result) { - for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { - const char* rawValue = lua_tostring(L, -1); - if (rawValue) { - std::string key(rawValue); - if (boost::starts_with(key, match) && !(match == "" && boost::starts_with(key, "_"))) { - result.push_back(key); - } - } - } + for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { + const char* rawValue = lua_tostring(L, -1); + if (rawValue) { + std::string key(rawValue); + if (boost::starts_with(key, match) && !(match == "" && boost::starts_with(key, "_"))) { + result.push_back(key); + } + } + } } std::vector<std::string> Console::getCompletions(const std::string& input, int start, int end) { - std::string prefix = input.substr(boost::numeric_cast<size_t>(start), boost::numeric_cast<size_t>(end - start)); - - std::vector<std::string> tokens; - if (end) { - tokens = Lua::tokenize(input.substr(0, boost::numeric_cast<size_t>(end))); - } - - // Don't autocomplete strings - if (!tokens.empty() && ((*tokens.rbegin())[0] == '\'' || (*tokens.rbegin())[0] == '"')) { - return std::vector<std::string>(); - } - - std::vector<std::string> context; - for (std::vector<std::string>::reverse_iterator i = tokens.rbegin(); i != tokens.rend(); ++i) { - if (std::isalpha((*i)[0]) || (*i)[0] == '_') { - if (i != tokens.rbegin()) { - context.push_back(*i); - } - } - else if (*i != "." && *i != ":") { - break; - } - } - - // Drill into context - int top = lua_gettop(L); - lua_pushglobaltable(L); - for (std::vector<std::string>::reverse_iterator i = context.rbegin(); i != context.rend(); ++i) { - if (lua_istable(L, -1) || lua_isuserdata(L, -1)) { - lua_getfield(L, -1, i->c_str()); - if (!lua_isnil(L, 1)) { - continue; - } - } - lua_settop(L, top); - return std::vector<std::string>(); - } - - // Collect all keys from the table - std::vector<std::string> result; - if (lua_istable(L, -1)) { - addMatchingTableKeys(L, prefix, result); - } - - // Collect all keys from the metatable - if (lua_getmetatable(L, -1)) { - lua_getfield(L, -1, "__index"); - if (lua_istable(L, -1)) { - addMatchingTableKeys(L, prefix, result); - } - lua_pop(L, 1); - - lua_getfield(L, -1, "_completions"); - if (lua_isfunction(L, -1)) { - lua_pushvalue(L, -3); - if (lua_pcall(L, 1, 1, 0) != 0) { - throw std::runtime_error("Error calling '_completions': " + getErrorMessage()); - } - } - if (lua_istable(L, -1)) { - addMatchingTableValues(L, prefix, result); - } - lua_pop(L, 2); - } - - lua_settop(L, top); - - return result; + std::string prefix = input.substr(boost::numeric_cast<size_t>(start), boost::numeric_cast<size_t>(end - start)); + + std::vector<std::string> tokens; + if (end) { + tokens = Lua::tokenize(input.substr(0, boost::numeric_cast<size_t>(end))); + } + + // Don't autocomplete strings + if (!tokens.empty() && ((*tokens.rbegin())[0] == '\'' || (*tokens.rbegin())[0] == '"')) { + return std::vector<std::string>(); + } + + std::vector<std::string> context; + for (std::vector<std::string>::reverse_iterator i = tokens.rbegin(); i != tokens.rend(); ++i) { + if (std::isalpha((*i)[0]) || (*i)[0] == '_') { + if (i != tokens.rbegin()) { + context.push_back(*i); + } + } + else if (*i != "." && *i != ":") { + break; + } + } + + // Drill into context + int top = lua_gettop(L); + lua_pushglobaltable(L); + for (std::vector<std::string>::reverse_iterator i = context.rbegin(); i != context.rend(); ++i) { + if (lua_istable(L, -1) || lua_isuserdata(L, -1)) { + lua_getfield(L, -1, i->c_str()); + if (!lua_isnil(L, 1)) { + continue; + } + } + lua_settop(L, top); + return std::vector<std::string>(); + } + + // Collect all keys from the table + std::vector<std::string> result; + if (lua_istable(L, -1)) { + addMatchingTableKeys(L, prefix, result); + } + + // Collect all keys from the metatable + if (lua_getmetatable(L, -1)) { + lua_getfield(L, -1, "__index"); + if (lua_istable(L, -1)) { + addMatchingTableKeys(L, prefix, result); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "_completions"); + if (lua_isfunction(L, -1)) { + lua_pushvalue(L, -3); + if (lua_pcall(L, 1, 1, 0) != 0) { + throw std::runtime_error("Error calling '_completions': " + getErrorMessage()); + } + } + if (lua_istable(L, -1)) { + addMatchingTableValues(L, prefix, result); + } + lua_pop(L, 2); + } + + lua_settop(L, top); + + return result; } diff --git a/Sluift/Console.h b/Sluift/Console.h index b53a167..6ed6f58 100644 --- a/Sluift/Console.h +++ b/Sluift/Console.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,35 +7,38 @@ #pragma once #include <string> + #include <boost/optional/optional.hpp> -#include <Sluift/Completer.h> + #include <Swiften/Base/Override.h> +#include <Sluift/Completer.h> + struct lua_State; namespace Swift { - class Terminal; + class Terminal; - class Console : public Completer { - public: - Console(lua_State* L, Terminal* terminal); - virtual ~Console(); + class Console : public Completer { + public: + Console(lua_State* L, Terminal* terminal); + virtual ~Console(); - void run(); + void run(); - static int call(lua_State* L, int numberOfArguments, bool keepResult); + static int call(lua_State* L, int numberOfArguments, bool keepResult); - private: - std::string getPrompt(bool firstLine) const; - std::string getErrorMessage() const; - bool readCommand(); - int tryLoadCommand(const std::string& command); + private: + std::string getPrompt(bool firstLine) const; + std::string getErrorMessage() const; + bool readCommand(); + int tryLoadCommand(const std::string& command); - virtual std::vector<std::string> getCompletions(const std::string&, int start, int end) SWIFTEN_OVERRIDE; + virtual std::vector<std::string> getCompletions(const std::string&, int start, int end) SWIFTEN_OVERRIDE; - private: - lua_State* L; - Terminal* terminal; - int previousNumberOfReturnArguments; - }; + private: + lua_State* L; + Terminal* terminal; + int previousNumberOfReturnArguments; + }; } diff --git a/Sluift/EditlineTerminal.cpp b/Sluift/EditlineTerminal.cpp index 8d1aac8..206ced6 100644 --- a/Sluift/EditlineTerminal.cpp +++ b/Sluift/EditlineTerminal.cpp @@ -1,78 +1,81 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/EditlineTerminal.h> -#include <boost/optional.hpp> -#include <iostream> -#include <editline/readline.h> -#include <boost/numeric/conversion/cast.hpp> #include <cassert> -#include <vector> #include <cstring> +#include <iostream> +#include <vector> + +#include <boost/numeric/conversion/cast.hpp> +#include <boost/optional.hpp> + +#include <editline/readline.h> #include <Swiften/Base/Platform.h> + #include <Sluift/Completer.h> using namespace Swift; -static EditlineTerminal* globalInstance = NULL; +static EditlineTerminal* globalInstance = nullptr; static int completionStart = -1; static int completionEnd = -1; -#if defined(SWIFTEN_PLATFORM_WINDOWS) +#if defined(SWIFTEN_PLATFORM_WINDOWS) static char* getEmptyCompletions(const char*, int) { #else static int getEmptyCompletions(const char*, int) { #endif - return 0; + return 0; } static char* getCompletions(const char*, int state) { - rl_completion_append_character = 0; + rl_completion_append_character = 0; #if RL_READLINE_VERSION >= 0x0600 - rl_completion_suppress_append = 1; + rl_completion_suppress_append = 1; #endif - static std::vector<std::string> completions; - if (state == 0) { - assert(globalInstance); - completions.clear(); - if (globalInstance->getCompleter()) { - completions = globalInstance->getCompleter()->getCompletions(rl_line_buffer, completionStart, completionEnd); - } - } - if (boost::numeric_cast<size_t>(state) >= completions.size()) { - return 0; - } - return strdup(completions[boost::numeric_cast<size_t>(state)].c_str()); + static std::vector<std::string> completions; + if (state == 0) { + assert(globalInstance); + completions.clear(); + if (globalInstance->getCompleter()) { + completions = globalInstance->getCompleter()->getCompletions(rl_line_buffer, completionStart, completionEnd); + } + } + if (boost::numeric_cast<size_t>(state) >= completions.size()) { + return nullptr; + } + return strdup(completions[boost::numeric_cast<size_t>(state)].c_str()); } static char** getAttemptedCompletions(const char* text, int start, int end) { - completionStart = start; - completionEnd = end; - return rl_completion_matches(text, getCompletions); + completionStart = start; + completionEnd = end; + return rl_completion_matches(text, getCompletions); } EditlineTerminal& EditlineTerminal::getInstance() { - static EditlineTerminal instance; - globalInstance = &instance; - return instance; + static EditlineTerminal instance; + globalInstance = &instance; + return instance; } EditlineTerminal::EditlineTerminal() { - rl_attempted_completion_function = getAttemptedCompletions; - rl_completion_entry_function = getEmptyCompletions; // Fallback. Do nothing. + rl_attempted_completion_function = getAttemptedCompletions; + rl_completion_entry_function = getEmptyCompletions; // Fallback. Do nothing. #if defined(SWIFTEN_PLATFORM_WINDOWS) - // rl_basic_word_break is a cons char[] in MinGWEditLine. - // This one seems to work, although it doesn't on OS X for some reason. - rl_completer_word_break_characters = strdup(" \t\n.:+-*/><=;|&()[]{}"); + // rl_basic_word_break is a cons char[] in MinGWEditLine. + // This one seems to work, although it doesn't on OS X for some reason. + rl_completer_word_break_characters = strdup(" \t\n.:+-*/><=;|&()[]{}"); #else - rl_basic_word_break_characters = strdup(" \t\n.:+-*/><=;|&()[]{}"); + rl_basic_word_break_characters = strdup(" \t\n.:+-*/><=;|&()[]{}"); #endif } @@ -80,19 +83,19 @@ EditlineTerminal::~EditlineTerminal() { } void EditlineTerminal::printError(const std::string& message) { - std::cout << message << std::endl; + std::cout << message << std::endl; } boost::optional<std::string> EditlineTerminal::readLine(const std::string& prompt) { - const char* line = readline(prompt.c_str()); - return line ? std::string(line) : boost::optional<std::string>(); + const char* line = readline(prompt.c_str()); + return line ? std::string(line) : boost::optional<std::string>(); } void EditlineTerminal::addToHistory(const std::string& line) { #if defined(SWIFTEN_PLATFORM_WINDOWS) - // MinGWEditLine copies the string, so this is safe - add_history(const_cast<char*>(line.c_str())); + // MinGWEditLine copies the string, so this is safe + add_history(const_cast<char*>(line.c_str())); #else - add_history(line.c_str()); + add_history(line.c_str()); #endif } diff --git a/Sluift/EditlineTerminal.h b/Sluift/EditlineTerminal.h index 3608096..ec4cf63 100644 --- a/Sluift/EditlineTerminal.h +++ b/Sluift/EditlineTerminal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,19 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> + #include <Sluift/Terminal.h> namespace Swift { - class EditlineTerminal : public Terminal { - public: - static EditlineTerminal& getInstance(); + class EditlineTerminal : public Terminal { + public: + static EditlineTerminal& getInstance(); - private: - EditlineTerminal(); - virtual ~EditlineTerminal(); + private: + EditlineTerminal(); + virtual ~EditlineTerminal(); - virtual boost::optional<std::string> readLine(const std::string& prompt) SWIFTEN_OVERRIDE; - virtual void printError(const std::string& message) SWIFTEN_OVERRIDE; - virtual void addToHistory(const std::string& command) SWIFTEN_OVERRIDE; - }; + virtual boost::optional<std::string> readLine(const std::string& prompt) SWIFTEN_OVERRIDE; + virtual void printError(const std::string& message) SWIFTEN_OVERRIDE; + virtual void addToHistory(const std::string& command) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/BodyConvertor.cpp b/Sluift/ElementConvertors/BodyConvertor.cpp index 35f1a72..f6797b0 100644 --- a/Sluift/ElementConvertors/BodyConvertor.cpp +++ b/Sluift/ElementConvertors/BodyConvertor.cpp @@ -1,13 +1,15 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/BodyConvertor.h> +#include <memory> + #include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> + #include <Sluift/Lua/LuaUtils.h> using namespace Swift; @@ -18,18 +20,18 @@ BodyConvertor::BodyConvertor() : GenericLuaElementConvertor<Body>("body") { BodyConvertor::~BodyConvertor() { } -boost::shared_ptr<Body> BodyConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<Body> result = boost::make_shared<Body>(); - if (boost::optional<std::string> value = Lua::getStringField(L, -1, "text")) { - result->setText(*value); - } - return result; +std::shared_ptr<Body> BodyConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<Body> result = std::make_shared<Body>(); + if (boost::optional<std::string> value = Lua::getStringField(L, -1, "text")) { + result->setText(*value); + } + return result; } -void BodyConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<Body> payload) { - lua_createtable(L, 0, 0); - if (!payload->getText().empty()) { - lua_pushstring(L, payload->getText().c_str()); - lua_setfield(L, -2, "text"); - } +void BodyConvertor::doConvertToLua(lua_State* L, std::shared_ptr<Body> payload) { + lua_createtable(L, 0, 0); + if (!payload->getText().empty()) { + lua_pushstring(L, payload->getText().c_str()); + lua_setfield(L, -2, "text"); + } } diff --git a/Sluift/ElementConvertors/BodyConvertor.h b/Sluift/ElementConvertors/BodyConvertor.h index c9d922b..64ff4d0 100644 --- a/Sluift/ElementConvertors/BodyConvertor.h +++ b/Sluift/ElementConvertors/BodyConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,19 +7,19 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/Body.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/Body.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class BodyConvertor : public GenericLuaElementConvertor<Body> { - public: - BodyConvertor(); - virtual ~BodyConvertor(); + class BodyConvertor : public GenericLuaElementConvertor<Body> { + public: + BodyConvertor(); + virtual ~BodyConvertor(); - virtual boost::shared_ptr<Body> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<Body>) SWIFTEN_OVERRIDE; - }; + virtual std::shared_ptr<Body> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<Body>) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/CarbonsReceivedConvertor.cpp b/Sluift/ElementConvertors/CarbonsReceivedConvertor.cpp new file mode 100644 index 0000000..cfd55f3 --- /dev/null +++ b/Sluift/ElementConvertors/CarbonsReceivedConvertor.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2016 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ + +#include <Sluift/ElementConvertors/CarbonsReceivedConvertor.h> + +#include <memory> +#include <lua.hpp> + +#include <Swiften/Elements/Forwarded.h> + +#include <Sluift/LuaElementConvertors.h> + +using namespace Swift; + +CarbonsReceivedConvertor::CarbonsReceivedConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<CarbonsReceived>("carbons_received"), + convertors(convertors) { +} + +CarbonsReceivedConvertor::~CarbonsReceivedConvertor() { +} + +std::shared_ptr<CarbonsReceived> CarbonsReceivedConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<CarbonsReceived> result = std::make_shared<CarbonsReceived>(); + lua_getfield(L, -1, "payload"); + if (!lua_isnil(L, -1)) { + std::shared_ptr<Forwarded> payload = std::dynamic_pointer_cast<Forwarded>(convertors->convertFromLuaUntyped(L, -1, "payload")); + if (!!payload) { + result->setForwarded(payload); + } + } + lua_pop(L, 1); + return result; +} + +void CarbonsReceivedConvertor::doConvertToLua(lua_State* L, std::shared_ptr<CarbonsReceived> payload) { + lua_createtable(L, 0, 0); + if (convertors->convertToLuaUntyped(L, payload->getForwarded()) > 0) { + lua_setfield(L, -2, "payload"); + + } +} + +boost::optional<LuaElementConvertor::Documentation> CarbonsReceivedConvertor::getDocumentation() const { + return Documentation( + "CarbonsReceived", + "This table has the following fields:\n\n" + "- `payload`: @{Forwarded}\n" + ); +} diff --git a/Sluift/ElementConvertors/CarbonsReceivedConvertor.h b/Sluift/ElementConvertors/CarbonsReceivedConvertor.h new file mode 100644 index 0000000..f18f699 --- /dev/null +++ b/Sluift/ElementConvertors/CarbonsReceivedConvertor.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2016 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ + +#pragma once + +#include <Swiften/Base/Override.h> +#include <Swiften/Elements/CarbonsReceived.h> + +#include <Sluift/GenericLuaElementConvertor.h> + +namespace Swift { + class LuaElementConvertors; + + class CarbonsReceivedConvertor : public GenericLuaElementConvertor<CarbonsReceived> { + public: + CarbonsReceivedConvertor(LuaElementConvertors* convertors); + virtual ~CarbonsReceivedConvertor(); + + virtual std::shared_ptr<CarbonsReceived> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<CarbonsReceived>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + + private: + LuaElementConvertors* convertors; + }; +} + diff --git a/Sluift/ElementConvertors/CarbonsSentConvertor.cpp b/Sluift/ElementConvertors/CarbonsSentConvertor.cpp new file mode 100644 index 0000000..45851d2 --- /dev/null +++ b/Sluift/ElementConvertors/CarbonsSentConvertor.cpp @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2016 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ + +#include <Sluift/ElementConvertors/CarbonsSentConvertor.h> + +#include <memory> +#include <lua.hpp> + +#include <Swiften/Elements/Forwarded.h> + +#include <Sluift/LuaElementConvertors.h> + +using namespace Swift; + +CarbonsSentConvertor::CarbonsSentConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<CarbonsSent>("carbons_sent"), + convertors(convertors) { +} + +CarbonsSentConvertor::~CarbonsSentConvertor() { +} + +std::shared_ptr<CarbonsSent> CarbonsSentConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<CarbonsSent> result = std::make_shared<CarbonsSent>(); + lua_getfield(L, -1, "payload"); + if (!lua_isnil(L, -1)) { + std::shared_ptr<Forwarded> payload = std::dynamic_pointer_cast<Forwarded>(convertors->convertFromLuaUntyped(L, -1, "payload")); + if (!!payload) { + result->setForwarded(payload); + } + } + lua_pop(L, 1); + return result; +} + +void CarbonsSentConvertor::doConvertToLua(lua_State* L, std::shared_ptr<CarbonsSent> payload) { + lua_createtable(L, 0, 0); + if (convertors->convertToLuaUntyped(L, payload->getForwarded()) > 0) { + lua_setfield(L, -2, "payload"); + } +} + +boost::optional<LuaElementConvertor::Documentation> CarbonsSentConvertor::getDocumentation() const { + return Documentation( + "CarbonsSent", + "This table has the following fields:\n\n" + "- `payload`: @{Forwarded}\n" + ); +} diff --git a/Sluift/ElementConvertors/CarbonsSentConvertor.h b/Sluift/ElementConvertors/CarbonsSentConvertor.h new file mode 100644 index 0000000..a36a6a8 --- /dev/null +++ b/Sluift/ElementConvertors/CarbonsSentConvertor.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2016 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ + +#pragma once + +#include <Swiften/Base/Override.h> +#include <Swiften/Elements/CarbonsSent.h> + +#include <Sluift/GenericLuaElementConvertor.h> + +namespace Swift { + class LuaElementConvertors; + + class CarbonsSentConvertor : public GenericLuaElementConvertor<CarbonsSent> { + public: + CarbonsSentConvertor(LuaElementConvertors* convertors); + virtual ~CarbonsSentConvertor(); + + virtual std::shared_ptr<CarbonsSent> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<CarbonsSent>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + + private: + LuaElementConvertors* convertors; + }; +} + diff --git a/Sluift/ElementConvertors/CommandConvertor.cpp b/Sluift/ElementConvertors/CommandConvertor.cpp index c9fc952..de7a439 100644 --- a/Sluift/ElementConvertors/CommandConvertor.cpp +++ b/Sluift/ElementConvertors/CommandConvertor.cpp @@ -1,16 +1,17 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/CommandConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Swiften/Base/foreach.h> +#include <lua.hpp> + #include <Sluift/Lua/Check.h> #include <Sluift/Lua/Value.h> #include <Sluift/LuaElementConvertors.h> @@ -18,179 +19,177 @@ using namespace Swift; static Command::Action convertActionFromString(const std::string& action) { - if (action == "cancel") { return Command::Cancel; } - else if (action == "execute") { return Command::Execute; } - else if (action == "complete") { return Command::Complete; } - else if (action == "prev") { return Command::Prev; } - else if (action == "next") { return Command::Next; } - return Command::NoAction; + if (action == "cancel") { return Command::Cancel; } + else if (action == "execute") { return Command::Execute; } + else if (action == "complete") { return Command::Complete; } + else if (action == "prev") { return Command::Prev; } + else if (action == "next") { return Command::Next; } + return Command::NoAction; } static std::string convertActionToString(Command::Action action) { - switch (action) { - case Command::Cancel: return "cancel"; - case Command::Execute: return "execute"; - case Command::Complete: return "complete"; - case Command::Prev: return "prev"; - case Command::Next: return "next"; - case Command::NoAction: assert(false); return ""; - } - assert(false); - return ""; + switch (action) { + case Command::Cancel: return "cancel"; + case Command::Execute: return "execute"; + case Command::Complete: return "complete"; + case Command::Prev: return "prev"; + case Command::Next: return "next"; + case Command::NoAction: assert(false); return ""; + } + assert(false); + return ""; } -CommandConvertor::CommandConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<Command>("command"), - convertors(convertors) { +CommandConvertor::CommandConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<Command>("command"), + convertors(convertors) { } CommandConvertor::~CommandConvertor() { } -boost::shared_ptr<Command> CommandConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<Command> result = boost::make_shared<Command>(); - - lua_getfield(L, -1, "node"); - if (!lua_isnil(L, -1)) { - result->setNode(std::string(Lua::checkString(L, -1))); - } - lua_pop(L, 1); - - lua_getfield(L, -1, "session_id"); - if (!lua_isnil(L, -1)) { - result->setSessionID(std::string(Lua::checkString(L, -1))); - } - lua_pop(L, 1); - - lua_getfield(L, -1, "status"); - if (!lua_isnil(L, -1)) { - std::string statusText = Lua::checkString(L, -1); - Command::Status status = Command::NoStatus; - if (statusText == "executing") { status = Command::Executing; } - else if (statusText == "completed") { status = Command::Completed; } - else if (statusText == "canceled") { status = Command::Canceled; } - result->setStatus(status); - } - lua_pop(L, 1); - - lua_getfield(L, -1, "action"); - if (!lua_isnil(L, -1)) { - result->setAction(convertActionFromString(Lua::checkString(L, -1))); - } - lua_pop(L, 1); - - lua_getfield(L, -1, "execute_action"); - if (!lua_isnil(L, -1)) { - result->setExecuteAction(convertActionFromString(Lua::checkString(L, -1))); - } - lua_pop(L, 1); - - lua_getfield(L, -1, "available_actions"); - if (!lua_isnil(L, -1)) { - Lua::checkType(L, -1, LUA_TTABLE); - lua_pushnil(L); - for (lua_pushnil(L); lua_next(L, -2) != 0; ) { - result->addAvailableAction(convertActionFromString(Lua::checkString(L, -1))); - lua_pop(L, 1); - } - } - lua_pop(L, 1); - - lua_getfield(L, -1, "notes"); - if (!lua_isnil(L, -1)) { - Lua::checkType(L, -1, LUA_TTABLE); - lua_pushnil(L); - for (lua_pushnil(L); lua_next(L, -2) != 0; ) { - Lua::checkType(L, -1, LUA_TTABLE); - std::string note; - lua_getfield(L, -1, "note"); - if (!lua_isnil(L, -1)) { - note = Lua::checkString(L, -1); - } - lua_pop(L, 1); - - Command::Note::Type noteType = Command::Note::Info; - lua_getfield(L, -1, "type"); - if (!lua_isnil(L, -1)) { - std::string type = Lua::checkString(L, -1); - if (type == "info") { noteType = Command::Note::Info; } - else if (type == "warn") { noteType = Command::Note::Warn; } - else if (type == "error") { noteType = Command::Note::Error; } - } - lua_pop(L, 1); - - result->addNote(Command::Note(note, noteType)); - lua_pop(L, 1); - } - } - lua_pop(L, 1); - - lua_getfield(L, -1, "form"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<Form> form = boost::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { - result->setForm(form); - } - } - lua_pop(L, 1); - - return result; +std::shared_ptr<Command> CommandConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<Command> result = std::make_shared<Command>(); + + lua_getfield(L, -1, "node"); + if (!lua_isnil(L, -1)) { + result->setNode(std::string(Lua::checkString(L, -1))); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "session_id"); + if (!lua_isnil(L, -1)) { + result->setSessionID(std::string(Lua::checkString(L, -1))); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "status"); + if (!lua_isnil(L, -1)) { + std::string statusText = Lua::checkString(L, -1); + Command::Status status = Command::NoStatus; + if (statusText == "executing") { status = Command::Executing; } + else if (statusText == "completed") { status = Command::Completed; } + else if (statusText == "canceled") { status = Command::Canceled; } + result->setStatus(status); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "action"); + if (!lua_isnil(L, -1)) { + result->setAction(convertActionFromString(Lua::checkString(L, -1))); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "execute_action"); + if (!lua_isnil(L, -1)) { + result->setExecuteAction(convertActionFromString(Lua::checkString(L, -1))); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "available_actions"); + if (!lua_isnil(L, -1)) { + Lua::checkType(L, -1, LUA_TTABLE); + for (lua_pushnil(L); lua_next(L, -2) != 0; ) { + result->addAvailableAction(convertActionFromString(Lua::checkString(L, -1))); + lua_pop(L, 1); + } + } + lua_pop(L, 1); + + lua_getfield(L, -1, "notes"); + if (!lua_isnil(L, -1)) { + Lua::checkType(L, -1, LUA_TTABLE); + for (lua_pushnil(L); lua_next(L, -2) != 0; ) { + Lua::checkType(L, -1, LUA_TTABLE); + std::string note; + lua_getfield(L, -1, "note"); + if (!lua_isnil(L, -1)) { + note = Lua::checkString(L, -1); + } + lua_pop(L, 1); + + Command::Note::Type noteType = Command::Note::Info; + lua_getfield(L, -1, "type"); + if (!lua_isnil(L, -1)) { + std::string type = Lua::checkString(L, -1); + if (type == "info") { noteType = Command::Note::Info; } + else if (type == "warn") { noteType = Command::Note::Warn; } + else if (type == "error") { noteType = Command::Note::Error; } + } + lua_pop(L, 1); + + result->addNote(Command::Note(note, noteType)); + lua_pop(L, 1); + } + } + lua_pop(L, 1); + + lua_getfield(L, -1, "form"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<Form> form = std::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { + result->setForm(form); + } + } + lua_pop(L, 1); + + return result; } -void CommandConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<Command> payload) { - Lua::Table result; - if (!payload->getNode().empty()) { - result["node"] = Lua::valueRef(payload->getNode()); - } - if (!payload->getSessionID().empty()) { - result["session_id"] = Lua::valueRef(payload->getSessionID()); - } - switch (payload->getStatus()) { - case Command::Executing: result["status"] = Lua::valueRef("executing"); break; - case Command::Completed: result["status"] = Lua::valueRef("completed"); break; - case Command::Canceled: result["status"] = Lua::valueRef("canceled"); break; - case Command::NoStatus: break; - } - - if (!payload->getNotes().empty()) { - std::vector<Lua::Value> notes; - foreach (const Command::Note& note, payload->getNotes()) { - Lua::Table noteTable; - if (!note.note.empty()) { - noteTable["note"] = Lua::valueRef(note.note); - } - switch (note.type) { - case Command::Note::Info: noteTable["type"] = Lua::valueRef("info"); break; - case Command::Note::Warn: noteTable["type"] = Lua::valueRef("warn"); break; - case Command::Note::Error: noteTable["type"] = Lua::valueRef("error"); break; - } - notes.push_back(noteTable); - } - result["notes"] = Lua::valueRef(notes); - } - - if (payload->getAction() != Command::NoAction) { - result["action"] = Lua::valueRef(convertActionToString(payload->getAction())); - } - - if (payload->getExecuteAction() != Command::NoAction) { - result["execute_action"] = Lua::valueRef(convertActionToString(payload->getAction())); - } - - if (!payload->getAvailableActions().empty()) { - std::vector<Lua::Value> availableActions; - foreach (const Command::Action& action, payload->getAvailableActions()) { - if (action != Command::NoAction) { - availableActions.push_back(convertActionToString(action)); - } - } - result["available_actions"] = Lua::valueRef(availableActions); - } - - Lua::pushValue(L, result); - - if (payload->getForm()) { - bool result = convertors->convertToLuaUntyped(L, payload->getForm()); - assert(result); - lua_setfield(L, -2, "form"); - } +void CommandConvertor::doConvertToLua(lua_State* L, std::shared_ptr<Command> payload) { + Lua::Table result; + if (!payload->getNode().empty()) { + result["node"] = Lua::valueRef(payload->getNode()); + } + if (!payload->getSessionID().empty()) { + result["session_id"] = Lua::valueRef(payload->getSessionID()); + } + switch (payload->getStatus()) { + case Command::Executing: result["status"] = Lua::valueRef("executing"); break; + case Command::Completed: result["status"] = Lua::valueRef("completed"); break; + case Command::Canceled: result["status"] = Lua::valueRef("canceled"); break; + case Command::NoStatus: break; + } + + if (!payload->getNotes().empty()) { + std::vector<Lua::Value> notes; + for (const auto& note : payload->getNotes()) { + Lua::Table noteTable; + if (!note.note.empty()) { + noteTable["note"] = Lua::valueRef(note.note); + } + switch (note.type) { + case Command::Note::Info: noteTable["type"] = Lua::valueRef("info"); break; + case Command::Note::Warn: noteTable["type"] = Lua::valueRef("warn"); break; + case Command::Note::Error: noteTable["type"] = Lua::valueRef("error"); break; + } + notes.push_back(noteTable); + } + result["notes"] = Lua::valueRef(notes); + } + + if (payload->getAction() != Command::NoAction) { + result["action"] = Lua::valueRef(convertActionToString(payload->getAction())); + } + + if (payload->getExecuteAction() != Command::NoAction) { + result["execute_action"] = Lua::valueRef(convertActionToString(payload->getAction())); + } + + if (!payload->getAvailableActions().empty()) { + std::vector<Lua::Value> availableActions; + for (const auto& action : payload->getAvailableActions()) { + if (action != Command::NoAction) { + availableActions.push_back(convertActionToString(action)); + } + } + result["available_actions"] = Lua::valueRef(availableActions); + } + + Lua::pushValue(L, result); + + if (payload->getForm()) { + bool result = convertors->convertToLuaUntyped(L, payload->getForm()); + assert(result); + lua_setfield(L, -2, "form"); + } } diff --git a/Sluift/ElementConvertors/CommandConvertor.h b/Sluift/ElementConvertors/CommandConvertor.h index 868fe5e..1b0d481 100644 --- a/Sluift/ElementConvertors/CommandConvertor.h +++ b/Sluift/ElementConvertors/CommandConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,22 +7,22 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/Command.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/Command.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class CommandConvertor : public GenericLuaElementConvertor<Command> { - public: - CommandConvertor(LuaElementConvertors* convertors); - virtual ~CommandConvertor(); + class CommandConvertor : public GenericLuaElementConvertor<Command> { + public: + CommandConvertor(LuaElementConvertors* convertors); + virtual ~CommandConvertor(); - virtual boost::shared_ptr<Command> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<Command>) SWIFTEN_OVERRIDE; + virtual std::shared_ptr<Command> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<Command>) SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/DOMElementConvertor.cpp b/Sluift/ElementConvertors/DOMElementConvertor.cpp index 6ed214d..b957686 100644 --- a/Sluift/ElementConvertors/DOMElementConvertor.cpp +++ b/Sluift/ElementConvertors/DOMElementConvertor.cpp @@ -1,159 +1,159 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/DOMElementConvertor.h> -#include <iostream> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <lua.hpp> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/RawXMLPayload.h> -#include <Swiften/Serializer/PayloadSerializer.h> -#include <Sluift/Lua/Check.h> -#include <Sluift/Lua/LuaUtils.h> -#include <Swiften/Parser/XMLParserClient.h> -#include <Swiften/Parser/XMLParser.h> -#include <Swiften/Parser/AttributeMap.h> #include <Swiften/Parser/Attribute.h> +#include <Swiften/Parser/AttributeMap.h> +#include <Swiften/Parser/XMLParser.h> +#include <Swiften/Parser/XMLParserClient.h> +#include <Swiften/Serializer/PayloadSerializer.h> #include <Swiften/Serializer/XML/XMLElement.h> -#include <Swiften/Serializer/XML/XMLTextNode.h> #include <Swiften/Serializer/XML/XMLRawTextNode.h> +#include <Swiften/Serializer/XML/XMLTextNode.h> + +#include <Sluift/Lua/Check.h> #include <Sluift/Lua/Debug.h> +#include <Sluift/Lua/LuaUtils.h> using namespace Swift; namespace { - class ParserClient : public XMLParserClient { - public: - ParserClient(lua_State* L) : L(L), currentIndex(1) { - } - - virtual void handleStartElement( - const std::string& element, const std::string& ns, - const AttributeMap& attributes) SWIFTEN_OVERRIDE { - lua_checkstack(L, 6); - lua_pushnumber(L, currentIndex); - lua_newtable(L); - lua_pushstring(L, element.c_str()); - lua_setfield(L, -2, "tag"); - if (!ns.empty()) { - lua_pushstring(L, ns.c_str()); - lua_setfield(L, -2, "ns"); - } - if (!attributes.getEntries().empty()) { - lua_newtable(L); - int i = 1; - foreach(const AttributeMap::Entry& entry, attributes.getEntries()) { - lua_pushnumber(L, i); - lua_newtable(L); - lua_pushstring(L, entry.getAttribute().getName().c_str()); - lua_setfield(L, -2, "name"); - if (!entry.getAttribute().getNamespace().empty()) { - lua_pushstring(L, entry.getAttribute().getNamespace().c_str()); - lua_setfield(L, -2, "ns"); - } - lua_pushstring(L, entry.getValue().c_str()); - lua_setfield(L, -2, "value"); - lua_settable(L, -3); - ++i; - } - lua_setfield(L, -2, "attributes"); - } - - indexStack.push_back(currentIndex); - currentIndex = 1; - lua_newtable(L); - } - - virtual void handleEndElement( - const std::string&, const std::string&) SWIFTEN_OVERRIDE { - lua_setfield(L, -2, "children"); - lua_settable(L, -3); - currentIndex = indexStack.back(); - indexStack.pop_back(); - currentIndex++; - } - - virtual void handleCharacterData(const std::string& data) SWIFTEN_OVERRIDE { - lua_checkstack(L, 2); - lua_pushnumber(L, currentIndex); - lua_pushstring(L, data.c_str()); - lua_settable(L, -3); - currentIndex++; - } - - private: - lua_State* L; - std::vector<int> indexStack; - int currentIndex; - }; - - std::string serializeElement(lua_State* L) { - std::string tag; - lua_getfield(L, -1, "tag"); - if (lua_isstring(L, -1)) { - tag = lua_tostring(L, -1); - } - lua_pop(L, 1); - - std::string ns; - lua_getfield(L, -1, "ns"); - if (lua_isstring(L, -1)) { - ns = lua_tostring(L, -1); - } - lua_pop(L, 1); - - XMLElement element(tag, ns); - - lua_getfield(L, -1, "attributes"); - if (lua_istable(L, -1)) { - int index = Lua::absoluteOffset(L, -1); - for (lua_pushnil(L); lua_next(L, index) != 0; ) { - if (lua_istable(L, -1)) { - std::string attributeName; - lua_getfield(L, -1, "name"); - if (lua_isstring(L, -1)) { - attributeName = lua_tostring(L, -1); - } - lua_pop(L, 1); - - std::string attributeValue; - lua_getfield(L, -1, "value"); - if (lua_isstring(L, -1)) { - attributeValue = lua_tostring(L, -1); - } - lua_pop(L, 1); - - if (!attributeName.empty()) { - element.setAttribute(attributeName, attributeValue); - } - } - lua_pop(L, 1); // value - } - } - lua_pop(L, 1); // children - - lua_getfield(L, -1, "children"); - if (lua_istable(L, -1)) { - int index = Lua::absoluteOffset(L, -1); - for (lua_pushnil(L); lua_next(L, index) != 0; ) { - if (lua_isstring(L, -1)) { - element.addNode(boost::make_shared<XMLTextNode>(lua_tostring(L, -1))); - } - else if (lua_istable(L, -1)) { - element.addNode(boost::make_shared<XMLRawTextNode>(serializeElement(L))); - } - lua_pop(L, 1); // value - } - } - lua_pop(L, 1); // children - - return element.serialize(); - } + class ParserClient : public XMLParserClient { + public: + ParserClient(lua_State* L) : L(L), currentIndex(1) { + } + + virtual void handleStartElement( + const std::string& element, const std::string& ns, + const AttributeMap& attributes) SWIFTEN_OVERRIDE { + lua_checkstack(L, 6); + lua_pushnumber(L, currentIndex); + lua_newtable(L); + lua_pushstring(L, element.c_str()); + lua_setfield(L, -2, "tag"); + if (!ns.empty()) { + lua_pushstring(L, ns.c_str()); + lua_setfield(L, -2, "ns"); + } + if (!attributes.getEntries().empty()) { + lua_newtable(L); + int i = 1; + for (const auto& entry : attributes.getEntries()) { + lua_pushnumber(L, i); + lua_newtable(L); + lua_pushstring(L, entry.getAttribute().getName().c_str()); + lua_setfield(L, -2, "name"); + if (!entry.getAttribute().getNamespace().empty()) { + lua_pushstring(L, entry.getAttribute().getNamespace().c_str()); + lua_setfield(L, -2, "ns"); + } + lua_pushstring(L, entry.getValue().c_str()); + lua_setfield(L, -2, "value"); + lua_settable(L, -3); + ++i; + } + lua_setfield(L, -2, "attributes"); + } + + indexStack.push_back(currentIndex); + currentIndex = 1; + lua_newtable(L); + } + + virtual void handleEndElement( + const std::string&, const std::string&) SWIFTEN_OVERRIDE { + lua_setfield(L, -2, "children"); + lua_settable(L, -3); + currentIndex = indexStack.back(); + indexStack.pop_back(); + currentIndex++; + } + + virtual void handleCharacterData(const std::string& data) SWIFTEN_OVERRIDE { + lua_checkstack(L, 2); + lua_pushnumber(L, currentIndex); + lua_pushstring(L, data.c_str()); + lua_settable(L, -3); + currentIndex++; + } + + private: + lua_State* L; + std::vector<int> indexStack; + int currentIndex; + }; + + std::string serializeElement(lua_State* L) { + std::string tag; + lua_getfield(L, -1, "tag"); + if (lua_isstring(L, -1)) { + tag = lua_tostring(L, -1); + } + lua_pop(L, 1); + + std::string ns; + lua_getfield(L, -1, "ns"); + if (lua_isstring(L, -1)) { + ns = lua_tostring(L, -1); + } + lua_pop(L, 1); + + XMLElement element(tag, ns); + + lua_getfield(L, -1, "attributes"); + if (lua_istable(L, -1)) { + int index = Lua::absoluteOffset(L, -1); + for (lua_pushnil(L); lua_next(L, index) != 0; ) { + if (lua_istable(L, -1)) { + std::string attributeName; + lua_getfield(L, -1, "name"); + if (lua_isstring(L, -1)) { + attributeName = lua_tostring(L, -1); + } + lua_pop(L, 1); + + std::string attributeValue; + lua_getfield(L, -1, "value"); + if (lua_isstring(L, -1)) { + attributeValue = lua_tostring(L, -1); + } + lua_pop(L, 1); + + if (!attributeName.empty()) { + element.setAttribute(attributeName, attributeValue); + } + } + lua_pop(L, 1); // value + } + } + lua_pop(L, 1); // children + + lua_getfield(L, -1, "children"); + if (lua_istable(L, -1)) { + int index = Lua::absoluteOffset(L, -1); + for (lua_pushnil(L); lua_next(L, index) != 0; ) { + if (lua_isstring(L, -1)) { + element.addNode(std::make_shared<XMLTextNode>(lua_tostring(L, -1))); + } + else if (lua_istable(L, -1)) { + element.addNode(std::make_shared<XMLRawTextNode>(serializeElement(L))); + } + lua_pop(L, 1); // value + } + } + lua_pop(L, 1); // children + + return element.serialize(); + } } DOMElementConvertor::DOMElementConvertor() { @@ -162,40 +162,40 @@ DOMElementConvertor::DOMElementConvertor() { DOMElementConvertor::~DOMElementConvertor() { } -boost::shared_ptr<Element> DOMElementConvertor::convertFromLua(lua_State* L, int index, const std::string& type) { - if (!lua_istable(L, index) || type != "dom") { - return boost::shared_ptr<Payload>(); - } - return boost::make_shared<RawXMLPayload>(serializeElement(L).c_str()); +std::shared_ptr<Element> DOMElementConvertor::convertFromLua(lua_State* L, int index, const std::string& type) { + if (!lua_istable(L, index) || type != "dom") { + return std::shared_ptr<Payload>(); + } + return std::make_shared<RawXMLPayload>(serializeElement(L).c_str()); } boost::optional<std::string> DOMElementConvertor::convertToLua( - lua_State* L, boost::shared_ptr<Element> element) { - // Serialize payload to XML - boost::shared_ptr<Payload> payload = boost::dynamic_pointer_cast<Payload>(element); - if (!payload) { - return boost::optional<std::string>(); - } - - PayloadSerializer* serializer = serializers.getPayloadSerializer(payload); - assert(serializer); - std::string serializedPayload = serializer->serialize(payload); - - lua_newtable(L); - - // Parse the payload again - ParserClient parserClient(L); - boost::shared_ptr<XMLParser> parser(parsers.createXMLParser(&parserClient)); - bool result = parser->parse(serializedPayload); - assert(result); - - // There can only be one element, so stripping the list - lua_pushnil(L); - lua_next(L, -2); - Lua::registerTableToString(L, -1); - - lua_replace(L, -3); - lua_settop(L, -2); - - return std::string("dom"); + lua_State* L, std::shared_ptr<Element> element) { + // Serialize payload to XML + std::shared_ptr<Payload> payload = std::dynamic_pointer_cast<Payload>(element); + if (!payload) { + return boost::optional<std::string>(); + } + + PayloadSerializer* serializer = serializers.getPayloadSerializer(payload); + assert(serializer); + std::string serializedPayload = serializer->serialize(payload); + + lua_newtable(L); + + // Parse the payload again + ParserClient parserClient(L); + std::shared_ptr<XMLParser> parser(parsers.createXMLParser(&parserClient)); + bool result = parser->parse(serializedPayload); + assert(result); + + // There can only be one element, so stripping the list + lua_pushnil(L); + lua_next(L, -2); + Lua::registerTableToString(L, -1); + + lua_replace(L, -3); + lua_settop(L, -2); + + return std::string("dom"); } diff --git a/Sluift/ElementConvertors/DOMElementConvertor.h b/Sluift/ElementConvertors/DOMElementConvertor.h index 610dbff..7b1ba58 100644 --- a/Sluift/ElementConvertors/DOMElementConvertor.h +++ b/Sluift/ElementConvertors/DOMElementConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,22 +7,22 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Parser/PlatformXMLParserFactory.h> +#include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h> #include <Sluift/LuaElementConvertor.h> -#include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h> -#include <Swiften/Parser/PlatformXMLParserFactory.h> namespace Swift { - class DOMElementConvertor : public LuaElementConvertor { - public: - DOMElementConvertor(); - virtual ~DOMElementConvertor(); + class DOMElementConvertor : public LuaElementConvertor { + public: + DOMElementConvertor(); + virtual ~DOMElementConvertor(); - virtual boost::shared_ptr<Element> convertFromLua(lua_State*, int index, const std::string& type) SWIFTEN_OVERRIDE; - virtual boost::optional<std::string> convertToLua(lua_State*, boost::shared_ptr<Element>) SWIFTEN_OVERRIDE; + virtual std::shared_ptr<Element> convertFromLua(lua_State*, int index, const std::string& type) SWIFTEN_OVERRIDE; + virtual boost::optional<std::string> convertToLua(lua_State*, std::shared_ptr<Element>) SWIFTEN_OVERRIDE; - private: - PlatformXMLParserFactory parsers; - FullPayloadSerializerCollection serializers; - }; + private: + PlatformXMLParserFactory parsers; + FullPayloadSerializerCollection serializers; + }; } diff --git a/Sluift/ElementConvertors/DefaultElementConvertor.cpp b/Sluift/ElementConvertors/DefaultElementConvertor.cpp index c95da93..75e6706 100644 --- a/Sluift/ElementConvertors/DefaultElementConvertor.cpp +++ b/Sluift/ElementConvertors/DefaultElementConvertor.cpp @@ -1,14 +1,15 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/DefaultElementConvertor.h> -#include <iostream> -#include <typeinfo> #include <string> +#include <typeinfo> + +#include <Swiften/Base/Log.h> using namespace Swift; @@ -18,13 +19,13 @@ DefaultElementConvertor::DefaultElementConvertor() { DefaultElementConvertor::~DefaultElementConvertor() { } -boost::shared_ptr<Element> DefaultElementConvertor::convertFromLua(lua_State*, int, const std::string& type) { - std::cerr << "Warning: Unable to convert type '" << type << "'" << std::endl; - return boost::shared_ptr<Element>(); +std::shared_ptr<Element> DefaultElementConvertor::convertFromLua(lua_State*, int, const std::string& type) { + SWIFT_LOG(warning) << "Unable to convert type '" << type << "'" << std::endl; + return std::shared_ptr<Element>(); } -boost::optional<std::string> DefaultElementConvertor::convertToLua(lua_State*, boost::shared_ptr<Element>) { - // Should have been handled by the raw XML convertor - assert(false); - return NO_RESULT; +boost::optional<std::string> DefaultElementConvertor::convertToLua(lua_State*, std::shared_ptr<Element>) { + // Should have been handled by the raw XML convertor + assert(false); + return NO_RESULT; } diff --git a/Sluift/ElementConvertors/DefaultElementConvertor.h b/Sluift/ElementConvertors/DefaultElementConvertor.h index e08bb98..4aec300 100644 --- a/Sluift/ElementConvertors/DefaultElementConvertor.h +++ b/Sluift/ElementConvertors/DefaultElementConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -11,12 +11,12 @@ #include <Sluift/LuaElementConvertor.h> namespace Swift { - class DefaultElementConvertor : public LuaElementConvertor { - public: - DefaultElementConvertor(); - virtual ~DefaultElementConvertor(); + class DefaultElementConvertor : public LuaElementConvertor { + public: + DefaultElementConvertor(); + virtual ~DefaultElementConvertor(); - virtual boost::shared_ptr<Element> convertFromLua(lua_State*, int index, const std::string& type) SWIFTEN_OVERRIDE; - virtual boost::optional<std::string> convertToLua(lua_State*, boost::shared_ptr<Element>) SWIFTEN_OVERRIDE; - }; + virtual std::shared_ptr<Element> convertFromLua(lua_State*, int index, const std::string& type) SWIFTEN_OVERRIDE; + virtual boost::optional<std::string> convertToLua(lua_State*, std::shared_ptr<Element>) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/DelayConvertor.cpp b/Sluift/ElementConvertors/DelayConvertor.cpp index a17e114..f23e137 100644 --- a/Sluift/ElementConvertors/DelayConvertor.cpp +++ b/Sluift/ElementConvertors/DelayConvertor.cpp @@ -1,17 +1,21 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/DelayConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/Lua/Check.h> + +#include <lua.hpp> + #include <Swiften/Base/DateTime.h> +#include <Sluift/Lua/Check.h> + using namespace Swift; DelayConvertor::DelayConvertor() : GenericLuaElementConvertor<Delay>("delay") { @@ -20,28 +24,28 @@ DelayConvertor::DelayConvertor() : GenericLuaElementConvertor<Delay>("delay") { DelayConvertor::~DelayConvertor() { } -boost::shared_ptr<Delay> DelayConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<Delay> result = boost::make_shared<Delay>(); - lua_getfield(L, -1, "stamp"); - if (lua_isstring(L, -1)) { - result->setStamp(stringToDateTime(lua_tostring(L, -1))); - } - lua_pop(L, 1); - - lua_getfield(L, -1, "from"); - if (lua_isstring(L, -1)) { - result->setFrom(lua_tostring(L, -1)); - } - lua_pop(L, 1); - return result; +std::shared_ptr<Delay> DelayConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<Delay> result = std::make_shared<Delay>(); + lua_getfield(L, -1, "stamp"); + if (lua_isstring(L, -1)) { + result->setStamp(stringToDateTime(lua_tostring(L, -1))); + } + lua_pop(L, 1); + + lua_getfield(L, -1, "from"); + if (lua_isstring(L, -1)) { + result->setFrom(lua_tostring(L, -1)); + } + lua_pop(L, 1); + return result; } -void DelayConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<Delay> payload) { - lua_createtable(L, 0, 0); - if (payload->getFrom()) { - lua_pushstring(L, (*payload->getFrom()).toString().c_str()); - lua_setfield(L, -2, "from"); - } - lua_pushstring(L, dateTimeToString(payload->getStamp()).c_str()); - lua_setfield(L, -2, "stamp"); +void DelayConvertor::doConvertToLua(lua_State* L, std::shared_ptr<Delay> payload) { + lua_createtable(L, 0, 0); + if (payload->getFrom()) { + lua_pushstring(L, (*payload->getFrom()).toString().c_str()); + lua_setfield(L, -2, "from"); + } + lua_pushstring(L, dateTimeToString(payload->getStamp()).c_str()); + lua_setfield(L, -2, "stamp"); } diff --git a/Sluift/ElementConvertors/DelayConvertor.h b/Sluift/ElementConvertors/DelayConvertor.h index 6cee7de..b9f72f2 100644 --- a/Sluift/ElementConvertors/DelayConvertor.h +++ b/Sluift/ElementConvertors/DelayConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,17 +7,17 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/Delay.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/Delay.h> namespace Swift { - class DelayConvertor : public GenericLuaElementConvertor<Delay> { - public: - DelayConvertor(); - virtual ~DelayConvertor(); + class DelayConvertor : public GenericLuaElementConvertor<Delay> { + public: + DelayConvertor(); + virtual ~DelayConvertor(); - virtual boost::shared_ptr<Delay> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<Delay>) SWIFTEN_OVERRIDE; - }; + virtual std::shared_ptr<Delay> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<Delay>) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/DiscoInfoConvertor.cpp b/Sluift/ElementConvertors/DiscoInfoConvertor.cpp index d9a408e..2aa4a77 100644 --- a/Sluift/ElementConvertors/DiscoInfoConvertor.cpp +++ b/Sluift/ElementConvertors/DiscoInfoConvertor.cpp @@ -1,14 +1,17 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/DiscoInfoConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> + +#include <lua.hpp> + #include <Sluift/Lua/LuaUtils.h> using namespace Swift; @@ -19,98 +22,98 @@ DiscoInfoConvertor::DiscoInfoConvertor() : GenericLuaElementConvertor<DiscoInfo> DiscoInfoConvertor::~DiscoInfoConvertor() { } -boost::shared_ptr<DiscoInfo> DiscoInfoConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<DiscoInfo> result = boost::make_shared<DiscoInfo>(); - if (boost::optional<std::string> value = Lua::getStringField(L, -1, "node")) { - result->setNode(*value); - } - - lua_getfield(L, -1, "identities"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - result->addIdentity(DiscoInfo::Identity( - Lua::getStringField(L, -1, "name").get_value_or(""), - Lua::getStringField(L, -1, "category").get_value_or("client"), - Lua::getStringField(L, -1, "type").get_value_or("pc"), - Lua::getStringField(L, -1, "language").get_value_or(""))); - lua_pop(L, 1); - } - } - lua_pop(L, 1); - - lua_getfield(L, -1, "features"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - if (lua_isstring(L, -1)) { - result->addFeature(lua_tostring(L, -1)); - } - lua_pop(L, 1); - } - } - lua_pop(L, 1); - - // TODO: Extension - - return result; +std::shared_ptr<DiscoInfo> DiscoInfoConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<DiscoInfo> result = std::make_shared<DiscoInfo>(); + if (boost::optional<std::string> value = Lua::getStringField(L, -1, "node")) { + result->setNode(*value); + } + + lua_getfield(L, -1, "identities"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + result->addIdentity(DiscoInfo::Identity( + Lua::getStringField(L, -1, "name").get_value_or(""), + Lua::getStringField(L, -1, "category").get_value_or("client"), + Lua::getStringField(L, -1, "type").get_value_or("pc"), + Lua::getStringField(L, -1, "language").get_value_or(""))); + lua_pop(L, 1); + } + } + lua_pop(L, 1); + + lua_getfield(L, -1, "features"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + if (lua_isstring(L, -1)) { + result->addFeature(lua_tostring(L, -1)); + } + lua_pop(L, 1); + } + } + lua_pop(L, 1); + + // TODO: Extension + + return result; } -void DiscoInfoConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<DiscoInfo> payload) { - lua_newtable(L); - if (!payload->getNode().empty()) { - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - } - - const std::vector<DiscoInfo::Identity>& identities = payload->getIdentities(); - if (!identities.empty()) { - lua_createtable(L, boost::numeric_cast<int>(identities.size()), 0); - for (size_t i = 0; i < identities.size(); ++i) { - lua_createtable(L, 0, 0); - if (!identities[i].getName().empty()) { - lua_pushstring(L, identities[i].getName().c_str()); - lua_setfield(L, -2, "name"); - } - if (!identities[i].getCategory().empty()) { - lua_pushstring(L, identities[i].getCategory().c_str()); - lua_setfield(L, -2, "category"); - } - if (!identities[i].getType().empty()) { - lua_pushstring(L, identities[i].getType().c_str()); - lua_setfield(L, -2, "type"); - } - if (!identities[i].getLanguage().empty()) { - lua_pushstring(L, identities[i].getLanguage().c_str()); - lua_setfield(L, -2, "language"); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "identities"); - } - - const std::vector<std::string>& features = payload->getFeatures(); - if (!features.empty()) { - lua_createtable(L, boost::numeric_cast<int>(features.size()), 0); - for (size_t i = 0; i < features.size(); ++i) { - lua_pushstring(L, features[i].c_str()); - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "features"); - } - - // TODO: Extension +void DiscoInfoConvertor::doConvertToLua(lua_State* L, std::shared_ptr<DiscoInfo> payload) { + lua_newtable(L); + if (!payload->getNode().empty()) { + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + } + + const std::vector<DiscoInfo::Identity>& identities = payload->getIdentities(); + if (!identities.empty()) { + lua_createtable(L, boost::numeric_cast<int>(identities.size()), 0); + for (size_t i = 0; i < identities.size(); ++i) { + lua_createtable(L, 0, 0); + if (!identities[i].getName().empty()) { + lua_pushstring(L, identities[i].getName().c_str()); + lua_setfield(L, -2, "name"); + } + if (!identities[i].getCategory().empty()) { + lua_pushstring(L, identities[i].getCategory().c_str()); + lua_setfield(L, -2, "category"); + } + if (!identities[i].getType().empty()) { + lua_pushstring(L, identities[i].getType().c_str()); + lua_setfield(L, -2, "type"); + } + if (!identities[i].getLanguage().empty()) { + lua_pushstring(L, identities[i].getLanguage().c_str()); + lua_setfield(L, -2, "language"); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "identities"); + } + + const std::vector<std::string>& features = payload->getFeatures(); + if (!features.empty()) { + lua_createtable(L, boost::numeric_cast<int>(features.size()), 0); + for (size_t i = 0; i < features.size(); ++i) { + lua_pushstring(L, features[i].c_str()); + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "features"); + } + + // TODO: Extension } boost::optional<LuaElementConvertor::Documentation> DiscoInfoConvertor::getDocumentation() const { - return Documentation( - "DiscoInfo", - "Represents `disco#info` service discovery data.\n\n" - "This table has the following structure:\n\n" - "- `node`: string\n" - "- `identities`: array(table)\n" - " - `name`: string\n" - " - `category`: string\n" - " - `type`: string\n" - " - `language`: string\n" - "- `features`: array(string)\n" - ); + return Documentation( + "DiscoInfo", + "Represents `disco#info` service discovery data.\n\n" + "This table has the following structure:\n\n" + "- `node`: string\n" + "- `identities`: array(table)\n" + " - `name`: string\n" + " - `category`: string\n" + " - `type`: string\n" + " - `language`: string\n" + "- `features`: array(string)\n" + ); } diff --git a/Sluift/ElementConvertors/DiscoInfoConvertor.h b/Sluift/ElementConvertors/DiscoInfoConvertor.h index 7c5009f..34f8237 100644 --- a/Sluift/ElementConvertors/DiscoInfoConvertor.h +++ b/Sluift/ElementConvertors/DiscoInfoConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,18 +7,18 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/DiscoInfo.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/DiscoInfo.h> namespace Swift { - class DiscoInfoConvertor : public GenericLuaElementConvertor<DiscoInfo> { - public: - DiscoInfoConvertor(); - virtual ~DiscoInfoConvertor(); + class DiscoInfoConvertor : public GenericLuaElementConvertor<DiscoInfo> { + public: + DiscoInfoConvertor(); + virtual ~DiscoInfoConvertor(); - virtual boost::shared_ptr<DiscoInfo> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<DiscoInfo>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - }; + virtual std::shared_ptr<DiscoInfo> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<DiscoInfo>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/DiscoItemsConvertor.cpp b/Sluift/ElementConvertors/DiscoItemsConvertor.cpp index 6ec944a..c15a0f8 100644 --- a/Sluift/ElementConvertors/DiscoItemsConvertor.cpp +++ b/Sluift/ElementConvertors/DiscoItemsConvertor.cpp @@ -1,14 +1,17 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/DiscoItemsConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> + +#include <lua.hpp> + #include <Sluift/Lua/LuaUtils.h> using namespace Swift; @@ -19,50 +22,50 @@ DiscoItemsConvertor::DiscoItemsConvertor() : GenericLuaElementConvertor<DiscoIte DiscoItemsConvertor::~DiscoItemsConvertor() { } -boost::shared_ptr<DiscoItems> DiscoItemsConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<DiscoItems> result = boost::make_shared<DiscoItems>(); - if (boost::optional<std::string> value = Lua::getStringField(L, -1, "node")) { - result->setNode(*value); - } - lua_getfield(L, -1, "items"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - result->addItem(DiscoItems::Item( - Lua::getStringField(L, -1, "name").get_value_or(""), - JID(Lua::getStringField(L, -1, "jid").get_value_or("")), - Lua::getStringField(L, -1, "node").get_value_or(""))); - lua_pop(L, 1); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<DiscoItems> DiscoItemsConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<DiscoItems> result = std::make_shared<DiscoItems>(); + if (boost::optional<std::string> value = Lua::getStringField(L, -1, "node")) { + result->setNode(*value); + } + lua_getfield(L, -1, "items"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + result->addItem(DiscoItems::Item( + Lua::getStringField(L, -1, "name").get_value_or(""), + JID(Lua::getStringField(L, -1, "jid").get_value_or("")), + Lua::getStringField(L, -1, "node").get_value_or(""))); + lua_pop(L, 1); + } + } + lua_pop(L, 1); + return result; } -void DiscoItemsConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<DiscoItems> payload) { - lua_newtable(L); - if (!payload->getNode().empty()) { - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - } - const std::vector<DiscoItems::Item>& items = payload->getItems(); - if (!items.empty()) { - lua_createtable(L, boost::numeric_cast<int>(items.size()), 0); - for (size_t i = 0; i < items.size(); ++i) { - lua_createtable(L, 0, 0); - if (!items[i].getName().empty()) { - lua_pushstring(L, items[i].getName().c_str()); - lua_setfield(L, -2, "name"); - } - if (!items[i].getNode().empty()) { - lua_pushstring(L, items[i].getNode().c_str()); - lua_setfield(L, -2, "node"); - } - if (items[i].getJID().isValid()) { - lua_pushstring(L, items[i].getJID().toString().c_str()); - lua_setfield(L, -2, "jid"); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "items"); - } +void DiscoItemsConvertor::doConvertToLua(lua_State* L, std::shared_ptr<DiscoItems> payload) { + lua_newtable(L); + if (!payload->getNode().empty()) { + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + } + const std::vector<DiscoItems::Item>& items = payload->getItems(); + if (!items.empty()) { + lua_createtable(L, boost::numeric_cast<int>(items.size()), 0); + for (size_t i = 0; i < items.size(); ++i) { + lua_createtable(L, 0, 0); + if (!items[i].getName().empty()) { + lua_pushstring(L, items[i].getName().c_str()); + lua_setfield(L, -2, "name"); + } + if (!items[i].getNode().empty()) { + lua_pushstring(L, items[i].getNode().c_str()); + lua_setfield(L, -2, "node"); + } + if (items[i].getJID().isValid()) { + lua_pushstring(L, items[i].getJID().toString().c_str()); + lua_setfield(L, -2, "jid"); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "items"); + } } diff --git a/Sluift/ElementConvertors/DiscoItemsConvertor.h b/Sluift/ElementConvertors/DiscoItemsConvertor.h index 5e3a86c..a77b948 100644 --- a/Sluift/ElementConvertors/DiscoItemsConvertor.h +++ b/Sluift/ElementConvertors/DiscoItemsConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,17 +7,17 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/DiscoItems.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/DiscoItems.h> namespace Swift { - class DiscoItemsConvertor : public GenericLuaElementConvertor<DiscoItems> { - public: - DiscoItemsConvertor(); - virtual ~DiscoItemsConvertor(); + class DiscoItemsConvertor : public GenericLuaElementConvertor<DiscoItems> { + public: + DiscoItemsConvertor(); + virtual ~DiscoItemsConvertor(); - virtual boost::shared_ptr<DiscoItems> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<DiscoItems>) SWIFTEN_OVERRIDE; - }; + virtual std::shared_ptr<DiscoItems> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<DiscoItems>) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/ElementConvertors.ipp b/Sluift/ElementConvertors/ElementConvertors.ipp index 7d25e86..a81c9cf 100644 --- a/Sluift/ElementConvertors/ElementConvertors.ipp +++ b/Sluift/ElementConvertors/ElementConvertors.ipp @@ -1,87 +1,87 @@ /* - * Copyright (c) 2013-2014 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ -#include <Sluift/ElementConvertors/PubSubRetractConvertor.h> +#include <Sluift/ElementConvertors/IsodeIQDelegationConvertor.h> +#include <Sluift/ElementConvertors/PubSubAffiliationConvertor.h> #include <Sluift/ElementConvertors/PubSubAffiliationsConvertor.h> -#include <Sluift/ElementConvertors/PubSubPublishConvertor.h> -#include <Sluift/ElementConvertors/PubSubItemsConvertor.h> -#include <Sluift/ElementConvertors/PubSubOwnerRedirectConvertor.h> -#include <Sluift/ElementConvertors/PubSubEventRedirectConvertor.h> -#include <Sluift/ElementConvertors/UserTuneConvertor.h> #include <Sluift/ElementConvertors/PubSubConfigureConvertor.h> -#include <Sluift/ElementConvertors/PubSubEventDisassociateConvertor.h> -#include <Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.h> -#include <Sluift/ElementConvertors/PubSubOwnerConfigureConvertor.h> -#include <Sluift/ElementConvertors/UserLocationConvertor.h> -#include <Sluift/ElementConvertors/PubSubSubscribeOptionsConvertor.h> -#include <Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.h> +#include <Sluift/ElementConvertors/PubSubCreateConvertor.h> #include <Sluift/ElementConvertors/PubSubDefaultConvertor.h> +#include <Sluift/ElementConvertors/PubSubEventAssociateConvertor.h> #include <Sluift/ElementConvertors/PubSubEventCollectionConvertor.h> -#include <Sluift/ElementConvertors/PubSubEventSubscriptionConvertor.h> -#include <Sluift/ElementConvertors/PubSubEventRetractConvertor.h> -#include <Sluift/ElementConvertors/PubSubItemConvertor.h> -#include <Sluift/ElementConvertors/PubSubUnsubscribeConvertor.h> +#include <Sluift/ElementConvertors/PubSubEventConfigurationConvertor.h> #include <Sluift/ElementConvertors/PubSubEventDeleteConvertor.h> -#include <Sluift/ElementConvertors/PubSubCreateConvertor.h> -#include <Sluift/ElementConvertors/PubSubOwnerPurgeConvertor.h> +#include <Sluift/ElementConvertors/PubSubEventDisassociateConvertor.h> +#include <Sluift/ElementConvertors/PubSubEventItemConvertor.h> #include <Sluift/ElementConvertors/PubSubEventItemsConvertor.h> +#include <Sluift/ElementConvertors/PubSubEventPurgeConvertor.h> +#include <Sluift/ElementConvertors/PubSubEventRedirectConvertor.h> +#include <Sluift/ElementConvertors/PubSubEventRetractConvertor.h> +#include <Sluift/ElementConvertors/PubSubEventSubscriptionConvertor.h> +#include <Sluift/ElementConvertors/PubSubItemConvertor.h> +#include <Sluift/ElementConvertors/PubSubItemsConvertor.h> #include <Sluift/ElementConvertors/PubSubOptionsConvertor.h> -#include <Sluift/ElementConvertors/PubSubEventItemConvertor.h> -#include <Sluift/ElementConvertors/PubSubOwnerSubscriptionConvertor.h> -#include <Sluift/ElementConvertors/IsodeIQDelegationConvertor.h> #include <Sluift/ElementConvertors/PubSubOwnerAffiliationConvertor.h> -#include <Sluift/ElementConvertors/PubSubEventPurgeConvertor.h> -#include <Sluift/ElementConvertors/PubSubAffiliationConvertor.h> -#include <Sluift/ElementConvertors/PubSubSubscribeConvertor.h> -#include <Sluift/ElementConvertors/PubSubOwnerDeleteConvertor.h> +#include <Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.h> +#include <Sluift/ElementConvertors/PubSubOwnerConfigureConvertor.h> #include <Sluift/ElementConvertors/PubSubOwnerDefaultConvertor.h> -#include <Sluift/ElementConvertors/PubSubSubscriptionsConvertor.h> -#include <Sluift/ElementConvertors/PubSubEventAssociateConvertor.h> +#include <Sluift/ElementConvertors/PubSubOwnerDeleteConvertor.h> +#include <Sluift/ElementConvertors/PubSubOwnerPurgeConvertor.h> +#include <Sluift/ElementConvertors/PubSubOwnerRedirectConvertor.h> +#include <Sluift/ElementConvertors/PubSubOwnerSubscriptionConvertor.h> +#include <Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.h> +#include <Sluift/ElementConvertors/PubSubPublishConvertor.h> +#include <Sluift/ElementConvertors/PubSubRetractConvertor.h> +#include <Sluift/ElementConvertors/PubSubSubscribeConvertor.h> +#include <Sluift/ElementConvertors/PubSubSubscribeOptionsConvertor.h> #include <Sluift/ElementConvertors/PubSubSubscriptionConvertor.h> +#include <Sluift/ElementConvertors/PubSubSubscriptionsConvertor.h> +#include <Sluift/ElementConvertors/PubSubUnsubscribeConvertor.h> #include <Sluift/ElementConvertors/SecurityLabelConvertor.h> -#include <Sluift/ElementConvertors/PubSubEventConfigurationConvertor.h> +#include <Sluift/ElementConvertors/UserLocationConvertor.h> +#include <Sluift/ElementConvertors/UserTuneConvertor.h> void LuaElementConvertors::registerConvertors() { - convertors.push_back(boost::make_shared<PubSubRetractConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubAffiliationsConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubPublishConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubItemsConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubOwnerRedirectConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventRedirectConvertor>(this)); - convertors.push_back(boost::make_shared<UserTuneConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubConfigureConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventDisassociateConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubOwnerAffiliationsConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubOwnerConfigureConvertor>(this)); - convertors.push_back(boost::make_shared<UserLocationConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubSubscribeOptionsConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubOwnerSubscriptionsConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubDefaultConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventCollectionConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventSubscriptionConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventRetractConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubItemConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubUnsubscribeConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventDeleteConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubCreateConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubOwnerPurgeConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventItemsConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubOptionsConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventItemConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubOwnerSubscriptionConvertor>(this)); - convertors.push_back(boost::make_shared<IsodeIQDelegationConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubOwnerAffiliationConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventPurgeConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubAffiliationConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubSubscribeConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubOwnerDeleteConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubOwnerDefaultConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubSubscriptionsConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventAssociateConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubSubscriptionConvertor>(this)); - convertors.push_back(boost::make_shared<SecurityLabelConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventConfigurationConvertor>(this)); + convertors.push_back(std::make_shared<PubSubRetractConvertor>(this)); + convertors.push_back(std::make_shared<PubSubAffiliationsConvertor>(this)); + convertors.push_back(std::make_shared<PubSubPublishConvertor>(this)); + convertors.push_back(std::make_shared<PubSubItemsConvertor>(this)); + convertors.push_back(std::make_shared<PubSubOwnerRedirectConvertor>()); + convertors.push_back(std::make_shared<PubSubEventRedirectConvertor>()); + convertors.push_back(std::make_shared<UserTuneConvertor>()); + convertors.push_back(std::make_shared<PubSubConfigureConvertor>(this)); + convertors.push_back(std::make_shared<PubSubEventDisassociateConvertor>()); + convertors.push_back(std::make_shared<PubSubOwnerAffiliationsConvertor>(this)); + convertors.push_back(std::make_shared<PubSubOwnerConfigureConvertor>(this)); + convertors.push_back(std::make_shared<UserLocationConvertor>()); + convertors.push_back(std::make_shared<PubSubSubscribeOptionsConvertor>()); + convertors.push_back(std::make_shared<PubSubOwnerSubscriptionsConvertor>(this)); + convertors.push_back(std::make_shared<PubSubDefaultConvertor>()); + convertors.push_back(std::make_shared<PubSubEventCollectionConvertor>(this)); + convertors.push_back(std::make_shared<PubSubEventSubscriptionConvertor>()); + convertors.push_back(std::make_shared<PubSubEventRetractConvertor>()); + convertors.push_back(std::make_shared<PubSubItemConvertor>(this)); + convertors.push_back(std::make_shared<PubSubUnsubscribeConvertor>()); + convertors.push_back(std::make_shared<PubSubEventDeleteConvertor>(this)); + convertors.push_back(std::make_shared<PubSubCreateConvertor>(this)); + convertors.push_back(std::make_shared<PubSubOwnerPurgeConvertor>()); + convertors.push_back(std::make_shared<PubSubEventItemsConvertor>(this)); + convertors.push_back(std::make_shared<PubSubOptionsConvertor>(this)); + convertors.push_back(std::make_shared<PubSubEventItemConvertor>(this)); + convertors.push_back(std::make_shared<PubSubOwnerSubscriptionConvertor>()); + convertors.push_back(std::make_shared<IsodeIQDelegationConvertor>(this)); + convertors.push_back(std::make_shared<PubSubOwnerAffiliationConvertor>()); + convertors.push_back(std::make_shared<PubSubEventPurgeConvertor>()); + convertors.push_back(std::make_shared<PubSubAffiliationConvertor>()); + convertors.push_back(std::make_shared<PubSubSubscribeConvertor>(this)); + convertors.push_back(std::make_shared<PubSubOwnerDeleteConvertor>(this)); + convertors.push_back(std::make_shared<PubSubOwnerDefaultConvertor>(this)); + convertors.push_back(std::make_shared<PubSubSubscriptionsConvertor>(this)); + convertors.push_back(std::make_shared<PubSubEventAssociateConvertor>()); + convertors.push_back(std::make_shared<PubSubSubscriptionConvertor>(this)); + convertors.push_back(std::make_shared<SecurityLabelConvertor>()); + convertors.push_back(std::make_shared<PubSubEventConfigurationConvertor>(this)); } diff --git a/Sluift/ElementConvertors/FormConvertor.cpp b/Sluift/ElementConvertors/FormConvertor.cpp index be1015c..90fd9fe 100644 --- a/Sluift/ElementConvertors/FormConvertor.cpp +++ b/Sluift/ElementConvertors/FormConvertor.cpp @@ -1,343 +1,343 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/FormConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <sstream> + +#include <boost/assign/list_of.hpp> #include <boost/numeric/conversion/cast.hpp> + +#include <lua.hpp> + #include <Sluift/Lua/Check.h> #include <Sluift/Lua/Value.h> -#include <Swiften/Base/foreach.h> -#include <boost/assign/list_of.hpp> -#include <sstream> using namespace Swift; namespace { - int formIndex(lua_State* L) { - lua_getfield(L, 1, "fields"); - if (lua_type(L, -1) != LUA_TTABLE) { - return 0; - } - int index = Lua::absoluteOffset(L, -1); - lua_pushnil(L); - for (lua_pushnil(L); lua_next(L, index) != 0; ) { - lua_getfield(L, -1, "name"); - if (lua_equal(L, -1, 2)) { - lua_pop(L, 1); - return 1; - } - lua_pop(L, 2); - } - return 0; - } - - int formNewIndex(lua_State* L) { - lua_getfield(L, 1, "fields"); - bool foundField = false; - if (lua_type(L, -1) == LUA_TTABLE) { - for (lua_pushnil(L); lua_next(L, -2) != 0; ) { - lua_getfield(L, -1, "name"); - if (lua_equal(L, -1, 2)) { - lua_pushvalue(L, 3); - lua_setfield(L, -3, "value"); - foundField = true; - lua_pop(L, 3); - break; - } - lua_pop(L, 2); - } - } - lua_pop(L, 1); - - if (!foundField) { - lua_pushvalue(L, 2); - lua_pushvalue(L, 3); - lua_rawset(L, 1); - } - return 0; - } - - Lua::Table convertFieldToLua(boost::shared_ptr<FormField> field) { - Lua::Table luaField = boost::assign::map_list_of("name", Lua::valueRef(field->getName())); - std::string type; - switch (field->getType()) { - case FormField::UnknownType: type = ""; break; - case FormField::BooleanType: type = "boolean"; break; - case FormField::FixedType: type = "fixed"; break; - case FormField::HiddenType: type = "hidden"; break; - case FormField::ListSingleType: type = "list-single"; break; - case FormField::TextMultiType: type = "text-multi"; break; - case FormField::TextPrivateType: type = "text-private"; break; - case FormField::TextSingleType: type = "text-single"; break; - case FormField::JIDSingleType: type = "jid-single"; break; - case FormField::JIDMultiType: type = "jid-multi"; break; - case FormField::ListMultiType: type = "list-multi"; break; - } - if (!type.empty()) { - luaField["type"] = Lua::valueRef(type); - } - if (!field->getLabel().empty()) { - luaField["label"] = Lua::valueRef(field->getLabel()); - } - if (field->getRequired()) { - luaField["required"] = Lua::boolRef(field->getRequired()); - } - if (!field->getDescription().empty()) { - luaField["description"] = Lua::valueRef(field->getDescription()); - } - if (field->getType() == FormField::BooleanType) { - luaField["value"] = Lua::boolRef(field->getBoolValue()); - } - else if (field->getValues().size() > 1) { - luaField["value"] = Lua::valueRef(Lua::Array(field->getValues().begin(), field->getValues().end())); - } - else if (field->getValues().size() == 1) { - luaField["value"] = Lua::valueRef(field->getValues()[0]); - } - if (!field->getOptions().empty()) { - Lua::Array options; - foreach(const FormField::Option& option, field->getOptions()) { - Lua::Table luaOption = boost::assign::map_list_of - ("label", Lua::valueRef(option.label)) - ("value", Lua::valueRef(option.value)); - options.push_back(luaOption); - } - luaField["options"] = valueRef(options); - } - return luaField; - } - - Lua::Array convertFieldListToLua(const std::vector< boost::shared_ptr<FormField> >& fieldList) { - Lua::Array fields; - foreach(boost::shared_ptr<FormField> field, fieldList) { - fields.push_back(convertFieldToLua(field)); - } - return fields; - } - - - boost::shared_ptr<FormField> convertFieldFromLua(lua_State* L) { - boost::shared_ptr<FormField> result = boost::make_shared<FormField>(); - FormField::Type fieldType = FormField::UnknownType; - boost::optional<std::string> type = Lua::getStringField(L, -1, "type"); - if (type) { - if (*type == "boolean") { - fieldType = FormField::BooleanType; - } - if (*type == "fixed") { - fieldType = FormField::FixedType; - } - if (*type == "hidden") { - fieldType = FormField::HiddenType; - } - if (*type == "list-single") { - fieldType = FormField::ListSingleType; - } - if (*type == "text-multi") { - fieldType = FormField::TextMultiType; - } - if (*type == "text-private") { - fieldType = FormField::TextPrivateType; - } - if (*type == "text-single") { - fieldType = FormField::TextSingleType; - } - if (*type == "jid-single") { - fieldType = FormField::JIDSingleType; - } - if (*type == "jid-multi") { - fieldType = FormField::JIDMultiType; - } - if (*type == "list-multi") { - fieldType = FormField::ListMultiType; - } - } - result->setType(fieldType); - if (boost::optional<std::string> name = Lua::getStringField(L, -1, "name")) { - result->setName(*name); - } - if (boost::optional<std::string> description = Lua::getStringField(L, -1, "description")) { - result->setDescription(*description); - } - if (boost::optional<std::string> label = Lua::getStringField(L, -1, "label")) { - result->setLabel(*label); - } - if (boost::optional<bool> required = Lua::getBooleanField(L, -1, "required")) { - result->setRequired(*required); - } - if (boost::optional<std::string> value = Lua::getStringField(L, -1, "value")) { - result->addValue(*value); - } - else if (boost::optional<bool> value = Lua::getBooleanField(L, -1, "value")) { - result->setBoolValue(*value); - } - else { - lua_getfield(L, -1, "value"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - if (lua_isstring(L, -1)) { - result->addValue(lua_tostring(L, -1)); - } - lua_pop(L, 1); - } - } - lua_pop(L, 1); - } - lua_getfield(L, -1, "options"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - if (lua_istable(L, -1)) { - FormField::Option option("", ""); - if (boost::optional<std::string> value = Lua::getStringField(L, -1, "value")) { - option.value = *value; - } - if (boost::optional<std::string> label = Lua::getStringField(L, -1, "label")) { - option.label = *label; - } - result->addOption(option); - } - lua_pop(L, 1); - } - } - lua_pop(L, 1); - return result; - } - - std::vector< boost::shared_ptr<FormField> > convertFieldListFromLua(lua_State* L) { - std::vector< boost::shared_ptr<FormField> > result; - for (lua_pushnil(L); lua_next(L, -2);) { - result.push_back(convertFieldFromLua(L)); - lua_pop(L, 1); - } - return result; - } - - boost::shared_ptr<Form> convertFormFromLua(lua_State* L) { - boost::shared_ptr<Form> result = boost::make_shared<Form>(); - if (boost::optional<std::string> title = Lua::getStringField(L, -1, "title")) { - result->setTitle(*title); - } - if (boost::optional<std::string> instructions = Lua::getStringField(L, -1, "instructions")) { - result->setInstructions(*instructions); - } - if (boost::optional<std::string> type = Lua::getStringField(L, -1, "type")) { - Form::Type formType = Form::FormType; - if (*type == "submit") { - formType = Form::SubmitType; - } - else if (*type == "cancel") { - formType = Form::CancelType; - } - else if (*type == "result") { - formType = Form::ResultType; - } - result->setType(formType); - } - - lua_getfield(L, -1, "fields"); - if (lua_istable(L, -1)) { - foreach (boost::shared_ptr<FormField> formField, convertFieldListFromLua(L)) { - result->addField(formField); - } - } - lua_pop(L, 1); - - lua_getfield(L, -1, "reported_fields"); - if (lua_istable(L, -1)) { - foreach (boost::shared_ptr<FormField> formField, convertFieldListFromLua(L)) { - result->addReportedField(formField); - } - } - lua_pop(L, 1); - - lua_getfield(L, -1, "items"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2);) { - result->addItem(convertFieldListFromLua(L)); - lua_pop(L, 1); - } - } - lua_pop(L, 1); - - return result; - } - - void convertFormToLua(lua_State* L, boost::shared_ptr<Form> payload) { - std::string type; - switch (payload->getType()) { - case Form::FormType: type = "form"; break; - case Form::SubmitType: type = "submit"; break; - case Form::CancelType: type = "cancel"; break; - case Form::ResultType: type = "result"; break; - } - - Lua::Table result = boost::assign::map_list_of("type", Lua::valueRef(type)); - if (!payload->getTitle().empty()) { - result["title"] = Lua::valueRef(payload->getTitle()); - } - if (!payload->getInstructions().empty()) { - result["instructions"] = Lua::valueRef(payload->getInstructions()); - } - if (!payload->getFields().empty()) { - result["fields"] = valueRef(convertFieldListToLua(payload->getFields())); - } - if (!payload->getReportedFields().empty()) { - result["reported_fields"] = valueRef(convertFieldListToLua(payload->getReportedFields())); - } - - if (!payload->getItems().empty()) { - Lua::Array luaItems; - foreach(const Form::FormItem& item, payload->getItems()) { - if (!item.empty()) { - luaItems.push_back(convertFieldListToLua(item)); - } - } - result["items"] = valueRef(luaItems); - } - - Lua::pushValue(L, result); - - lua_newtable(L); - lua_pushcfunction(L, formIndex); - lua_setfield(L, -2, "__index"); - lua_pushcfunction(L, formNewIndex); - lua_setfield(L, -2, "__newindex"); - lua_setmetatable(L, -2); - } - - int createSubmission(lua_State* L) { - boost::shared_ptr<Form> form = convertFormFromLua(L); - - // Remove all redundant elements - form->setInstructions(""); - form->setTitle(""); - form->clearItems(); - form->clearReportedFields(); - std::vector< boost::shared_ptr<FormField> > fields(form->getFields()); - form->clearFields(); - foreach (boost::shared_ptr<FormField> field, fields) { - if (field->getType() == FormField::FixedType) { - continue; - } - field->clearOptions(); - field->setLabel(""); - field->setType(FormField::UnknownType); - field->setDescription(""); - form->addField(field); - } - form->setType(Form::SubmitType); - - // Convert back - convertFormToLua(L, form); - Lua::registerTableToString(L, -1); - - return 1; - } + int formIndex(lua_State* L) { + lua_getfield(L, 1, "fields"); + if (lua_type(L, -1) != LUA_TTABLE) { + return 0; + } + int index = Lua::absoluteOffset(L, -1); + lua_pushnil(L); + for (lua_pushnil(L); lua_next(L, index) != 0; ) { + lua_getfield(L, -1, "name"); + if (lua_equal(L, -1, 2)) { + lua_pop(L, 1); + return 1; + } + lua_pop(L, 2); + } + return 0; + } + + int formNewIndex(lua_State* L) { + lua_getfield(L, 1, "fields"); + bool foundField = false; + if (lua_type(L, -1) == LUA_TTABLE) { + for (lua_pushnil(L); lua_next(L, -2) != 0; ) { + lua_getfield(L, -1, "name"); + if (lua_equal(L, -1, 2)) { + lua_pushvalue(L, 3); + lua_setfield(L, -3, "value"); + foundField = true; + lua_pop(L, 3); + break; + } + lua_pop(L, 2); + } + } + lua_pop(L, 1); + + if (!foundField) { + lua_pushvalue(L, 2); + lua_pushvalue(L, 3); + lua_rawset(L, 1); + } + return 0; + } + + Lua::Table convertFieldToLua(std::shared_ptr<FormField> field) { + Lua::Table luaField = boost::assign::map_list_of("name", Lua::valueRef(field->getName())); + std::string type; + switch (field->getType()) { + case FormField::UnknownType: type = ""; break; + case FormField::BooleanType: type = "boolean"; break; + case FormField::FixedType: type = "fixed"; break; + case FormField::HiddenType: type = "hidden"; break; + case FormField::ListSingleType: type = "list-single"; break; + case FormField::TextMultiType: type = "text-multi"; break; + case FormField::TextPrivateType: type = "text-private"; break; + case FormField::TextSingleType: type = "text-single"; break; + case FormField::JIDSingleType: type = "jid-single"; break; + case FormField::JIDMultiType: type = "jid-multi"; break; + case FormField::ListMultiType: type = "list-multi"; break; + } + if (!type.empty()) { + luaField["type"] = Lua::valueRef(type); + } + if (!field->getLabel().empty()) { + luaField["label"] = Lua::valueRef(field->getLabel()); + } + if (field->getRequired()) { + luaField["required"] = Lua::boolRef(field->getRequired()); + } + if (!field->getDescription().empty()) { + luaField["description"] = Lua::valueRef(field->getDescription()); + } + if (field->getType() == FormField::BooleanType) { + luaField["value"] = Lua::boolRef(field->getBoolValue()); + } + else if (field->getValues().size() > 1) { + luaField["value"] = Lua::valueRef(Lua::Array(field->getValues().begin(), field->getValues().end())); + } + else if (field->getValues().size() == 1) { + luaField["value"] = Lua::valueRef(field->getValues()[0]); + } + if (!field->getOptions().empty()) { + Lua::Array options; + for (const auto& option : field->getOptions()) { + Lua::Table luaOption = boost::assign::map_list_of + ("label", Lua::valueRef(option.label)) + ("value", Lua::valueRef(option.value)); + options.push_back(luaOption); + } + luaField["options"] = valueRef(options); + } + return luaField; + } + + Lua::Array convertFieldListToLua(const std::vector< std::shared_ptr<FormField> >& fieldList) { + Lua::Array fields; + for (auto&& field : fieldList) { + fields.push_back(convertFieldToLua(field)); + } + return fields; + } + + + std::shared_ptr<FormField> convertFieldFromLua(lua_State* L) { + std::shared_ptr<FormField> result = std::make_shared<FormField>(); + FormField::Type fieldType = FormField::UnknownType; + boost::optional<std::string> type = Lua::getStringField(L, -1, "type"); + if (type) { + if (*type == "boolean") { + fieldType = FormField::BooleanType; + } + if (*type == "fixed") { + fieldType = FormField::FixedType; + } + if (*type == "hidden") { + fieldType = FormField::HiddenType; + } + if (*type == "list-single") { + fieldType = FormField::ListSingleType; + } + if (*type == "text-multi") { + fieldType = FormField::TextMultiType; + } + if (*type == "text-private") { + fieldType = FormField::TextPrivateType; + } + if (*type == "text-single") { + fieldType = FormField::TextSingleType; + } + if (*type == "jid-single") { + fieldType = FormField::JIDSingleType; + } + if (*type == "jid-multi") { + fieldType = FormField::JIDMultiType; + } + if (*type == "list-multi") { + fieldType = FormField::ListMultiType; + } + } + result->setType(fieldType); + if (boost::optional<std::string> name = Lua::getStringField(L, -1, "name")) { + result->setName(*name); + } + if (boost::optional<std::string> description = Lua::getStringField(L, -1, "description")) { + result->setDescription(*description); + } + if (boost::optional<std::string> label = Lua::getStringField(L, -1, "label")) { + result->setLabel(*label); + } + if (boost::optional<bool> required = Lua::getBooleanField(L, -1, "required")) { + result->setRequired(*required); + } + if (boost::optional<std::string> value = Lua::getStringField(L, -1, "value")) { + result->addValue(*value); + } + else if (boost::optional<bool> value = Lua::getBooleanField(L, -1, "value")) { + result->setBoolValue(*value); + } + else { + lua_getfield(L, -1, "value"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + if (lua_isstring(L, -1)) { + result->addValue(lua_tostring(L, -1)); + } + lua_pop(L, 1); + } + } + lua_pop(L, 1); + } + lua_getfield(L, -1, "options"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + if (lua_istable(L, -1)) { + FormField::Option option("", ""); + if (boost::optional<std::string> value = Lua::getStringField(L, -1, "value")) { + option.value = *value; + } + if (boost::optional<std::string> label = Lua::getStringField(L, -1, "label")) { + option.label = *label; + } + result->addOption(option); + } + lua_pop(L, 1); + } + } + lua_pop(L, 1); + return result; + } + + std::vector< std::shared_ptr<FormField> > convertFieldListFromLua(lua_State* L) { + std::vector< std::shared_ptr<FormField> > result; + for (lua_pushnil(L); lua_next(L, -2);) { + result.push_back(convertFieldFromLua(L)); + lua_pop(L, 1); + } + return result; + } + + std::shared_ptr<Form> convertFormFromLua(lua_State* L) { + std::shared_ptr<Form> result = std::make_shared<Form>(); + if (boost::optional<std::string> title = Lua::getStringField(L, -1, "title")) { + result->setTitle(*title); + } + if (boost::optional<std::string> instructions = Lua::getStringField(L, -1, "instructions")) { + result->setInstructions(*instructions); + } + if (boost::optional<std::string> type = Lua::getStringField(L, -1, "type")) { + Form::Type formType = Form::FormType; + if (*type == "submit") { + formType = Form::SubmitType; + } + else if (*type == "cancel") { + formType = Form::CancelType; + } + else if (*type == "result") { + formType = Form::ResultType; + } + result->setType(formType); + } + + lua_getfield(L, -1, "fields"); + if (lua_istable(L, -1)) { + for (auto&& formField : convertFieldListFromLua(L)) { + result->addField(formField); + } + } + lua_pop(L, 1); + + lua_getfield(L, -1, "reported_fields"); + if (lua_istable(L, -1)) { + for (auto&& formField : convertFieldListFromLua(L)) { + result->addReportedField(formField); + } + } + lua_pop(L, 1); + + lua_getfield(L, -1, "items"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2);) { + result->addItem(convertFieldListFromLua(L)); + lua_pop(L, 1); + } + } + lua_pop(L, 1); + + return result; + } + + void convertFormToLua(lua_State* L, std::shared_ptr<Form> payload) { + std::string type; + switch (payload->getType()) { + case Form::FormType: type = "form"; break; + case Form::SubmitType: type = "submit"; break; + case Form::CancelType: type = "cancel"; break; + case Form::ResultType: type = "result"; break; + } + + Lua::Table result = boost::assign::map_list_of("type", Lua::valueRef(type)); + if (!payload->getTitle().empty()) { + result["title"] = Lua::valueRef(payload->getTitle()); + } + if (!payload->getInstructions().empty()) { + result["instructions"] = Lua::valueRef(payload->getInstructions()); + } + result["fields"] = valueRef(convertFieldListToLua(payload->getFields())); + if (!payload->getReportedFields().empty()) { + result["reported_fields"] = valueRef(convertFieldListToLua(payload->getReportedFields())); + } + + if (!payload->getItems().empty()) { + Lua::Array luaItems; + for (const auto& item : payload->getItems()) { + if (!item.empty()) { + luaItems.push_back(convertFieldListToLua(item)); + } + } + result["items"] = valueRef(luaItems); + } + + Lua::pushValue(L, result); + + lua_newtable(L); + lua_pushcfunction(L, formIndex); + lua_setfield(L, -2, "__index"); + lua_pushcfunction(L, formNewIndex); + lua_setfield(L, -2, "__newindex"); + lua_setmetatable(L, -2); + } + + int createSubmission(lua_State* L) { + std::shared_ptr<Form> form = convertFormFromLua(L); + + // Remove all redundant elements + form->setInstructions(""); + form->setTitle(""); + form->clearItems(); + form->clearReportedFields(); + std::vector< std::shared_ptr<FormField> > fields(form->getFields()); + form->clearFields(); + for (auto&& field : fields) { + if (field->getType() == FormField::FixedType) { + continue; + } + field->clearOptions(); + field->setLabel(""); + field->setType(FormField::UnknownType); + field->setDescription(""); + form->addField(field); + } + form->setType(Form::SubmitType); + + // Convert back + convertFormToLua(L, form); + Lua::registerTableToString(L, -1); + + return 1; + } } FormConvertor::FormConvertor() : GenericLuaElementConvertor<Form>("form") { @@ -346,14 +346,14 @@ FormConvertor::FormConvertor() : GenericLuaElementConvertor<Form>("form") { FormConvertor::~FormConvertor() { } -boost::shared_ptr<Form> FormConvertor::doConvertFromLua(lua_State* L) { - return convertFormFromLua(L); +std::shared_ptr<Form> FormConvertor::doConvertFromLua(lua_State* L) { + return convertFormFromLua(L); } -void FormConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<Form> payload) { - convertFormToLua(L, payload); +void FormConvertor::doConvertToLua(lua_State* L, std::shared_ptr<Form> payload) { + convertFormToLua(L, payload); - lua_pushstring(L, "create_submission"); - lua_pushcfunction(L, createSubmission); - lua_rawset(L, -3); + lua_pushstring(L, "create_submission"); + lua_pushcfunction(L, createSubmission); + lua_rawset(L, -3); } diff --git a/Sluift/ElementConvertors/FormConvertor.h b/Sluift/ElementConvertors/FormConvertor.h index 3c1542f..b32a940 100644 --- a/Sluift/ElementConvertors/FormConvertor.h +++ b/Sluift/ElementConvertors/FormConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,17 +7,17 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/Form.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/Form.h> namespace Swift { - class FormConvertor : public GenericLuaElementConvertor<Form> { - public: - FormConvertor(); - virtual ~FormConvertor(); + class FormConvertor : public GenericLuaElementConvertor<Form> { + public: + FormConvertor(); + virtual ~FormConvertor(); - virtual boost::shared_ptr<Form> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<Form>) SWIFTEN_OVERRIDE; - }; + virtual std::shared_ptr<Form> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<Form>) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/ForwardedConvertor.cpp b/Sluift/ElementConvertors/ForwardedConvertor.cpp index a6ec79c..b353eea 100644 --- a/Sluift/ElementConvertors/ForwardedConvertor.cpp +++ b/Sluift/ElementConvertors/ForwardedConvertor.cpp @@ -1,72 +1,74 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ +#include <Sluift/ElementConvertors/ForwardedConvertor.h> + +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <boost/smart_ptr/make_shared.hpp> + #include <lua.hpp> -#include <Swiften/Base/foreach.h> -#include <Sluift/ElementConvertors/ForwardedConvertor.h> -#include <Sluift/LuaElementConvertors.h> + #include <Swiften/Elements/Delay.h> #include <Swiften/Elements/IQ.h> -#include <Swiften/Elements/Presence.h> #include <Swiften/Elements/Message.h> +#include <Swiften/Elements/Presence.h> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -ForwardedConvertor::ForwardedConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<Forwarded>("forwarded"), - convertors(convertors) { +ForwardedConvertor::ForwardedConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<Forwarded>("forwarded"), + convertors(convertors) { } ForwardedConvertor::~ForwardedConvertor() { } -boost::shared_ptr<Forwarded> ForwardedConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<Forwarded> result = boost::make_shared<Forwarded>(); - lua_getfield(L, -1, "delay"); - if (!lua_isnil(L, -1)) { - boost::shared_ptr<Delay> delay = boost::dynamic_pointer_cast<Delay>(convertors->convertFromLuaUntyped(L, -1, "delay")); - if (!!delay) { - result->setDelay(delay); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "stanza"); - if (!lua_isnil(L, -1)) { - boost::shared_ptr<Stanza> stanza = boost::dynamic_pointer_cast<Stanza>(convertors->convertFromLua(L, -1)); - if (!!stanza) { - result->setStanza(stanza); - } - lua_pop(L, 1); - return result; - } - return result; +std::shared_ptr<Forwarded> ForwardedConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<Forwarded> result = std::make_shared<Forwarded>(); + lua_getfield(L, -1, "delay"); + if (!lua_isnil(L, -1)) { + std::shared_ptr<Delay> delay = std::dynamic_pointer_cast<Delay>(convertors->convertFromLuaUntyped(L, -1, "delay")); + if (!!delay) { + result->setDelay(delay); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "stanza"); + if (!lua_isnil(L, -1)) { + std::shared_ptr<Stanza> stanza = std::dynamic_pointer_cast<Stanza>(convertors->convertFromLua(L, -1)); + if (!!stanza) { + result->setStanza(stanza); + } + lua_pop(L, 1); + return result; + } + return result; } -void ForwardedConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<Forwarded> payload) { - lua_createtable(L, 0, 0); - if (convertors->convertToLuaUntyped(L, payload->getDelay()) > 0) { - lua_setfield(L, -2, "delay"); - } - boost::shared_ptr<Stanza> stanza = payload->getStanza(); - if (!!stanza) { - if (convertors->convertToLua(L, stanza) > 0) { - lua_setfield(L, -2, "stanza"); - } - } +void ForwardedConvertor::doConvertToLua(lua_State* L, std::shared_ptr<Forwarded> payload) { + lua_createtable(L, 0, 0); + if (convertors->convertToLuaUntyped(L, payload->getDelay()) > 0) { + lua_setfield(L, -2, "delay"); + } + std::shared_ptr<Stanza> stanza = payload->getStanza(); + if (!!stanza) { + if (convertors->convertToLua(L, stanza) > 0) { + lua_setfield(L, -2, "stanza"); + } + } } boost::optional<LuaElementConvertor::Documentation> ForwardedConvertor::getDocumentation() const { - return Documentation( - "Forwarded", - "This table has the following fields:\n\n" - "- `delay`: @{Delay} (Optional)\n" - "- `stanza`: @{Stanza} (Optional)\n" - ); + return Documentation( + "Forwarded", + "This table has the following fields:\n\n" + "- `delay`: @{Delay} (Optional)\n" + "- `stanza`: @{Stanza} (Optional)\n" + ); } diff --git a/Sluift/ElementConvertors/ForwardedConvertor.h b/Sluift/ElementConvertors/ForwardedConvertor.h index a7d2586..a83b5f4 100644 --- a/Sluift/ElementConvertors/ForwardedConvertor.h +++ b/Sluift/ElementConvertors/ForwardedConvertor.h @@ -1,30 +1,31 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Sluift/GenericLuaElementConvertor.h> #include <Swiften/Base/Override.h> #include <Swiften/Elements/Forwarded.h> +#include <Sluift/GenericLuaElementConvertor.h> + namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class ForwardedConvertor : public GenericLuaElementConvertor<Forwarded> { - public: - ForwardedConvertor(LuaElementConvertors* convertors); - virtual ~ForwardedConvertor(); + class ForwardedConvertor : public GenericLuaElementConvertor<Forwarded> { + public: + ForwardedConvertor(LuaElementConvertors* convertors); + virtual ~ForwardedConvertor(); - virtual boost::shared_ptr<Forwarded> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<Forwarded>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<Forwarded> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<Forwarded>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - private: - LuaElementConvertors* convertors; - }; + private: + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/IQConvertor.cpp b/Sluift/ElementConvertors/IQConvertor.cpp index e9119cb..67a4a2a 100644 --- a/Sluift/ElementConvertors/IQConvertor.cpp +++ b/Sluift/ElementConvertors/IQConvertor.cpp @@ -1,74 +1,75 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ -#include <boost/smart_ptr/make_shared.hpp> -#include <lua.hpp> #include <Sluift/ElementConvertors/IQConvertor.h> -#include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <memory> + +#include <lua.hpp> + +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -IQConvertor::IQConvertor(LuaElementConvertors* convertors) : - StanzaConvertor<IQ>("iq"), - convertors(convertors) { +IQConvertor::IQConvertor(LuaElementConvertors* convertors) : + StanzaConvertor<IQ>("iq"), + convertors(convertors) { } IQConvertor::~IQConvertor() { } -boost::shared_ptr<IQ> IQConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<IQ> result = getStanza(L, convertors); - lua_getfield(L, -1, "type"); - if (lua_isstring(L, -1)) { - result->setType(IQConvertor::convertIQTypeFromString(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<IQ> IQConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<IQ> result = getStanza(L, convertors); + lua_getfield(L, -1, "type"); + if (lua_isstring(L, -1)) { + result->setType(IQConvertor::convertIQTypeFromString(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void IQConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<IQ> stanza) { - pushStanza(L, stanza, convertors); - const std::string type = IQConvertor::convertIQTypeToString(stanza->getType()); - lua_pushstring(L, type.c_str()); - lua_setfield(L, -2, "type"); +void IQConvertor::doConvertToLua(lua_State* L, std::shared_ptr<IQ> stanza) { + pushStanza(L, stanza, convertors); + const std::string type = IQConvertor::convertIQTypeToString(stanza->getType()); + lua_pushstring(L, type.c_str()); + lua_setfield(L, -2, "type"); } boost::optional<LuaElementConvertor::Documentation> IQConvertor::getDocumentation() const { - return Documentation( - "IQ", - "This table has the following fields:\n\n" - "- `type`: string\n" - "- `id`: string\n" - "- `from`: string\n" - "- `to`: string\n" - "- `payloads`: array<@{Payload}>\n" - ); + return Documentation( + "IQ", + "This table has the following fields:\n\n" + "- `type`: string\n" + "- `id`: string\n" + "- `from`: string\n" + "- `to`: string\n" + "- `payloads`: array<@{Payload}>\n" + ); } std::string IQConvertor::convertIQTypeToString(IQ::Type type) { - switch (type) { - case IQ::Get: return "get"; - case IQ::Set: return "set"; - case IQ::Result: return "result"; - case IQ::Error: return "error"; - } - assert(false); - return ""; + switch (type) { + case IQ::Get: return "get"; + case IQ::Set: return "set"; + case IQ::Result: return "result"; + case IQ::Error: return "error"; + } + assert(false); + return ""; } IQ::Type IQConvertor::convertIQTypeFromString(const std::string& type) { - if (type == "get") { - return IQ::Get; - } - else if (type == "set") { - return IQ::Set; - } - else { - throw Lua::Exception("Illegal query type: '" + type + "'"); - } + if (type == "get") { + return IQ::Get; + } + else if (type == "set") { + return IQ::Set; + } + else { + throw Lua::Exception("Illegal query type: '" + type + "'"); + } } diff --git a/Sluift/ElementConvertors/IQConvertor.h b/Sluift/ElementConvertors/IQConvertor.h index b5351b7..859900a 100644 --- a/Sluift/ElementConvertors/IQConvertor.h +++ b/Sluift/ElementConvertors/IQConvertor.h @@ -1,33 +1,34 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Sluift/ElementConvertors/StanzaConvertor.h> #include <Swiften/Base/Override.h> #include <Swiften/Elements/IQ.h> +#include <Sluift/ElementConvertors/StanzaConvertor.h> + namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class IQConvertor : public StanzaConvertor<IQ> { - public: - IQConvertor(LuaElementConvertors* convertors); - virtual ~IQConvertor(); + class IQConvertor : public StanzaConvertor<IQ> { + public: + IQConvertor(LuaElementConvertors* convertors); + virtual ~IQConvertor(); - virtual boost::shared_ptr<IQ> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<IQ>) SWIFTEN_OVERRIDE; + virtual std::shared_ptr<IQ> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<IQ>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - static std::string convertIQTypeToString(IQ::Type type); - static IQ::Type convertIQTypeFromString(const std::string& type); + static std::string convertIQTypeToString(IQ::Type type); + static IQ::Type convertIQTypeFromString(const std::string& type); - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/IsodeIQDelegationConvertor.cpp b/Sluift/ElementConvertors/IsodeIQDelegationConvertor.cpp index c60a7aa..56b4a80 100644 --- a/Sluift/ElementConvertors/IsodeIQDelegationConvertor.cpp +++ b/Sluift/ElementConvertors/IsodeIQDelegationConvertor.cpp @@ -1,52 +1,50 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/IsodeIQDelegationConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -IsodeIQDelegationConvertor::IsodeIQDelegationConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<IsodeIQDelegation>("isode_iq_delegation"), - convertors(convertors) { +IsodeIQDelegationConvertor::IsodeIQDelegationConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<IsodeIQDelegation>("isode_iq_delegation"), + convertors(convertors) { } IsodeIQDelegationConvertor::~IsodeIQDelegationConvertor() { } -boost::shared_ptr<IsodeIQDelegation> IsodeIQDelegationConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<IsodeIQDelegation> result = boost::make_shared<IsodeIQDelegation>(); - lua_getfield(L, -1, "forward"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<Forwarded> payload = boost::dynamic_pointer_cast<Forwarded>(convertors->convertFromLuaUntyped(L, -1, "forwarded"))) { - result->setForward(payload); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<IsodeIQDelegation> IsodeIQDelegationConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<IsodeIQDelegation> result = std::make_shared<IsodeIQDelegation>(); + lua_getfield(L, -1, "forward"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<Forwarded> payload = std::dynamic_pointer_cast<Forwarded>(convertors->convertFromLuaUntyped(L, -1, "forwarded"))) { + result->setForward(payload); + } + } + lua_pop(L, 1); + return result; } -void IsodeIQDelegationConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<IsodeIQDelegation> payload) { - lua_createtable(L, 0, 0); - if (convertors->convertToLuaUntyped(L, payload->getForward()) > 0) { - lua_setfield(L, -2, "forward"); - } +void IsodeIQDelegationConvertor::doConvertToLua(lua_State* L, std::shared_ptr<IsodeIQDelegation> payload) { + lua_createtable(L, 0, 0); + if (convertors->convertToLuaUntyped(L, payload->getForward()) > 0) { + lua_setfield(L, -2, "forward"); + } } boost::optional<LuaElementConvertor::Documentation> IsodeIQDelegationConvertor::getDocumentation() const { - return Documentation( - "IsodeIQDelegation", - "This table has the following fields:\n\n" - "- `forward`: @{Forwarded}\n" - ); + return Documentation( + "IsodeIQDelegation", + "This table has the following fields:\n\n" + "- `forward`: @{Forwarded}\n" + ); } diff --git a/Sluift/ElementConvertors/IsodeIQDelegationConvertor.h b/Sluift/ElementConvertors/IsodeIQDelegationConvertor.h index 5af4944..f8b8c4a 100644 --- a/Sluift/ElementConvertors/IsodeIQDelegationConvertor.h +++ b/Sluift/ElementConvertors/IsodeIQDelegationConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/IsodeIQDelegation.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/IsodeIQDelegation.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class IsodeIQDelegationConvertor : public GenericLuaElementConvertor<IsodeIQDelegation> { - public: - IsodeIQDelegationConvertor(LuaElementConvertors* convertors); - virtual ~IsodeIQDelegationConvertor(); + class IsodeIQDelegationConvertor : public GenericLuaElementConvertor<IsodeIQDelegation> { + public: + IsodeIQDelegationConvertor(LuaElementConvertors* convertors); + virtual ~IsodeIQDelegationConvertor(); - virtual boost::shared_ptr<IsodeIQDelegation> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<IsodeIQDelegation>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<IsodeIQDelegation> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<IsodeIQDelegation>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/MAMFinConvertor.cpp b/Sluift/ElementConvertors/MAMFinConvertor.cpp index 25e4406..4fb8201 100644 --- a/Sluift/ElementConvertors/MAMFinConvertor.cpp +++ b/Sluift/ElementConvertors/MAMFinConvertor.cpp @@ -1,78 +1,81 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ +#include <Sluift/ElementConvertors/MAMFinConvertor.h> + +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <boost/smart_ptr/make_shared.hpp> + #include <lua.hpp> -#include <Sluift/ElementConvertors/MAMFinConvertor.h> -#include <Sluift/LuaElementConvertors.h> + #include <Swiften/Elements/ResultSet.h> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -MAMFinConvertor::MAMFinConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<MAMFin>("mam_fin"), - convertors(convertors) { +MAMFinConvertor::MAMFinConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<MAMFin>("mam_fin"), + convertors(convertors) { } MAMFinConvertor::~MAMFinConvertor() { } -boost::shared_ptr<MAMFin> MAMFinConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<MAMFin> result = boost::make_shared<MAMFin>(); - lua_getfield(L, -1, "query_id"); - if (lua_isstring(L, -1)) { - result->setQueryID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "complete"); - if (lua_isboolean(L, -1)) { - result->setComplete(lua_toboolean(L, -1) != 0); - } - lua_pop(L, 1); - lua_getfield(L, -1, "stable"); - if (!lua_isnil(L, -1)) { - result->setStable(lua_toboolean(L, -1) != 0); - } - lua_pop(L, 1); - lua_getfield(L, -1, "result_set"); - if (!lua_isnil(L, -1)) { - boost::shared_ptr<ResultSet> resultSet = boost::dynamic_pointer_cast<ResultSet>(convertors->convertFromLuaUntyped(L, -1, "result_set")); - if (!!resultSet) { - result->setResultSet(resultSet); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<MAMFin> MAMFinConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<MAMFin> result = std::make_shared<MAMFin>(); + lua_getfield(L, -1, "query_id"); + if (lua_isstring(L, -1)) { + result->setQueryID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "complete"); + if (lua_isboolean(L, -1)) { + result->setComplete(lua_toboolean(L, -1) != 0); + } + lua_pop(L, 1); + lua_getfield(L, -1, "stable"); + if (!lua_isnil(L, -1)) { + result->setStable(lua_toboolean(L, -1) != 0); + } + lua_pop(L, 1); + lua_getfield(L, -1, "result_set"); + if (!lua_isnil(L, -1)) { + std::shared_ptr<ResultSet> resultSet = std::dynamic_pointer_cast<ResultSet>(convertors->convertFromLuaUntyped(L, -1, "result_set")); + if (!!resultSet) { + result->setResultSet(resultSet); + } + } + lua_pop(L, 1); + return result; } -void MAMFinConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<MAMFin> payload) { - lua_createtable(L, 0, 0); - if (payload->getQueryID()) { - lua_pushstring(L, (*payload->getQueryID()).c_str()); - lua_setfield(L, -2, "query_id"); - } - lua_pushboolean(L, payload->isComplete()); - lua_setfield(L, -2, "complete"); - lua_pushboolean(L, payload->isStable()); - lua_setfield(L, -2, "stable"); - if (convertors->convertToLuaUntyped(L, payload->getResultSet()) > 0) { - lua_setfield(L, -2, "result_set"); - } +void MAMFinConvertor::doConvertToLua(lua_State* L, std::shared_ptr<MAMFin> payload) { + lua_createtable(L, 0, 0); + if (payload->getQueryID()) { + lua_pushstring(L, (*payload->getQueryID()).c_str()); + lua_setfield(L, -2, "query_id"); + } + lua_pushboolean(L, payload->isComplete()); + lua_setfield(L, -2, "complete"); + lua_pushboolean(L, payload->isStable()); + lua_setfield(L, -2, "stable"); + if (convertors->convertToLuaUntyped(L, payload->getResultSet()) > 0) { + lua_setfield(L, -2, "result_set"); + } } boost::optional<LuaElementConvertor::Documentation> MAMFinConvertor::getDocumentation() const { - return Documentation( - "MAMFin", - "This table has the following fields:\n\n" - "- `query_id`: string (Optional)\n" - "- `complete`: boolean (Optional)\n" - "- `stable`: boolean (Optional)\n" - "- `result_set`: @{ResultSet} (Optional)\n" - ); + return Documentation( + "MAMFin", + "This table has the following fields:\n\n" + "- `query_id`: string (Optional)\n" + "- `complete`: boolean (Optional)\n" + "- `stable`: boolean (Optional)\n" + "- `result_set`: @{ResultSet} (Optional)\n" + ); } diff --git a/Sluift/ElementConvertors/MAMFinConvertor.h b/Sluift/ElementConvertors/MAMFinConvertor.h index 4021c00..371076a 100644 --- a/Sluift/ElementConvertors/MAMFinConvertor.h +++ b/Sluift/ElementConvertors/MAMFinConvertor.h @@ -1,29 +1,30 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Sluift/GenericLuaElementConvertor.h> #include <Swiften/Base/Override.h> #include <Swiften/Elements/MAMFin.h> +#include <Sluift/GenericLuaElementConvertor.h> + namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class MAMFinConvertor : public GenericLuaElementConvertor<MAMFin> { - public: - MAMFinConvertor(LuaElementConvertors* convertors); - virtual ~MAMFinConvertor(); + class MAMFinConvertor : public GenericLuaElementConvertor<MAMFin> { + public: + MAMFinConvertor(LuaElementConvertors* convertors); + virtual ~MAMFinConvertor(); - virtual boost::shared_ptr<MAMFin> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<MAMFin>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<MAMFin> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<MAMFin>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/MAMQueryConvertor.cpp b/Sluift/ElementConvertors/MAMQueryConvertor.cpp index d53fd9b..52337ce 100644 --- a/Sluift/ElementConvertors/MAMQueryConvertor.cpp +++ b/Sluift/ElementConvertors/MAMQueryConvertor.cpp @@ -1,85 +1,88 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ +#include <Sluift/ElementConvertors/MAMQueryConvertor.h> + +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <boost/smart_ptr/make_shared.hpp> + #include <lua.hpp> -#include <Sluift/ElementConvertors/MAMQueryConvertor.h> -#include <Sluift/LuaElementConvertors.h> + #include <Swiften/Elements/Form.h> #include <Swiften/Elements/ResultSet.h> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -MAMQueryConvertor::MAMQueryConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<MAMQuery>("mam"), - convertors(convertors) { +MAMQueryConvertor::MAMQueryConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<MAMQuery>("mam"), + convertors(convertors) { } MAMQueryConvertor::~MAMQueryConvertor() { } -boost::shared_ptr<MAMQuery> MAMQueryConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<MAMQuery> result = boost::make_shared<MAMQuery>(); - lua_getfield(L, -1, "query_id"); - if (lua_isstring(L, -1)) { - result->setQueryID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "form"); - if (!lua_isnil(L, -1)) { - boost::shared_ptr<Form> form = boost::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form")); - if (!!form) { - result->setForm(form); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "result_set"); - if (!lua_isnil(L, -1)) { - boost::shared_ptr<ResultSet> resultSet = boost::dynamic_pointer_cast<ResultSet>(convertors->convertFromLuaUntyped(L, -1, "result_set")); - if (!!resultSet) { - result->setResultSet(resultSet); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<MAMQuery> MAMQueryConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<MAMQuery> result = std::make_shared<MAMQuery>(); + lua_getfield(L, -1, "query_id"); + if (lua_isstring(L, -1)) { + result->setQueryID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "form"); + if (!lua_isnil(L, -1)) { + std::shared_ptr<Form> form = std::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form")); + if (!!form) { + result->setForm(form); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "result_set"); + if (!lua_isnil(L, -1)) { + std::shared_ptr<ResultSet> resultSet = std::dynamic_pointer_cast<ResultSet>(convertors->convertFromLuaUntyped(L, -1, "result_set")); + if (!!resultSet) { + result->setResultSet(resultSet); + } + } + lua_pop(L, 1); + return result; } -void MAMQueryConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<MAMQuery> payload) { - lua_createtable(L, 0, 0); - if (payload->getQueryID()) { - lua_pushstring(L, (*payload->getQueryID()).c_str()); - lua_setfield(L, -2, "query_id"); - } - if (payload->getNode()) { - lua_pushstring(L, (*payload->getNode()).c_str()); - lua_setfield(L, -2, "node"); - } - if (convertors->convertToLuaUntyped(L, payload->getForm()) > 0) { - lua_setfield(L, -2, "form"); - } - if (convertors->convertToLuaUntyped(L, payload->getResultSet()) > 0) { - lua_setfield(L, -2, "result_set"); - } +void MAMQueryConvertor::doConvertToLua(lua_State* L, std::shared_ptr<MAMQuery> payload) { + lua_createtable(L, 0, 0); + if (payload->getQueryID()) { + lua_pushstring(L, (*payload->getQueryID()).c_str()); + lua_setfield(L, -2, "query_id"); + } + if (payload->getNode()) { + lua_pushstring(L, (*payload->getNode()).c_str()); + lua_setfield(L, -2, "node"); + } + if (convertors->convertToLuaUntyped(L, payload->getForm()) > 0) { + lua_setfield(L, -2, "form"); + } + if (convertors->convertToLuaUntyped(L, payload->getResultSet()) > 0) { + lua_setfield(L, -2, "result_set"); + } } boost::optional<LuaElementConvertor::Documentation> MAMQueryConvertor::getDocumentation() const { - return Documentation( - "MAMQuery", - "This table has the following fields:\n\n" - "- `query_id`: string (Optional)\n" - "- `node`: string (Optional)\n" - "- `form`: string @{Form} (Optional)\n" - "- `result_set`: @{ResultSet} (Optional)\n" - ); + return Documentation( + "MAMQuery", + "This table has the following fields:\n\n" + "- `query_id`: string (Optional)\n" + "- `node`: string (Optional)\n" + "- `form`: string @{Form} (Optional)\n" + "- `result_set`: @{ResultSet} (Optional)\n" + ); } diff --git a/Sluift/ElementConvertors/MAMQueryConvertor.h b/Sluift/ElementConvertors/MAMQueryConvertor.h index 5169607..4ee119e 100644 --- a/Sluift/ElementConvertors/MAMQueryConvertor.h +++ b/Sluift/ElementConvertors/MAMQueryConvertor.h @@ -1,29 +1,30 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Sluift/GenericLuaElementConvertor.h> #include <Swiften/Base/Override.h> #include <Swiften/Elements/MAMQuery.h> +#include <Sluift/GenericLuaElementConvertor.h> + namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class MAMQueryConvertor : public GenericLuaElementConvertor<MAMQuery> { - public: - MAMQueryConvertor(LuaElementConvertors* convertors); - virtual ~MAMQueryConvertor(); + class MAMQueryConvertor : public GenericLuaElementConvertor<MAMQuery> { + public: + MAMQueryConvertor(LuaElementConvertors* convertors); + virtual ~MAMQueryConvertor(); - virtual boost::shared_ptr<MAMQuery> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<MAMQuery>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<MAMQuery> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<MAMQuery>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/MAMResultConvertor.cpp b/Sluift/ElementConvertors/MAMResultConvertor.cpp index c163201..25b4c39 100644 --- a/Sluift/ElementConvertors/MAMResultConvertor.cpp +++ b/Sluift/ElementConvertors/MAMResultConvertor.cpp @@ -1,71 +1,73 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ +#include <Sluift/ElementConvertors/MAMResultConvertor.h> + +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <boost/smart_ptr/make_shared.hpp> + #include <lua.hpp> -#include <Sluift/ElementConvertors/MAMResultConvertor.h> -#include <Sluift/LuaElementConvertors.h> -#include <Swiften/Elements/Forwarded.h> +#include <Swiften/Elements/Forwarded.h> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -MAMResultConvertor::MAMResultConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<MAMResult>("mam_result"), - convertors(convertors) { +MAMResultConvertor::MAMResultConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<MAMResult>("mam_result"), + convertors(convertors) { } MAMResultConvertor::~MAMResultConvertor() { } -boost::shared_ptr<MAMResult> MAMResultConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<MAMResult> result = boost::make_shared<MAMResult>(); - lua_getfield(L, -1, "payload"); - if (!lua_isnil(L, -1)) { - boost::shared_ptr<Forwarded> payload = boost::dynamic_pointer_cast<Forwarded>(convertors->convertFromLuaUntyped(L, -1, "payload")); - if (!!payload) { - result->setPayload(payload); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "id"); - if (lua_isstring(L, -1)) { - result->setID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "query_id"); - if (lua_isstring(L, -1)) { - result->setQueryID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<MAMResult> MAMResultConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<MAMResult> result = std::make_shared<MAMResult>(); + lua_getfield(L, -1, "payload"); + if (!lua_isnil(L, -1)) { + std::shared_ptr<Forwarded> payload = std::dynamic_pointer_cast<Forwarded>(convertors->convertFromLuaUntyped(L, -1, "payload")); + if (!!payload) { + result->setPayload(payload); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "id"); + if (lua_isstring(L, -1)) { + result->setID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "query_id"); + if (lua_isstring(L, -1)) { + result->setQueryID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void MAMResultConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<MAMResult> payload) { - lua_createtable(L, 0, 0); - if (convertors->convertToLuaUntyped(L, payload->getPayload()) > 0) { - lua_setfield(L, -2, "payload"); - } - lua_pushstring(L, payload->getID().c_str()); - lua_setfield(L, -2, "id"); - if (payload->getQueryID()) { - lua_pushstring(L, (*payload->getQueryID()).c_str()); - lua_setfield(L, -2, "query_id"); - } +void MAMResultConvertor::doConvertToLua(lua_State* L, std::shared_ptr<MAMResult> payload) { + lua_createtable(L, 0, 0); + if (convertors->convertToLuaUntyped(L, payload->getPayload()) > 0) { + lua_setfield(L, -2, "payload"); + } + lua_pushstring(L, payload->getID().c_str()); + lua_setfield(L, -2, "id"); + if (payload->getQueryID()) { + lua_pushstring(L, (*payload->getQueryID()).c_str()); + lua_setfield(L, -2, "query_id"); + } } boost::optional<LuaElementConvertor::Documentation> MAMResultConvertor::getDocumentation() const { - return Documentation( - "MAMResult", - "This table has the following fields:\n\n" - "- `payload`: @{Forwarded}\n" - "- `id`: string\n" - "- `query_id`: string (Optional)\n" - ); + return Documentation( + "MAMResult", + "This table has the following fields:\n\n" + "- `payload`: @{Forwarded}\n" + "- `id`: string\n" + "- `query_id`: string (Optional)\n" + ); } diff --git a/Sluift/ElementConvertors/MAMResultConvertor.h b/Sluift/ElementConvertors/MAMResultConvertor.h index 65d430a..a1b2564 100644 --- a/Sluift/ElementConvertors/MAMResultConvertor.h +++ b/Sluift/ElementConvertors/MAMResultConvertor.h @@ -1,29 +1,30 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Sluift/GenericLuaElementConvertor.h> #include <Swiften/Base/Override.h> #include <Swiften/Elements/MAMResult.h> +#include <Sluift/GenericLuaElementConvertor.h> + namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class MAMResultConvertor : public GenericLuaElementConvertor<MAMResult> { - public: - MAMResultConvertor(LuaElementConvertors* convertors); - virtual ~MAMResultConvertor(); + class MAMResultConvertor : public GenericLuaElementConvertor<MAMResult> { + public: + MAMResultConvertor(LuaElementConvertors* convertors); + virtual ~MAMResultConvertor(); - virtual boost::shared_ptr<MAMResult> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<MAMResult>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<MAMResult> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<MAMResult>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/MessageConvertor.cpp b/Sluift/ElementConvertors/MessageConvertor.cpp index d56e680..b7bf286 100644 --- a/Sluift/ElementConvertors/MessageConvertor.cpp +++ b/Sluift/ElementConvertors/MessageConvertor.cpp @@ -1,84 +1,85 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ -#include <boost/smart_ptr/make_shared.hpp> -#include <lua.hpp> #include <Sluift/ElementConvertors/MessageConvertor.h> -#include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <memory> + +#include <lua.hpp> + +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -MessageConvertor::MessageConvertor(LuaElementConvertors* convertors) : - StanzaConvertor<Message>("message"), - convertors(convertors) { +MessageConvertor::MessageConvertor(LuaElementConvertors* convertors) : + StanzaConvertor<Message>("message"), + convertors(convertors) { } MessageConvertor::~MessageConvertor() { } -boost::shared_ptr<Message> MessageConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<Message> result = getStanza(L, convertors); - lua_getfield(L, -1, "type"); - if (lua_isstring(L, -1)) { - result->setType(convertMessageTypeFromString(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<Message> MessageConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<Message> result = getStanza(L, convertors); + lua_getfield(L, -1, "type"); + if (lua_isstring(L, -1)) { + result->setType(convertMessageTypeFromString(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void MessageConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<Message> stanza) { - pushStanza(L, stanza, convertors); - const std::string type = convertMessageTypeToString(stanza->getType()); - lua_pushstring(L, type.c_str()); - lua_setfield(L, -2, "type"); +void MessageConvertor::doConvertToLua(lua_State* L, std::shared_ptr<Message> stanza) { + pushStanza(L, stanza, convertors); + const std::string type = convertMessageTypeToString(stanza->getType()); + lua_pushstring(L, type.c_str()); + lua_setfield(L, -2, "type"); } boost::optional<LuaElementConvertor::Documentation> MessageConvertor::getDocumentation() const { - return Documentation( - "Message", - "This table has the following fields:\n\n" - "- `type`: string\n" - "- `id`: string\n" - "- `from`: string\n" - "- `to`: string\n" - "- `payloads`: array<@{Payload}>\n" - ); + return Documentation( + "Message", + "This table has the following fields:\n\n" + "- `type`: string\n" + "- `id`: string\n" + "- `from`: string\n" + "- `to`: string\n" + "- `payloads`: array<@{Payload}>\n" + ); } std::string MessageConvertor::convertMessageTypeToString(Message::Type type) { - switch (type) { - case Message::Normal: return "normal"; - case Message::Chat: return "chat"; - case Message::Error: return "error"; - case Message::Groupchat: return "groupchat"; - case Message::Headline: return "headline"; - } - assert(false); - return ""; + switch (type) { + case Message::Normal: return "normal"; + case Message::Chat: return "chat"; + case Message::Error: return "error"; + case Message::Groupchat: return "groupchat"; + case Message::Headline: return "headline"; + } + assert(false); + return ""; } Message::Type MessageConvertor::convertMessageTypeFromString(const std::string& type) { - if (type == "normal") { - return Message::Normal; - } - else if (type == "chat") { - return Message::Chat; - } - else if (type == "error") { - return Message::Error; - } - else if (type == "groupchat") { - return Message::Groupchat; - } - else if (type == "headline") { - return Message::Headline; - } - else { - throw Lua::Exception("Illegal message type: '" + type + "'"); - } + if (type == "normal") { + return Message::Normal; + } + else if (type == "chat") { + return Message::Chat; + } + else if (type == "error") { + return Message::Error; + } + else if (type == "groupchat") { + return Message::Groupchat; + } + else if (type == "headline") { + return Message::Headline; + } + else { + throw Lua::Exception("Illegal message type: '" + type + "'"); + } } diff --git a/Sluift/ElementConvertors/MessageConvertor.h b/Sluift/ElementConvertors/MessageConvertor.h index f0da885..2031552 100644 --- a/Sluift/ElementConvertors/MessageConvertor.h +++ b/Sluift/ElementConvertors/MessageConvertor.h @@ -1,33 +1,34 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Sluift/ElementConvertors/StanzaConvertor.h> #include <Swiften/Base/Override.h> #include <Swiften/Elements/Message.h> +#include <Sluift/ElementConvertors/StanzaConvertor.h> + namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class MessageConvertor : public StanzaConvertor<Message> { - public: - MessageConvertor(LuaElementConvertors* convertors); - virtual ~MessageConvertor(); + class MessageConvertor : public StanzaConvertor<Message> { + public: + MessageConvertor(LuaElementConvertors* convertors); + virtual ~MessageConvertor(); - virtual boost::shared_ptr<Message> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<Message>) SWIFTEN_OVERRIDE; + virtual std::shared_ptr<Message> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<Message>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - static std::string convertMessageTypeToString(Message::Type type); - static Message::Type convertMessageTypeFromString(const std::string& type); + static std::string convertMessageTypeToString(Message::Type type); + static Message::Type convertMessageTypeFromString(const std::string& type); - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PresenceConvertor.cpp b/Sluift/ElementConvertors/PresenceConvertor.cpp index 4ab178c..abfac77 100644 --- a/Sluift/ElementConvertors/PresenceConvertor.cpp +++ b/Sluift/ElementConvertors/PresenceConvertor.cpp @@ -1,96 +1,97 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ -#include <boost/smart_ptr/make_shared.hpp> -#include <lua.hpp> #include <Sluift/ElementConvertors/PresenceConvertor.h> -#include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <memory> + +#include <lua.hpp> + +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -PresenceConvertor::PresenceConvertor(LuaElementConvertors* convertors) : - StanzaConvertor<Presence>("presence"), - convertors(convertors) { +PresenceConvertor::PresenceConvertor(LuaElementConvertors* convertors) : + StanzaConvertor<Presence>("presence"), + convertors(convertors) { } PresenceConvertor::~PresenceConvertor() { } -boost::shared_ptr<Presence> PresenceConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<Presence> result = getStanza(L, convertors); - lua_getfield(L, -1, "type"); - if (lua_isstring(L, -1)) { - result->setType(convertPresenceTypeFromString(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<Presence> PresenceConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<Presence> result = getStanza(L, convertors); + lua_getfield(L, -1, "type"); + if (lua_isstring(L, -1)) { + result->setType(convertPresenceTypeFromString(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PresenceConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<Presence> stanza) { - pushStanza(L, stanza, convertors); - const std::string type = convertPresenceTypeToString(stanza->getType()); - lua_pushstring(L, type.c_str()); - lua_setfield(L, -2, "type"); +void PresenceConvertor::doConvertToLua(lua_State* L, std::shared_ptr<Presence> stanza) { + pushStanza(L, stanza, convertors); + const std::string type = convertPresenceTypeToString(stanza->getType()); + lua_pushstring(L, type.c_str()); + lua_setfield(L, -2, "type"); } boost::optional<LuaElementConvertor::Documentation> PresenceConvertor::getDocumentation() const { - return Documentation( - "Presence", - "This table has the following fields:\n\n" - "- `type`: string\n" - "- `id`: string\n" - "- `from`: string\n" - "- `to`: string\n" - "- `payloads`: array<@{Payload}>\n" - ); + return Documentation( + "Presence", + "This table has the following fields:\n\n" + "- `type`: string\n" + "- `id`: string\n" + "- `from`: string\n" + "- `to`: string\n" + "- `payloads`: array<@{Payload}>\n" + ); } std::string PresenceConvertor::convertPresenceTypeToString(Presence::Type type) { - switch (type) { - case Presence::Available: return "available"; - case Presence::Error: return "error"; - case Presence::Probe: return "probe"; - case Presence::Subscribe: return "subscribe"; - case Presence::Subscribed: return "subscribed"; - case Presence::Unavailable: return "unavailable"; - case Presence::Unsubscribe: return "unsubscribe"; - case Presence::Unsubscribed: return "unsubscribed"; - } - assert(false); - return ""; + switch (type) { + case Presence::Available: return "available"; + case Presence::Error: return "error"; + case Presence::Probe: return "probe"; + case Presence::Subscribe: return "subscribe"; + case Presence::Subscribed: return "subscribed"; + case Presence::Unavailable: return "unavailable"; + case Presence::Unsubscribe: return "unsubscribe"; + case Presence::Unsubscribed: return "unsubscribed"; + } + assert(false); + return ""; } Presence::Type PresenceConvertor::convertPresenceTypeFromString(const std::string& type) { - if (type == "available") { - return Presence::Available; - } - else if (type == "error") { - return Presence::Error; - } - else if (type == "probe") { - return Presence::Probe; - } - else if (type == "subscribe") { - return Presence::Subscribe; - } - else if (type == "subscribed") { - return Presence::Subscribed; - } - else if (type == "unavailable") { - return Presence::Unavailable; - } - else if (type == "unsubscribe") { - return Presence::Unsubscribe; - } - else if (type == "unsubscribed") { - return Presence::Unsubscribed; - } - else { - throw Lua::Exception("Illegal presence type: '" + type + "'"); - } + if (type == "available") { + return Presence::Available; + } + else if (type == "error") { + return Presence::Error; + } + else if (type == "probe") { + return Presence::Probe; + } + else if (type == "subscribe") { + return Presence::Subscribe; + } + else if (type == "subscribed") { + return Presence::Subscribed; + } + else if (type == "unavailable") { + return Presence::Unavailable; + } + else if (type == "unsubscribe") { + return Presence::Unsubscribe; + } + else if (type == "unsubscribed") { + return Presence::Unsubscribed; + } + else { + throw Lua::Exception("Illegal presence type: '" + type + "'"); + } } diff --git a/Sluift/ElementConvertors/PresenceConvertor.h b/Sluift/ElementConvertors/PresenceConvertor.h index fc4326e..11ec547 100644 --- a/Sluift/ElementConvertors/PresenceConvertor.h +++ b/Sluift/ElementConvertors/PresenceConvertor.h @@ -1,33 +1,34 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Sluift/ElementConvertors/StanzaConvertor.h> #include <Swiften/Base/Override.h> #include <Swiften/Elements/Presence.h> +#include <Sluift/ElementConvertors/StanzaConvertor.h> + namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PresenceConvertor : public StanzaConvertor<Presence> { - public: - PresenceConvertor(LuaElementConvertors* convertors); - virtual ~PresenceConvertor(); + class PresenceConvertor : public StanzaConvertor<Presence> { + public: + PresenceConvertor(LuaElementConvertors* convertors); + virtual ~PresenceConvertor(); - virtual boost::shared_ptr<Presence> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<Presence>) SWIFTEN_OVERRIDE; + virtual std::shared_ptr<Presence> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<Presence>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - static std::string convertPresenceTypeToString(Presence::Type type); - static Presence::Type convertPresenceTypeFromString(const std::string& type); + static std::string convertPresenceTypeToString(Presence::Type type); + static Presence::Type convertPresenceTypeFromString(const std::string& type); - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubAffiliationConvertor.cpp b/Sluift/ElementConvertors/PubSubAffiliationConvertor.cpp index c35488d..62a2b60 100644 --- a/Sluift/ElementConvertors/PubSubAffiliationConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubAffiliationConvertor.cpp @@ -1,93 +1,88 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubAffiliationConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubAffiliationConvertor::PubSubAffiliationConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubAffiliation>("pubsub_affiliation"), - convertors(convertors) { +PubSubAffiliationConvertor::PubSubAffiliationConvertor() : + GenericLuaElementConvertor<PubSubAffiliation>("pubsub_affiliation") { } PubSubAffiliationConvertor::~PubSubAffiliationConvertor() { } -boost::shared_ptr<PubSubAffiliation> PubSubAffiliationConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubAffiliation> result = boost::make_shared<PubSubAffiliation>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "type"); - if (lua_isstring(L, -1)) { - if (std::string(lua_tostring(L, -1)) == "none") { - result->setType(PubSubAffiliation::None); - } - if (std::string(lua_tostring(L, -1)) == "member") { - result->setType(PubSubAffiliation::Member); - } - if (std::string(lua_tostring(L, -1)) == "outcast") { - result->setType(PubSubAffiliation::Outcast); - } - if (std::string(lua_tostring(L, -1)) == "owner") { - result->setType(PubSubAffiliation::Owner); - } - if (std::string(lua_tostring(L, -1)) == "publisher") { - result->setType(PubSubAffiliation::Publisher); - } - if (std::string(lua_tostring(L, -1)) == "publish_only") { - result->setType(PubSubAffiliation::PublishOnly); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubAffiliation> PubSubAffiliationConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubAffiliation> result = std::make_shared<PubSubAffiliation>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "type"); + if (lua_isstring(L, -1)) { + if (std::string(lua_tostring(L, -1)) == "none") { + result->setType(PubSubAffiliation::None); + } + if (std::string(lua_tostring(L, -1)) == "member") { + result->setType(PubSubAffiliation::Member); + } + if (std::string(lua_tostring(L, -1)) == "outcast") { + result->setType(PubSubAffiliation::Outcast); + } + if (std::string(lua_tostring(L, -1)) == "owner") { + result->setType(PubSubAffiliation::Owner); + } + if (std::string(lua_tostring(L, -1)) == "publisher") { + result->setType(PubSubAffiliation::Publisher); + } + if (std::string(lua_tostring(L, -1)) == "publish_only") { + result->setType(PubSubAffiliation::PublishOnly); + } + } + lua_pop(L, 1); + return result; } -void PubSubAffiliationConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubAffiliation> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - switch (payload->getType()) { - case PubSubAffiliation::None: - lua_pushstring(L, "none"); - break; - case PubSubAffiliation::Member: - lua_pushstring(L, "member"); - break; - case PubSubAffiliation::Outcast: - lua_pushstring(L, "outcast"); - break; - case PubSubAffiliation::Owner: - lua_pushstring(L, "owner"); - break; - case PubSubAffiliation::Publisher: - lua_pushstring(L, "publisher"); - break; - case PubSubAffiliation::PublishOnly: - lua_pushstring(L, "publish_only"); - break; - } - lua_setfield(L, -2, "type"); +void PubSubAffiliationConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubAffiliation> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + switch (payload->getType()) { + case PubSubAffiliation::None: + lua_pushstring(L, "none"); + break; + case PubSubAffiliation::Member: + lua_pushstring(L, "member"); + break; + case PubSubAffiliation::Outcast: + lua_pushstring(L, "outcast"); + break; + case PubSubAffiliation::Owner: + lua_pushstring(L, "owner"); + break; + case PubSubAffiliation::Publisher: + lua_pushstring(L, "publisher"); + break; + case PubSubAffiliation::PublishOnly: + lua_pushstring(L, "publish_only"); + break; + } + lua_setfield(L, -2, "type"); } boost::optional<LuaElementConvertor::Documentation> PubSubAffiliationConvertor::getDocumentation() const { - return Documentation( - "PubSubAffiliation", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `type`: `\"none\"`, `\"member\"`, `\"outcast\"`, `\"owner\"`, `\"publisher\"`, or `\"publish_only\"`\n" - ); + return Documentation( + "PubSubAffiliation", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `type`: `\"none\"`, `\"member\"`, `\"outcast\"`, `\"owner\"`, `\"publisher\"`, or `\"publish_only\"`\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubAffiliationConvertor.h b/Sluift/ElementConvertors/PubSubAffiliationConvertor.h index 846dc38..456ef4e 100644 --- a/Sluift/ElementConvertors/PubSubAffiliationConvertor.h +++ b/Sluift/ElementConvertors/PubSubAffiliationConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubAffiliation.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubAffiliation.h> namespace Swift { - class LuaElementConvertors; - - class PubSubAffiliationConvertor : public GenericLuaElementConvertor<PubSubAffiliation> { - public: - PubSubAffiliationConvertor(LuaElementConvertors* convertors); - virtual ~PubSubAffiliationConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubAffiliation> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubAffiliation>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubAffiliationConvertor : public GenericLuaElementConvertor<PubSubAffiliation> { + public: + PubSubAffiliationConvertor(); + virtual ~PubSubAffiliationConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubAffiliation> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubAffiliation>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubAffiliationsConvertor.cpp b/Sluift/ElementConvertors/PubSubAffiliationsConvertor.cpp index a338eda..c6ba09e 100644 --- a/Sluift/ElementConvertors/PubSubAffiliationsConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubAffiliationsConvertor.cpp @@ -1,79 +1,78 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubAffiliationsConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/LuaElementConvertors.h> -#include <Swiften/Base/foreach.h> +#include <lua.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -PubSubAffiliationsConvertor::PubSubAffiliationsConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubAffiliations>("pubsub_affiliations"), - convertors(convertors) { +PubSubAffiliationsConvertor::PubSubAffiliationsConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubAffiliations>("pubsub_affiliations"), + convertors(convertors) { } PubSubAffiliationsConvertor::~PubSubAffiliationsConvertor() { } -boost::shared_ptr<PubSubAffiliations> PubSubAffiliationsConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubAffiliations> result = boost::make_shared<PubSubAffiliations>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< boost::shared_ptr<PubSubAffiliation> > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubAffiliation> payload = boost::dynamic_pointer_cast<PubSubAffiliation>(convertors->convertFromLuaUntyped(L, -1, "pubsub_affiliation"))) { - items.push_back(payload); - } - } - lua_pop(L, 1); - } +std::shared_ptr<PubSubAffiliations> PubSubAffiliationsConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubAffiliations> result = std::make_shared<PubSubAffiliations>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::shared_ptr<PubSubAffiliation> > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubAffiliation> payload = std::dynamic_pointer_cast<PubSubAffiliation>(convertors->convertFromLuaUntyped(L, -1, "pubsub_affiliation"))) { + items.push_back(payload); + } + } + lua_pop(L, 1); + } - result->setAffiliations(items); - } - return result; + result->setAffiliations(items); + } + return result; } -void PubSubAffiliationsConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubAffiliations> payload) { - lua_createtable(L, 0, 0); - if (payload->getNode()) { - lua_pushstring(L, (*payload->getNode()).c_str()); - lua_setfield(L, -2, "node"); - } - if (!payload->getAffiliations().empty()) { - { - int i = 0; - foreach(boost::shared_ptr<PubSubAffiliation> item, payload->getAffiliations()) { - if (convertors->convertToLuaUntyped(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - } +void PubSubAffiliationsConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubAffiliations> payload) { + lua_createtable(L, 0, 0); + if (payload->getNode()) { + lua_pushstring(L, (*payload->getNode()).c_str()); + lua_setfield(L, -2, "node"); + } + if (!payload->getAffiliations().empty()) { + { + int i = 0; + for (auto&& item : payload->getAffiliations()) { + if (convertors->convertToLuaUntyped(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + } } boost::optional<LuaElementConvertor::Documentation> PubSubAffiliationsConvertor::getDocumentation() const { - return Documentation( - "PubSubAffiliations", - "This table has the following fields:\n\n" - "- `node`: string (Optional)\n" - "- `affiliations`: array<@{PubSubAffiliation}>\n" - ); + return Documentation( + "PubSubAffiliations", + "This table has the following fields:\n\n" + "- `node`: string (Optional)\n" + "- `affiliations`: array<@{PubSubAffiliation}>\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubAffiliationsConvertor.h b/Sluift/ElementConvertors/PubSubAffiliationsConvertor.h index f398436..8ad38b2 100644 --- a/Sluift/ElementConvertors/PubSubAffiliationsConvertor.h +++ b/Sluift/ElementConvertors/PubSubAffiliationsConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubAffiliations.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubAffiliations.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubAffiliationsConvertor : public GenericLuaElementConvertor<PubSubAffiliations> { - public: - PubSubAffiliationsConvertor(LuaElementConvertors* convertors); - virtual ~PubSubAffiliationsConvertor(); + class PubSubAffiliationsConvertor : public GenericLuaElementConvertor<PubSubAffiliations> { + public: + PubSubAffiliationsConvertor(LuaElementConvertors* convertors); + virtual ~PubSubAffiliationsConvertor(); - virtual boost::shared_ptr<PubSubAffiliations> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubAffiliations>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubAffiliations> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubAffiliations>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubConfigureConvertor.cpp b/Sluift/ElementConvertors/PubSubConfigureConvertor.cpp index be6b978..d8bf05d 100644 --- a/Sluift/ElementConvertors/PubSubConfigureConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubConfigureConvertor.cpp @@ -1,52 +1,50 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubConfigureConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubConfigureConvertor::PubSubConfigureConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubConfigure>("pubsub_configure"), - convertors(convertors) { +PubSubConfigureConvertor::PubSubConfigureConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubConfigure>("pubsub_configure"), + convertors(convertors) { } PubSubConfigureConvertor::~PubSubConfigureConvertor() { } -boost::shared_ptr<PubSubConfigure> PubSubConfigureConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubConfigure> result = boost::make_shared<PubSubConfigure>(); - lua_getfield(L, -1, "data"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<Form> payload = boost::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { - result->setData(payload); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubConfigure> PubSubConfigureConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubConfigure> result = std::make_shared<PubSubConfigure>(); + lua_getfield(L, -1, "data"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<Form> payload = std::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { + result->setData(payload); + } + } + lua_pop(L, 1); + return result; } -void PubSubConfigureConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubConfigure> payload) { - lua_createtable(L, 0, 0); - if (convertors->convertToLuaUntyped(L, payload->getData()) > 0) { - lua_setfield(L, -2, "data"); - } +void PubSubConfigureConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubConfigure> payload) { + lua_createtable(L, 0, 0); + if (convertors->convertToLuaUntyped(L, payload->getData()) > 0) { + lua_setfield(L, -2, "data"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubConfigureConvertor::getDocumentation() const { - return Documentation( - "PubSubConfigure", - "This table has the following fields:\n\n" - "- `data`: @{Form}\n" - ); + return Documentation( + "PubSubConfigure", + "This table has the following fields:\n\n" + "- `data`: @{Form}\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubConfigureConvertor.h b/Sluift/ElementConvertors/PubSubConfigureConvertor.h index 4fc57b2..e41bb68 100644 --- a/Sluift/ElementConvertors/PubSubConfigureConvertor.h +++ b/Sluift/ElementConvertors/PubSubConfigureConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubConfigure.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubConfigure.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubConfigureConvertor : public GenericLuaElementConvertor<PubSubConfigure> { - public: - PubSubConfigureConvertor(LuaElementConvertors* convertors); - virtual ~PubSubConfigureConvertor(); + class PubSubConfigureConvertor : public GenericLuaElementConvertor<PubSubConfigure> { + public: + PubSubConfigureConvertor(LuaElementConvertors* convertors); + virtual ~PubSubConfigureConvertor(); - virtual boost::shared_ptr<PubSubConfigure> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubConfigure>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubConfigure> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubConfigure>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubCreateConvertor.cpp b/Sluift/ElementConvertors/PubSubCreateConvertor.cpp index ac601d9..80553d5 100644 --- a/Sluift/ElementConvertors/PubSubCreateConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubCreateConvertor.cpp @@ -1,60 +1,58 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubCreateConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubCreateConvertor::PubSubCreateConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubCreate>("pubsub_create"), - convertors(convertors) { +PubSubCreateConvertor::PubSubCreateConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubCreate>("pubsub_create"), + convertors(convertors) { } PubSubCreateConvertor::~PubSubCreateConvertor() { } -boost::shared_ptr<PubSubCreate> PubSubCreateConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubCreate> result = boost::make_shared<PubSubCreate>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "configure"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubConfigure> payload = boost::dynamic_pointer_cast<PubSubConfigure>(convertors->convertFromLuaUntyped(L, -1, "pubsub_configure"))) { - result->setConfigure(payload); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubCreate> PubSubCreateConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubCreate> result = std::make_shared<PubSubCreate>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "configure"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubConfigure> payload = std::dynamic_pointer_cast<PubSubConfigure>(convertors->convertFromLuaUntyped(L, -1, "pubsub_configure"))) { + result->setConfigure(payload); + } + } + lua_pop(L, 1); + return result; } -void PubSubCreateConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubCreate> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - if (convertors->convertToLuaUntyped(L, payload->getConfigure()) > 0) { - lua_setfield(L, -2, "configure"); - } +void PubSubCreateConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubCreate> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + if (convertors->convertToLuaUntyped(L, payload->getConfigure()) > 0) { + lua_setfield(L, -2, "configure"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubCreateConvertor::getDocumentation() const { - return Documentation( - "PubSubCreate", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `configure`: @{PubSubConfigure}\n" - ); + return Documentation( + "PubSubCreate", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `configure`: @{PubSubConfigure}\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubCreateConvertor.h b/Sluift/ElementConvertors/PubSubCreateConvertor.h index a4bf149..12c47da 100644 --- a/Sluift/ElementConvertors/PubSubCreateConvertor.h +++ b/Sluift/ElementConvertors/PubSubCreateConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubCreate.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubCreate.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubCreateConvertor : public GenericLuaElementConvertor<PubSubCreate> { - public: - PubSubCreateConvertor(LuaElementConvertors* convertors); - virtual ~PubSubCreateConvertor(); + class PubSubCreateConvertor : public GenericLuaElementConvertor<PubSubCreate> { + public: + PubSubCreateConvertor(LuaElementConvertors* convertors); + virtual ~PubSubCreateConvertor(); - virtual boost::shared_ptr<PubSubCreate> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubCreate>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubCreate> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubCreate>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubDefaultConvertor.cpp b/Sluift/ElementConvertors/PubSubDefaultConvertor.cpp index e0de984..8406913 100644 --- a/Sluift/ElementConvertors/PubSubDefaultConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubDefaultConvertor.cpp @@ -1,77 +1,72 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubDefaultConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubDefaultConvertor::PubSubDefaultConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubDefault>("pubsub_default"), - convertors(convertors) { +PubSubDefaultConvertor::PubSubDefaultConvertor() : + GenericLuaElementConvertor<PubSubDefault>("pubsub_default") { } PubSubDefaultConvertor::~PubSubDefaultConvertor() { } -boost::shared_ptr<PubSubDefault> PubSubDefaultConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubDefault> result = boost::make_shared<PubSubDefault>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "type"); - if (lua_isstring(L, -1)) { - if (std::string(lua_tostring(L, -1)) == "none") { - result->setType(PubSubDefault::None); - } - if (std::string(lua_tostring(L, -1)) == "collection") { - result->setType(PubSubDefault::Collection); - } - if (std::string(lua_tostring(L, -1)) == "leaf") { - result->setType(PubSubDefault::Leaf); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubDefault> PubSubDefaultConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubDefault> result = std::make_shared<PubSubDefault>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "type"); + if (lua_isstring(L, -1)) { + if (std::string(lua_tostring(L, -1)) == "none") { + result->setType(PubSubDefault::None); + } + if (std::string(lua_tostring(L, -1)) == "collection") { + result->setType(PubSubDefault::Collection); + } + if (std::string(lua_tostring(L, -1)) == "leaf") { + result->setType(PubSubDefault::Leaf); + } + } + lua_pop(L, 1); + return result; } -void PubSubDefaultConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubDefault> payload) { - lua_createtable(L, 0, 0); - if (payload->getNode()) { - lua_pushstring(L, (*payload->getNode()).c_str()); - lua_setfield(L, -2, "node"); - } - switch (payload->getType()) { - case PubSubDefault::None: - lua_pushstring(L, "none"); - break; - case PubSubDefault::Collection: - lua_pushstring(L, "collection"); - break; - case PubSubDefault::Leaf: - lua_pushstring(L, "leaf"); - break; - } - lua_setfield(L, -2, "type"); +void PubSubDefaultConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubDefault> payload) { + lua_createtable(L, 0, 0); + if (payload->getNode()) { + lua_pushstring(L, (*payload->getNode()).c_str()); + lua_setfield(L, -2, "node"); + } + switch (payload->getType()) { + case PubSubDefault::None: + lua_pushstring(L, "none"); + break; + case PubSubDefault::Collection: + lua_pushstring(L, "collection"); + break; + case PubSubDefault::Leaf: + lua_pushstring(L, "leaf"); + break; + } + lua_setfield(L, -2, "type"); } boost::optional<LuaElementConvertor::Documentation> PubSubDefaultConvertor::getDocumentation() const { - return Documentation( - "PubSubDefault", - "This table has the following fields:\n\n" - "- `node`: string (Optional)\n" - "- `type`: `\"none\"`, `\"collection\"`, or `\"leaf\"`\n" - ); + return Documentation( + "PubSubDefault", + "This table has the following fields:\n\n" + "- `node`: string (Optional)\n" + "- `type`: `\"none\"`, `\"collection\"`, or `\"leaf\"`\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubDefaultConvertor.h b/Sluift/ElementConvertors/PubSubDefaultConvertor.h index 9b6a01f..fbdbf95 100644 --- a/Sluift/ElementConvertors/PubSubDefaultConvertor.h +++ b/Sluift/ElementConvertors/PubSubDefaultConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubDefault.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubDefault.h> namespace Swift { - class LuaElementConvertors; - - class PubSubDefaultConvertor : public GenericLuaElementConvertor<PubSubDefault> { - public: - PubSubDefaultConvertor(LuaElementConvertors* convertors); - virtual ~PubSubDefaultConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubDefault> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubDefault>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubDefaultConvertor : public GenericLuaElementConvertor<PubSubDefault> { + public: + PubSubDefaultConvertor(); + virtual ~PubSubDefaultConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubDefault> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubDefault>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventAssociateConvertor.cpp b/Sluift/ElementConvertors/PubSubEventAssociateConvertor.cpp index 623ddc4..eb025a5 100644 --- a/Sluift/ElementConvertors/PubSubEventAssociateConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventAssociateConvertor.cpp @@ -1,49 +1,44 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventAssociateConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubEventAssociateConvertor::PubSubEventAssociateConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEventAssociate>("pubsub_event_associate"), - convertors(convertors) { +PubSubEventAssociateConvertor::PubSubEventAssociateConvertor() : + GenericLuaElementConvertor<PubSubEventAssociate>("pubsub_event_associate") { } PubSubEventAssociateConvertor::~PubSubEventAssociateConvertor() { } -boost::shared_ptr<PubSubEventAssociate> PubSubEventAssociateConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEventAssociate> result = boost::make_shared<PubSubEventAssociate>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubEventAssociate> PubSubEventAssociateConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEventAssociate> result = std::make_shared<PubSubEventAssociate>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubEventAssociateConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEventAssociate> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); +void PubSubEventAssociateConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEventAssociate> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); } boost::optional<LuaElementConvertor::Documentation> PubSubEventAssociateConvertor::getDocumentation() const { - return Documentation( - "PubSubEventAssociate", - "This table has the following fields:\n\n" - "- `node`: string\n" - ); + return Documentation( + "PubSubEventAssociate", + "This table has the following fields:\n\n" + "- `node`: string\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubEventAssociateConvertor.h b/Sluift/ElementConvertors/PubSubEventAssociateConvertor.h index 6f4f3d8..975aa60 100644 --- a/Sluift/ElementConvertors/PubSubEventAssociateConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventAssociateConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEventAssociate.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEventAssociate.h> namespace Swift { - class LuaElementConvertors; - - class PubSubEventAssociateConvertor : public GenericLuaElementConvertor<PubSubEventAssociate> { - public: - PubSubEventAssociateConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventAssociateConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubEventAssociate> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEventAssociate>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubEventAssociateConvertor : public GenericLuaElementConvertor<PubSubEventAssociate> { + public: + PubSubEventAssociateConvertor(); + virtual ~PubSubEventAssociateConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubEventAssociate> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEventAssociate>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventCollectionConvertor.cpp b/Sluift/ElementConvertors/PubSubEventCollectionConvertor.cpp index 8fdfefa..721b1b4 100644 --- a/Sluift/ElementConvertors/PubSubEventCollectionConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventCollectionConvertor.cpp @@ -1,73 +1,71 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventCollectionConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubEventCollectionConvertor::PubSubEventCollectionConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEventCollection>("pubsub_event_collection"), - convertors(convertors) { +PubSubEventCollectionConvertor::PubSubEventCollectionConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubEventCollection>("pubsub_event_collection"), + convertors(convertors) { } PubSubEventCollectionConvertor::~PubSubEventCollectionConvertor() { } -boost::shared_ptr<PubSubEventCollection> PubSubEventCollectionConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEventCollection> result = boost::make_shared<PubSubEventCollection>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "disassociate"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubEventDisassociate> payload = boost::dynamic_pointer_cast<PubSubEventDisassociate>(convertors->convertFromLuaUntyped(L, -1, "pubsub_event_disassociate"))) { - result->setDisassociate(payload); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "associate"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubEventAssociate> payload = boost::dynamic_pointer_cast<PubSubEventAssociate>(convertors->convertFromLuaUntyped(L, -1, "pubsub_event_associate"))) { - result->setAssociate(payload); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubEventCollection> PubSubEventCollectionConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEventCollection> result = std::make_shared<PubSubEventCollection>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "disassociate"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubEventDisassociate> payload = std::dynamic_pointer_cast<PubSubEventDisassociate>(convertors->convertFromLuaUntyped(L, -1, "pubsub_event_disassociate"))) { + result->setDisassociate(payload); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "associate"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubEventAssociate> payload = std::dynamic_pointer_cast<PubSubEventAssociate>(convertors->convertFromLuaUntyped(L, -1, "pubsub_event_associate"))) { + result->setAssociate(payload); + } + } + lua_pop(L, 1); + return result; } -void PubSubEventCollectionConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEventCollection> payload) { - lua_createtable(L, 0, 0); - if (payload->getNode()) { - lua_pushstring(L, (*payload->getNode()).c_str()); - lua_setfield(L, -2, "node"); - } - if (convertors->convertToLuaUntyped(L, payload->getDisassociate()) > 0) { - lua_setfield(L, -2, "disassociate"); - } - if (convertors->convertToLuaUntyped(L, payload->getAssociate()) > 0) { - lua_setfield(L, -2, "associate"); - } +void PubSubEventCollectionConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEventCollection> payload) { + lua_createtable(L, 0, 0); + if (payload->getNode()) { + lua_pushstring(L, (*payload->getNode()).c_str()); + lua_setfield(L, -2, "node"); + } + if (convertors->convertToLuaUntyped(L, payload->getDisassociate()) > 0) { + lua_setfield(L, -2, "disassociate"); + } + if (convertors->convertToLuaUntyped(L, payload->getAssociate()) > 0) { + lua_setfield(L, -2, "associate"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubEventCollectionConvertor::getDocumentation() const { - return Documentation( - "PubSubEventCollection", - "This table has the following fields:\n\n" - "- `node`: string (Optional)\n" - "- `disassociate`: @{PubSubEventDisassociate}\n" - "- `associate`: @{PubSubEventAssociate}\n" - ); + return Documentation( + "PubSubEventCollection", + "This table has the following fields:\n\n" + "- `node`: string (Optional)\n" + "- `disassociate`: @{PubSubEventDisassociate}\n" + "- `associate`: @{PubSubEventAssociate}\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubEventCollectionConvertor.h b/Sluift/ElementConvertors/PubSubEventCollectionConvertor.h index 4226619..e8feada 100644 --- a/Sluift/ElementConvertors/PubSubEventCollectionConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventCollectionConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEventCollection.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEventCollection.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubEventCollectionConvertor : public GenericLuaElementConvertor<PubSubEventCollection> { - public: - PubSubEventCollectionConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventCollectionConvertor(); + class PubSubEventCollectionConvertor : public GenericLuaElementConvertor<PubSubEventCollection> { + public: + PubSubEventCollectionConvertor(LuaElementConvertors* convertors); + virtual ~PubSubEventCollectionConvertor(); - virtual boost::shared_ptr<PubSubEventCollection> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEventCollection>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubEventCollection> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEventCollection>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventConfigurationConvertor.cpp b/Sluift/ElementConvertors/PubSubEventConfigurationConvertor.cpp index 56f46ec..828a010 100644 --- a/Sluift/ElementConvertors/PubSubEventConfigurationConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventConfigurationConvertor.cpp @@ -1,60 +1,58 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventConfigurationConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubEventConfigurationConvertor::PubSubEventConfigurationConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEventConfiguration>("pubsub_event_configuration"), - convertors(convertors) { +PubSubEventConfigurationConvertor::PubSubEventConfigurationConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubEventConfiguration>("pubsub_event_configuration"), + convertors(convertors) { } PubSubEventConfigurationConvertor::~PubSubEventConfigurationConvertor() { } -boost::shared_ptr<PubSubEventConfiguration> PubSubEventConfigurationConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEventConfiguration> result = boost::make_shared<PubSubEventConfiguration>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "data"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<Form> payload = boost::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { - result->setData(payload); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubEventConfiguration> PubSubEventConfigurationConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEventConfiguration> result = std::make_shared<PubSubEventConfiguration>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "data"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<Form> payload = std::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { + result->setData(payload); + } + } + lua_pop(L, 1); + return result; } -void PubSubEventConfigurationConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEventConfiguration> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - if (convertors->convertToLuaUntyped(L, payload->getData()) > 0) { - lua_setfield(L, -2, "data"); - } +void PubSubEventConfigurationConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEventConfiguration> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + if (convertors->convertToLuaUntyped(L, payload->getData()) > 0) { + lua_setfield(L, -2, "data"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubEventConfigurationConvertor::getDocumentation() const { - return Documentation( - "PubSubEventConfiguration", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `data`: @{Form}\n" - ); + return Documentation( + "PubSubEventConfiguration", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `data`: @{Form}\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubEventConfigurationConvertor.h b/Sluift/ElementConvertors/PubSubEventConfigurationConvertor.h index ce76da4..dd327d4 100644 --- a/Sluift/ElementConvertors/PubSubEventConfigurationConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventConfigurationConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEventConfiguration.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEventConfiguration.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubEventConfigurationConvertor : public GenericLuaElementConvertor<PubSubEventConfiguration> { - public: - PubSubEventConfigurationConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventConfigurationConvertor(); + class PubSubEventConfigurationConvertor : public GenericLuaElementConvertor<PubSubEventConfiguration> { + public: + PubSubEventConfigurationConvertor(LuaElementConvertors* convertors); + virtual ~PubSubEventConfigurationConvertor(); - virtual boost::shared_ptr<PubSubEventConfiguration> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEventConfiguration>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubEventConfiguration> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEventConfiguration>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventConvertor.cpp b/Sluift/ElementConvertors/PubSubEventConvertor.cpp index ae4374c..da7c849 100644 --- a/Sluift/ElementConvertors/PubSubEventConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventConvertor.cpp @@ -1,37 +1,35 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubEventConvertor::PubSubEventConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEvent>("pubsub_event"), - convertors(convertors) { +PubSubEventConvertor::PubSubEventConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubEvent>("pubsub_event"), + convertors(convertors) { } PubSubEventConvertor::~PubSubEventConvertor() { } -boost::shared_ptr<PubSubEvent> PubSubEventConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEvent> result = boost::make_shared<PubSubEvent>(); - if (boost::shared_ptr<PubSubEventPayload> payload = boost::dynamic_pointer_cast<PubSubEventPayload>(convertors->convertFromLua(L, -1))) { - result->setPayload(payload); - } - return result; +std::shared_ptr<PubSubEvent> PubSubEventConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEvent> result = std::make_shared<PubSubEvent>(); + if (std::shared_ptr<PubSubEventPayload> payload = std::dynamic_pointer_cast<PubSubEventPayload>(convertors->convertFromLua(L, -1))) { + result->setPayload(payload); + } + return result; } -void PubSubEventConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEvent> event) { - convertors->convertToLua(L, event->getPayload()); +void PubSubEventConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEvent> event) { + convertors->convertToLua(L, event->getPayload()); } diff --git a/Sluift/ElementConvertors/PubSubEventConvertor.h b/Sluift/ElementConvertors/PubSubEventConvertor.h index 3bb4594..8b0cbec 100644 --- a/Sluift/ElementConvertors/PubSubEventConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,22 +7,22 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEvent.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEvent.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubEventConvertor : public GenericLuaElementConvertor<PubSubEvent> { - public: - PubSubEventConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventConvertor(); + class PubSubEventConvertor : public GenericLuaElementConvertor<PubSubEvent> { + public: + PubSubEventConvertor(LuaElementConvertors* convertors); + virtual ~PubSubEventConvertor(); - virtual boost::shared_ptr<PubSubEvent> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEvent>) SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubEvent> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEvent>) SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventDeleteConvertor.cpp b/Sluift/ElementConvertors/PubSubEventDeleteConvertor.cpp index 29ead48..06fb3a2 100644 --- a/Sluift/ElementConvertors/PubSubEventDeleteConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventDeleteConvertor.cpp @@ -1,60 +1,58 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventDeleteConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubEventDeleteConvertor::PubSubEventDeleteConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEventDelete>("pubsub_event_delete"), - convertors(convertors) { +PubSubEventDeleteConvertor::PubSubEventDeleteConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubEventDelete>("pubsub_event_delete"), + convertors(convertors) { } PubSubEventDeleteConvertor::~PubSubEventDeleteConvertor() { } -boost::shared_ptr<PubSubEventDelete> PubSubEventDeleteConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEventDelete> result = boost::make_shared<PubSubEventDelete>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "redirects"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubEventRedirect> payload = boost::dynamic_pointer_cast<PubSubEventRedirect>(convertors->convertFromLuaUntyped(L, -1, "pubsub_event_redirect"))) { - result->setRedirects(payload); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubEventDelete> PubSubEventDeleteConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEventDelete> result = std::make_shared<PubSubEventDelete>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "redirects"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubEventRedirect> payload = std::dynamic_pointer_cast<PubSubEventRedirect>(convertors->convertFromLuaUntyped(L, -1, "pubsub_event_redirect"))) { + result->setRedirects(payload); + } + } + lua_pop(L, 1); + return result; } -void PubSubEventDeleteConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEventDelete> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - if (convertors->convertToLuaUntyped(L, payload->getRedirects()) > 0) { - lua_setfield(L, -2, "redirects"); - } +void PubSubEventDeleteConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEventDelete> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + if (convertors->convertToLuaUntyped(L, payload->getRedirects()) > 0) { + lua_setfield(L, -2, "redirects"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubEventDeleteConvertor::getDocumentation() const { - return Documentation( - "PubSubEventDelete", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `redirects`: @{PubSubEventRedirect}\n" - ); + return Documentation( + "PubSubEventDelete", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `redirects`: @{PubSubEventRedirect}\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubEventDeleteConvertor.h b/Sluift/ElementConvertors/PubSubEventDeleteConvertor.h index e229781..ba2b0b8 100644 --- a/Sluift/ElementConvertors/PubSubEventDeleteConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventDeleteConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEventDelete.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEventDelete.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubEventDeleteConvertor : public GenericLuaElementConvertor<PubSubEventDelete> { - public: - PubSubEventDeleteConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventDeleteConvertor(); + class PubSubEventDeleteConvertor : public GenericLuaElementConvertor<PubSubEventDelete> { + public: + PubSubEventDeleteConvertor(LuaElementConvertors* convertors); + virtual ~PubSubEventDeleteConvertor(); - virtual boost::shared_ptr<PubSubEventDelete> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEventDelete>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubEventDelete> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEventDelete>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventDisassociateConvertor.cpp b/Sluift/ElementConvertors/PubSubEventDisassociateConvertor.cpp index 9ca8395..0ada5ce 100644 --- a/Sluift/ElementConvertors/PubSubEventDisassociateConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventDisassociateConvertor.cpp @@ -1,49 +1,44 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventDisassociateConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubEventDisassociateConvertor::PubSubEventDisassociateConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEventDisassociate>("pubsub_event_disassociate"), - convertors(convertors) { +PubSubEventDisassociateConvertor::PubSubEventDisassociateConvertor() : + GenericLuaElementConvertor<PubSubEventDisassociate>("pubsub_event_disassociate") { } PubSubEventDisassociateConvertor::~PubSubEventDisassociateConvertor() { } -boost::shared_ptr<PubSubEventDisassociate> PubSubEventDisassociateConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEventDisassociate> result = boost::make_shared<PubSubEventDisassociate>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubEventDisassociate> PubSubEventDisassociateConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEventDisassociate> result = std::make_shared<PubSubEventDisassociate>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubEventDisassociateConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEventDisassociate> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); +void PubSubEventDisassociateConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEventDisassociate> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); } boost::optional<LuaElementConvertor::Documentation> PubSubEventDisassociateConvertor::getDocumentation() const { - return Documentation( - "PubSubEventDisassociate", - "This table has the following fields:\n\n" - "- `node`: string\n" - ); + return Documentation( + "PubSubEventDisassociate", + "This table has the following fields:\n\n" + "- `node`: string\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubEventDisassociateConvertor.h b/Sluift/ElementConvertors/PubSubEventDisassociateConvertor.h index 25a3863..0a1d678 100644 --- a/Sluift/ElementConvertors/PubSubEventDisassociateConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventDisassociateConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEventDisassociate.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEventDisassociate.h> namespace Swift { - class LuaElementConvertors; - - class PubSubEventDisassociateConvertor : public GenericLuaElementConvertor<PubSubEventDisassociate> { - public: - PubSubEventDisassociateConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventDisassociateConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubEventDisassociate> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEventDisassociate>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubEventDisassociateConvertor : public GenericLuaElementConvertor<PubSubEventDisassociate> { + public: + PubSubEventDisassociateConvertor(); + virtual ~PubSubEventDisassociateConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubEventDisassociate> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEventDisassociate>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventItemConvertor.cpp b/Sluift/ElementConvertors/PubSubEventItemConvertor.cpp index 43a64ff..ac86024 100644 --- a/Sluift/ElementConvertors/PubSubEventItemConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventItemConvertor.cpp @@ -1,103 +1,102 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventItemConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/LuaElementConvertors.h> -#include <Swiften/Base/foreach.h> +#include <lua.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -PubSubEventItemConvertor::PubSubEventItemConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEventItem>("pubsub_event_item"), - convertors(convertors) { +PubSubEventItemConvertor::PubSubEventItemConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubEventItem>("pubsub_event_item"), + convertors(convertors) { } PubSubEventItemConvertor::~PubSubEventItemConvertor() { } -boost::shared_ptr<PubSubEventItem> PubSubEventItemConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEventItem> result = boost::make_shared<PubSubEventItem>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "publisher"); - if (lua_isstring(L, -1)) { - result->setPublisher(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "data"); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< boost::shared_ptr<Payload> > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<Payload> payload = boost::dynamic_pointer_cast<Payload>(convertors->convertFromLua(L, -1))) { - items.push_back(payload); - } - } - lua_pop(L, 1); - } +std::shared_ptr<PubSubEventItem> PubSubEventItemConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEventItem> result = std::make_shared<PubSubEventItem>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "publisher"); + if (lua_isstring(L, -1)) { + result->setPublisher(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "data"); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::shared_ptr<Payload> > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<Payload> payload = std::dynamic_pointer_cast<Payload>(convertors->convertFromLua(L, -1))) { + items.push_back(payload); + } + } + lua_pop(L, 1); + } - result->setData(items); - } - lua_pop(L, 1); - lua_getfield(L, -1, "id"); - if (lua_isstring(L, -1)) { - result->setID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; + result->setData(items); + } + lua_pop(L, 1); + lua_getfield(L, -1, "id"); + if (lua_isstring(L, -1)) { + result->setID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubEventItemConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEventItem> payload) { - lua_createtable(L, 0, 0); - if (payload->getNode()) { - lua_pushstring(L, (*payload->getNode()).c_str()); - lua_setfield(L, -2, "node"); - } - if (payload->getPublisher()) { - lua_pushstring(L, (*payload->getPublisher()).c_str()); - lua_setfield(L, -2, "publisher"); - } - if (!payload->getData().empty()) { - lua_createtable(L, boost::numeric_cast<int>(payload->getData().size()), 0); - { - int i = 0; - foreach(boost::shared_ptr<Payload> item, payload->getData()) { - if (convertors->convertToLua(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - lua_setfield(L, -2, "data"); - } - if (payload->getID()) { - lua_pushstring(L, (*payload->getID()).c_str()); - lua_setfield(L, -2, "id"); - } +void PubSubEventItemConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEventItem> payload) { + lua_createtable(L, 0, 0); + if (payload->getNode()) { + lua_pushstring(L, (*payload->getNode()).c_str()); + lua_setfield(L, -2, "node"); + } + if (payload->getPublisher()) { + lua_pushstring(L, (*payload->getPublisher()).c_str()); + lua_setfield(L, -2, "publisher"); + } + if (!payload->getData().empty()) { + lua_createtable(L, boost::numeric_cast<int>(payload->getData().size()), 0); + { + int i = 0; + for (auto&& item : payload->getData()) { + if (convertors->convertToLua(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + lua_setfield(L, -2, "data"); + } + if (payload->getID()) { + lua_pushstring(L, (*payload->getID()).c_str()); + lua_setfield(L, -2, "id"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubEventItemConvertor::getDocumentation() const { - return Documentation( - "PubSubEventItem", - "This table has the following fields:\n\n" - "- `node`: string (Optional)\n" - "- `publisher`: string (Optional)\n" - "- `data`: array<element (table)>\n" - "- `id`: string (Optional)\n" - ); + return Documentation( + "PubSubEventItem", + "This table has the following fields:\n\n" + "- `node`: string (Optional)\n" + "- `publisher`: string (Optional)\n" + "- `data`: array<element (table)>\n" + "- `id`: string (Optional)\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubEventItemConvertor.h b/Sluift/ElementConvertors/PubSubEventItemConvertor.h index c7dac83..6239b14 100644 --- a/Sluift/ElementConvertors/PubSubEventItemConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventItemConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEventItem.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEventItem.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubEventItemConvertor : public GenericLuaElementConvertor<PubSubEventItem> { - public: - PubSubEventItemConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventItemConvertor(); + class PubSubEventItemConvertor : public GenericLuaElementConvertor<PubSubEventItem> { + public: + PubSubEventItemConvertor(LuaElementConvertors* convertors); + virtual ~PubSubEventItemConvertor(); - virtual boost::shared_ptr<PubSubEventItem> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEventItem>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubEventItem> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEventItem>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventItemsConvertor.cpp b/Sluift/ElementConvertors/PubSubEventItemsConvertor.cpp index 3287a6d..7a3cde1 100644 --- a/Sluift/ElementConvertors/PubSubEventItemsConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventItemsConvertor.cpp @@ -1,112 +1,111 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventItemsConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/LuaElementConvertors.h> -#include <Swiften/Base/foreach.h> +#include <lua.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -PubSubEventItemsConvertor::PubSubEventItemsConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEventItems>("pubsub_event_items"), - convertors(convertors) { +PubSubEventItemsConvertor::PubSubEventItemsConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubEventItems>("pubsub_event_items"), + convertors(convertors) { } PubSubEventItemsConvertor::~PubSubEventItemsConvertor() { } -boost::shared_ptr<PubSubEventItems> PubSubEventItemsConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEventItems> result = boost::make_shared<PubSubEventItems>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "items"); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< boost::shared_ptr<PubSubEventItem> > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubEventItem> payload = boost::dynamic_pointer_cast<PubSubEventItem>(convertors->convertFromLuaUntyped(L, -1, "pubsub_event_item"))) { - items.push_back(payload); - } - } - lua_pop(L, 1); - } +std::shared_ptr<PubSubEventItems> PubSubEventItemsConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEventItems> result = std::make_shared<PubSubEventItems>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "items"); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::shared_ptr<PubSubEventItem> > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubEventItem> payload = std::dynamic_pointer_cast<PubSubEventItem>(convertors->convertFromLuaUntyped(L, -1, "pubsub_event_item"))) { + items.push_back(payload); + } + } + lua_pop(L, 1); + } - result->setItems(items); - } - lua_pop(L, 1); - lua_getfield(L, -1, "retracts"); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< boost::shared_ptr<PubSubEventRetract> > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubEventRetract> payload = boost::dynamic_pointer_cast<PubSubEventRetract>(convertors->convertFromLuaUntyped(L, -1, "pubsub_event_retract"))) { - items.push_back(payload); - } - } - lua_pop(L, 1); - } + result->setItems(items); + } + lua_pop(L, 1); + lua_getfield(L, -1, "retracts"); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::shared_ptr<PubSubEventRetract> > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubEventRetract> payload = std::dynamic_pointer_cast<PubSubEventRetract>(convertors->convertFromLuaUntyped(L, -1, "pubsub_event_retract"))) { + items.push_back(payload); + } + } + lua_pop(L, 1); + } - result->setRetracts(items); - } - lua_pop(L, 1); - return result; + result->setRetracts(items); + } + lua_pop(L, 1); + return result; } -void PubSubEventItemsConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEventItems> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - if (!payload->getItems().empty()) { - lua_createtable(L, boost::numeric_cast<int>(payload->getItems().size()), 0); - { - int i = 0; - foreach(boost::shared_ptr<PubSubEventItem> item, payload->getItems()) { - if (convertors->convertToLuaUntyped(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - lua_setfield(L, -2, "items"); - } - if (!payload->getRetracts().empty()) { - lua_createtable(L, boost::numeric_cast<int>(payload->getRetracts().size()), 0); - { - int i = 0; - foreach(boost::shared_ptr<PubSubEventRetract> item, payload->getRetracts()) { - if (convertors->convertToLuaUntyped(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - lua_setfield(L, -2, "retracts"); - } +void PubSubEventItemsConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEventItems> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + if (!payload->getItems().empty()) { + lua_createtable(L, boost::numeric_cast<int>(payload->getItems().size()), 0); + { + int i = 0; + for (auto&& item : payload->getItems()) { + if (convertors->convertToLuaUntyped(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + lua_setfield(L, -2, "items"); + } + if (!payload->getRetracts().empty()) { + lua_createtable(L, boost::numeric_cast<int>(payload->getRetracts().size()), 0); + { + int i = 0; + for (auto&& item : payload->getRetracts()) { + if (convertors->convertToLuaUntyped(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + lua_setfield(L, -2, "retracts"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubEventItemsConvertor::getDocumentation() const { - return Documentation( - "PubSubEventItems", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `items`: array<@{PubSubEventItem}>\n" - "- `retracts`: array<@{PubSubEventRetract}>\n" - ); + return Documentation( + "PubSubEventItems", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `items`: array<@{PubSubEventItem}>\n" + "- `retracts`: array<@{PubSubEventRetract}>\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubEventItemsConvertor.h b/Sluift/ElementConvertors/PubSubEventItemsConvertor.h index c409a3c..ea8942b 100644 --- a/Sluift/ElementConvertors/PubSubEventItemsConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventItemsConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEventItems.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEventItems.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubEventItemsConvertor : public GenericLuaElementConvertor<PubSubEventItems> { - public: - PubSubEventItemsConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventItemsConvertor(); + class PubSubEventItemsConvertor : public GenericLuaElementConvertor<PubSubEventItems> { + public: + PubSubEventItemsConvertor(LuaElementConvertors* convertors); + virtual ~PubSubEventItemsConvertor(); - virtual boost::shared_ptr<PubSubEventItems> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEventItems>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubEventItems> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEventItems>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventPurgeConvertor.cpp b/Sluift/ElementConvertors/PubSubEventPurgeConvertor.cpp index e4604c0..223eedd 100644 --- a/Sluift/ElementConvertors/PubSubEventPurgeConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventPurgeConvertor.cpp @@ -1,49 +1,44 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventPurgeConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubEventPurgeConvertor::PubSubEventPurgeConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEventPurge>("pubsub_event_purge"), - convertors(convertors) { +PubSubEventPurgeConvertor::PubSubEventPurgeConvertor() : + GenericLuaElementConvertor<PubSubEventPurge>("pubsub_event_purge") { } PubSubEventPurgeConvertor::~PubSubEventPurgeConvertor() { } -boost::shared_ptr<PubSubEventPurge> PubSubEventPurgeConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEventPurge> result = boost::make_shared<PubSubEventPurge>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubEventPurge> PubSubEventPurgeConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEventPurge> result = std::make_shared<PubSubEventPurge>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubEventPurgeConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEventPurge> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); +void PubSubEventPurgeConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEventPurge> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); } boost::optional<LuaElementConvertor::Documentation> PubSubEventPurgeConvertor::getDocumentation() const { - return Documentation( - "PubSubEventPurge", - "This table has the following fields:\n\n" - "- `node`: string\n" - ); + return Documentation( + "PubSubEventPurge", + "This table has the following fields:\n\n" + "- `node`: string\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubEventPurgeConvertor.h b/Sluift/ElementConvertors/PubSubEventPurgeConvertor.h index 39e571d..e3321b1 100644 --- a/Sluift/ElementConvertors/PubSubEventPurgeConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventPurgeConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEventPurge.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEventPurge.h> namespace Swift { - class LuaElementConvertors; - - class PubSubEventPurgeConvertor : public GenericLuaElementConvertor<PubSubEventPurge> { - public: - PubSubEventPurgeConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventPurgeConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubEventPurge> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEventPurge>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubEventPurgeConvertor : public GenericLuaElementConvertor<PubSubEventPurge> { + public: + PubSubEventPurgeConvertor(); + virtual ~PubSubEventPurgeConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubEventPurge> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEventPurge>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventRedirectConvertor.cpp b/Sluift/ElementConvertors/PubSubEventRedirectConvertor.cpp index 3c0555e..673b320 100644 --- a/Sluift/ElementConvertors/PubSubEventRedirectConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventRedirectConvertor.cpp @@ -1,49 +1,44 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventRedirectConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubEventRedirectConvertor::PubSubEventRedirectConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEventRedirect>("pubsub_event_redirect"), - convertors(convertors) { +PubSubEventRedirectConvertor::PubSubEventRedirectConvertor() : + GenericLuaElementConvertor<PubSubEventRedirect>("pubsub_event_redirect") { } PubSubEventRedirectConvertor::~PubSubEventRedirectConvertor() { } -boost::shared_ptr<PubSubEventRedirect> PubSubEventRedirectConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEventRedirect> result = boost::make_shared<PubSubEventRedirect>(); - lua_getfield(L, -1, "uri"); - if (lua_isstring(L, -1)) { - result->setURI(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubEventRedirect> PubSubEventRedirectConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEventRedirect> result = std::make_shared<PubSubEventRedirect>(); + lua_getfield(L, -1, "uri"); + if (lua_isstring(L, -1)) { + result->setURI(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubEventRedirectConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEventRedirect> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getURI().c_str()); - lua_setfield(L, -2, "uri"); +void PubSubEventRedirectConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEventRedirect> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getURI().c_str()); + lua_setfield(L, -2, "uri"); } boost::optional<LuaElementConvertor::Documentation> PubSubEventRedirectConvertor::getDocumentation() const { - return Documentation( - "PubSubEventRedirect", - "This table has the following fields:\n\n" - "- `uri`: string\n" - ); + return Documentation( + "PubSubEventRedirect", + "This table has the following fields:\n\n" + "- `uri`: string\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubEventRedirectConvertor.h b/Sluift/ElementConvertors/PubSubEventRedirectConvertor.h index 90b9d49..b1f33d2 100644 --- a/Sluift/ElementConvertors/PubSubEventRedirectConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventRedirectConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEventRedirect.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEventRedirect.h> namespace Swift { - class LuaElementConvertors; - - class PubSubEventRedirectConvertor : public GenericLuaElementConvertor<PubSubEventRedirect> { - public: - PubSubEventRedirectConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventRedirectConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubEventRedirect> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEventRedirect>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubEventRedirectConvertor : public GenericLuaElementConvertor<PubSubEventRedirect> { + public: + PubSubEventRedirectConvertor(); + virtual ~PubSubEventRedirectConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubEventRedirect> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEventRedirect>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventRetractConvertor.cpp b/Sluift/ElementConvertors/PubSubEventRetractConvertor.cpp index f4f1cfb..5981922 100644 --- a/Sluift/ElementConvertors/PubSubEventRetractConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventRetractConvertor.cpp @@ -1,49 +1,44 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventRetractConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubEventRetractConvertor::PubSubEventRetractConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEventRetract>("pubsub_event_retract"), - convertors(convertors) { +PubSubEventRetractConvertor::PubSubEventRetractConvertor() : + GenericLuaElementConvertor<PubSubEventRetract>("pubsub_event_retract") { } PubSubEventRetractConvertor::~PubSubEventRetractConvertor() { } -boost::shared_ptr<PubSubEventRetract> PubSubEventRetractConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEventRetract> result = boost::make_shared<PubSubEventRetract>(); - lua_getfield(L, -1, "id"); - if (lua_isstring(L, -1)) { - result->setID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubEventRetract> PubSubEventRetractConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEventRetract> result = std::make_shared<PubSubEventRetract>(); + lua_getfield(L, -1, "id"); + if (lua_isstring(L, -1)) { + result->setID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubEventRetractConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEventRetract> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getID().c_str()); - lua_setfield(L, -2, "id"); +void PubSubEventRetractConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEventRetract> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getID().c_str()); + lua_setfield(L, -2, "id"); } boost::optional<LuaElementConvertor::Documentation> PubSubEventRetractConvertor::getDocumentation() const { - return Documentation( - "PubSubEventRetract", - "This table has the following fields:\n\n" - "- `id`: string\n" - ); + return Documentation( + "PubSubEventRetract", + "This table has the following fields:\n\n" + "- `id`: string\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubEventRetractConvertor.h b/Sluift/ElementConvertors/PubSubEventRetractConvertor.h index 0e3b303..65aac36 100644 --- a/Sluift/ElementConvertors/PubSubEventRetractConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventRetractConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEventRetract.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEventRetract.h> namespace Swift { - class LuaElementConvertors; - - class PubSubEventRetractConvertor : public GenericLuaElementConvertor<PubSubEventRetract> { - public: - PubSubEventRetractConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventRetractConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubEventRetract> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEventRetract>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubEventRetractConvertor : public GenericLuaElementConvertor<PubSubEventRetract> { + public: + PubSubEventRetractConvertor(); + virtual ~PubSubEventRetractConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubEventRetract> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEventRetract>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubEventSubscriptionConvertor.cpp b/Sluift/ElementConvertors/PubSubEventSubscriptionConvertor.cpp index 7eec64d..cab78d4 100644 --- a/Sluift/ElementConvertors/PubSubEventSubscriptionConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubEventSubscriptionConvertor.cpp @@ -1,107 +1,104 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubEventSubscriptionConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Swiften/Base/DateTime.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubEventSubscriptionConvertor::PubSubEventSubscriptionConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubEventSubscription>("pubsub_event_subscription"), - convertors(convertors) { +PubSubEventSubscriptionConvertor::PubSubEventSubscriptionConvertor() : + GenericLuaElementConvertor<PubSubEventSubscription>("pubsub_event_subscription") { } PubSubEventSubscriptionConvertor::~PubSubEventSubscriptionConvertor() { } -boost::shared_ptr<PubSubEventSubscription> PubSubEventSubscriptionConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubEventSubscription> result = boost::make_shared<PubSubEventSubscription>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "jid"); - if (lua_isstring(L, -1)) { - result->setJID(JID(std::string(lua_tostring(L, -1)))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "subscription"); - if (lua_isstring(L, -1)) { - if (std::string(lua_tostring(L, -1)) == "none") { - result->setSubscription(PubSubEventSubscription::None); - } - if (std::string(lua_tostring(L, -1)) == "pending") { - result->setSubscription(PubSubEventSubscription::Pending); - } - if (std::string(lua_tostring(L, -1)) == "subscribed") { - result->setSubscription(PubSubEventSubscription::Subscribed); - } - if (std::string(lua_tostring(L, -1)) == "unconfigured") { - result->setSubscription(PubSubEventSubscription::Unconfigured); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "subscription_id"); - if (lua_isstring(L, -1)) { - result->setSubscriptionID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "expiry"); - if (lua_isstring(L, -1)) { - result->setExpiry(stringToDateTime(std::string(lua_tostring(L, -1)))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubEventSubscription> PubSubEventSubscriptionConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubEventSubscription> result = std::make_shared<PubSubEventSubscription>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "jid"); + if (lua_isstring(L, -1)) { + result->setJID(JID(std::string(lua_tostring(L, -1)))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "subscription"); + if (lua_isstring(L, -1)) { + if (std::string(lua_tostring(L, -1)) == "none") { + result->setSubscription(PubSubEventSubscription::None); + } + if (std::string(lua_tostring(L, -1)) == "pending") { + result->setSubscription(PubSubEventSubscription::Pending); + } + if (std::string(lua_tostring(L, -1)) == "subscribed") { + result->setSubscription(PubSubEventSubscription::Subscribed); + } + if (std::string(lua_tostring(L, -1)) == "unconfigured") { + result->setSubscription(PubSubEventSubscription::Unconfigured); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "subscription_id"); + if (lua_isstring(L, -1)) { + result->setSubscriptionID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "expiry"); + if (lua_isstring(L, -1)) { + result->setExpiry(stringToDateTime(std::string(lua_tostring(L, -1)))); + } + lua_pop(L, 1); + return result; } -void PubSubEventSubscriptionConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubEventSubscription> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - lua_pushstring(L, payload->getJID().toString().c_str()); - lua_setfield(L, -2, "jid"); - switch (payload->getSubscription()) { - case PubSubEventSubscription::None: - lua_pushstring(L, "none"); - break; - case PubSubEventSubscription::Pending: - lua_pushstring(L, "pending"); - break; - case PubSubEventSubscription::Subscribed: - lua_pushstring(L, "subscribed"); - break; - case PubSubEventSubscription::Unconfigured: - lua_pushstring(L, "unconfigured"); - break; - } - lua_setfield(L, -2, "subscription"); - if (payload->getSubscriptionID()) { - lua_pushstring(L, (*payload->getSubscriptionID()).c_str()); - lua_setfield(L, -2, "subscription_id"); - } - lua_pushstring(L, dateTimeToString(payload->getExpiry()).c_str()); - lua_setfield(L, -2, "expiry"); +void PubSubEventSubscriptionConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubEventSubscription> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + lua_pushstring(L, payload->getJID().toString().c_str()); + lua_setfield(L, -2, "jid"); + switch (payload->getSubscription()) { + case PubSubEventSubscription::None: + lua_pushstring(L, "none"); + break; + case PubSubEventSubscription::Pending: + lua_pushstring(L, "pending"); + break; + case PubSubEventSubscription::Subscribed: + lua_pushstring(L, "subscribed"); + break; + case PubSubEventSubscription::Unconfigured: + lua_pushstring(L, "unconfigured"); + break; + } + lua_setfield(L, -2, "subscription"); + if (payload->getSubscriptionID()) { + lua_pushstring(L, (*payload->getSubscriptionID()).c_str()); + lua_setfield(L, -2, "subscription_id"); + } + lua_pushstring(L, dateTimeToString(payload->getExpiry()).c_str()); + lua_setfield(L, -2, "expiry"); } boost::optional<LuaElementConvertor::Documentation> PubSubEventSubscriptionConvertor::getDocumentation() const { - return Documentation( - "PubSubEventSubscription", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `jid`: jid (string)\n" - "- `subscription`: `\"none\"`, `\"pending\"`, `\"subscribed\"`, or `\"unconfigured\"`\n" - "- `subscription_id`: string (Optional)\n" - "- `expiry`: datetime (string)\n" - ); + return Documentation( + "PubSubEventSubscription", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `jid`: jid (string)\n" + "- `subscription`: `\"none\"`, `\"pending\"`, `\"subscribed\"`, or `\"unconfigured\"`\n" + "- `subscription_id`: string (Optional)\n" + "- `expiry`: datetime (string)\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubEventSubscriptionConvertor.h b/Sluift/ElementConvertors/PubSubEventSubscriptionConvertor.h index c254e34..0b3181b 100644 --- a/Sluift/ElementConvertors/PubSubEventSubscriptionConvertor.h +++ b/Sluift/ElementConvertors/PubSubEventSubscriptionConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubEventSubscription.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubEventSubscription.h> namespace Swift { - class LuaElementConvertors; - - class PubSubEventSubscriptionConvertor : public GenericLuaElementConvertor<PubSubEventSubscription> { - public: - PubSubEventSubscriptionConvertor(LuaElementConvertors* convertors); - virtual ~PubSubEventSubscriptionConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubEventSubscription> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubEventSubscription>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubEventSubscriptionConvertor : public GenericLuaElementConvertor<PubSubEventSubscription> { + public: + PubSubEventSubscriptionConvertor(); + virtual ~PubSubEventSubscriptionConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubEventSubscription> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubEventSubscription>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubItemConvertor.cpp b/Sluift/ElementConvertors/PubSubItemConvertor.cpp index 61aa17c..27fd4a3 100644 --- a/Sluift/ElementConvertors/PubSubItemConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubItemConvertor.cpp @@ -1,81 +1,80 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubItemConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/LuaElementConvertors.h> -#include <Swiften/Base/foreach.h> +#include <lua.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -PubSubItemConvertor::PubSubItemConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubItem>("pubsub_item"), - convertors(convertors) { +PubSubItemConvertor::PubSubItemConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubItem>("pubsub_item"), + convertors(convertors) { } PubSubItemConvertor::~PubSubItemConvertor() { } -boost::shared_ptr<PubSubItem> PubSubItemConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubItem> result = boost::make_shared<PubSubItem>(); - lua_getfield(L, -1, "data"); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< boost::shared_ptr<Payload> > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<Payload> payload = boost::dynamic_pointer_cast<Payload>(convertors->convertFromLua(L, -1))) { - items.push_back(payload); - } - } - lua_pop(L, 1); - } +std::shared_ptr<PubSubItem> PubSubItemConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubItem> result = std::make_shared<PubSubItem>(); + lua_getfield(L, -1, "data"); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::shared_ptr<Payload> > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<Payload> payload = std::dynamic_pointer_cast<Payload>(convertors->convertFromLua(L, -1))) { + items.push_back(payload); + } + } + lua_pop(L, 1); + } - result->setData(items); - } - lua_pop(L, 1); - lua_getfield(L, -1, "id"); - if (lua_isstring(L, -1)) { - result->setID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; + result->setData(items); + } + lua_pop(L, 1); + lua_getfield(L, -1, "id"); + if (lua_isstring(L, -1)) { + result->setID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubItemConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubItem> payload) { - lua_createtable(L, 0, 0); - if (!payload->getData().empty()) { - lua_createtable(L, boost::numeric_cast<int>(payload->getData().size()), 0); - { - int i = 0; - foreach(boost::shared_ptr<Payload> item, payload->getData()) { - if (convertors->convertToLua(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - lua_setfield(L, -2, "data"); - } - lua_pushstring(L, payload->getID().c_str()); - lua_setfield(L, -2, "id"); +void PubSubItemConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubItem> payload) { + lua_createtable(L, 0, 0); + if (!payload->getData().empty()) { + lua_createtable(L, boost::numeric_cast<int>(payload->getData().size()), 0); + { + int i = 0; + for (auto&& item : payload->getData()) { + if (convertors->convertToLua(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + lua_setfield(L, -2, "data"); + } + lua_pushstring(L, payload->getID().c_str()); + lua_setfield(L, -2, "id"); } boost::optional<LuaElementConvertor::Documentation> PubSubItemConvertor::getDocumentation() const { - return Documentation( - "PubSubItem", - "This table has the following fields:\n\n" - "- `data`: array<element (table)>\n" - "- `id`: string\n" - ); + return Documentation( + "PubSubItem", + "This table has the following fields:\n\n" + "- `data`: array<element (table)>\n" + "- `id`: string\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubItemConvertor.h b/Sluift/ElementConvertors/PubSubItemConvertor.h index 334c15c..2772932 100644 --- a/Sluift/ElementConvertors/PubSubItemConvertor.h +++ b/Sluift/ElementConvertors/PubSubItemConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubItem.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubItem.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubItemConvertor : public GenericLuaElementConvertor<PubSubItem> { - public: - PubSubItemConvertor(LuaElementConvertors* convertors); - virtual ~PubSubItemConvertor(); + class PubSubItemConvertor : public GenericLuaElementConvertor<PubSubItem> { + public: + PubSubItemConvertor(LuaElementConvertors* convertors); + virtual ~PubSubItemConvertor(); - virtual boost::shared_ptr<PubSubItem> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubItem>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubItem> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubItem>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubItemsConvertor.cpp b/Sluift/ElementConvertors/PubSubItemsConvertor.cpp index 8ce1884..5fa1bd3 100644 --- a/Sluift/ElementConvertors/PubSubItemsConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubItemsConvertor.cpp @@ -1,97 +1,96 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubItemsConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/LuaElementConvertors.h> -#include <Swiften/Base/foreach.h> +#include <lua.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -PubSubItemsConvertor::PubSubItemsConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubItems>("pubsub_items"), - convertors(convertors) { +PubSubItemsConvertor::PubSubItemsConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubItems>("pubsub_items"), + convertors(convertors) { } PubSubItemsConvertor::~PubSubItemsConvertor() { } -boost::shared_ptr<PubSubItems> PubSubItemsConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubItems> result = boost::make_shared<PubSubItems>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< boost::shared_ptr<PubSubItem> > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubItem> payload = boost::dynamic_pointer_cast<PubSubItem>(convertors->convertFromLuaUntyped(L, -1, "pubsub_item"))) { - items.push_back(payload); - } - } - lua_pop(L, 1); - } +std::shared_ptr<PubSubItems> PubSubItemsConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubItems> result = std::make_shared<PubSubItems>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::shared_ptr<PubSubItem> > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubItem> payload = std::dynamic_pointer_cast<PubSubItem>(convertors->convertFromLuaUntyped(L, -1, "pubsub_item"))) { + items.push_back(payload); + } + } + lua_pop(L, 1); + } - result->setItems(items); - } - lua_getfield(L, -1, "maximum_items"); - if (lua_isnumber(L, -1)) { - result->setMaximumItems(boost::numeric_cast<unsigned int>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "subscription_id"); - if (lua_isstring(L, -1)) { - result->setSubscriptionID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; + result->setItems(items); + } + lua_getfield(L, -1, "maximum_items"); + if (lua_isnumber(L, -1)) { + result->setMaximumItems(boost::numeric_cast<unsigned int>(lua_tonumber(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "subscription_id"); + if (lua_isstring(L, -1)) { + result->setSubscriptionID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubItemsConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubItems> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - if (!payload->getItems().empty()) { - { - int i = 0; - foreach(boost::shared_ptr<PubSubItem> item, payload->getItems()) { - if (convertors->convertToLuaUntyped(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - } - if (payload->getMaximumItems()) { - lua_pushnumber(L, (*payload->getMaximumItems())); - lua_setfield(L, -2, "maximum_items"); - } - if (payload->getSubscriptionID()) { - lua_pushstring(L, (*payload->getSubscriptionID()).c_str()); - lua_setfield(L, -2, "subscription_id"); - } +void PubSubItemsConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubItems> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + if (!payload->getItems().empty()) { + { + int i = 0; + for (auto&& item : payload->getItems()) { + if (convertors->convertToLuaUntyped(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + } + if (payload->getMaximumItems()) { + lua_pushnumber(L, (*payload->getMaximumItems())); + lua_setfield(L, -2, "maximum_items"); + } + if (payload->getSubscriptionID()) { + lua_pushstring(L, (*payload->getSubscriptionID()).c_str()); + lua_setfield(L, -2, "subscription_id"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubItemsConvertor::getDocumentation() const { - return Documentation( - "PubSubItems", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `items`: array<@{PubSubItem}>\n" - "- `maximum_items`: number (Optional)\n" - "- `subscription_id`: string (Optional)\n" - ); + return Documentation( + "PubSubItems", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `items`: array<@{PubSubItem}>\n" + "- `maximum_items`: number (Optional)\n" + "- `subscription_id`: string (Optional)\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubItemsConvertor.h b/Sluift/ElementConvertors/PubSubItemsConvertor.h index 801c2d8..56348b0 100644 --- a/Sluift/ElementConvertors/PubSubItemsConvertor.h +++ b/Sluift/ElementConvertors/PubSubItemsConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubItems.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubItems.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubItemsConvertor : public GenericLuaElementConvertor<PubSubItems> { - public: - PubSubItemsConvertor(LuaElementConvertors* convertors); - virtual ~PubSubItemsConvertor(); + class PubSubItemsConvertor : public GenericLuaElementConvertor<PubSubItems> { + public: + PubSubItemsConvertor(LuaElementConvertors* convertors); + virtual ~PubSubItemsConvertor(); - virtual boost::shared_ptr<PubSubItems> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubItems>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubItems> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubItems>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubOptionsConvertor.cpp b/Sluift/ElementConvertors/PubSubOptionsConvertor.cpp index dcb37a5..3582c63 100644 --- a/Sluift/ElementConvertors/PubSubOptionsConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubOptionsConvertor.cpp @@ -1,78 +1,76 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubOptionsConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubOptionsConvertor::PubSubOptionsConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubOptions>("pubsub_options"), - convertors(convertors) { +PubSubOptionsConvertor::PubSubOptionsConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubOptions>("pubsub_options"), + convertors(convertors) { } PubSubOptionsConvertor::~PubSubOptionsConvertor() { } -boost::shared_ptr<PubSubOptions> PubSubOptionsConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubOptions> result = boost::make_shared<PubSubOptions>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "jid"); - if (lua_isstring(L, -1)) { - result->setJID(JID(std::string(lua_tostring(L, -1)))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "data"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<Form> payload = boost::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { - result->setData(payload); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "subscription_id"); - if (lua_isstring(L, -1)) { - result->setSubscriptionID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubOptions> PubSubOptionsConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubOptions> result = std::make_shared<PubSubOptions>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "jid"); + if (lua_isstring(L, -1)) { + result->setJID(JID(std::string(lua_tostring(L, -1)))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "data"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<Form> payload = std::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { + result->setData(payload); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "subscription_id"); + if (lua_isstring(L, -1)) { + result->setSubscriptionID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubOptionsConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubOptions> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - lua_pushstring(L, payload->getJID().toString().c_str()); - lua_setfield(L, -2, "jid"); - if (convertors->convertToLuaUntyped(L, payload->getData()) > 0) { - lua_setfield(L, -2, "data"); - } - if (payload->getSubscriptionID()) { - lua_pushstring(L, (*payload->getSubscriptionID()).c_str()); - lua_setfield(L, -2, "subscription_id"); - } +void PubSubOptionsConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubOptions> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + lua_pushstring(L, payload->getJID().toString().c_str()); + lua_setfield(L, -2, "jid"); + if (convertors->convertToLuaUntyped(L, payload->getData()) > 0) { + lua_setfield(L, -2, "data"); + } + if (payload->getSubscriptionID()) { + lua_pushstring(L, (*payload->getSubscriptionID()).c_str()); + lua_setfield(L, -2, "subscription_id"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubOptionsConvertor::getDocumentation() const { - return Documentation( - "PubSubOptions", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `jid`: jid (string)\n" - "- `data`: @{Form}\n" - "- `subscription_id`: string (Optional)\n" - ); + return Documentation( + "PubSubOptions", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `jid`: jid (string)\n" + "- `data`: @{Form}\n" + "- `subscription_id`: string (Optional)\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubOptionsConvertor.h b/Sluift/ElementConvertors/PubSubOptionsConvertor.h index 8aacdbd..60d11cc 100644 --- a/Sluift/ElementConvertors/PubSubOptionsConvertor.h +++ b/Sluift/ElementConvertors/PubSubOptionsConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubOptions.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubOptions.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubOptionsConvertor : public GenericLuaElementConvertor<PubSubOptions> { - public: - PubSubOptionsConvertor(LuaElementConvertors* convertors); - virtual ~PubSubOptionsConvertor(); + class PubSubOptionsConvertor : public GenericLuaElementConvertor<PubSubOptions> { + public: + PubSubOptionsConvertor(LuaElementConvertors* convertors); + virtual ~PubSubOptionsConvertor(); - virtual boost::shared_ptr<PubSubOptions> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubOptions>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubOptions> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubOptions>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubOwnerAffiliationConvertor.cpp b/Sluift/ElementConvertors/PubSubOwnerAffiliationConvertor.cpp index bfcd4c4..15a800b 100644 --- a/Sluift/ElementConvertors/PubSubOwnerAffiliationConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubOwnerAffiliationConvertor.cpp @@ -1,93 +1,88 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubOwnerAffiliationConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubOwnerAffiliationConvertor::PubSubOwnerAffiliationConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubOwnerAffiliation>("pubsub_owner_affiliation"), - convertors(convertors) { +PubSubOwnerAffiliationConvertor::PubSubOwnerAffiliationConvertor() : + GenericLuaElementConvertor<PubSubOwnerAffiliation>("pubsub_owner_affiliation") { } PubSubOwnerAffiliationConvertor::~PubSubOwnerAffiliationConvertor() { } -boost::shared_ptr<PubSubOwnerAffiliation> PubSubOwnerAffiliationConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubOwnerAffiliation> result = boost::make_shared<PubSubOwnerAffiliation>(); - lua_getfield(L, -1, "jid"); - if (lua_isstring(L, -1)) { - result->setJID(JID(std::string(lua_tostring(L, -1)))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "type"); - if (lua_isstring(L, -1)) { - if (std::string(lua_tostring(L, -1)) == "none") { - result->setType(PubSubOwnerAffiliation::None); - } - if (std::string(lua_tostring(L, -1)) == "member") { - result->setType(PubSubOwnerAffiliation::Member); - } - if (std::string(lua_tostring(L, -1)) == "outcast") { - result->setType(PubSubOwnerAffiliation::Outcast); - } - if (std::string(lua_tostring(L, -1)) == "owner") { - result->setType(PubSubOwnerAffiliation::Owner); - } - if (std::string(lua_tostring(L, -1)) == "publisher") { - result->setType(PubSubOwnerAffiliation::Publisher); - } - if (std::string(lua_tostring(L, -1)) == "publish_only") { - result->setType(PubSubOwnerAffiliation::PublishOnly); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubOwnerAffiliation> PubSubOwnerAffiliationConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubOwnerAffiliation> result = std::make_shared<PubSubOwnerAffiliation>(); + lua_getfield(L, -1, "jid"); + if (lua_isstring(L, -1)) { + result->setJID(JID(std::string(lua_tostring(L, -1)))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "type"); + if (lua_isstring(L, -1)) { + if (std::string(lua_tostring(L, -1)) == "none") { + result->setType(PubSubOwnerAffiliation::None); + } + if (std::string(lua_tostring(L, -1)) == "member") { + result->setType(PubSubOwnerAffiliation::Member); + } + if (std::string(lua_tostring(L, -1)) == "outcast") { + result->setType(PubSubOwnerAffiliation::Outcast); + } + if (std::string(lua_tostring(L, -1)) == "owner") { + result->setType(PubSubOwnerAffiliation::Owner); + } + if (std::string(lua_tostring(L, -1)) == "publisher") { + result->setType(PubSubOwnerAffiliation::Publisher); + } + if (std::string(lua_tostring(L, -1)) == "publish_only") { + result->setType(PubSubOwnerAffiliation::PublishOnly); + } + } + lua_pop(L, 1); + return result; } -void PubSubOwnerAffiliationConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubOwnerAffiliation> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getJID().toString().c_str()); - lua_setfield(L, -2, "jid"); - switch (payload->getType()) { - case PubSubOwnerAffiliation::None: - lua_pushstring(L, "none"); - break; - case PubSubOwnerAffiliation::Member: - lua_pushstring(L, "member"); - break; - case PubSubOwnerAffiliation::Outcast: - lua_pushstring(L, "outcast"); - break; - case PubSubOwnerAffiliation::Owner: - lua_pushstring(L, "owner"); - break; - case PubSubOwnerAffiliation::Publisher: - lua_pushstring(L, "publisher"); - break; - case PubSubOwnerAffiliation::PublishOnly: - lua_pushstring(L, "publish_only"); - break; - } - lua_setfield(L, -2, "type"); +void PubSubOwnerAffiliationConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubOwnerAffiliation> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getJID().toString().c_str()); + lua_setfield(L, -2, "jid"); + switch (payload->getType()) { + case PubSubOwnerAffiliation::None: + lua_pushstring(L, "none"); + break; + case PubSubOwnerAffiliation::Member: + lua_pushstring(L, "member"); + break; + case PubSubOwnerAffiliation::Outcast: + lua_pushstring(L, "outcast"); + break; + case PubSubOwnerAffiliation::Owner: + lua_pushstring(L, "owner"); + break; + case PubSubOwnerAffiliation::Publisher: + lua_pushstring(L, "publisher"); + break; + case PubSubOwnerAffiliation::PublishOnly: + lua_pushstring(L, "publish_only"); + break; + } + lua_setfield(L, -2, "type"); } boost::optional<LuaElementConvertor::Documentation> PubSubOwnerAffiliationConvertor::getDocumentation() const { - return Documentation( - "PubSubOwnerAffiliation", - "This table has the following fields:\n\n" - "- `jid`: jid (string)\n" - "- `type`: `\"none\"`, `\"member\"`, `\"outcast\"`, `\"owner\"`, `\"publisher\"`, or `\"publish_only\"`\n" - ); + return Documentation( + "PubSubOwnerAffiliation", + "This table has the following fields:\n\n" + "- `jid`: jid (string)\n" + "- `type`: `\"none\"`, `\"member\"`, `\"outcast\"`, `\"owner\"`, `\"publisher\"`, or `\"publish_only\"`\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubOwnerAffiliationConvertor.h b/Sluift/ElementConvertors/PubSubOwnerAffiliationConvertor.h index f16503f..9020482 100644 --- a/Sluift/ElementConvertors/PubSubOwnerAffiliationConvertor.h +++ b/Sluift/ElementConvertors/PubSubOwnerAffiliationConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubOwnerAffiliation.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubOwnerAffiliation.h> namespace Swift { - class LuaElementConvertors; - - class PubSubOwnerAffiliationConvertor : public GenericLuaElementConvertor<PubSubOwnerAffiliation> { - public: - PubSubOwnerAffiliationConvertor(LuaElementConvertors* convertors); - virtual ~PubSubOwnerAffiliationConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubOwnerAffiliation> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubOwnerAffiliation>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubOwnerAffiliationConvertor : public GenericLuaElementConvertor<PubSubOwnerAffiliation> { + public: + PubSubOwnerAffiliationConvertor(); + virtual ~PubSubOwnerAffiliationConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubOwnerAffiliation> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubOwnerAffiliation>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.cpp b/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.cpp index 85f9c3f..ee8a8cb 100644 --- a/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.cpp @@ -1,77 +1,76 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/LuaElementConvertors.h> -#include <Swiften/Base/foreach.h> +#include <lua.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -PubSubOwnerAffiliationsConvertor::PubSubOwnerAffiliationsConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubOwnerAffiliations>("pubsub_owner_affiliations"), - convertors(convertors) { +PubSubOwnerAffiliationsConvertor::PubSubOwnerAffiliationsConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubOwnerAffiliations>("pubsub_owner_affiliations"), + convertors(convertors) { } PubSubOwnerAffiliationsConvertor::~PubSubOwnerAffiliationsConvertor() { } -boost::shared_ptr<PubSubOwnerAffiliations> PubSubOwnerAffiliationsConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubOwnerAffiliations> result = boost::make_shared<PubSubOwnerAffiliations>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< boost::shared_ptr<PubSubOwnerAffiliation> > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubOwnerAffiliation> payload = boost::dynamic_pointer_cast<PubSubOwnerAffiliation>(convertors->convertFromLuaUntyped(L, -1, "pubsub_owner_affiliation"))) { - items.push_back(payload); - } - } - lua_pop(L, 1); - } +std::shared_ptr<PubSubOwnerAffiliations> PubSubOwnerAffiliationsConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubOwnerAffiliations> result = std::make_shared<PubSubOwnerAffiliations>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::shared_ptr<PubSubOwnerAffiliation> > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubOwnerAffiliation> payload = std::dynamic_pointer_cast<PubSubOwnerAffiliation>(convertors->convertFromLuaUntyped(L, -1, "pubsub_owner_affiliation"))) { + items.push_back(payload); + } + } + lua_pop(L, 1); + } - result->setAffiliations(items); - } - return result; + result->setAffiliations(items); + } + return result; } -void PubSubOwnerAffiliationsConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubOwnerAffiliations> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - if (!payload->getAffiliations().empty()) { - { - int i = 0; - foreach(boost::shared_ptr<PubSubOwnerAffiliation> item, payload->getAffiliations()) { - if (convertors->convertToLuaUntyped(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - } +void PubSubOwnerAffiliationsConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubOwnerAffiliations> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + if (!payload->getAffiliations().empty()) { + { + int i = 0; + for (auto&& item : payload->getAffiliations()) { + if (convertors->convertToLuaUntyped(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + } } boost::optional<LuaElementConvertor::Documentation> PubSubOwnerAffiliationsConvertor::getDocumentation() const { - return Documentation( - "PubSubOwnerAffiliations", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `affiliations`: array<@{PubSubOwnerAffiliation}>\n" - ); + return Documentation( + "PubSubOwnerAffiliations", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `affiliations`: array<@{PubSubOwnerAffiliation}>\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.h b/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.h index 63ed4a7..3026e2c 100644 --- a/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.h +++ b/Sluift/ElementConvertors/PubSubOwnerAffiliationsConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubOwnerAffiliations.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubOwnerAffiliations.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubOwnerAffiliationsConvertor : public GenericLuaElementConvertor<PubSubOwnerAffiliations> { - public: - PubSubOwnerAffiliationsConvertor(LuaElementConvertors* convertors); - virtual ~PubSubOwnerAffiliationsConvertor(); + class PubSubOwnerAffiliationsConvertor : public GenericLuaElementConvertor<PubSubOwnerAffiliations> { + public: + PubSubOwnerAffiliationsConvertor(LuaElementConvertors* convertors); + virtual ~PubSubOwnerAffiliationsConvertor(); - virtual boost::shared_ptr<PubSubOwnerAffiliations> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubOwnerAffiliations>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubOwnerAffiliations> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubOwnerAffiliations>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubOwnerConfigureConvertor.cpp b/Sluift/ElementConvertors/PubSubOwnerConfigureConvertor.cpp index 1c8c0fb..d179152 100644 --- a/Sluift/ElementConvertors/PubSubOwnerConfigureConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubOwnerConfigureConvertor.cpp @@ -1,62 +1,60 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubOwnerConfigureConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubOwnerConfigureConvertor::PubSubOwnerConfigureConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubOwnerConfigure>("pubsub_owner_configure"), - convertors(convertors) { +PubSubOwnerConfigureConvertor::PubSubOwnerConfigureConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubOwnerConfigure>("pubsub_owner_configure"), + convertors(convertors) { } PubSubOwnerConfigureConvertor::~PubSubOwnerConfigureConvertor() { } -boost::shared_ptr<PubSubOwnerConfigure> PubSubOwnerConfigureConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubOwnerConfigure> result = boost::make_shared<PubSubOwnerConfigure>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "data"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<Form> payload = boost::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { - result->setData(payload); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubOwnerConfigure> PubSubOwnerConfigureConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubOwnerConfigure> result = std::make_shared<PubSubOwnerConfigure>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "data"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<Form> payload = std::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { + result->setData(payload); + } + } + lua_pop(L, 1); + return result; } -void PubSubOwnerConfigureConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubOwnerConfigure> payload) { - lua_createtable(L, 0, 0); - if (payload->getNode()) { - lua_pushstring(L, (*payload->getNode()).c_str()); - lua_setfield(L, -2, "node"); - } - if (convertors->convertToLuaUntyped(L, payload->getData()) > 0) { - lua_setfield(L, -2, "data"); - } +void PubSubOwnerConfigureConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubOwnerConfigure> payload) { + lua_createtable(L, 0, 0); + if (payload->getNode()) { + lua_pushstring(L, (*payload->getNode()).c_str()); + lua_setfield(L, -2, "node"); + } + if (convertors->convertToLuaUntyped(L, payload->getData()) > 0) { + lua_setfield(L, -2, "data"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubOwnerConfigureConvertor::getDocumentation() const { - return Documentation( - "PubSubOwnerConfigure", - "This table has the following fields:\n\n" - "- `node`: string (Optional)\n" - "- `data`: @{Form}\n" - ); + return Documentation( + "PubSubOwnerConfigure", + "This table has the following fields:\n\n" + "- `node`: string (Optional)\n" + "- `data`: @{Form}\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubOwnerConfigureConvertor.h b/Sluift/ElementConvertors/PubSubOwnerConfigureConvertor.h index d02336d..4b39fdf 100644 --- a/Sluift/ElementConvertors/PubSubOwnerConfigureConvertor.h +++ b/Sluift/ElementConvertors/PubSubOwnerConfigureConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubOwnerConfigure.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubOwnerConfigure.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubOwnerConfigureConvertor : public GenericLuaElementConvertor<PubSubOwnerConfigure> { - public: - PubSubOwnerConfigureConvertor(LuaElementConvertors* convertors); - virtual ~PubSubOwnerConfigureConvertor(); + class PubSubOwnerConfigureConvertor : public GenericLuaElementConvertor<PubSubOwnerConfigure> { + public: + PubSubOwnerConfigureConvertor(LuaElementConvertors* convertors); + virtual ~PubSubOwnerConfigureConvertor(); - virtual boost::shared_ptr<PubSubOwnerConfigure> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubOwnerConfigure>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubOwnerConfigure> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubOwnerConfigure>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubOwnerDefaultConvertor.cpp b/Sluift/ElementConvertors/PubSubOwnerDefaultConvertor.cpp index 9879be2..b2ff3de 100644 --- a/Sluift/ElementConvertors/PubSubOwnerDefaultConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubOwnerDefaultConvertor.cpp @@ -1,52 +1,50 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubOwnerDefaultConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubOwnerDefaultConvertor::PubSubOwnerDefaultConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubOwnerDefault>("pubsub_owner_default"), - convertors(convertors) { +PubSubOwnerDefaultConvertor::PubSubOwnerDefaultConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubOwnerDefault>("pubsub_owner_default"), + convertors(convertors) { } PubSubOwnerDefaultConvertor::~PubSubOwnerDefaultConvertor() { } -boost::shared_ptr<PubSubOwnerDefault> PubSubOwnerDefaultConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubOwnerDefault> result = boost::make_shared<PubSubOwnerDefault>(); - lua_getfield(L, -1, "data"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<Form> payload = boost::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { - result->setData(payload); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubOwnerDefault> PubSubOwnerDefaultConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubOwnerDefault> result = std::make_shared<PubSubOwnerDefault>(); + lua_getfield(L, -1, "data"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<Form> payload = std::dynamic_pointer_cast<Form>(convertors->convertFromLuaUntyped(L, -1, "form"))) { + result->setData(payload); + } + } + lua_pop(L, 1); + return result; } -void PubSubOwnerDefaultConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubOwnerDefault> payload) { - lua_createtable(L, 0, 0); - if (convertors->convertToLuaUntyped(L, payload->getData()) > 0) { - lua_setfield(L, -2, "data"); - } +void PubSubOwnerDefaultConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubOwnerDefault> payload) { + lua_createtable(L, 0, 0); + if (convertors->convertToLuaUntyped(L, payload->getData()) > 0) { + lua_setfield(L, -2, "data"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubOwnerDefaultConvertor::getDocumentation() const { - return Documentation( - "PubSubOwnerDefault", - "This table has the following fields:\n\n" - "- `data`: @{Form}\n" - ); + return Documentation( + "PubSubOwnerDefault", + "This table has the following fields:\n\n" + "- `data`: @{Form}\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubOwnerDefaultConvertor.h b/Sluift/ElementConvertors/PubSubOwnerDefaultConvertor.h index 932c3ae..ae0f018 100644 --- a/Sluift/ElementConvertors/PubSubOwnerDefaultConvertor.h +++ b/Sluift/ElementConvertors/PubSubOwnerDefaultConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubOwnerDefault.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubOwnerDefault.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubOwnerDefaultConvertor : public GenericLuaElementConvertor<PubSubOwnerDefault> { - public: - PubSubOwnerDefaultConvertor(LuaElementConvertors* convertors); - virtual ~PubSubOwnerDefaultConvertor(); + class PubSubOwnerDefaultConvertor : public GenericLuaElementConvertor<PubSubOwnerDefault> { + public: + PubSubOwnerDefaultConvertor(LuaElementConvertors* convertors); + virtual ~PubSubOwnerDefaultConvertor(); - virtual boost::shared_ptr<PubSubOwnerDefault> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubOwnerDefault>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubOwnerDefault> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubOwnerDefault>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubOwnerDeleteConvertor.cpp b/Sluift/ElementConvertors/PubSubOwnerDeleteConvertor.cpp index e6e2b4f..3733d74 100644 --- a/Sluift/ElementConvertors/PubSubOwnerDeleteConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubOwnerDeleteConvertor.cpp @@ -1,60 +1,58 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubOwnerDeleteConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubOwnerDeleteConvertor::PubSubOwnerDeleteConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubOwnerDelete>("pubsub_owner_delete"), - convertors(convertors) { +PubSubOwnerDeleteConvertor::PubSubOwnerDeleteConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubOwnerDelete>("pubsub_owner_delete"), + convertors(convertors) { } PubSubOwnerDeleteConvertor::~PubSubOwnerDeleteConvertor() { } -boost::shared_ptr<PubSubOwnerDelete> PubSubOwnerDeleteConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubOwnerDelete> result = boost::make_shared<PubSubOwnerDelete>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "redirect"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubOwnerRedirect> payload = boost::dynamic_pointer_cast<PubSubOwnerRedirect>(convertors->convertFromLuaUntyped(L, -1, "pubsub_owner_redirect"))) { - result->setRedirect(payload); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubOwnerDelete> PubSubOwnerDeleteConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubOwnerDelete> result = std::make_shared<PubSubOwnerDelete>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "redirect"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubOwnerRedirect> payload = std::dynamic_pointer_cast<PubSubOwnerRedirect>(convertors->convertFromLuaUntyped(L, -1, "pubsub_owner_redirect"))) { + result->setRedirect(payload); + } + } + lua_pop(L, 1); + return result; } -void PubSubOwnerDeleteConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubOwnerDelete> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - if (convertors->convertToLuaUntyped(L, payload->getRedirect()) > 0) { - lua_setfield(L, -2, "redirect"); - } +void PubSubOwnerDeleteConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubOwnerDelete> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + if (convertors->convertToLuaUntyped(L, payload->getRedirect()) > 0) { + lua_setfield(L, -2, "redirect"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubOwnerDeleteConvertor::getDocumentation() const { - return Documentation( - "PubSubOwnerDelete", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `redirect`: @{PubSubOwnerRedirect}\n" - ); + return Documentation( + "PubSubOwnerDelete", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `redirect`: @{PubSubOwnerRedirect}\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubOwnerDeleteConvertor.h b/Sluift/ElementConvertors/PubSubOwnerDeleteConvertor.h index a48dcf9..54a2cf9 100644 --- a/Sluift/ElementConvertors/PubSubOwnerDeleteConvertor.h +++ b/Sluift/ElementConvertors/PubSubOwnerDeleteConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubOwnerDelete.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubOwnerDelete.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubOwnerDeleteConvertor : public GenericLuaElementConvertor<PubSubOwnerDelete> { - public: - PubSubOwnerDeleteConvertor(LuaElementConvertors* convertors); - virtual ~PubSubOwnerDeleteConvertor(); + class PubSubOwnerDeleteConvertor : public GenericLuaElementConvertor<PubSubOwnerDelete> { + public: + PubSubOwnerDeleteConvertor(LuaElementConvertors* convertors); + virtual ~PubSubOwnerDeleteConvertor(); - virtual boost::shared_ptr<PubSubOwnerDelete> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubOwnerDelete>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubOwnerDelete> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubOwnerDelete>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubOwnerPurgeConvertor.cpp b/Sluift/ElementConvertors/PubSubOwnerPurgeConvertor.cpp index 5b605bd..98c6355 100644 --- a/Sluift/ElementConvertors/PubSubOwnerPurgeConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubOwnerPurgeConvertor.cpp @@ -1,49 +1,44 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubOwnerPurgeConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubOwnerPurgeConvertor::PubSubOwnerPurgeConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubOwnerPurge>("pubsub_owner_purge"), - convertors(convertors) { +PubSubOwnerPurgeConvertor::PubSubOwnerPurgeConvertor() : + GenericLuaElementConvertor<PubSubOwnerPurge>("pubsub_owner_purge") { } PubSubOwnerPurgeConvertor::~PubSubOwnerPurgeConvertor() { } -boost::shared_ptr<PubSubOwnerPurge> PubSubOwnerPurgeConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubOwnerPurge> result = boost::make_shared<PubSubOwnerPurge>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubOwnerPurge> PubSubOwnerPurgeConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubOwnerPurge> result = std::make_shared<PubSubOwnerPurge>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubOwnerPurgeConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubOwnerPurge> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); +void PubSubOwnerPurgeConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubOwnerPurge> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); } boost::optional<LuaElementConvertor::Documentation> PubSubOwnerPurgeConvertor::getDocumentation() const { - return Documentation( - "PubSubOwnerPurge", - "This table has the following fields:\n\n" - "- `node`: string\n" - ); + return Documentation( + "PubSubOwnerPurge", + "This table has the following fields:\n\n" + "- `node`: string\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubOwnerPurgeConvertor.h b/Sluift/ElementConvertors/PubSubOwnerPurgeConvertor.h index 45bba63..4696f45 100644 --- a/Sluift/ElementConvertors/PubSubOwnerPurgeConvertor.h +++ b/Sluift/ElementConvertors/PubSubOwnerPurgeConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubOwnerPurge.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubOwnerPurge.h> namespace Swift { - class LuaElementConvertors; - - class PubSubOwnerPurgeConvertor : public GenericLuaElementConvertor<PubSubOwnerPurge> { - public: - PubSubOwnerPurgeConvertor(LuaElementConvertors* convertors); - virtual ~PubSubOwnerPurgeConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubOwnerPurge> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubOwnerPurge>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubOwnerPurgeConvertor : public GenericLuaElementConvertor<PubSubOwnerPurge> { + public: + PubSubOwnerPurgeConvertor(); + virtual ~PubSubOwnerPurgeConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubOwnerPurge> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubOwnerPurge>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubOwnerRedirectConvertor.cpp b/Sluift/ElementConvertors/PubSubOwnerRedirectConvertor.cpp index 4ac5573..8fc20d2 100644 --- a/Sluift/ElementConvertors/PubSubOwnerRedirectConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubOwnerRedirectConvertor.cpp @@ -1,49 +1,44 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubOwnerRedirectConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubOwnerRedirectConvertor::PubSubOwnerRedirectConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubOwnerRedirect>("pubsub_owner_redirect"), - convertors(convertors) { +PubSubOwnerRedirectConvertor::PubSubOwnerRedirectConvertor() : + GenericLuaElementConvertor<PubSubOwnerRedirect>("pubsub_owner_redirect") { } PubSubOwnerRedirectConvertor::~PubSubOwnerRedirectConvertor() { } -boost::shared_ptr<PubSubOwnerRedirect> PubSubOwnerRedirectConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubOwnerRedirect> result = boost::make_shared<PubSubOwnerRedirect>(); - lua_getfield(L, -1, "uri"); - if (lua_isstring(L, -1)) { - result->setURI(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubOwnerRedirect> PubSubOwnerRedirectConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubOwnerRedirect> result = std::make_shared<PubSubOwnerRedirect>(); + lua_getfield(L, -1, "uri"); + if (lua_isstring(L, -1)) { + result->setURI(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubOwnerRedirectConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubOwnerRedirect> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getURI().c_str()); - lua_setfield(L, -2, "uri"); +void PubSubOwnerRedirectConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubOwnerRedirect> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getURI().c_str()); + lua_setfield(L, -2, "uri"); } boost::optional<LuaElementConvertor::Documentation> PubSubOwnerRedirectConvertor::getDocumentation() const { - return Documentation( - "PubSubOwnerRedirect", - "This table has the following fields:\n\n" - "- `uri`: string\n" - ); + return Documentation( + "PubSubOwnerRedirect", + "This table has the following fields:\n\n" + "- `uri`: string\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubOwnerRedirectConvertor.h b/Sluift/ElementConvertors/PubSubOwnerRedirectConvertor.h index e563f97..3517a49 100644 --- a/Sluift/ElementConvertors/PubSubOwnerRedirectConvertor.h +++ b/Sluift/ElementConvertors/PubSubOwnerRedirectConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubOwnerRedirect.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubOwnerRedirect.h> namespace Swift { - class LuaElementConvertors; - - class PubSubOwnerRedirectConvertor : public GenericLuaElementConvertor<PubSubOwnerRedirect> { - public: - PubSubOwnerRedirectConvertor(LuaElementConvertors* convertors); - virtual ~PubSubOwnerRedirectConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubOwnerRedirect> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubOwnerRedirect>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubOwnerRedirectConvertor : public GenericLuaElementConvertor<PubSubOwnerRedirect> { + public: + PubSubOwnerRedirectConvertor(); + virtual ~PubSubOwnerRedirectConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubOwnerRedirect> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubOwnerRedirect>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubOwnerSubscriptionConvertor.cpp b/Sluift/ElementConvertors/PubSubOwnerSubscriptionConvertor.cpp index 844d669..e0b3687 100644 --- a/Sluift/ElementConvertors/PubSubOwnerSubscriptionConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubOwnerSubscriptionConvertor.cpp @@ -1,81 +1,76 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubOwnerSubscriptionConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubOwnerSubscriptionConvertor::PubSubOwnerSubscriptionConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubOwnerSubscription>("pubsub_owner_subscription"), - convertors(convertors) { +PubSubOwnerSubscriptionConvertor::PubSubOwnerSubscriptionConvertor() : + GenericLuaElementConvertor<PubSubOwnerSubscription>("pubsub_owner_subscription") { } PubSubOwnerSubscriptionConvertor::~PubSubOwnerSubscriptionConvertor() { } -boost::shared_ptr<PubSubOwnerSubscription> PubSubOwnerSubscriptionConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubOwnerSubscription> result = boost::make_shared<PubSubOwnerSubscription>(); - lua_getfield(L, -1, "jid"); - if (lua_isstring(L, -1)) { - result->setJID(JID(std::string(lua_tostring(L, -1)))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "subscription"); - if (lua_isstring(L, -1)) { - if (std::string(lua_tostring(L, -1)) == "none") { - result->setSubscription(PubSubOwnerSubscription::None); - } - if (std::string(lua_tostring(L, -1)) == "pending") { - result->setSubscription(PubSubOwnerSubscription::Pending); - } - if (std::string(lua_tostring(L, -1)) == "subscribed") { - result->setSubscription(PubSubOwnerSubscription::Subscribed); - } - if (std::string(lua_tostring(L, -1)) == "unconfigured") { - result->setSubscription(PubSubOwnerSubscription::Unconfigured); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubOwnerSubscription> PubSubOwnerSubscriptionConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubOwnerSubscription> result = std::make_shared<PubSubOwnerSubscription>(); + lua_getfield(L, -1, "jid"); + if (lua_isstring(L, -1)) { + result->setJID(JID(std::string(lua_tostring(L, -1)))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "subscription"); + if (lua_isstring(L, -1)) { + if (std::string(lua_tostring(L, -1)) == "none") { + result->setSubscription(PubSubOwnerSubscription::None); + } + if (std::string(lua_tostring(L, -1)) == "pending") { + result->setSubscription(PubSubOwnerSubscription::Pending); + } + if (std::string(lua_tostring(L, -1)) == "subscribed") { + result->setSubscription(PubSubOwnerSubscription::Subscribed); + } + if (std::string(lua_tostring(L, -1)) == "unconfigured") { + result->setSubscription(PubSubOwnerSubscription::Unconfigured); + } + } + lua_pop(L, 1); + return result; } -void PubSubOwnerSubscriptionConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubOwnerSubscription> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getJID().toString().c_str()); - lua_setfield(L, -2, "jid"); - switch (payload->getSubscription()) { - case PubSubOwnerSubscription::None: - lua_pushstring(L, "none"); - break; - case PubSubOwnerSubscription::Pending: - lua_pushstring(L, "pending"); - break; - case PubSubOwnerSubscription::Subscribed: - lua_pushstring(L, "subscribed"); - break; - case PubSubOwnerSubscription::Unconfigured: - lua_pushstring(L, "unconfigured"); - break; - } - lua_setfield(L, -2, "subscription"); +void PubSubOwnerSubscriptionConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubOwnerSubscription> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getJID().toString().c_str()); + lua_setfield(L, -2, "jid"); + switch (payload->getSubscription()) { + case PubSubOwnerSubscription::None: + lua_pushstring(L, "none"); + break; + case PubSubOwnerSubscription::Pending: + lua_pushstring(L, "pending"); + break; + case PubSubOwnerSubscription::Subscribed: + lua_pushstring(L, "subscribed"); + break; + case PubSubOwnerSubscription::Unconfigured: + lua_pushstring(L, "unconfigured"); + break; + } + lua_setfield(L, -2, "subscription"); } boost::optional<LuaElementConvertor::Documentation> PubSubOwnerSubscriptionConvertor::getDocumentation() const { - return Documentation( - "PubSubOwnerSubscription", - "This table has the following fields:\n\n" - "- `jid`: jid (string)\n" - "- `subscription`: `\"none\"`, `\"pending\"`, `\"subscribed\"`, or `\"unconfigured\"`\n" - ); + return Documentation( + "PubSubOwnerSubscription", + "This table has the following fields:\n\n" + "- `jid`: jid (string)\n" + "- `subscription`: `\"none\"`, `\"pending\"`, `\"subscribed\"`, or `\"unconfigured\"`\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubOwnerSubscriptionConvertor.h b/Sluift/ElementConvertors/PubSubOwnerSubscriptionConvertor.h index 6742013..2908654 100644 --- a/Sluift/ElementConvertors/PubSubOwnerSubscriptionConvertor.h +++ b/Sluift/ElementConvertors/PubSubOwnerSubscriptionConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubOwnerSubscription.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubOwnerSubscription.h> namespace Swift { - class LuaElementConvertors; - - class PubSubOwnerSubscriptionConvertor : public GenericLuaElementConvertor<PubSubOwnerSubscription> { - public: - PubSubOwnerSubscriptionConvertor(LuaElementConvertors* convertors); - virtual ~PubSubOwnerSubscriptionConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubOwnerSubscription> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubOwnerSubscription>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubOwnerSubscriptionConvertor : public GenericLuaElementConvertor<PubSubOwnerSubscription> { + public: + PubSubOwnerSubscriptionConvertor(); + virtual ~PubSubOwnerSubscriptionConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubOwnerSubscription> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubOwnerSubscription>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.cpp b/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.cpp index d061b2d..88085b5 100644 --- a/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.cpp @@ -1,77 +1,76 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/LuaElementConvertors.h> -#include <Swiften/Base/foreach.h> +#include <lua.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -PubSubOwnerSubscriptionsConvertor::PubSubOwnerSubscriptionsConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubOwnerSubscriptions>("pubsub_owner_subscriptions"), - convertors(convertors) { +PubSubOwnerSubscriptionsConvertor::PubSubOwnerSubscriptionsConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubOwnerSubscriptions>("pubsub_owner_subscriptions"), + convertors(convertors) { } PubSubOwnerSubscriptionsConvertor::~PubSubOwnerSubscriptionsConvertor() { } -boost::shared_ptr<PubSubOwnerSubscriptions> PubSubOwnerSubscriptionsConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubOwnerSubscriptions> result = boost::make_shared<PubSubOwnerSubscriptions>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< boost::shared_ptr<PubSubOwnerSubscription> > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubOwnerSubscription> payload = boost::dynamic_pointer_cast<PubSubOwnerSubscription>(convertors->convertFromLuaUntyped(L, -1, "pubsub_owner_subscription"))) { - items.push_back(payload); - } - } - lua_pop(L, 1); - } +std::shared_ptr<PubSubOwnerSubscriptions> PubSubOwnerSubscriptionsConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubOwnerSubscriptions> result = std::make_shared<PubSubOwnerSubscriptions>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::shared_ptr<PubSubOwnerSubscription> > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubOwnerSubscription> payload = std::dynamic_pointer_cast<PubSubOwnerSubscription>(convertors->convertFromLuaUntyped(L, -1, "pubsub_owner_subscription"))) { + items.push_back(payload); + } + } + lua_pop(L, 1); + } - result->setSubscriptions(items); - } - return result; + result->setSubscriptions(items); + } + return result; } -void PubSubOwnerSubscriptionsConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubOwnerSubscriptions> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - if (!payload->getSubscriptions().empty()) { - { - int i = 0; - foreach(boost::shared_ptr<PubSubOwnerSubscription> item, payload->getSubscriptions()) { - if (convertors->convertToLuaUntyped(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - } +void PubSubOwnerSubscriptionsConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubOwnerSubscriptions> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + if (!payload->getSubscriptions().empty()) { + { + int i = 0; + for (auto&& item : payload->getSubscriptions()) { + if (convertors->convertToLuaUntyped(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + } } boost::optional<LuaElementConvertor::Documentation> PubSubOwnerSubscriptionsConvertor::getDocumentation() const { - return Documentation( - "PubSubOwnerSubscriptions", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `subscriptions`: array<@{PubSubOwnerSubscription}>\n" - ); + return Documentation( + "PubSubOwnerSubscriptions", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `subscriptions`: array<@{PubSubOwnerSubscription}>\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.h b/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.h index dbdff67..c89b814 100644 --- a/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.h +++ b/Sluift/ElementConvertors/PubSubOwnerSubscriptionsConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubOwnerSubscriptions.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubOwnerSubscriptions.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubOwnerSubscriptionsConvertor : public GenericLuaElementConvertor<PubSubOwnerSubscriptions> { - public: - PubSubOwnerSubscriptionsConvertor(LuaElementConvertors* convertors); - virtual ~PubSubOwnerSubscriptionsConvertor(); + class PubSubOwnerSubscriptionsConvertor : public GenericLuaElementConvertor<PubSubOwnerSubscriptions> { + public: + PubSubOwnerSubscriptionsConvertor(LuaElementConvertors* convertors); + virtual ~PubSubOwnerSubscriptionsConvertor(); - virtual boost::shared_ptr<PubSubOwnerSubscriptions> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubOwnerSubscriptions>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubOwnerSubscriptions> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubOwnerSubscriptions>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubPublishConvertor.cpp b/Sluift/ElementConvertors/PubSubPublishConvertor.cpp index 961d210..63c97bc 100644 --- a/Sluift/ElementConvertors/PubSubPublishConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubPublishConvertor.cpp @@ -1,81 +1,80 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubPublishConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/LuaElementConvertors.h> -#include <Swiften/Base/foreach.h> +#include <lua.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -PubSubPublishConvertor::PubSubPublishConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubPublish>("pubsub_publish"), - convertors(convertors) { +PubSubPublishConvertor::PubSubPublishConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubPublish>("pubsub_publish"), + convertors(convertors) { } PubSubPublishConvertor::~PubSubPublishConvertor() { } -boost::shared_ptr<PubSubPublish> PubSubPublishConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubPublish> result = boost::make_shared<PubSubPublish>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "items"); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< boost::shared_ptr<PubSubItem> > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubItem> payload = boost::dynamic_pointer_cast<PubSubItem>(convertors->convertFromLuaUntyped(L, -1, "pubsub_item"))) { - items.push_back(payload); - } - } - lua_pop(L, 1); - } +std::shared_ptr<PubSubPublish> PubSubPublishConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubPublish> result = std::make_shared<PubSubPublish>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "items"); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::shared_ptr<PubSubItem> > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubItem> payload = std::dynamic_pointer_cast<PubSubItem>(convertors->convertFromLuaUntyped(L, -1, "pubsub_item"))) { + items.push_back(payload); + } + } + lua_pop(L, 1); + } - result->setItems(items); - } - lua_pop(L, 1); - return result; + result->setItems(items); + } + lua_pop(L, 1); + return result; } -void PubSubPublishConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubPublish> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - if (!payload->getItems().empty()) { - lua_createtable(L, boost::numeric_cast<int>(payload->getItems().size()), 0); - { - int i = 0; - foreach(boost::shared_ptr<PubSubItem> item, payload->getItems()) { - if (convertors->convertToLuaUntyped(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - lua_setfield(L, -2, "items"); - } +void PubSubPublishConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubPublish> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + if (!payload->getItems().empty()) { + lua_createtable(L, boost::numeric_cast<int>(payload->getItems().size()), 0); + { + int i = 0; + for (auto&& item : payload->getItems()) { + if (convertors->convertToLuaUntyped(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + lua_setfield(L, -2, "items"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubPublishConvertor::getDocumentation() const { - return Documentation( - "PubSubPublish", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `items`: array<@{PubSubItem}>\n" - ); + return Documentation( + "PubSubPublish", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `items`: array<@{PubSubItem}>\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubPublishConvertor.h b/Sluift/ElementConvertors/PubSubPublishConvertor.h index 6deda0e..1765caf 100644 --- a/Sluift/ElementConvertors/PubSubPublishConvertor.h +++ b/Sluift/ElementConvertors/PubSubPublishConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubPublish.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubPublish.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubPublishConvertor : public GenericLuaElementConvertor<PubSubPublish> { - public: - PubSubPublishConvertor(LuaElementConvertors* convertors); - virtual ~PubSubPublishConvertor(); + class PubSubPublishConvertor : public GenericLuaElementConvertor<PubSubPublish> { + public: + PubSubPublishConvertor(LuaElementConvertors* convertors); + virtual ~PubSubPublishConvertor(); - virtual boost::shared_ptr<PubSubPublish> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubPublish>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubPublish> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubPublish>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubRetractConvertor.cpp b/Sluift/ElementConvertors/PubSubRetractConvertor.cpp index abf19df..c070ad6 100644 --- a/Sluift/ElementConvertors/PubSubRetractConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubRetractConvertor.cpp @@ -1,89 +1,90 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubRetractConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/LuaElementConvertors.h> -#include <Swiften/Base/foreach.h> +#include <lua.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -PubSubRetractConvertor::PubSubRetractConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubRetract>("pubsub_retract"), - convertors(convertors) { +PubSubRetractConvertor::PubSubRetractConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubRetract>("pubsub_retract"), + convertors(convertors) { } PubSubRetractConvertor::~PubSubRetractConvertor() { } -boost::shared_ptr<PubSubRetract> PubSubRetractConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubRetract> result = boost::make_shared<PubSubRetract>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "items"); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< boost::shared_ptr<PubSubItem> > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubItem> payload = boost::dynamic_pointer_cast<PubSubItem>(convertors->convertFromLuaUntyped(L, -1, "pubsub_item"))) { - items.push_back(payload); - } - } - lua_pop(L, 1); - } +std::shared_ptr<PubSubRetract> PubSubRetractConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubRetract> result = std::make_shared<PubSubRetract>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "items"); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::shared_ptr<PubSubItem> > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubItem> payload = std::dynamic_pointer_cast<PubSubItem>(convertors->convertFromLuaUntyped(L, -1, "pubsub_item"))) { + items.push_back(payload); + } + } + lua_pop(L, 1); + } - result->setItems(items); - } - lua_pop(L, 1); - lua_getfield(L, -1, "notify"); - if (lua_isboolean(L, -1)) { - result->setNotify(lua_toboolean(L, -1)); - } - lua_pop(L, 1); - return result; + result->setItems(items); + } + lua_pop(L, 1); + lua_getfield(L, -1, "notify"); + if (lua_isboolean(L, -1)) { + result->setNotify(lua_toboolean(L, -1)); + } + lua_pop(L, 1); + return result; } -void PubSubRetractConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubRetract> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getNode().c_str()); - lua_setfield(L, -2, "node"); - if (!payload->getItems().empty()) { - lua_createtable(L, boost::numeric_cast<int>(payload->getItems().size()), 0); - { - int i = 0; - foreach(boost::shared_ptr<PubSubItem> item, payload->getItems()) { - if (convertors->convertToLuaUntyped(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - lua_setfield(L, -2, "items"); - } - lua_pushboolean(L, payload->isNotify()); - lua_setfield(L, -2, "notify"); +void PubSubRetractConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubRetract> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getNode().c_str()); + lua_setfield(L, -2, "node"); + if (!payload->getItems().empty()) { + lua_createtable(L, boost::numeric_cast<int>(payload->getItems().size()), 0); + { + int i = 0; + for (auto&& item : payload->getItems()) { + if (convertors->convertToLuaUntyped(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + lua_setfield(L, -2, "items"); + } + if (payload->isNotify().is_initialized()) { + lua_pushboolean(L, payload->isNotify().get_value_or(false)); + lua_setfield(L, -2, "notify"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubRetractConvertor::getDocumentation() const { - return Documentation( - "PubSubRetract", - "This table has the following fields:\n\n" - "- `node`: string\n" - "- `items`: array<@{PubSubItem}>\n" - "- `notify`: boolean\n" - ); + return Documentation( + "PubSubRetract", + "This table has the following fields:\n\n" + "- `node`: string\n" + "- `items`: array<@{PubSubItem}>\n" + "- `notify`: boolean\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubRetractConvertor.h b/Sluift/ElementConvertors/PubSubRetractConvertor.h index 46aa71b..13f7d0d 100644 --- a/Sluift/ElementConvertors/PubSubRetractConvertor.h +++ b/Sluift/ElementConvertors/PubSubRetractConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubRetract.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubRetract.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubRetractConvertor : public GenericLuaElementConvertor<PubSubRetract> { - public: - PubSubRetractConvertor(LuaElementConvertors* convertors); - virtual ~PubSubRetractConvertor(); + class PubSubRetractConvertor : public GenericLuaElementConvertor<PubSubRetract> { + public: + PubSubRetractConvertor(LuaElementConvertors* convertors); + virtual ~PubSubRetractConvertor(); - virtual boost::shared_ptr<PubSubRetract> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubRetract>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubRetract> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubRetract>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubSubscribeConvertor.cpp b/Sluift/ElementConvertors/PubSubSubscribeConvertor.cpp index 64be818..bb5eb61 100644 --- a/Sluift/ElementConvertors/PubSubSubscribeConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubSubscribeConvertor.cpp @@ -1,70 +1,68 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubSubscribeConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubSubscribeConvertor::PubSubSubscribeConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubSubscribe>("pubsub_subscribe"), - convertors(convertors) { +PubSubSubscribeConvertor::PubSubSubscribeConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubSubscribe>("pubsub_subscribe"), + convertors(convertors) { } PubSubSubscribeConvertor::~PubSubSubscribeConvertor() { } -boost::shared_ptr<PubSubSubscribe> PubSubSubscribeConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubSubscribe> result = boost::make_shared<PubSubSubscribe>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "jid"); - if (lua_isstring(L, -1)) { - result->setJID(JID(std::string(lua_tostring(L, -1)))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "options"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubOptions> payload = boost::dynamic_pointer_cast<PubSubOptions>(convertors->convertFromLuaUntyped(L, -1, "pubsub_options"))) { - result->setOptions(payload); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubSubscribe> PubSubSubscribeConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubSubscribe> result = std::make_shared<PubSubSubscribe>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "jid"); + if (lua_isstring(L, -1)) { + result->setJID(JID(std::string(lua_tostring(L, -1)))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "options"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubOptions> payload = std::dynamic_pointer_cast<PubSubOptions>(convertors->convertFromLuaUntyped(L, -1, "pubsub_options"))) { + result->setOptions(payload); + } + } + lua_pop(L, 1); + return result; } -void PubSubSubscribeConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubSubscribe> payload) { - lua_createtable(L, 0, 0); - if (payload->getNode()) { - lua_pushstring(L, (*payload->getNode()).c_str()); - lua_setfield(L, -2, "node"); - } - lua_pushstring(L, payload->getJID().toString().c_str()); - lua_setfield(L, -2, "jid"); - if (convertors->convertToLuaUntyped(L, payload->getOptions()) > 0) { - lua_setfield(L, -2, "options"); - } +void PubSubSubscribeConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubSubscribe> payload) { + lua_createtable(L, 0, 0); + if (payload->getNode()) { + lua_pushstring(L, (*payload->getNode()).c_str()); + lua_setfield(L, -2, "node"); + } + lua_pushstring(L, payload->getJID().toString().c_str()); + lua_setfield(L, -2, "jid"); + if (convertors->convertToLuaUntyped(L, payload->getOptions()) > 0) { + lua_setfield(L, -2, "options"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubSubscribeConvertor::getDocumentation() const { - return Documentation( - "PubSubSubscribe", - "This table has the following fields:\n\n" - "- `node`: string (Optional)\n" - "- `jid`: jid (string)\n" - "- `options`: @{PubSubOptions}\n" - ); + return Documentation( + "PubSubSubscribe", + "This table has the following fields:\n\n" + "- `node`: string (Optional)\n" + "- `jid`: jid (string)\n" + "- `options`: @{PubSubOptions}\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubSubscribeConvertor.h b/Sluift/ElementConvertors/PubSubSubscribeConvertor.h index 5a7aefe..238f677 100644 --- a/Sluift/ElementConvertors/PubSubSubscribeConvertor.h +++ b/Sluift/ElementConvertors/PubSubSubscribeConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubSubscribe.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubSubscribe.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubSubscribeConvertor : public GenericLuaElementConvertor<PubSubSubscribe> { - public: - PubSubSubscribeConvertor(LuaElementConvertors* convertors); - virtual ~PubSubSubscribeConvertor(); + class PubSubSubscribeConvertor : public GenericLuaElementConvertor<PubSubSubscribe> { + public: + PubSubSubscribeConvertor(LuaElementConvertors* convertors); + virtual ~PubSubSubscribeConvertor(); - virtual boost::shared_ptr<PubSubSubscribe> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubSubscribe>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubSubscribe> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubSubscribe>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubSubscribeOptionsConvertor.cpp b/Sluift/ElementConvertors/PubSubSubscribeOptionsConvertor.cpp index 8a068ff..01da15f 100644 --- a/Sluift/ElementConvertors/PubSubSubscribeOptionsConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubSubscribeOptionsConvertor.cpp @@ -1,49 +1,44 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubSubscribeOptionsConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubSubscribeOptionsConvertor::PubSubSubscribeOptionsConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubSubscribeOptions>("pubsub_subscribe_options"), - convertors(convertors) { +PubSubSubscribeOptionsConvertor::PubSubSubscribeOptionsConvertor() : + GenericLuaElementConvertor<PubSubSubscribeOptions>("pubsub_subscribe_options") { } PubSubSubscribeOptionsConvertor::~PubSubSubscribeOptionsConvertor() { } -boost::shared_ptr<PubSubSubscribeOptions> PubSubSubscribeOptionsConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubSubscribeOptions> result = boost::make_shared<PubSubSubscribeOptions>(); - lua_getfield(L, -1, "required"); - if (lua_isboolean(L, -1)) { - result->setRequired(lua_toboolean(L, -1)); - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubSubscribeOptions> PubSubSubscribeOptionsConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubSubscribeOptions> result = std::make_shared<PubSubSubscribeOptions>(); + lua_getfield(L, -1, "required"); + if (lua_isboolean(L, -1)) { + result->setRequired(lua_toboolean(L, -1)); + } + lua_pop(L, 1); + return result; } -void PubSubSubscribeOptionsConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubSubscribeOptions> payload) { - lua_createtable(L, 0, 0); - lua_pushboolean(L, payload->isRequired()); - lua_setfield(L, -2, "required"); +void PubSubSubscribeOptionsConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubSubscribeOptions> payload) { + lua_createtable(L, 0, 0); + lua_pushboolean(L, payload->isRequired()); + lua_setfield(L, -2, "required"); } boost::optional<LuaElementConvertor::Documentation> PubSubSubscribeOptionsConvertor::getDocumentation() const { - return Documentation( - "PubSubSubscribeOptions", - "This table has the following fields:\n\n" - "- `required`: boolean\n" - ); + return Documentation( + "PubSubSubscribeOptions", + "This table has the following fields:\n\n" + "- `required`: boolean\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubSubscribeOptionsConvertor.h b/Sluift/ElementConvertors/PubSubSubscribeOptionsConvertor.h index a36e7bb..fed8779 100644 --- a/Sluift/ElementConvertors/PubSubSubscribeOptionsConvertor.h +++ b/Sluift/ElementConvertors/PubSubSubscribeOptionsConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubSubscribeOptions.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubSubscribeOptions.h> namespace Swift { - class LuaElementConvertors; - - class PubSubSubscribeOptionsConvertor : public GenericLuaElementConvertor<PubSubSubscribeOptions> { - public: - PubSubSubscribeOptionsConvertor(LuaElementConvertors* convertors); - virtual ~PubSubSubscribeOptionsConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubSubscribeOptions> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubSubscribeOptions>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubSubscribeOptionsConvertor : public GenericLuaElementConvertor<PubSubSubscribeOptions> { + public: + PubSubSubscribeOptionsConvertor(); + virtual ~PubSubSubscribeOptionsConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubSubscribeOptions> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubSubscribeOptions>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/PubSubSubscriptionConvertor.cpp b/Sluift/ElementConvertors/PubSubSubscriptionConvertor.cpp index 3aad76e..65c6474 100644 --- a/Sluift/ElementConvertors/PubSubSubscriptionConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubSubscriptionConvertor.cpp @@ -1,112 +1,110 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubSubscriptionConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> +#include <lua.hpp> #include <Sluift/LuaElementConvertors.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -PubSubSubscriptionConvertor::PubSubSubscriptionConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubSubscription>("pubsub_subscription"), - convertors(convertors) { +PubSubSubscriptionConvertor::PubSubSubscriptionConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubSubscription>("pubsub_subscription"), + convertors(convertors) { } PubSubSubscriptionConvertor::~PubSubSubscriptionConvertor() { } -boost::shared_ptr<PubSubSubscription> PubSubSubscriptionConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubSubscription> result = boost::make_shared<PubSubSubscription>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "subscription_id"); - if (lua_isstring(L, -1)) { - result->setSubscriptionID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "jid"); - if (lua_isstring(L, -1)) { - result->setJID(JID(std::string(lua_tostring(L, -1)))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "options"); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubSubscribeOptions> payload = boost::dynamic_pointer_cast<PubSubSubscribeOptions>(convertors->convertFromLuaUntyped(L, -1, "pubsub_subscribe_options"))) { - result->setOptions(payload); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "subscription"); - if (lua_isstring(L, -1)) { - if (std::string(lua_tostring(L, -1)) == "none") { - result->setSubscription(PubSubSubscription::None); - } - if (std::string(lua_tostring(L, -1)) == "pending") { - result->setSubscription(PubSubSubscription::Pending); - } - if (std::string(lua_tostring(L, -1)) == "subscribed") { - result->setSubscription(PubSubSubscription::Subscribed); - } - if (std::string(lua_tostring(L, -1)) == "unconfigured") { - result->setSubscription(PubSubSubscription::Unconfigured); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubSubscription> PubSubSubscriptionConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubSubscription> result = std::make_shared<PubSubSubscription>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "subscription_id"); + if (lua_isstring(L, -1)) { + result->setSubscriptionID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "jid"); + if (lua_isstring(L, -1)) { + result->setJID(JID(std::string(lua_tostring(L, -1)))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "options"); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubSubscribeOptions> payload = std::dynamic_pointer_cast<PubSubSubscribeOptions>(convertors->convertFromLuaUntyped(L, -1, "pubsub_subscribe_options"))) { + result->setOptions(payload); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "subscription"); + if (lua_isstring(L, -1)) { + if (std::string(lua_tostring(L, -1)) == "none") { + result->setSubscription(PubSubSubscription::None); + } + if (std::string(lua_tostring(L, -1)) == "pending") { + result->setSubscription(PubSubSubscription::Pending); + } + if (std::string(lua_tostring(L, -1)) == "subscribed") { + result->setSubscription(PubSubSubscription::Subscribed); + } + if (std::string(lua_tostring(L, -1)) == "unconfigured") { + result->setSubscription(PubSubSubscription::Unconfigured); + } + } + lua_pop(L, 1); + return result; } -void PubSubSubscriptionConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubSubscription> payload) { - lua_createtable(L, 0, 0); - if (payload->getNode()) { - lua_pushstring(L, (*payload->getNode()).c_str()); - lua_setfield(L, -2, "node"); - } - if (payload->getSubscriptionID()) { - lua_pushstring(L, (*payload->getSubscriptionID()).c_str()); - lua_setfield(L, -2, "subscription_id"); - } - lua_pushstring(L, payload->getJID().toString().c_str()); - lua_setfield(L, -2, "jid"); - if (convertors->convertToLuaUntyped(L, payload->getOptions()) > 0) { - lua_setfield(L, -2, "options"); - } - switch (payload->getSubscription()) { - case PubSubSubscription::None: - lua_pushstring(L, "none"); - break; - case PubSubSubscription::Pending: - lua_pushstring(L, "pending"); - break; - case PubSubSubscription::Subscribed: - lua_pushstring(L, "subscribed"); - break; - case PubSubSubscription::Unconfigured: - lua_pushstring(L, "unconfigured"); - break; - } - lua_setfield(L, -2, "subscription"); +void PubSubSubscriptionConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubSubscription> payload) { + lua_createtable(L, 0, 0); + if (payload->getNode()) { + lua_pushstring(L, (*payload->getNode()).c_str()); + lua_setfield(L, -2, "node"); + } + if (payload->getSubscriptionID()) { + lua_pushstring(L, (*payload->getSubscriptionID()).c_str()); + lua_setfield(L, -2, "subscription_id"); + } + lua_pushstring(L, payload->getJID().toString().c_str()); + lua_setfield(L, -2, "jid"); + if (convertors->convertToLuaUntyped(L, payload->getOptions()) > 0) { + lua_setfield(L, -2, "options"); + } + switch (payload->getSubscription()) { + case PubSubSubscription::None: + lua_pushstring(L, "none"); + break; + case PubSubSubscription::Pending: + lua_pushstring(L, "pending"); + break; + case PubSubSubscription::Subscribed: + lua_pushstring(L, "subscribed"); + break; + case PubSubSubscription::Unconfigured: + lua_pushstring(L, "unconfigured"); + break; + } + lua_setfield(L, -2, "subscription"); } boost::optional<LuaElementConvertor::Documentation> PubSubSubscriptionConvertor::getDocumentation() const { - return Documentation( - "PubSubSubscription", - "This table has the following fields:\n\n" - "- `node`: string (Optional)\n" - "- `subscription_id`: string (Optional)\n" - "- `jid`: jid (string)\n" - "- `options`: @{PubSubSubscribeOptions}\n" - "- `subscription`: `\"none\"`, `\"pending\"`, `\"subscribed\"`, or `\"unconfigured\"`\n" - ); + return Documentation( + "PubSubSubscription", + "This table has the following fields:\n\n" + "- `node`: string (Optional)\n" + "- `subscription_id`: string (Optional)\n" + "- `jid`: jid (string)\n" + "- `options`: @{PubSubSubscribeOptions}\n" + "- `subscription`: `\"none\"`, `\"pending\"`, `\"subscribed\"`, or `\"unconfigured\"`\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubSubscriptionConvertor.h b/Sluift/ElementConvertors/PubSubSubscriptionConvertor.h index 6d09ddf..5635181 100644 --- a/Sluift/ElementConvertors/PubSubSubscriptionConvertor.h +++ b/Sluift/ElementConvertors/PubSubSubscriptionConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubSubscription.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubSubscription.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubSubscriptionConvertor : public GenericLuaElementConvertor<PubSubSubscription> { - public: - PubSubSubscriptionConvertor(LuaElementConvertors* convertors); - virtual ~PubSubSubscriptionConvertor(); + class PubSubSubscriptionConvertor : public GenericLuaElementConvertor<PubSubSubscription> { + public: + PubSubSubscriptionConvertor(LuaElementConvertors* convertors); + virtual ~PubSubSubscriptionConvertor(); - virtual boost::shared_ptr<PubSubSubscription> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubSubscription>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubSubscription> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubSubscription>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.cpp b/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.cpp index 5e66f2f..3712192 100644 --- a/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.cpp @@ -1,79 +1,78 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubSubscriptionsConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/LuaElementConvertors.h> -#include <Swiften/Base/foreach.h> +#include <lua.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <Sluift/LuaElementConvertors.h> using namespace Swift; -PubSubSubscriptionsConvertor::PubSubSubscriptionsConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubSubscriptions>("pubsub_subscriptions"), - convertors(convertors) { +PubSubSubscriptionsConvertor::PubSubSubscriptionsConvertor(LuaElementConvertors* convertors) : + GenericLuaElementConvertor<PubSubSubscriptions>("pubsub_subscriptions"), + convertors(convertors) { } PubSubSubscriptionsConvertor::~PubSubSubscriptionsConvertor() { } -boost::shared_ptr<PubSubSubscriptions> PubSubSubscriptionsConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubSubscriptions> result = boost::make_shared<PubSubSubscriptions>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< boost::shared_ptr<PubSubSubscription> > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - if (boost::shared_ptr<PubSubSubscription> payload = boost::dynamic_pointer_cast<PubSubSubscription>(convertors->convertFromLuaUntyped(L, -1, "pubsub_subscription"))) { - items.push_back(payload); - } - } - lua_pop(L, 1); - } +std::shared_ptr<PubSubSubscriptions> PubSubSubscriptionsConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubSubscriptions> result = std::make_shared<PubSubSubscriptions>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::shared_ptr<PubSubSubscription> > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + if (std::shared_ptr<PubSubSubscription> payload = std::dynamic_pointer_cast<PubSubSubscription>(convertors->convertFromLuaUntyped(L, -1, "pubsub_subscription"))) { + items.push_back(payload); + } + } + lua_pop(L, 1); + } - result->setSubscriptions(items); - } - return result; + result->setSubscriptions(items); + } + return result; } -void PubSubSubscriptionsConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubSubscriptions> payload) { - lua_createtable(L, 0, 0); - if (payload->getNode()) { - lua_pushstring(L, (*payload->getNode()).c_str()); - lua_setfield(L, -2, "node"); - } - if (!payload->getSubscriptions().empty()) { - { - int i = 0; - foreach(boost::shared_ptr<PubSubSubscription> item, payload->getSubscriptions()) { - if (convertors->convertToLuaUntyped(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - } +void PubSubSubscriptionsConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubSubscriptions> payload) { + lua_createtable(L, 0, 0); + if (payload->getNode()) { + lua_pushstring(L, (*payload->getNode()).c_str()); + lua_setfield(L, -2, "node"); + } + if (!payload->getSubscriptions().empty()) { + { + int i = 0; + for (auto&& item : payload->getSubscriptions()) { + if (convertors->convertToLuaUntyped(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + } } boost::optional<LuaElementConvertor::Documentation> PubSubSubscriptionsConvertor::getDocumentation() const { - return Documentation( - "PubSubSubscriptions", - "This table has the following fields:\n\n" - "- `node`: string (Optional)\n" - "- `subscriptions`: array<@{PubSubSubscription}>\n" - ); + return Documentation( + "PubSubSubscriptions", + "This table has the following fields:\n\n" + "- `node`: string (Optional)\n" + "- `subscriptions`: array<@{PubSubSubscription}>\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.h b/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.h index 70fc159..2c941e6 100644 --- a/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.h +++ b/Sluift/ElementConvertors/PubSubSubscriptionsConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,23 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubSubscriptions.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubSubscriptions.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class PubSubSubscriptionsConvertor : public GenericLuaElementConvertor<PubSubSubscriptions> { - public: - PubSubSubscriptionsConvertor(LuaElementConvertors* convertors); - virtual ~PubSubSubscriptionsConvertor(); + class PubSubSubscriptionsConvertor : public GenericLuaElementConvertor<PubSubSubscriptions> { + public: + PubSubSubscriptionsConvertor(LuaElementConvertors* convertors); + virtual ~PubSubSubscriptionsConvertor(); - virtual boost::shared_ptr<PubSubSubscriptions> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubSubscriptions>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + virtual std::shared_ptr<PubSubSubscriptions> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubSubscriptions>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; - private: - LuaElementConvertors* convertors; - }; + private: + LuaElementConvertors* convertors; + }; } diff --git a/Sluift/ElementConvertors/PubSubUnsubscribeConvertor.cpp b/Sluift/ElementConvertors/PubSubUnsubscribeConvertor.cpp index 4b515ea..056c84c 100644 --- a/Sluift/ElementConvertors/PubSubUnsubscribeConvertor.cpp +++ b/Sluift/ElementConvertors/PubSubUnsubscribeConvertor.cpp @@ -1,69 +1,64 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/PubSubUnsubscribeConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> - - +#include <memory> - -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -PubSubUnsubscribeConvertor::PubSubUnsubscribeConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<PubSubUnsubscribe>("pubsub_unsubscribe"), - convertors(convertors) { +PubSubUnsubscribeConvertor::PubSubUnsubscribeConvertor() : + GenericLuaElementConvertor<PubSubUnsubscribe>("pubsub_unsubscribe") { } PubSubUnsubscribeConvertor::~PubSubUnsubscribeConvertor() { } -boost::shared_ptr<PubSubUnsubscribe> PubSubUnsubscribeConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<PubSubUnsubscribe> result = boost::make_shared<PubSubUnsubscribe>(); - lua_getfield(L, -1, "node"); - if (lua_isstring(L, -1)) { - result->setNode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "jid"); - if (lua_isstring(L, -1)) { - result->setJID(JID(std::string(lua_tostring(L, -1)))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "subscription_id"); - if (lua_isstring(L, -1)) { - result->setSubscriptionID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<PubSubUnsubscribe> PubSubUnsubscribeConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<PubSubUnsubscribe> result = std::make_shared<PubSubUnsubscribe>(); + lua_getfield(L, -1, "node"); + if (lua_isstring(L, -1)) { + result->setNode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "jid"); + if (lua_isstring(L, -1)) { + result->setJID(JID(std::string(lua_tostring(L, -1)))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "subscription_id"); + if (lua_isstring(L, -1)) { + result->setSubscriptionID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void PubSubUnsubscribeConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<PubSubUnsubscribe> payload) { - lua_createtable(L, 0, 0); - if (payload->getNode()) { - lua_pushstring(L, (*payload->getNode()).c_str()); - lua_setfield(L, -2, "node"); - } - lua_pushstring(L, payload->getJID().toString().c_str()); - lua_setfield(L, -2, "jid"); - if (payload->getSubscriptionID()) { - lua_pushstring(L, (*payload->getSubscriptionID()).c_str()); - lua_setfield(L, -2, "subscription_id"); - } +void PubSubUnsubscribeConvertor::doConvertToLua(lua_State* L, std::shared_ptr<PubSubUnsubscribe> payload) { + lua_createtable(L, 0, 0); + if (payload->getNode()) { + lua_pushstring(L, (*payload->getNode()).c_str()); + lua_setfield(L, -2, "node"); + } + lua_pushstring(L, payload->getJID().toString().c_str()); + lua_setfield(L, -2, "jid"); + if (payload->getSubscriptionID()) { + lua_pushstring(L, (*payload->getSubscriptionID()).c_str()); + lua_setfield(L, -2, "subscription_id"); + } } boost::optional<LuaElementConvertor::Documentation> PubSubUnsubscribeConvertor::getDocumentation() const { - return Documentation( - "PubSubUnsubscribe", - "This table has the following fields:\n\n" - "- `node`: string (Optional)\n" - "- `jid`: jid (string)\n" - "- `subscription_id`: string (Optional)\n" - ); + return Documentation( + "PubSubUnsubscribe", + "This table has the following fields:\n\n" + "- `node`: string (Optional)\n" + "- `jid`: jid (string)\n" + "- `subscription_id`: string (Optional)\n" + ); } diff --git a/Sluift/ElementConvertors/PubSubUnsubscribeConvertor.h b/Sluift/ElementConvertors/PubSubUnsubscribeConvertor.h index e075298..7270917 100644 --- a/Sluift/ElementConvertors/PubSubUnsubscribeConvertor.h +++ b/Sluift/ElementConvertors/PubSubUnsubscribeConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/PubSubUnsubscribe.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/PubSubUnsubscribe.h> namespace Swift { - class LuaElementConvertors; - - class PubSubUnsubscribeConvertor : public GenericLuaElementConvertor<PubSubUnsubscribe> { - public: - PubSubUnsubscribeConvertor(LuaElementConvertors* convertors); - virtual ~PubSubUnsubscribeConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<PubSubUnsubscribe> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<PubSubUnsubscribe>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class PubSubUnsubscribeConvertor : public GenericLuaElementConvertor<PubSubUnsubscribe> { + public: + PubSubUnsubscribeConvertor(); + virtual ~PubSubUnsubscribeConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<PubSubUnsubscribe> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<PubSubUnsubscribe>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/RawXMLElementConvertor.cpp b/Sluift/ElementConvertors/RawXMLElementConvertor.cpp index e859079..9688677 100644 --- a/Sluift/ElementConvertors/RawXMLElementConvertor.cpp +++ b/Sluift/ElementConvertors/RawXMLElementConvertor.cpp @@ -1,17 +1,18 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/RawXMLElementConvertor.h> -#include <iostream> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <lua.hpp> #include <Swiften/Elements/RawXMLPayload.h> #include <Swiften/Serializer/PayloadSerializer.h> + #include <Sluift/Lua/Check.h> using namespace Swift; @@ -22,20 +23,20 @@ RawXMLElementConvertor::RawXMLElementConvertor() { RawXMLElementConvertor::~RawXMLElementConvertor() { } -boost::shared_ptr<Element> RawXMLElementConvertor::convertFromLua(lua_State* L, int index, const std::string& type) { - if (type == "xml") { - return boost::make_shared<RawXMLPayload>(std::string(Lua::checkString(L, index))); - } - return boost::shared_ptr<Payload>(); +std::shared_ptr<Element> RawXMLElementConvertor::convertFromLua(lua_State* L, int index, const std::string& type) { + if (type == "xml") { + return std::make_shared<RawXMLPayload>(std::string(Lua::checkString(L, index))); + } + return std::shared_ptr<Payload>(); } -boost::optional<std::string> RawXMLElementConvertor::convertToLua(lua_State* L, boost::shared_ptr<Element> element) { - boost::shared_ptr<Payload> payload = boost::dynamic_pointer_cast<Payload>(element); - if (!payload) { - return boost::optional<std::string>(); - } - PayloadSerializer* serializer = serializers.getPayloadSerializer(payload); - assert(serializer); - lua_pushstring(L, serializer->serialize(payload).c_str()); - return std::string("xml"); +boost::optional<std::string> RawXMLElementConvertor::convertToLua(lua_State* L, std::shared_ptr<Element> element) { + std::shared_ptr<Payload> payload = std::dynamic_pointer_cast<Payload>(element); + if (!payload) { + return boost::optional<std::string>(); + } + PayloadSerializer* serializer = serializers.getPayloadSerializer(payload); + assert(serializer); + lua_pushstring(L, serializer->serialize(payload).c_str()); + return std::string("xml"); } diff --git a/Sluift/ElementConvertors/RawXMLElementConvertor.h b/Sluift/ElementConvertors/RawXMLElementConvertor.h index 98be763..79f648f 100644 --- a/Sluift/ElementConvertors/RawXMLElementConvertor.h +++ b/Sluift/ElementConvertors/RawXMLElementConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,20 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h> #include <Sluift/LuaElementConvertor.h> -#include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h> namespace Swift { - class RawXMLElementConvertor : public LuaElementConvertor { - public: - RawXMLElementConvertor(); - virtual ~RawXMLElementConvertor(); + class RawXMLElementConvertor : public LuaElementConvertor { + public: + RawXMLElementConvertor(); + virtual ~RawXMLElementConvertor(); - virtual boost::shared_ptr<Element> convertFromLua(lua_State*, int index, const std::string& type) SWIFTEN_OVERRIDE; - virtual boost::optional<std::string> convertToLua(lua_State*, boost::shared_ptr<Element>) SWIFTEN_OVERRIDE; + virtual std::shared_ptr<Element> convertFromLua(lua_State*, int index, const std::string& type) SWIFTEN_OVERRIDE; + virtual boost::optional<std::string> convertToLua(lua_State*, std::shared_ptr<Element>) SWIFTEN_OVERRIDE; - private: - FullPayloadSerializerCollection serializers; - }; + private: + FullPayloadSerializerCollection serializers; + }; } diff --git a/Sluift/ElementConvertors/ResultSetConvertor.cpp b/Sluift/ElementConvertors/ResultSetConvertor.cpp index 79eb00d..7762a79 100644 --- a/Sluift/ElementConvertors/ResultSetConvertor.cpp +++ b/Sluift/ElementConvertors/ResultSetConvertor.cpp @@ -1,116 +1,116 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ -#include <boost/numeric/conversion/cast.hpp> -#include <boost/smart_ptr/make_shared.hpp> -#include <lua.hpp> #include <Sluift/ElementConvertors/ResultSetConvertor.h> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <memory> + +#include <boost/numeric/conversion/cast.hpp> + +#include <lua.hpp> using namespace Swift; -ResultSetConvertor::ResultSetConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<ResultSet>("result_set"), - convertors(convertors) { +ResultSetConvertor::ResultSetConvertor() : + GenericLuaElementConvertor<ResultSet>("result_set") { } ResultSetConvertor::~ResultSetConvertor() { } -boost::shared_ptr<ResultSet> ResultSetConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<ResultSet> result = boost::make_shared<ResultSet>(); - lua_getfield(L, -1, "max_items"); - if (lua_isstring(L, -1)) { - result->setMaxItems(boost::numeric_cast<int>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "count"); - if (lua_isnumber(L, -1)) { - result->setCount(boost::numeric_cast<int>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "index"); - if (lua_isnumber(L, -1)) { - result->setIndex(boost::numeric_cast<int>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "first_id_index"); - if (lua_isstring(L, -1)) { - result->setFirstIDIndex(boost::numeric_cast<int>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "first_id"); - if (lua_isstring(L, -1)) { - result->setFirstID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "last_id"); - if (lua_isstring(L, -1)) { - result->setLastID(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "after"); - if (lua_isstring(L, -1)) { - result->setAfter(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "before"); - if (lua_isstring(L, -1)) { - result->setBefore(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<ResultSet> ResultSetConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<ResultSet> result = std::make_shared<ResultSet>(); + lua_getfield(L, -1, "max_items"); + if (lua_isstring(L, -1)) { + result->setMaxItems(boost::numeric_cast<int>(lua_tonumber(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "count"); + if (lua_isnumber(L, -1)) { + result->setCount(boost::numeric_cast<int>(lua_tonumber(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "index"); + if (lua_isnumber(L, -1)) { + result->setIndex(boost::numeric_cast<int>(lua_tonumber(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "first_id_index"); + if (lua_isstring(L, -1)) { + result->setFirstIDIndex(boost::numeric_cast<int>(lua_tonumber(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "first_id"); + if (lua_isstring(L, -1)) { + result->setFirstID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "last_id"); + if (lua_isstring(L, -1)) { + result->setLastID(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "after"); + if (lua_isstring(L, -1)) { + result->setAfter(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "before"); + if (lua_isstring(L, -1)) { + result->setBefore(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void ResultSetConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<ResultSet> payload) { - lua_createtable(L, 0, 0); - if (payload->getMaxItems()) { - lua_pushnumber(L, *payload->getMaxItems()); - lua_setfield(L, -2, "max_items"); - } - if (payload->getCount()) { - lua_pushnumber(L, *payload->getCount()); - lua_setfield(L, -2, "count"); - } - if (payload->getIndex()) { - lua_pushnumber(L, *payload->getIndex()); - lua_setfield(L, -2, "index"); - } - if (payload->getFirstIDIndex()) { - lua_pushnumber(L, *payload->getFirstIDIndex()); - lua_setfield(L, -2, "first_id_index"); - } - if (payload->getFirstID()) { - lua_pushstring(L, (*payload->getFirstID()).c_str()); - lua_setfield(L, -2, "first_id"); - } - if (payload->getLastID()) { - lua_pushstring(L, (*payload->getLastID()).c_str()); - lua_setfield(L, -2, "last_id"); - } - if (payload->getAfter()) { - lua_pushstring(L, (*payload->getAfter()).c_str()); - lua_setfield(L, -2, "after"); - } - if (payload->getBefore()) { - lua_pushstring(L, (*payload->getBefore()).c_str()); - lua_setfield(L, -2, "before"); - } +void ResultSetConvertor::doConvertToLua(lua_State* L, std::shared_ptr<ResultSet> payload) { + lua_createtable(L, 0, 0); + if (payload->getMaxItems()) { + lua_pushnumber(L, *payload->getMaxItems()); + lua_setfield(L, -2, "max_items"); + } + if (payload->getCount()) { + lua_pushnumber(L, *payload->getCount()); + lua_setfield(L, -2, "count"); + } + if (payload->getIndex()) { + lua_pushnumber(L, *payload->getIndex()); + lua_setfield(L, -2, "index"); + } + if (payload->getFirstIDIndex()) { + lua_pushnumber(L, *payload->getFirstIDIndex()); + lua_setfield(L, -2, "first_id_index"); + } + if (payload->getFirstID()) { + lua_pushstring(L, (*payload->getFirstID()).c_str()); + lua_setfield(L, -2, "first_id"); + } + if (payload->getLastID()) { + lua_pushstring(L, (*payload->getLastID()).c_str()); + lua_setfield(L, -2, "last_id"); + } + if (payload->getAfter()) { + lua_pushstring(L, (*payload->getAfter()).c_str()); + lua_setfield(L, -2, "after"); + } + if (payload->getBefore()) { + lua_pushstring(L, (*payload->getBefore()).c_str()); + lua_setfield(L, -2, "before"); + } } boost::optional<LuaElementConvertor::Documentation> ResultSetConvertor::getDocumentation() const { - return Documentation( - "ResultSet", - "This table has the following fields:\n\n" - "- `max_items`: number (Optional)\n" - "- `count`: number (Optional)\n" - "- `first_id_index`: number (Optional)\n" - "- `first_id`: string (Optional)\n" - "- `last_id`: string (Optional)\n" - "- `after`: string (Optional)\n" - ); + return Documentation( + "ResultSet", + "This table has the following fields:\n\n" + "- `max_items`: number (Optional)\n" + "- `count`: number (Optional)\n" + "- `first_id_index`: number (Optional)\n" + "- `first_id`: string (Optional)\n" + "- `last_id`: string (Optional)\n" + "- `after`: string (Optional)\n" + ); } diff --git a/Sluift/ElementConvertors/ResultSetConvertor.h b/Sluift/ElementConvertors/ResultSetConvertor.h index 50a6836..e1b826c 100644 --- a/Sluift/ElementConvertors/ResultSetConvertor.h +++ b/Sluift/ElementConvertors/ResultSetConvertor.h @@ -1,29 +1,27 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Sluift/GenericLuaElementConvertor.h> #include <Swiften/Base/Override.h> #include <Swiften/Elements/ResultSet.h> -namespace Swift { - class LuaElementConvertors; +#include <Sluift/GenericLuaElementConvertor.h> - class ResultSetConvertor : public GenericLuaElementConvertor<ResultSet> { - public: - ResultSetConvertor(LuaElementConvertors* convertors); - virtual ~ResultSetConvertor(); +namespace Swift { + class LuaElementConvertors; - virtual boost::shared_ptr<ResultSet> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<ResultSet>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class ResultSetConvertor : public GenericLuaElementConvertor<ResultSet> { + public: + ResultSetConvertor(); + virtual ~ResultSetConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<ResultSet> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<ResultSet>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/SConscript b/Sluift/ElementConvertors/SConscript index 265017b..0bf8022 100644 --- a/Sluift/ElementConvertors/SConscript +++ b/Sluift/ElementConvertors/SConscript @@ -2,53 +2,55 @@ Import('env') convertors = [ - env.File("PubSubRetractConvertor.cpp"), - env.File("PubSubAffiliationsConvertor.cpp"), - env.File("PubSubPublishConvertor.cpp"), - env.File("PubSubItemsConvertor.cpp"), - env.File("PubSubOwnerRedirectConvertor.cpp"), - env.File("PubSubEventRedirectConvertor.cpp"), - env.File("UserTuneConvertor.cpp"), - env.File("PubSubConfigureConvertor.cpp"), - env.File("PubSubEventDisassociateConvertor.cpp"), - env.File("PubSubOwnerAffiliationsConvertor.cpp"), - env.File("PubSubOwnerConfigureConvertor.cpp"), - env.File("UserLocationConvertor.cpp"), - env.File("PubSubSubscribeOptionsConvertor.cpp"), - env.File("PubSubOwnerSubscriptionsConvertor.cpp"), - env.File("PubSubDefaultConvertor.cpp"), - env.File("PubSubEventCollectionConvertor.cpp"), - env.File("PubSubEventSubscriptionConvertor.cpp"), - env.File("PubSubEventRetractConvertor.cpp"), - env.File("PubSubItemConvertor.cpp"), - env.File("PubSubUnsubscribeConvertor.cpp"), - env.File("PubSubEventDeleteConvertor.cpp"), - env.File("PubSubCreateConvertor.cpp"), - env.File("PubSubOwnerPurgeConvertor.cpp"), - env.File("PubSubEventItemsConvertor.cpp"), - env.File("PubSubOptionsConvertor.cpp"), - env.File("PubSubEventItemConvertor.cpp"), - env.File("PubSubOwnerSubscriptionConvertor.cpp"), - env.File("PubSubOwnerAffiliationConvertor.cpp"), - env.File("PubSubEventPurgeConvertor.cpp"), - env.File("PubSubAffiliationConvertor.cpp"), - env.File("PubSubSubscribeConvertor.cpp"), - env.File("PubSubOwnerDeleteConvertor.cpp"), - env.File("PubSubOwnerDefaultConvertor.cpp"), - env.File("PubSubSubscriptionsConvertor.cpp"), - env.File("PubSubEventAssociateConvertor.cpp"), - env.File("PubSubSubscriptionConvertor.cpp"), - env.File("SecurityLabelConvertor.cpp"), - env.File("PubSubEventConfigurationConvertor.cpp"), - env.File("IQConvertor.cpp"), - env.File("PresenceConvertor.cpp"), - env.File("MessageConvertor.cpp"), - env.File("ResultSetConvertor.cpp"), - env.File("ForwardedConvertor.cpp"), - env.File("MAMResultConvertor.cpp"), - env.File("MAMQueryConvertor.cpp"), - env.File("MAMFinConvertor.cpp"), - env.File("SubjectConvertor.cpp"), - env.File("IsodeIQDelegationConvertor.cpp") + env.File("PubSubRetractConvertor.cpp"), + env.File("PubSubAffiliationsConvertor.cpp"), + env.File("PubSubPublishConvertor.cpp"), + env.File("PubSubItemsConvertor.cpp"), + env.File("PubSubOwnerRedirectConvertor.cpp"), + env.File("PubSubEventRedirectConvertor.cpp"), + env.File("UserTuneConvertor.cpp"), + env.File("PubSubConfigureConvertor.cpp"), + env.File("PubSubEventDisassociateConvertor.cpp"), + env.File("PubSubOwnerAffiliationsConvertor.cpp"), + env.File("PubSubOwnerConfigureConvertor.cpp"), + env.File("UserLocationConvertor.cpp"), + env.File("PubSubSubscribeOptionsConvertor.cpp"), + env.File("PubSubOwnerSubscriptionsConvertor.cpp"), + env.File("PubSubDefaultConvertor.cpp"), + env.File("PubSubEventCollectionConvertor.cpp"), + env.File("PubSubEventSubscriptionConvertor.cpp"), + env.File("PubSubEventRetractConvertor.cpp"), + env.File("PubSubItemConvertor.cpp"), + env.File("PubSubUnsubscribeConvertor.cpp"), + env.File("PubSubEventDeleteConvertor.cpp"), + env.File("PubSubCreateConvertor.cpp"), + env.File("PubSubOwnerPurgeConvertor.cpp"), + env.File("PubSubEventItemsConvertor.cpp"), + env.File("PubSubOptionsConvertor.cpp"), + env.File("PubSubEventItemConvertor.cpp"), + env.File("PubSubOwnerSubscriptionConvertor.cpp"), + env.File("PubSubOwnerAffiliationConvertor.cpp"), + env.File("PubSubEventPurgeConvertor.cpp"), + env.File("PubSubAffiliationConvertor.cpp"), + env.File("PubSubSubscribeConvertor.cpp"), + env.File("PubSubOwnerDeleteConvertor.cpp"), + env.File("PubSubOwnerDefaultConvertor.cpp"), + env.File("PubSubSubscriptionsConvertor.cpp"), + env.File("PubSubEventAssociateConvertor.cpp"), + env.File("PubSubSubscriptionConvertor.cpp"), + env.File("SecurityLabelConvertor.cpp"), + env.File("PubSubEventConfigurationConvertor.cpp"), + env.File("IQConvertor.cpp"), + env.File("PresenceConvertor.cpp"), + env.File("MessageConvertor.cpp"), + env.File("ResultSetConvertor.cpp"), + env.File("ForwardedConvertor.cpp"), + env.File("MAMResultConvertor.cpp"), + env.File("MAMQueryConvertor.cpp"), + env.File("MAMFinConvertor.cpp"), + env.File("CarbonsReceivedConvertor.cpp"), + env.File("CarbonsSentConvertor.cpp"), + env.File("SubjectConvertor.cpp"), + env.File("IsodeIQDelegationConvertor.cpp") ] Return('convertors') diff --git a/Sluift/ElementConvertors/SecurityLabelConvertor.cpp b/Sluift/ElementConvertors/SecurityLabelConvertor.cpp index cfaeb7d..21d9a8f 100644 --- a/Sluift/ElementConvertors/SecurityLabelConvertor.cpp +++ b/Sluift/ElementConvertors/SecurityLabelConvertor.cpp @@ -1,101 +1,98 @@ /* - * Copyright (c) 2010-2014 Isode Limited. + * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/SecurityLabelConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> -#include <boost/numeric/conversion/cast.hpp> +#include <memory> -#include <Swiften/Base/foreach.h> +#include <boost/numeric/conversion/cast.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -SecurityLabelConvertor::SecurityLabelConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<SecurityLabel>("security_label"), - convertors(convertors) { +SecurityLabelConvertor::SecurityLabelConvertor() : + GenericLuaElementConvertor<SecurityLabel>("security_label") { } SecurityLabelConvertor::~SecurityLabelConvertor() { } -boost::shared_ptr<SecurityLabel> SecurityLabelConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<SecurityLabel> result = boost::make_shared<SecurityLabel>(); - lua_getfield(L, -1, "equivalent_labels"); - if (lua_type(L, -1) == LUA_TTABLE) { - std::vector< std::string > items; - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (lua_isstring(L, -1)) { - items.push_back(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - } +std::shared_ptr<SecurityLabel> SecurityLabelConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<SecurityLabel> result = std::make_shared<SecurityLabel>(); + lua_getfield(L, -1, "equivalent_labels"); + if (lua_type(L, -1) == LUA_TTABLE) { + std::vector< std::string > items; + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (lua_isstring(L, -1)) { + items.push_back(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + } - result->setEquivalentLabels(items); - } - lua_pop(L, 1); - lua_getfield(L, -1, "foreground_color"); - if (lua_isstring(L, -1)) { - result->setForegroundColor(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "display_marking"); - if (lua_isstring(L, -1)) { - result->setDisplayMarking(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "background_color"); - if (lua_isstring(L, -1)) { - result->setBackgroundColor(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "label"); - if (lua_isstring(L, -1)) { - result->setLabel(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; + result->setEquivalentLabels(items); + } + lua_pop(L, 1); + lua_getfield(L, -1, "foreground_color"); + if (lua_isstring(L, -1)) { + result->setForegroundColor(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "display_marking"); + if (lua_isstring(L, -1)) { + result->setDisplayMarking(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "background_color"); + if (lua_isstring(L, -1)) { + result->setBackgroundColor(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "label"); + if (lua_isstring(L, -1)) { + result->setLabel(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void SecurityLabelConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<SecurityLabel> payload) { - lua_createtable(L, 0, 0); - if (!payload->getEquivalentLabels().empty()) { - lua_createtable(L, boost::numeric_cast<int>(payload->getEquivalentLabels().size()), 0); - { - int i = 0; - foreach(const std::string& item, payload->getEquivalentLabels()) { - lua_pushstring(L, item.c_str()); - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - lua_setfield(L, -2, "equivalent_labels"); - } - lua_pushstring(L, payload->getForegroundColor().c_str()); - lua_setfield(L, -2, "foreground_color"); - lua_pushstring(L, payload->getDisplayMarking().c_str()); - lua_setfield(L, -2, "display_marking"); - lua_pushstring(L, payload->getBackgroundColor().c_str()); - lua_setfield(L, -2, "background_color"); - lua_pushstring(L, payload->getLabel().c_str()); - lua_setfield(L, -2, "label"); +void SecurityLabelConvertor::doConvertToLua(lua_State* L, std::shared_ptr<SecurityLabel> payload) { + lua_createtable(L, 0, 0); + if (!payload->getEquivalentLabels().empty()) { + lua_createtable(L, boost::numeric_cast<int>(payload->getEquivalentLabels().size()), 0); + { + int i = 0; + for (const auto& item : payload->getEquivalentLabels()) { + lua_pushstring(L, item.c_str()); + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + lua_setfield(L, -2, "equivalent_labels"); + } + lua_pushstring(L, payload->getForegroundColor().c_str()); + lua_setfield(L, -2, "foreground_color"); + lua_pushstring(L, payload->getDisplayMarking().c_str()); + lua_setfield(L, -2, "display_marking"); + lua_pushstring(L, payload->getBackgroundColor().c_str()); + lua_setfield(L, -2, "background_color"); + lua_pushstring(L, payload->getLabel().c_str()); + lua_setfield(L, -2, "label"); } boost::optional<LuaElementConvertor::Documentation> SecurityLabelConvertor::getDocumentation() const { - return Documentation( - "SecurityLabel", - "This table has the following fields:\n\n" - "- `equivalent_labels`: array<string>\n" - "- `foreground_color`: string\n" - "- `display_marking`: string\n" - "- `background_color`: string\n" - "- `label`: string\n" - ); + return Documentation( + "SecurityLabel", + "This table has the following fields:\n\n" + "- `equivalent_labels`: array<string>\n" + "- `foreground_color`: string\n" + "- `display_marking`: string\n" + "- `background_color`: string\n" + "- `label`: string\n" + ); } diff --git a/Sluift/ElementConvertors/SecurityLabelConvertor.h b/Sluift/ElementConvertors/SecurityLabelConvertor.h index 8e489c0..a0e7fea 100644 --- a/Sluift/ElementConvertors/SecurityLabelConvertor.h +++ b/Sluift/ElementConvertors/SecurityLabelConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2014 Isode Limited. + * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/SecurityLabel.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/SecurityLabel.h> namespace Swift { - class LuaElementConvertors; - - class SecurityLabelConvertor : public GenericLuaElementConvertor<SecurityLabel> { - public: - SecurityLabelConvertor(LuaElementConvertors* convertors); - virtual ~SecurityLabelConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<SecurityLabel> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<SecurityLabel>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class SecurityLabelConvertor : public GenericLuaElementConvertor<SecurityLabel> { + public: + SecurityLabelConvertor(); + virtual ~SecurityLabelConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<SecurityLabel> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<SecurityLabel>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/SoftwareVersionConvertor.cpp b/Sluift/ElementConvertors/SoftwareVersionConvertor.cpp index d621593..f997a45 100644 --- a/Sluift/ElementConvertors/SoftwareVersionConvertor.cpp +++ b/Sluift/ElementConvertors/SoftwareVersionConvertor.cpp @@ -1,14 +1,17 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/SoftwareVersionConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> + +#include <lua.hpp> + #include <Sluift/Lua/Check.h> using namespace Swift; @@ -19,32 +22,32 @@ SoftwareVersionConvertor::SoftwareVersionConvertor() : GenericLuaElementConverto SoftwareVersionConvertor::~SoftwareVersionConvertor() { } -boost::shared_ptr<SoftwareVersion> SoftwareVersionConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<SoftwareVersion> result = boost::make_shared<SoftwareVersion>(); - lua_getfield(L, -1, "name"); - if (!lua_isnil(L, -1)) { - result->setName(std::string(Lua::checkString(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "version"); - if (!lua_isnil(L, -1)) { - result->setVersion(std::string(Lua::checkString(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "os"); - if (!lua_isnil(L, -1)) { - result->setOS(std::string(Lua::checkString(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<SoftwareVersion> SoftwareVersionConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<SoftwareVersion> result = std::make_shared<SoftwareVersion>(); + lua_getfield(L, -1, "name"); + if (!lua_isnil(L, -1)) { + result->setName(std::string(Lua::checkString(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "version"); + if (!lua_isnil(L, -1)) { + result->setVersion(std::string(Lua::checkString(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "os"); + if (!lua_isnil(L, -1)) { + result->setOS(std::string(Lua::checkString(L, -1))); + } + lua_pop(L, 1); + return result; } -void SoftwareVersionConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<SoftwareVersion> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getName().c_str()); - lua_setfield(L, -2, "name"); - lua_pushstring(L, payload->getVersion().c_str()); - lua_setfield(L, -2, "version"); - lua_pushstring(L, payload->getOS().c_str()); - lua_setfield(L, -2, "os"); +void SoftwareVersionConvertor::doConvertToLua(lua_State* L, std::shared_ptr<SoftwareVersion> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getName().c_str()); + lua_setfield(L, -2, "name"); + lua_pushstring(L, payload->getVersion().c_str()); + lua_setfield(L, -2, "version"); + lua_pushstring(L, payload->getOS().c_str()); + lua_setfield(L, -2, "os"); } diff --git a/Sluift/ElementConvertors/SoftwareVersionConvertor.h b/Sluift/ElementConvertors/SoftwareVersionConvertor.h index aded40a..29b1483 100644 --- a/Sluift/ElementConvertors/SoftwareVersionConvertor.h +++ b/Sluift/ElementConvertors/SoftwareVersionConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,17 +7,17 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/SoftwareVersion.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/SoftwareVersion.h> namespace Swift { - class SoftwareVersionConvertor : public GenericLuaElementConvertor<SoftwareVersion> { - public: - SoftwareVersionConvertor(); - virtual ~SoftwareVersionConvertor(); + class SoftwareVersionConvertor : public GenericLuaElementConvertor<SoftwareVersion> { + public: + SoftwareVersionConvertor(); + virtual ~SoftwareVersionConvertor(); - virtual boost::shared_ptr<SoftwareVersion> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<SoftwareVersion>) SWIFTEN_OVERRIDE; - }; + virtual std::shared_ptr<SoftwareVersion> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<SoftwareVersion>) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/StanzaConvertor.h b/Sluift/ElementConvertors/StanzaConvertor.h index b3e75cf..bdaaad3 100644 --- a/Sluift/ElementConvertors/StanzaConvertor.h +++ b/Sluift/ElementConvertors/StanzaConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -8,81 +8,81 @@ #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/GenericLuaElementConvertor.h> -#include <Sluift/LuaElementConvertors.h> -#include <Sluift/Lua/Exception.h> -#include <Swiften/Base/foreach.h> -#include <Swiften/Elements/Payload.h> #include <Swiften/Elements/IQ.h> -#include <Swiften/Elements/Presence.h> #include <Swiften/Elements/Message.h> +#include <Swiften/Elements/Payload.h> +#include <Swiften/Elements/Presence.h> + +#include <Sluift/GenericLuaElementConvertor.h> +#include <Sluift/Lua/Exception.h> +#include <Sluift/LuaElementConvertors.h> namespace Swift { - template <typename T> class StanzaConvertor : public GenericLuaElementConvertor<T> { - public: - StanzaConvertor(const std::string& tag) - : GenericLuaElementConvertor<T>(tag) { - } + template <typename T> class StanzaConvertor : public GenericLuaElementConvertor<T> { + public: + StanzaConvertor(const std::string& tag) + : GenericLuaElementConvertor<T>(tag) { + } - virtual ~StanzaConvertor() { - } + virtual ~StanzaConvertor() { + } - boost::shared_ptr<T> getStanza(lua_State* L, LuaElementConvertors* convertors) { - boost::shared_ptr<T> result = boost::make_shared<T>(); - lua_getfield(L, -1, "id"); - if (lua_isstring(L, -1)) { - result->setID(lua_tostring(L, -1)); - } - lua_pop(L, 1); - lua_getfield(L, -1, "from"); - if (lua_isstring(L, -1)) { - result->setFrom(lua_tostring(L, -1)); - } - lua_pop(L, 1); - lua_getfield(L, -1, "to"); - if (lua_isstring(L, -1)) { - result->setTo(lua_tostring(L, -1)); - } - lua_pop(L, 1); - lua_getfield(L, -1, "payloads"); - if (lua_type(L, -1) == LUA_TTABLE) { - for(size_t i = 0; i < lua_objlen(L, -1); ++i) { - lua_pushnumber(L, i + 1); - lua_gettable(L, -2); - if (!lua_isnil(L, -1)) { - boost::shared_ptr<Payload> payload = boost::dynamic_pointer_cast<Payload>(convertors->convertFromLua(L, -1)); - if (!!payload) { - result->addPayload(payload); - } - } - lua_pop(L, 1); - } - } - lua_pop(L, 1); - return result; - } + std::shared_ptr<T> getStanza(lua_State* L, LuaElementConvertors* convertors) { + std::shared_ptr<T> result = std::make_shared<T>(); + lua_getfield(L, -1, "id"); + if (lua_isstring(L, -1)) { + result->setID(lua_tostring(L, -1)); + } + lua_pop(L, 1); + lua_getfield(L, -1, "from"); + if (lua_isstring(L, -1)) { + result->setFrom(lua_tostring(L, -1)); + } + lua_pop(L, 1); + lua_getfield(L, -1, "to"); + if (lua_isstring(L, -1)) { + result->setTo(lua_tostring(L, -1)); + } + lua_pop(L, 1); + lua_getfield(L, -1, "payloads"); + if (lua_type(L, -1) == LUA_TTABLE) { + for(size_t i = 0; i < lua_objlen(L, -1); ++i) { + lua_pushnumber(L, i + 1); + lua_gettable(L, -2); + if (!lua_isnil(L, -1)) { + std::shared_ptr<Payload> payload = std::dynamic_pointer_cast<Payload>(convertors->convertFromLua(L, -1)); + if (!!payload) { + result->addPayload(payload); + } + } + lua_pop(L, 1); + } + } + lua_pop(L, 1); + return result; + } - void pushStanza(lua_State* L, const boost::shared_ptr<T> stanza, LuaElementConvertors* convertors) { - lua_createtable(L, 0, 0); - lua_pushstring(L, stanza->getID().c_str()); - lua_setfield(L, -2, "id"); - lua_pushstring(L, stanza->getFrom().toString().c_str()); - lua_setfield(L, -2, "from"); - lua_pushstring(L, stanza->getTo().toString().c_str()); - lua_setfield(L, -2, "to"); - if (!stanza->getPayloads().empty()) { - lua_createtable(L, boost::numeric_cast<int>(stanza->getPayloads().size()), 0); - { - int i = 0; - foreach(const boost::shared_ptr<Payload> &item, stanza->getPayloads()) { - if (convertors->convertToLua(L, item) > 0) { - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - ++i; - } - } - } - lua_setfield(L, -2, "payloads"); - } - } - }; + void pushStanza(lua_State* L, const std::shared_ptr<T> stanza, LuaElementConvertors* convertors) { + lua_createtable(L, 0, 0); + lua_pushstring(L, stanza->getID().c_str()); + lua_setfield(L, -2, "id"); + lua_pushstring(L, stanza->getFrom().toString().c_str()); + lua_setfield(L, -2, "from"); + lua_pushstring(L, stanza->getTo().toString().c_str()); + lua_setfield(L, -2, "to"); + if (!stanza->getPayloads().empty()) { + lua_createtable(L, boost::numeric_cast<int>(stanza->getPayloads().size()), 0); + { + int i = 0; + for (const auto& item : stanza->getPayloads()) { + if (convertors->convertToLua(L, item) > 0) { + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + ++i; + } + } + } + lua_setfield(L, -2, "payloads"); + } + } + }; } diff --git a/Sluift/ElementConvertors/StatusConvertor.cpp b/Sluift/ElementConvertors/StatusConvertor.cpp index 9dc3585..eed4044 100644 --- a/Sluift/ElementConvertors/StatusConvertor.cpp +++ b/Sluift/ElementConvertors/StatusConvertor.cpp @@ -1,14 +1,17 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/StatusConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> + +#include <lua.hpp> + #include <Sluift/Lua/Check.h> using namespace Swift; @@ -19,18 +22,18 @@ StatusConvertor::StatusConvertor() : GenericLuaElementConvertor<Status>("status" StatusConvertor::~StatusConvertor() { } -boost::shared_ptr<Status> StatusConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<Status> result = boost::make_shared<Status>(); - lua_getfield(L, -1, "text"); - if (lua_isstring(L, -1)) { - result->setText(lua_tostring(L, -1)); - } - lua_pop(L, 1); - return result; +std::shared_ptr<Status> StatusConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<Status> result = std::make_shared<Status>(); + lua_getfield(L, -1, "text"); + if (lua_isstring(L, -1)) { + result->setText(lua_tostring(L, -1)); + } + lua_pop(L, 1); + return result; } -void StatusConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<Status> payload) { - lua_createtable(L, 0, 0); - lua_pushstring(L, payload->getText().c_str()); - lua_setfield(L, -2, "text"); +void StatusConvertor::doConvertToLua(lua_State* L, std::shared_ptr<Status> payload) { + lua_createtable(L, 0, 0); + lua_pushstring(L, payload->getText().c_str()); + lua_setfield(L, -2, "text"); } diff --git a/Sluift/ElementConvertors/StatusConvertor.h b/Sluift/ElementConvertors/StatusConvertor.h index 2e39f27..53da0ad 100644 --- a/Sluift/ElementConvertors/StatusConvertor.h +++ b/Sluift/ElementConvertors/StatusConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,17 +7,17 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/Status.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/Status.h> namespace Swift { - class StatusConvertor : public GenericLuaElementConvertor<Status> { - public: - StatusConvertor(); - virtual ~StatusConvertor(); + class StatusConvertor : public GenericLuaElementConvertor<Status> { + public: + StatusConvertor(); + virtual ~StatusConvertor(); - virtual boost::shared_ptr<Status> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<Status>) SWIFTEN_OVERRIDE; - }; + virtual std::shared_ptr<Status> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<Status>) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/StatusShowConvertor.cpp b/Sluift/ElementConvertors/StatusShowConvertor.cpp index 43098ef..6d0a067 100644 --- a/Sluift/ElementConvertors/StatusShowConvertor.cpp +++ b/Sluift/ElementConvertors/StatusShowConvertor.cpp @@ -1,14 +1,17 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/StatusShowConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> + +#include <lua.hpp> + #include <Sluift/Lua/Check.h> #include <Sluift/Lua/Exception.h> @@ -20,55 +23,55 @@ StatusShowConvertor::StatusShowConvertor() : GenericLuaElementConvertor<StatusSh StatusShowConvertor::~StatusShowConvertor() { } -boost::shared_ptr<StatusShow> StatusShowConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<StatusShow> result = boost::make_shared<StatusShow>(); - lua_getfield(L, -1, "type"); - if (lua_isstring(L, -1)) { - result->setType(convertStatusShowTypeFromString(lua_tostring(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<StatusShow> StatusShowConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<StatusShow> result = std::make_shared<StatusShow>(); + lua_getfield(L, -1, "type"); + if (lua_isstring(L, -1)) { + result->setType(convertStatusShowTypeFromString(lua_tostring(L, -1))); + } + lua_pop(L, 1); + return result; } -void StatusShowConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<StatusShow> payload) { - lua_createtable(L, 0, 0); - const std::string show = convertStatusShowTypeToString(payload->getType()); - if (!show.empty()) { - lua_pushstring(L, show.c_str()); - lua_setfield(L, -2, "type"); - } +void StatusShowConvertor::doConvertToLua(lua_State* L, std::shared_ptr<StatusShow> payload) { + lua_createtable(L, 0, 0); + const std::string show = convertStatusShowTypeToString(payload->getType()); + if (!show.empty()) { + lua_pushstring(L, show.c_str()); + lua_setfield(L, -2, "type"); + } } std::string StatusShowConvertor::convertStatusShowTypeToString(const StatusShow::Type &show) { - switch (show) { - case StatusShow::Online: return "online"; - case StatusShow::FFC: return "ffc"; - case StatusShow::Away: return "away"; - case StatusShow::XA: return "xa"; - case StatusShow::DND: return "dnd"; - case StatusShow::None: return ""; - } - assert(false); - return ""; + switch (show) { + case StatusShow::Online: return "online"; + case StatusShow::FFC: return "ffc"; + case StatusShow::Away: return "away"; + case StatusShow::XA: return "xa"; + case StatusShow::DND: return "dnd"; + case StatusShow::None: return ""; + } + assert(false); + return ""; } StatusShow::Type StatusShowConvertor::convertStatusShowTypeFromString(const std::string& show) { - if (show == "online") { - return StatusShow::Online; - } - else if (show == "ffc") { - return StatusShow::FFC; - } - else if (show == "away") { - return StatusShow::Away; - } - else if (show == "xa") { - return StatusShow::XA; - } - else if (show == "dnd") { - return StatusShow::DND; - } - else { - throw Lua::Exception("Illegal status show: '" + show + "'"); - } + if (show == "online") { + return StatusShow::Online; + } + else if (show == "ffc") { + return StatusShow::FFC; + } + else if (show == "away") { + return StatusShow::Away; + } + else if (show == "xa") { + return StatusShow::XA; + } + else if (show == "dnd") { + return StatusShow::DND; + } + else { + throw Lua::Exception("Illegal status show: '" + show + "'"); + } } diff --git a/Sluift/ElementConvertors/StatusShowConvertor.h b/Sluift/ElementConvertors/StatusShowConvertor.h index 6447c4e..1521ca3 100644 --- a/Sluift/ElementConvertors/StatusShowConvertor.h +++ b/Sluift/ElementConvertors/StatusShowConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,20 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/StatusShow.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/StatusShow.h> namespace Swift { - class StatusShowConvertor : public GenericLuaElementConvertor<StatusShow> { - public: - StatusShowConvertor(); - virtual ~StatusShowConvertor(); + class StatusShowConvertor : public GenericLuaElementConvertor<StatusShow> { + public: + StatusShowConvertor(); + virtual ~StatusShowConvertor(); - virtual boost::shared_ptr<StatusShow> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<StatusShow>) SWIFTEN_OVERRIDE; + virtual std::shared_ptr<StatusShow> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<StatusShow>) SWIFTEN_OVERRIDE; - static std::string convertStatusShowTypeToString(const StatusShow::Type &show); - static StatusShow::Type convertStatusShowTypeFromString(const std::string& show); - }; + static std::string convertStatusShowTypeToString(const StatusShow::Type &show); + static StatusShow::Type convertStatusShowTypeFromString(const std::string& show); + }; } diff --git a/Sluift/ElementConvertors/SubjectConvertor.cpp b/Sluift/ElementConvertors/SubjectConvertor.cpp index 893073f..ae03564 100644 --- a/Sluift/ElementConvertors/SubjectConvertor.cpp +++ b/Sluift/ElementConvertors/SubjectConvertor.cpp @@ -1,13 +1,15 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/SubjectConvertor.h> +#include <memory> + #include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> + #include <Sluift/Lua/LuaUtils.h> using namespace Swift; @@ -18,18 +20,18 @@ SubjectConvertor::SubjectConvertor() : GenericLuaElementConvertor<Subject>("subj SubjectConvertor::~SubjectConvertor() { } -boost::shared_ptr<Subject> SubjectConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<Subject> result = boost::make_shared<Subject>(); - if (boost::optional<std::string> value = Lua::getStringField(L, -1, "text")) { - result->setText(*value); - } - return result; +std::shared_ptr<Subject> SubjectConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<Subject> result = std::make_shared<Subject>(); + if (boost::optional<std::string> value = Lua::getStringField(L, -1, "text")) { + result->setText(*value); + } + return result; } -void SubjectConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<Subject> payload) { - lua_createtable(L, 0, 0); - if (!payload->getText().empty()) { - lua_pushstring(L, payload->getText().c_str()); - lua_setfield(L, -2, "text"); - } +void SubjectConvertor::doConvertToLua(lua_State* L, std::shared_ptr<Subject> payload) { + lua_createtable(L, 0, 0); + if (!payload->getText().empty()) { + lua_pushstring(L, payload->getText().c_str()); + lua_setfield(L, -2, "text"); + } } diff --git a/Sluift/ElementConvertors/SubjectConvertor.h b/Sluift/ElementConvertors/SubjectConvertor.h index d517b1e..1520004 100644 --- a/Sluift/ElementConvertors/SubjectConvertor.h +++ b/Sluift/ElementConvertors/SubjectConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,19 +7,19 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/Subject.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/Subject.h> namespace Swift { - class LuaElementConvertors; + class LuaElementConvertors; - class SubjectConvertor : public GenericLuaElementConvertor<Subject> { - public: - SubjectConvertor(); - virtual ~SubjectConvertor(); + class SubjectConvertor : public GenericLuaElementConvertor<Subject> { + public: + SubjectConvertor(); + virtual ~SubjectConvertor(); - virtual boost::shared_ptr<Subject> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<Subject>) SWIFTEN_OVERRIDE; - }; + virtual std::shared_ptr<Subject> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<Subject>) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/UserLocationConvertor.cpp b/Sluift/ElementConvertors/UserLocationConvertor.cpp index 2d546dd..253ca36 100644 --- a/Sluift/ElementConvertors/UserLocationConvertor.cpp +++ b/Sluift/ElementConvertors/UserLocationConvertor.cpp @@ -1,261 +1,258 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/UserLocationConvertor.h> +#include <memory> + #include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> -#include <boost/numeric/conversion/cast.hpp> #include <Swiften/Base/DateTime.h> -#pragma clang diagnostic ignored "-Wunused-private-field" - using namespace Swift; -UserLocationConvertor::UserLocationConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<UserLocation>("user_location"), - convertors(convertors) { +UserLocationConvertor::UserLocationConvertor() : + GenericLuaElementConvertor<UserLocation>("user_location") { } UserLocationConvertor::~UserLocationConvertor() { } -boost::shared_ptr<UserLocation> UserLocationConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<UserLocation> result = boost::make_shared<UserLocation>(); - lua_getfield(L, -1, "area"); - if (lua_isstring(L, -1)) { - result->setArea(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "altitude"); - if (lua_isnumber(L, -1)) { - result->setAltitude(boost::numeric_cast<float>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "locality"); - if (lua_isstring(L, -1)) { - result->setLocality(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "latitude"); - if (lua_isnumber(L, -1)) { - result->setLatitude(boost::numeric_cast<float>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "accuracy"); - if (lua_isnumber(L, -1)) { - result->setAccuracy(boost::numeric_cast<float>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "description"); - if (lua_isstring(L, -1)) { - result->setDescription(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "country_code"); - if (lua_isstring(L, -1)) { - result->setCountryCode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "timestamp"); - if (lua_isstring(L, -1)) { - result->setTimestamp(stringToDateTime(std::string(lua_tostring(L, -1)))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "floor"); - if (lua_isstring(L, -1)) { - result->setFloor(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "building"); - if (lua_isstring(L, -1)) { - result->setBuilding(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "room"); - if (lua_isstring(L, -1)) { - result->setRoom(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "country"); - if (lua_isstring(L, -1)) { - result->setCountry(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "region"); - if (lua_isstring(L, -1)) { - result->setRegion(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "uri"); - if (lua_isstring(L, -1)) { - result->setURI(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "longitude"); - if (lua_isnumber(L, -1)) { - result->setLongitude(boost::numeric_cast<float>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "error"); - if (lua_isnumber(L, -1)) { - result->setError(boost::numeric_cast<float>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "postal_code"); - if (lua_isstring(L, -1)) { - result->setPostalCode(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "bearing"); - if (lua_isnumber(L, -1)) { - result->setBearing(boost::numeric_cast<float>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "text"); - if (lua_isstring(L, -1)) { - result->setText(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "datum"); - if (lua_isstring(L, -1)) { - result->setDatum(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "street"); - if (lua_isstring(L, -1)) { - result->setStreet(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "speed"); - if (lua_isnumber(L, -1)) { - result->setSpeed(boost::numeric_cast<float>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<UserLocation> UserLocationConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<UserLocation> result = std::make_shared<UserLocation>(); + lua_getfield(L, -1, "area"); + if (lua_isstring(L, -1)) { + result->setArea(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "altitude"); + if (lua_isnumber(L, -1)) { + result->setAltitude(lua_tonumber(L, -1)); + } + lua_pop(L, 1); + lua_getfield(L, -1, "locality"); + if (lua_isstring(L, -1)) { + result->setLocality(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "latitude"); + if (lua_isnumber(L, -1)) { + result->setLatitude(lua_tonumber(L, -1)); + } + lua_pop(L, 1); + lua_getfield(L, -1, "accuracy"); + if (lua_isnumber(L, -1)) { + result->setAccuracy(lua_tonumber(L, -1)); + } + lua_pop(L, 1); + lua_getfield(L, -1, "description"); + if (lua_isstring(L, -1)) { + result->setDescription(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "country_code"); + if (lua_isstring(L, -1)) { + result->setCountryCode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "timestamp"); + if (lua_isstring(L, -1)) { + result->setTimestamp(stringToDateTime(std::string(lua_tostring(L, -1)))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "floor"); + if (lua_isstring(L, -1)) { + result->setFloor(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "building"); + if (lua_isstring(L, -1)) { + result->setBuilding(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "room"); + if (lua_isstring(L, -1)) { + result->setRoom(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "country"); + if (lua_isstring(L, -1)) { + result->setCountry(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "region"); + if (lua_isstring(L, -1)) { + result->setRegion(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "uri"); + if (lua_isstring(L, -1)) { + result->setURI(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "longitude"); + if (lua_isnumber(L, -1)) { + result->setLongitude(lua_tonumber(L, -1)); + } + lua_pop(L, 1); + lua_getfield(L, -1, "error"); + if (lua_isnumber(L, -1)) { + result->setError(lua_tonumber(L, -1)); + } + lua_pop(L, 1); + lua_getfield(L, -1, "postal_code"); + if (lua_isstring(L, -1)) { + result->setPostalCode(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "bearing"); + if (lua_isnumber(L, -1)) { + result->setBearing(lua_tonumber(L, -1)); + } + lua_pop(L, 1); + lua_getfield(L, -1, "text"); + if (lua_isstring(L, -1)) { + result->setText(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "datum"); + if (lua_isstring(L, -1)) { + result->setDatum(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "street"); + if (lua_isstring(L, -1)) { + result->setStreet(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "speed"); + if (lua_isnumber(L, -1)) { + result->setSpeed(lua_tonumber(L, -1)); + } + lua_pop(L, 1); + return result; } -void UserLocationConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<UserLocation> payload) { - lua_createtable(L, 0, 0); - if (payload->getArea()) { - lua_pushstring(L, (*payload->getArea()).c_str()); - lua_setfield(L, -2, "area"); - } - if (payload->getAltitude()) { - lua_pushnumber(L, (*payload->getAltitude())); - lua_setfield(L, -2, "altitude"); - } - if (payload->getLocality()) { - lua_pushstring(L, (*payload->getLocality()).c_str()); - lua_setfield(L, -2, "locality"); - } - if (payload->getLatitude()) { - lua_pushnumber(L, (*payload->getLatitude())); - lua_setfield(L, -2, "latitude"); - } - if (payload->getAccuracy()) { - lua_pushnumber(L, (*payload->getAccuracy())); - lua_setfield(L, -2, "accuracy"); - } - if (payload->getDescription()) { - lua_pushstring(L, (*payload->getDescription()).c_str()); - lua_setfield(L, -2, "description"); - } - if (payload->getCountryCode()) { - lua_pushstring(L, (*payload->getCountryCode()).c_str()); - lua_setfield(L, -2, "country_code"); - } - if (payload->getTimestamp()) { - lua_pushstring(L, dateTimeToString((*payload->getTimestamp())).c_str()); - lua_setfield(L, -2, "timestamp"); - } - if (payload->getFloor()) { - lua_pushstring(L, (*payload->getFloor()).c_str()); - lua_setfield(L, -2, "floor"); - } - if (payload->getBuilding()) { - lua_pushstring(L, (*payload->getBuilding()).c_str()); - lua_setfield(L, -2, "building"); - } - if (payload->getRoom()) { - lua_pushstring(L, (*payload->getRoom()).c_str()); - lua_setfield(L, -2, "room"); - } - if (payload->getCountry()) { - lua_pushstring(L, (*payload->getCountry()).c_str()); - lua_setfield(L, -2, "country"); - } - if (payload->getRegion()) { - lua_pushstring(L, (*payload->getRegion()).c_str()); - lua_setfield(L, -2, "region"); - } - if (payload->getURI()) { - lua_pushstring(L, (*payload->getURI()).c_str()); - lua_setfield(L, -2, "uri"); - } - if (payload->getLongitude()) { - lua_pushnumber(L, (*payload->getLongitude())); - lua_setfield(L, -2, "longitude"); - } - if (payload->getError()) { - lua_pushnumber(L, (*payload->getError())); - lua_setfield(L, -2, "error"); - } - if (payload->getPostalCode()) { - lua_pushstring(L, (*payload->getPostalCode()).c_str()); - lua_setfield(L, -2, "postal_code"); - } - if (payload->getBearing()) { - lua_pushnumber(L, (*payload->getBearing())); - lua_setfield(L, -2, "bearing"); - } - if (payload->getText()) { - lua_pushstring(L, (*payload->getText()).c_str()); - lua_setfield(L, -2, "text"); - } - if (payload->getDatum()) { - lua_pushstring(L, (*payload->getDatum()).c_str()); - lua_setfield(L, -2, "datum"); - } - if (payload->getStreet()) { - lua_pushstring(L, (*payload->getStreet()).c_str()); - lua_setfield(L, -2, "street"); - } - if (payload->getSpeed()) { - lua_pushnumber(L, (*payload->getSpeed())); - lua_setfield(L, -2, "speed"); - } +void UserLocationConvertor::doConvertToLua(lua_State* L, std::shared_ptr<UserLocation> payload) { + lua_createtable(L, 0, 0); + if (payload->getArea()) { + lua_pushstring(L, (*payload->getArea()).c_str()); + lua_setfield(L, -2, "area"); + } + if (payload->getAltitude()) { + lua_pushnumber(L, (*payload->getAltitude())); + lua_setfield(L, -2, "altitude"); + } + if (payload->getLocality()) { + lua_pushstring(L, (*payload->getLocality()).c_str()); + lua_setfield(L, -2, "locality"); + } + if (payload->getLatitude()) { + lua_pushnumber(L, (*payload->getLatitude())); + lua_setfield(L, -2, "latitude"); + } + if (payload->getAccuracy()) { + lua_pushnumber(L, (*payload->getAccuracy())); + lua_setfield(L, -2, "accuracy"); + } + if (payload->getDescription()) { + lua_pushstring(L, (*payload->getDescription()).c_str()); + lua_setfield(L, -2, "description"); + } + if (payload->getCountryCode()) { + lua_pushstring(L, (*payload->getCountryCode()).c_str()); + lua_setfield(L, -2, "country_code"); + } + if (payload->getTimestamp()) { + lua_pushstring(L, dateTimeToString((*payload->getTimestamp())).c_str()); + lua_setfield(L, -2, "timestamp"); + } + if (payload->getFloor()) { + lua_pushstring(L, (*payload->getFloor()).c_str()); + lua_setfield(L, -2, "floor"); + } + if (payload->getBuilding()) { + lua_pushstring(L, (*payload->getBuilding()).c_str()); + lua_setfield(L, -2, "building"); + } + if (payload->getRoom()) { + lua_pushstring(L, (*payload->getRoom()).c_str()); + lua_setfield(L, -2, "room"); + } + if (payload->getCountry()) { + lua_pushstring(L, (*payload->getCountry()).c_str()); + lua_setfield(L, -2, "country"); + } + if (payload->getRegion()) { + lua_pushstring(L, (*payload->getRegion()).c_str()); + lua_setfield(L, -2, "region"); + } + if (payload->getURI()) { + lua_pushstring(L, (*payload->getURI()).c_str()); + lua_setfield(L, -2, "uri"); + } + if (payload->getLongitude()) { + lua_pushnumber(L, (*payload->getLongitude())); + lua_setfield(L, -2, "longitude"); + } + if (payload->getError()) { + lua_pushnumber(L, (*payload->getError())); + lua_setfield(L, -2, "error"); + } + if (payload->getPostalCode()) { + lua_pushstring(L, (*payload->getPostalCode()).c_str()); + lua_setfield(L, -2, "postal_code"); + } + if (payload->getBearing()) { + lua_pushnumber(L, (*payload->getBearing())); + lua_setfield(L, -2, "bearing"); + } + if (payload->getText()) { + lua_pushstring(L, (*payload->getText()).c_str()); + lua_setfield(L, -2, "text"); + } + if (payload->getDatum()) { + lua_pushstring(L, (*payload->getDatum()).c_str()); + lua_setfield(L, -2, "datum"); + } + if (payload->getStreet()) { + lua_pushstring(L, (*payload->getStreet()).c_str()); + lua_setfield(L, -2, "street"); + } + if (payload->getSpeed()) { + lua_pushnumber(L, (*payload->getSpeed())); + lua_setfield(L, -2, "speed"); + } } boost::optional<LuaElementConvertor::Documentation> UserLocationConvertor::getDocumentation() const { - return Documentation( - "UserLocation", - "This table has the following fields:\n\n" - "- `area`: string (Optional)\n" - "- `altitude`: @{float} (Optional)\n" - "- `locality`: string (Optional)\n" - "- `latitude`: @{float} (Optional)\n" - "- `accuracy`: @{float} (Optional)\n" - "- `description`: string (Optional)\n" - "- `country_code`: string (Optional)\n" - "- `timestamp`: datetime (string) (Optional)\n" - "- `floor`: string (Optional)\n" - "- `building`: string (Optional)\n" - "- `room`: string (Optional)\n" - "- `country`: string (Optional)\n" - "- `region`: string (Optional)\n" - "- `uri`: string (Optional)\n" - "- `longitude`: @{float} (Optional)\n" - "- `error`: @{float} (Optional)\n" - "- `postal_code`: string (Optional)\n" - "- `bearing`: @{float} (Optional)\n" - "- `text`: string (Optional)\n" - "- `datum`: string (Optional)\n" - "- `street`: string (Optional)\n" - "- `speed`: @{float} (Optional)\n" - ); + return Documentation( + "UserLocation", + "This table has the following fields:\n\n" + "- `area`: string (Optional)\n" + "- `altitude`: @{float} (Optional)\n" + "- `locality`: string (Optional)\n" + "- `latitude`: @{float} (Optional)\n" + "- `accuracy`: @{float} (Optional)\n" + "- `description`: string (Optional)\n" + "- `country_code`: string (Optional)\n" + "- `timestamp`: datetime (string) (Optional)\n" + "- `floor`: string (Optional)\n" + "- `building`: string (Optional)\n" + "- `room`: string (Optional)\n" + "- `country`: string (Optional)\n" + "- `region`: string (Optional)\n" + "- `uri`: string (Optional)\n" + "- `longitude`: @{float} (Optional)\n" + "- `error`: @{float} (Optional)\n" + "- `postal_code`: string (Optional)\n" + "- `bearing`: @{float} (Optional)\n" + "- `text`: string (Optional)\n" + "- `datum`: string (Optional)\n" + "- `street`: string (Optional)\n" + "- `speed`: @{float} (Optional)\n" + ); } diff --git a/Sluift/ElementConvertors/UserLocationConvertor.h b/Sluift/ElementConvertors/UserLocationConvertor.h index 7582fed..36e3a0b 100644 --- a/Sluift/ElementConvertors/UserLocationConvertor.h +++ b/Sluift/ElementConvertors/UserLocationConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/UserLocation.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/UserLocation.h> namespace Swift { - class LuaElementConvertors; - - class UserLocationConvertor : public GenericLuaElementConvertor<UserLocation> { - public: - UserLocationConvertor(LuaElementConvertors* convertors); - virtual ~UserLocationConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<UserLocation> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<UserLocation>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class UserLocationConvertor : public GenericLuaElementConvertor<UserLocation> { + public: + UserLocationConvertor(); + virtual ~UserLocationConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<UserLocation> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<UserLocation>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/UserTuneConvertor.cpp b/Sluift/ElementConvertors/UserTuneConvertor.cpp index 0ce09e9..a9e1bee 100644 --- a/Sluift/ElementConvertors/UserTuneConvertor.cpp +++ b/Sluift/ElementConvertors/UserTuneConvertor.cpp @@ -1,111 +1,108 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/UserTuneConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> -#include <boost/numeric/conversion/cast.hpp> - +#include <memory> +#include <boost/numeric/conversion/cast.hpp> -#pragma clang diagnostic ignored "-Wunused-private-field" +#include <lua.hpp> using namespace Swift; -UserTuneConvertor::UserTuneConvertor(LuaElementConvertors* convertors) : - GenericLuaElementConvertor<UserTune>("user_tune"), - convertors(convertors) { +UserTuneConvertor::UserTuneConvertor() : + GenericLuaElementConvertor<UserTune>("user_tune") { } UserTuneConvertor::~UserTuneConvertor() { } -boost::shared_ptr<UserTune> UserTuneConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<UserTune> result = boost::make_shared<UserTune>(); - lua_getfield(L, -1, "rating"); - if (lua_isnumber(L, -1)) { - result->setRating(boost::numeric_cast<unsigned int>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "title"); - if (lua_isstring(L, -1)) { - result->setTitle(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "track"); - if (lua_isstring(L, -1)) { - result->setTrack(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "artist"); - if (lua_isstring(L, -1)) { - result->setArtist(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "uri"); - if (lua_isstring(L, -1)) { - result->setURI(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "source"); - if (lua_isstring(L, -1)) { - result->setSource(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "length"); - if (lua_isnumber(L, -1)) { - result->setLength(boost::numeric_cast<unsigned int>(lua_tonumber(L, -1))); - } - lua_pop(L, 1); - return result; +std::shared_ptr<UserTune> UserTuneConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<UserTune> result = std::make_shared<UserTune>(); + lua_getfield(L, -1, "rating"); + if (lua_isnumber(L, -1)) { + result->setRating(boost::numeric_cast<unsigned int>(lua_tonumber(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "title"); + if (lua_isstring(L, -1)) { + result->setTitle(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "track"); + if (lua_isstring(L, -1)) { + result->setTrack(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "artist"); + if (lua_isstring(L, -1)) { + result->setArtist(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "uri"); + if (lua_isstring(L, -1)) { + result->setURI(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "source"); + if (lua_isstring(L, -1)) { + result->setSource(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "length"); + if (lua_isnumber(L, -1)) { + result->setLength(boost::numeric_cast<unsigned int>(lua_tonumber(L, -1))); + } + lua_pop(L, 1); + return result; } -void UserTuneConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<UserTune> payload) { - lua_createtable(L, 0, 0); - if (payload->getRating()) { - lua_pushnumber(L, (*payload->getRating())); - lua_setfield(L, -2, "rating"); - } - if (payload->getTitle()) { - lua_pushstring(L, (*payload->getTitle()).c_str()); - lua_setfield(L, -2, "title"); - } - if (payload->getTrack()) { - lua_pushstring(L, (*payload->getTrack()).c_str()); - lua_setfield(L, -2, "track"); - } - if (payload->getArtist()) { - lua_pushstring(L, (*payload->getArtist()).c_str()); - lua_setfield(L, -2, "artist"); - } - if (payload->getURI()) { - lua_pushstring(L, (*payload->getURI()).c_str()); - lua_setfield(L, -2, "uri"); - } - if (payload->getSource()) { - lua_pushstring(L, (*payload->getSource()).c_str()); - lua_setfield(L, -2, "source"); - } - if (payload->getLength()) { - lua_pushnumber(L, (*payload->getLength())); - lua_setfield(L, -2, "length"); - } +void UserTuneConvertor::doConvertToLua(lua_State* L, std::shared_ptr<UserTune> payload) { + lua_createtable(L, 0, 0); + if (payload->getRating()) { + lua_pushnumber(L, (*payload->getRating())); + lua_setfield(L, -2, "rating"); + } + if (payload->getTitle()) { + lua_pushstring(L, (*payload->getTitle()).c_str()); + lua_setfield(L, -2, "title"); + } + if (payload->getTrack()) { + lua_pushstring(L, (*payload->getTrack()).c_str()); + lua_setfield(L, -2, "track"); + } + if (payload->getArtist()) { + lua_pushstring(L, (*payload->getArtist()).c_str()); + lua_setfield(L, -2, "artist"); + } + if (payload->getURI()) { + lua_pushstring(L, (*payload->getURI()).c_str()); + lua_setfield(L, -2, "uri"); + } + if (payload->getSource()) { + lua_pushstring(L, (*payload->getSource()).c_str()); + lua_setfield(L, -2, "source"); + } + if (payload->getLength()) { + lua_pushnumber(L, (*payload->getLength())); + lua_setfield(L, -2, "length"); + } } boost::optional<LuaElementConvertor::Documentation> UserTuneConvertor::getDocumentation() const { - return Documentation( - "UserTune", - "This table has the following fields:\n\n" - "- `rating`: number (Optional)\n" - "- `title`: string (Optional)\n" - "- `track`: string (Optional)\n" - "- `artist`: string (Optional)\n" - "- `uri`: string (Optional)\n" - "- `source`: string (Optional)\n" - "- `length`: number (Optional)\n" - ); + return Documentation( + "UserTune", + "This table has the following fields:\n\n" + "- `rating`: number (Optional)\n" + "- `title`: string (Optional)\n" + "- `track`: string (Optional)\n" + "- `artist`: string (Optional)\n" + "- `uri`: string (Optional)\n" + "- `source`: string (Optional)\n" + "- `length`: number (Optional)\n" + ); } diff --git a/Sluift/ElementConvertors/UserTuneConvertor.h b/Sluift/ElementConvertors/UserTuneConvertor.h index e5d0c36..ba57747 100644 --- a/Sluift/ElementConvertors/UserTuneConvertor.h +++ b/Sluift/ElementConvertors/UserTuneConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,23 +7,20 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/UserTune.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/UserTune.h> namespace Swift { - class LuaElementConvertors; - - class UserTuneConvertor : public GenericLuaElementConvertor<UserTune> { - public: - UserTuneConvertor(LuaElementConvertors* convertors); - virtual ~UserTuneConvertor(); + class LuaElementConvertors; - virtual boost::shared_ptr<UserTune> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<UserTune>) SWIFTEN_OVERRIDE; - virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + class UserTuneConvertor : public GenericLuaElementConvertor<UserTune> { + public: + UserTuneConvertor(); + virtual ~UserTuneConvertor(); - private: - LuaElementConvertors* convertors; - }; + virtual std::shared_ptr<UserTune> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<UserTune>) SWIFTEN_OVERRIDE; + virtual boost::optional<Documentation> getDocumentation() const SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/VCardConvertor.cpp b/Sluift/ElementConvertors/VCardConvertor.cpp index 451e0ab..ad521b3 100644 --- a/Sluift/ElementConvertors/VCardConvertor.cpp +++ b/Sluift/ElementConvertors/VCardConvertor.cpp @@ -1,18 +1,22 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/VCardConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> -#include <Sluift/Lua/LuaUtils.h> + +#include <lua.hpp> + #include <Swiften/Base/ByteArray.h> #include <Swiften/Base/DateTime.h> +#include <Sluift/Lua/LuaUtils.h> + using namespace Swift; VCardConvertor::VCardConvertor() : GenericLuaElementConvertor<VCard>("vcard") { @@ -21,609 +25,609 @@ VCardConvertor::VCardConvertor() : GenericLuaElementConvertor<VCard>("vcard") { VCardConvertor::~VCardConvertor() { } -boost::shared_ptr<VCard> VCardConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<VCard> result = boost::make_shared<VCard>(); - lua_getfield(L, -1, "fullname"); - if (lua_isstring(L, -1)) { - result->setFullName(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "familyname"); - if (lua_isstring(L, -1)) { - result->setFamilyName(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "givenname"); - if (lua_isstring(L, -1)) { - result->setGivenName(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "middlename"); - if (lua_isstring(L, -1)) { - result->setMiddleName(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "prefix"); - if (lua_isstring(L, -1)) { - result->setPrefix(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "suffix"); - if (lua_isstring(L, -1)) { - result->setSuffix(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "nick"); - if (lua_isstring(L, -1)) { - result->setNickname(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "description"); - if (lua_isstring(L, -1)) { - result->setDescription(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "photo"); - if (lua_isstring(L, -1)) { - size_t len; - const char* data = lua_tolstring(L, -1, &len); - result->setPhoto(createByteArray(data, len)); - } - lua_pop(L, 1); - lua_getfield(L, -1, "phototype"); - if (lua_isstring(L, -1)) { - result->setPhotoType(std::string(lua_tostring(L, -1))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "birthday"); - if (lua_isstring(L, -1)) { - result->setBirthday(stringToDateTime(std::string(lua_tostring(L, -1)))); - } - lua_pop(L, 1); - lua_getfield(L, -1, "email"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - VCard::EMailAddress emailAddress; - emailAddress.address = Lua::getStringField(L, -1, "address").get_value_or(""); - if (boost::optional<bool> home = Lua::getBooleanField(L, -1, "home")) { - emailAddress.isHome = *home; - } - if (boost::optional<bool> work = Lua::getBooleanField(L, -1, "work")) { - emailAddress.isWork = *work; - } - if (boost::optional<bool> internet = Lua::getBooleanField(L, -1, "internet")) { - emailAddress.isInternet = *internet; - } - if (boost::optional<bool> preferred = Lua::getBooleanField(L, -1, "preferred")) { - emailAddress.isPreferred = *preferred; - } - if (boost::optional<bool> x400 = Lua::getBooleanField(L, -1, "x400")) { - emailAddress.isX400 = *x400; - } - result->addEMailAddress(emailAddress); - lua_pop(L, 1); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "telephone"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - VCard::Telephone telephone; - telephone.number = Lua::getStringField(L, -1, "number").get_value_or(""); - if (boost::optional<bool> home = Lua::getBooleanField(L, -1, "home")) { - telephone.isHome = *home; - } - if (boost::optional<bool> work = Lua::getBooleanField(L, -1, "work")) { - telephone.isWork = *work; - } - if (boost::optional<bool> voice = Lua::getBooleanField(L, -1, "voice")) { - telephone.isVoice = *voice; - } - if (boost::optional<bool> fax = Lua::getBooleanField(L, -1, "fax")) { - telephone.isFax = *fax; - } - if (boost::optional<bool> pager = Lua::getBooleanField(L, -1, "pager")) { - telephone.isPager = *pager; - } - if (boost::optional<bool> msg = Lua::getBooleanField(L, -1, "msg")) { - telephone.isMSG = *msg; - } - if (boost::optional<bool> cell = Lua::getBooleanField(L, -1, "cell")) { - telephone.isCell = *cell; - } - if (boost::optional<bool> video = Lua::getBooleanField(L, -1, "video")) { - telephone.isVideo = *video; - } - if (boost::optional<bool> bbs = Lua::getBooleanField(L, -1, "bbs")) { - telephone.isBBS = *bbs; - } - if (boost::optional<bool> modem = Lua::getBooleanField(L, -1, "modem")) { - telephone.isModem = *modem; - } - if (boost::optional<bool> isdn = Lua::getBooleanField(L, -1, "isdn")) { - telephone.isISDN = *isdn; - } - if (boost::optional<bool> pcs = Lua::getBooleanField(L, -1, "pcs")) { - telephone.isPCS = *pcs; - } - if (boost::optional<bool> preferred = Lua::getBooleanField(L, -1, "preferred")) { - telephone.isPreferred = *preferred; - } - result->addTelephone(telephone); - lua_pop(L, 1); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "address"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - VCard::Address address; - address.poBox = Lua::getStringField(L, -1, "pobox").get_value_or(""); - address.addressExtension = Lua::getStringField(L, -1, "extension").get_value_or(""); - address.street = Lua::getStringField(L, -1, "street").get_value_or(""); - address.locality = Lua::getStringField(L, -1, "locality").get_value_or(""); - address.region = Lua::getStringField(L, -1, "region").get_value_or(""); - address.postalCode = Lua::getStringField(L, -1, "postalcode").get_value_or(""); - address.country = Lua::getStringField(L, -1, "country").get_value_or(""); - if (boost::optional<bool> home = Lua::getBooleanField(L, -1, "home")) { - address.isHome = *home; - } - if (boost::optional<bool> work = Lua::getBooleanField(L, -1, "work")) { - address.isWork = *work; - } - if (boost::optional<bool> postal = Lua::getBooleanField(L, -1, "postal")) { - address.isPostal = *postal; - } - if (boost::optional<bool> parcel = Lua::getBooleanField(L, -1, "parcel")) { - address.isParcel = *parcel; - } - if (boost::optional<bool> preferred = Lua::getBooleanField(L, -1, "preferred")) { - address.isPreferred = *preferred; - } - if (boost::optional<bool> domestic = Lua::getBooleanField(L, -1, "domestic")) { - if (*domestic) { - address.deliveryType = VCard::DomesticDelivery; - } - } - if (boost::optional<bool> international = Lua::getBooleanField(L, -1, "international")) { - if (*international) { - address.deliveryType = VCard::InternationalDelivery; - } - } - result->addAddress(address); - lua_pop(L, 1); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "addresslabel"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - VCard::AddressLabel addresslabel; - lua_getfield(L, -1, "lines"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - if (lua_isstring(L, -1)) { - addresslabel.lines.push_back(lua_tostring(L, -1)); - } - lua_pop(L, 1); - } - } - lua_pop(L, 1); - if (boost::optional<bool> home = Lua::getBooleanField(L, -1, "home")) { - addresslabel.isHome = *home; - } - if (boost::optional<bool> work = Lua::getBooleanField(L, -1, "work")) { - addresslabel.isWork = *work; - } - if (boost::optional<bool> postal = Lua::getBooleanField(L, -1, "postal")) { - addresslabel.isPostal = *postal; - } - if (boost::optional<bool> parcel = Lua::getBooleanField(L, -1, "parcel")) { - addresslabel.isParcel = *parcel; - } - if (boost::optional<bool> preferred = Lua::getBooleanField(L, -1, "preferred")) { - addresslabel.isPreferred = *preferred; - } - if (boost::optional<bool> domestic = Lua::getBooleanField(L, -1, "domestic")) { - if (*domestic) { - addresslabel.deliveryType = VCard::DomesticDelivery; - } - } - if (boost::optional<bool> international = Lua::getBooleanField(L, -1, "international")) { - if (*international) { - addresslabel.deliveryType = VCard::InternationalDelivery; - } - } - result->addAddressLabel(addresslabel); - lua_pop(L, 1); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "organization"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - VCard::Organization organization; - organization.name = Lua::getStringField(L, -1, "name").get_value_or(""); - lua_getfield(L, -1, "units"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - if (lua_isstring(L, -1)) { - organization.units.push_back(lua_tostring(L, -1)); - } - lua_pop(L, 1); - } - } - lua_pop(L, 1); - result->addOrganization(organization); - lua_pop(L, 1); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "jid"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - if (lua_isstring(L, -1)) { - result->addJID(lua_tostring(L, -1)); - } - lua_pop(L, 1); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "title"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - if (lua_isstring(L, -1)) { - result->addTitle(lua_tostring(L, -1)); - } - lua_pop(L, 1); - } - } - lua_pop(L, 1); - lua_getfield(L, -1, "role"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - if (lua_isstring(L, -1)) { - result->addRole(lua_tostring(L, -1)); - } - lua_pop(L, 1); } - } - lua_pop(L, 1); - lua_getfield(L, -1, "url"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); ) { - if (lua_isstring(L, -1)) { - result->addURL(lua_tostring(L, -1)); - } - lua_pop(L, 1); - } - } - lua_pop(L, 1); - return result; +std::shared_ptr<VCard> VCardConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<VCard> result = std::make_shared<VCard>(); + lua_getfield(L, -1, "fullname"); + if (lua_isstring(L, -1)) { + result->setFullName(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "familyname"); + if (lua_isstring(L, -1)) { + result->setFamilyName(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "givenname"); + if (lua_isstring(L, -1)) { + result->setGivenName(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "middlename"); + if (lua_isstring(L, -1)) { + result->setMiddleName(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "prefix"); + if (lua_isstring(L, -1)) { + result->setPrefix(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "suffix"); + if (lua_isstring(L, -1)) { + result->setSuffix(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "nick"); + if (lua_isstring(L, -1)) { + result->setNickname(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "description"); + if (lua_isstring(L, -1)) { + result->setDescription(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "photo"); + if (lua_isstring(L, -1)) { + size_t len; + const char* data = lua_tolstring(L, -1, &len); + result->setPhoto(createByteArray(data, len)); + } + lua_pop(L, 1); + lua_getfield(L, -1, "phototype"); + if (lua_isstring(L, -1)) { + result->setPhotoType(std::string(lua_tostring(L, -1))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "birthday"); + if (lua_isstring(L, -1)) { + result->setBirthday(stringToDateTime(std::string(lua_tostring(L, -1)))); + } + lua_pop(L, 1); + lua_getfield(L, -1, "email"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + VCard::EMailAddress emailAddress; + emailAddress.address = Lua::getStringField(L, -1, "address").get_value_or(""); + if (boost::optional<bool> home = Lua::getBooleanField(L, -1, "home")) { + emailAddress.isHome = *home; + } + if (boost::optional<bool> work = Lua::getBooleanField(L, -1, "work")) { + emailAddress.isWork = *work; + } + if (boost::optional<bool> internet = Lua::getBooleanField(L, -1, "internet")) { + emailAddress.isInternet = *internet; + } + if (boost::optional<bool> preferred = Lua::getBooleanField(L, -1, "preferred")) { + emailAddress.isPreferred = *preferred; + } + if (boost::optional<bool> x400 = Lua::getBooleanField(L, -1, "x400")) { + emailAddress.isX400 = *x400; + } + result->addEMailAddress(emailAddress); + lua_pop(L, 1); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "telephone"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + VCard::Telephone telephone; + telephone.number = Lua::getStringField(L, -1, "number").get_value_or(""); + if (boost::optional<bool> home = Lua::getBooleanField(L, -1, "home")) { + telephone.isHome = *home; + } + if (boost::optional<bool> work = Lua::getBooleanField(L, -1, "work")) { + telephone.isWork = *work; + } + if (boost::optional<bool> voice = Lua::getBooleanField(L, -1, "voice")) { + telephone.isVoice = *voice; + } + if (boost::optional<bool> fax = Lua::getBooleanField(L, -1, "fax")) { + telephone.isFax = *fax; + } + if (boost::optional<bool> pager = Lua::getBooleanField(L, -1, "pager")) { + telephone.isPager = *pager; + } + if (boost::optional<bool> msg = Lua::getBooleanField(L, -1, "msg")) { + telephone.isMSG = *msg; + } + if (boost::optional<bool> cell = Lua::getBooleanField(L, -1, "cell")) { + telephone.isCell = *cell; + } + if (boost::optional<bool> video = Lua::getBooleanField(L, -1, "video")) { + telephone.isVideo = *video; + } + if (boost::optional<bool> bbs = Lua::getBooleanField(L, -1, "bbs")) { + telephone.isBBS = *bbs; + } + if (boost::optional<bool> modem = Lua::getBooleanField(L, -1, "modem")) { + telephone.isModem = *modem; + } + if (boost::optional<bool> isdn = Lua::getBooleanField(L, -1, "isdn")) { + telephone.isISDN = *isdn; + } + if (boost::optional<bool> pcs = Lua::getBooleanField(L, -1, "pcs")) { + telephone.isPCS = *pcs; + } + if (boost::optional<bool> preferred = Lua::getBooleanField(L, -1, "preferred")) { + telephone.isPreferred = *preferred; + } + result->addTelephone(telephone); + lua_pop(L, 1); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "address"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + VCard::Address address; + address.poBox = Lua::getStringField(L, -1, "pobox").get_value_or(""); + address.addressExtension = Lua::getStringField(L, -1, "extension").get_value_or(""); + address.street = Lua::getStringField(L, -1, "street").get_value_or(""); + address.locality = Lua::getStringField(L, -1, "locality").get_value_or(""); + address.region = Lua::getStringField(L, -1, "region").get_value_or(""); + address.postalCode = Lua::getStringField(L, -1, "postalcode").get_value_or(""); + address.country = Lua::getStringField(L, -1, "country").get_value_or(""); + if (boost::optional<bool> home = Lua::getBooleanField(L, -1, "home")) { + address.isHome = *home; + } + if (boost::optional<bool> work = Lua::getBooleanField(L, -1, "work")) { + address.isWork = *work; + } + if (boost::optional<bool> postal = Lua::getBooleanField(L, -1, "postal")) { + address.isPostal = *postal; + } + if (boost::optional<bool> parcel = Lua::getBooleanField(L, -1, "parcel")) { + address.isParcel = *parcel; + } + if (boost::optional<bool> preferred = Lua::getBooleanField(L, -1, "preferred")) { + address.isPreferred = *preferred; + } + if (boost::optional<bool> domestic = Lua::getBooleanField(L, -1, "domestic")) { + if (*domestic) { + address.deliveryType = VCard::DomesticDelivery; + } + } + if (boost::optional<bool> international = Lua::getBooleanField(L, -1, "international")) { + if (*international) { + address.deliveryType = VCard::InternationalDelivery; + } + } + result->addAddress(address); + lua_pop(L, 1); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "addresslabel"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + VCard::AddressLabel addresslabel; + lua_getfield(L, -1, "lines"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + if (lua_isstring(L, -1)) { + addresslabel.lines.push_back(lua_tostring(L, -1)); + } + lua_pop(L, 1); + } + } + lua_pop(L, 1); + if (boost::optional<bool> home = Lua::getBooleanField(L, -1, "home")) { + addresslabel.isHome = *home; + } + if (boost::optional<bool> work = Lua::getBooleanField(L, -1, "work")) { + addresslabel.isWork = *work; + } + if (boost::optional<bool> postal = Lua::getBooleanField(L, -1, "postal")) { + addresslabel.isPostal = *postal; + } + if (boost::optional<bool> parcel = Lua::getBooleanField(L, -1, "parcel")) { + addresslabel.isParcel = *parcel; + } + if (boost::optional<bool> preferred = Lua::getBooleanField(L, -1, "preferred")) { + addresslabel.isPreferred = *preferred; + } + if (boost::optional<bool> domestic = Lua::getBooleanField(L, -1, "domestic")) { + if (*domestic) { + addresslabel.deliveryType = VCard::DomesticDelivery; + } + } + if (boost::optional<bool> international = Lua::getBooleanField(L, -1, "international")) { + if (*international) { + addresslabel.deliveryType = VCard::InternationalDelivery; + } + } + result->addAddressLabel(addresslabel); + lua_pop(L, 1); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "organization"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + VCard::Organization organization; + organization.name = Lua::getStringField(L, -1, "name").get_value_or(""); + lua_getfield(L, -1, "units"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + if (lua_isstring(L, -1)) { + organization.units.push_back(lua_tostring(L, -1)); + } + lua_pop(L, 1); + } + } + lua_pop(L, 1); + result->addOrganization(organization); + lua_pop(L, 1); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "jid"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + if (lua_isstring(L, -1)) { + result->addJID(lua_tostring(L, -1)); + } + lua_pop(L, 1); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "title"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + if (lua_isstring(L, -1)) { + result->addTitle(lua_tostring(L, -1)); + } + lua_pop(L, 1); + } + } + lua_pop(L, 1); + lua_getfield(L, -1, "role"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + if (lua_isstring(L, -1)) { + result->addRole(lua_tostring(L, -1)); + } + lua_pop(L, 1); } + } + lua_pop(L, 1); + lua_getfield(L, -1, "url"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); ) { + if (lua_isstring(L, -1)) { + result->addURL(lua_tostring(L, -1)); + } + lua_pop(L, 1); + } + } + lua_pop(L, 1); + return result; } -void VCardConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<VCard> payload) { - lua_newtable(L); - if (!payload->getFullName().empty()) { - lua_pushstring(L, payload->getFullName().c_str()); - lua_setfield(L, -2, "fullname"); - } - if (!payload->getFamilyName().empty()) { - lua_pushstring(L, payload->getFamilyName().c_str()); - lua_setfield(L, -2, "familyname"); - } - if (!payload->getGivenName().empty()) { - lua_pushstring(L, payload->getGivenName().c_str()); - lua_setfield(L, -2, "givenname"); - } - if (!payload->getMiddleName().empty()) { - lua_pushstring(L, payload->getMiddleName().c_str()); - lua_setfield(L, -2, "middlename"); - } - if (!payload->getPrefix().empty()) { - lua_pushstring(L, payload->getPrefix().c_str()); - lua_setfield(L, -2, "prefix"); - } - if (!payload->getSuffix().empty()) { - lua_pushstring(L, payload->getSuffix().c_str()); - lua_setfield(L, -2, "suffix"); - } - if (!payload->getNickname().empty()) { - lua_pushstring(L, payload->getNickname().c_str()); - lua_setfield(L, -2, "nick"); - } - if (!payload->getDescription().empty()) { - lua_pushstring(L, payload->getDescription().c_str()); - lua_setfield(L, -2, "description"); - } - if (!payload->getPhoto().empty()) { - lua_pushlstring(L, reinterpret_cast<const char*>(vecptr(payload->getPhoto())), payload->getPhoto().size()); - lua_setfield(L, -2, "photo"); - } - if (!payload->getPhotoType().empty()) { - lua_pushstring(L, payload->getPhotoType().c_str()); - lua_setfield(L, -2, "phototype"); - } - if (!payload->getBirthday().is_not_a_date_time()) { - lua_pushstring(L, dateTimeToString(payload->getBirthday()).c_str()); - lua_setfield(L, -2, "birthday"); - } - const std::vector<VCard::EMailAddress>& emails = payload->getEMailAddresses(); - if (!emails.empty()) { - lua_createtable(L, boost::numeric_cast<int>(emails.size()), 0); - for (size_t i = 0; i < emails.size(); ++i) { - lua_createtable(L, 0, 0); - if (!emails[i].address.empty()) { - lua_pushstring(L, emails[i].address.c_str()); - lua_setfield(L, -2, "address"); - } - if (emails[i].isHome) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "home"); - } - if (emails[i].isWork) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "work"); - } - if (emails[i].isInternet) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "internet"); - } - if (emails[i].isPreferred) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "preferred"); - } - if (emails[i].isX400) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "x400"); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "email"); - } - const std::vector<VCard::Telephone>& telephones = payload->getTelephones(); - if (!telephones.empty()) { - lua_createtable(L, boost::numeric_cast<int>(telephones.size()), 0); - for (size_t i = 0; i < telephones.size(); ++i) { - lua_createtable(L, 0, 0); - if (!telephones[i].number.empty()) { - lua_pushstring(L, telephones[i].number.c_str()); - lua_setfield(L, -2, "number"); - } - if (telephones[i].isHome) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "home"); - } - if (telephones[i].isWork) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "work"); - } - if (telephones[i].isVoice) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "voice"); - } - if (telephones[i].isFax) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "fax"); - } - if (telephones[i].isPager) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "pager"); - } - if (telephones[i].isMSG) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "msg"); - } - if (telephones[i].isCell) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "cell"); - } - if (telephones[i].isVideo) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "video"); - } - if (telephones[i].isBBS) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "bbs"); - } - if (telephones[i].isModem) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "modem"); - } - if (telephones[i].isISDN) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "isdn"); - } - if (telephones[i].isPCS) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "pcs"); - } - if (telephones[i].isPreferred) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "preferred"); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "telephone"); - } - const std::vector<VCard::Address>& addresses = payload->getAddresses(); - if (!addresses.empty()) { - lua_createtable(L, boost::numeric_cast<int>(addresses.size()), 0); - for (size_t i = 0; i < addresses.size(); ++i) { - lua_createtable(L, 0, 0); - if (!addresses[i].poBox.empty()) { - lua_pushstring(L, addresses[i].poBox.c_str()); - lua_setfield(L, -2, "pobox"); - } - if (!addresses[i].addressExtension.empty()) { - lua_pushstring(L, addresses[i].addressExtension.c_str()); - lua_setfield(L, -2, "extension"); - } - if (!addresses[i].street.empty()) { - lua_pushstring(L, addresses[i].street.c_str()); - lua_setfield(L, -2, "street"); - } - if (!addresses[i].locality.empty()) { - lua_pushstring(L, addresses[i].locality.c_str()); - lua_setfield(L, -2, "locality"); - } - if (!addresses[i].region.empty()) { - lua_pushstring(L, addresses[i].region.c_str()); - lua_setfield(L, -2, "region"); - } - if (!addresses[i].postalCode.empty()) { - lua_pushstring(L, addresses[i].postalCode.c_str()); - lua_setfield(L, -2, "postalcode"); - } - if (!addresses[i].country.empty()) { - lua_pushstring(L, addresses[i].country.c_str()); - lua_setfield(L, -2, "country"); - } - if (addresses[i].isHome) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "home"); - } - if (addresses[i].isWork) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "work"); - } - if (addresses[i].isPostal) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "postal"); - } - if (addresses[i].isParcel) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "parcel"); - } - if (addresses[i].isPreferred) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "preferred"); - } - if (addresses[i].deliveryType == VCard::DomesticDelivery) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "domestic"); - } - if (addresses[i].deliveryType == VCard::InternationalDelivery) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "international"); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "address"); - } - const std::vector<VCard::AddressLabel>& addresslabels = payload->getAddressLabels(); - if (!addresslabels.empty()) { - lua_createtable(L, boost::numeric_cast<int>(addresslabels.size()), 0); - for (size_t i = 0; i < addresslabels.size(); ++i) { - lua_createtable(L, 0, 0); - const std::vector<std::string>& lines = addresslabels[i].lines; - if (!lines.empty()) { - lua_createtable(L, boost::numeric_cast<int>(addresslabels[i].lines.size()), 0); - for (size_t j = 0; j < lines.size(); ++j) { - if (!lines[j].empty()) { - lua_pushstring(L, lines[j].c_str()); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(j+1)); - } - lua_setfield(L, -2, "lines"); - } - if (addresslabels[i].isHome) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "home"); - } - if (addresslabels[i].isWork) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "work"); - } - if (addresslabels[i].isPostal) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "postal"); - } - if (addresslabels[i].isParcel) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "parcel"); - } - if (addresslabels[i].isPreferred) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "preferred"); - } - if (addresslabels[i].deliveryType == VCard::DomesticDelivery) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "domestic"); - } - if (addresslabels[i].deliveryType == VCard::InternationalDelivery) { - lua_pushboolean(L, true); - lua_setfield(L, -2, "international"); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "addresslabel"); - } - const std::vector<VCard::Organization>& organizations = payload->getOrganizations(); - if (!organizations.empty()) { - lua_createtable(L, boost::numeric_cast<int>(organizations.size()), 0); - for (size_t i = 0; i < organizations.size(); ++i) { - lua_createtable(L, 0, 0); - if (!organizations[i].name.empty()) { - lua_pushstring(L, organizations[i].name.c_str()); - lua_setfield(L, -2, "name"); - } - const std::vector<std::string>& units = organizations[i].units; - if (!units.empty()) { - lua_createtable(L, boost::numeric_cast<int>(organizations[i].units.size()), 0); - for (size_t j = 0; j < units.size(); ++j) { - if (!units[j].empty()) { - lua_pushstring(L, units[j].c_str()); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(j+1)); - } - lua_setfield(L, -2, "units"); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "organization"); - } - const std::vector<JID>& jids = payload->getJIDs(); - if (!jids.empty()) { - lua_createtable(L, boost::numeric_cast<int>(jids.size()), 0); - for (size_t i = 0; i < jids.size(); ++i) { - if (!jids[i].toString().empty()) { - lua_pushstring(L, jids[i].toString().c_str()); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "jid"); - } - const std::vector<std::string>& titles = payload->getTitles(); - if (!titles.empty()) { - lua_createtable(L, boost::numeric_cast<int>(titles.size()), 0); - for (size_t i = 0; i < titles.size(); ++i) { - if (!titles[i].empty()) { - lua_pushstring(L, titles[i].c_str()); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "title"); - } - const std::vector<std::string>& roles = payload->getRoles(); - if (!roles.empty()) { - lua_createtable(L, boost::numeric_cast<int>(roles.size()), 0); - for (size_t i = 0; i < roles.size(); ++i) { - if (!roles[i].empty()) { - lua_pushstring(L, roles[i].c_str()); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "role"); - } - const std::vector<std::string>& urls = payload->getURLs(); - if (!urls.empty()) { - lua_createtable(L, boost::numeric_cast<int>(urls.size()), 0); - for (size_t i = 0; i < urls.size(); ++i) { - if (!urls[i].empty()) { - lua_pushstring(L, urls[i].c_str()); - } - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setfield(L, -2, "url"); - } +void VCardConvertor::doConvertToLua(lua_State* L, std::shared_ptr<VCard> payload) { + lua_newtable(L); + if (!payload->getFullName().empty()) { + lua_pushstring(L, payload->getFullName().c_str()); + lua_setfield(L, -2, "fullname"); + } + if (!payload->getFamilyName().empty()) { + lua_pushstring(L, payload->getFamilyName().c_str()); + lua_setfield(L, -2, "familyname"); + } + if (!payload->getGivenName().empty()) { + lua_pushstring(L, payload->getGivenName().c_str()); + lua_setfield(L, -2, "givenname"); + } + if (!payload->getMiddleName().empty()) { + lua_pushstring(L, payload->getMiddleName().c_str()); + lua_setfield(L, -2, "middlename"); + } + if (!payload->getPrefix().empty()) { + lua_pushstring(L, payload->getPrefix().c_str()); + lua_setfield(L, -2, "prefix"); + } + if (!payload->getSuffix().empty()) { + lua_pushstring(L, payload->getSuffix().c_str()); + lua_setfield(L, -2, "suffix"); + } + if (!payload->getNickname().empty()) { + lua_pushstring(L, payload->getNickname().c_str()); + lua_setfield(L, -2, "nick"); + } + if (!payload->getDescription().empty()) { + lua_pushstring(L, payload->getDescription().c_str()); + lua_setfield(L, -2, "description"); + } + if (!payload->getPhoto().empty()) { + lua_pushlstring(L, reinterpret_cast<const char*>(vecptr(payload->getPhoto())), payload->getPhoto().size()); + lua_setfield(L, -2, "photo"); + } + if (!payload->getPhotoType().empty()) { + lua_pushstring(L, payload->getPhotoType().c_str()); + lua_setfield(L, -2, "phototype"); + } + if (!payload->getBirthday().is_not_a_date_time()) { + lua_pushstring(L, dateTimeToString(payload->getBirthday()).c_str()); + lua_setfield(L, -2, "birthday"); + } + const std::vector<VCard::EMailAddress>& emails = payload->getEMailAddresses(); + if (!emails.empty()) { + lua_createtable(L, boost::numeric_cast<int>(emails.size()), 0); + for (size_t i = 0; i < emails.size(); ++i) { + lua_createtable(L, 0, 0); + if (!emails[i].address.empty()) { + lua_pushstring(L, emails[i].address.c_str()); + lua_setfield(L, -2, "address"); + } + if (emails[i].isHome) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "home"); + } + if (emails[i].isWork) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "work"); + } + if (emails[i].isInternet) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "internet"); + } + if (emails[i].isPreferred) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "preferred"); + } + if (emails[i].isX400) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "x400"); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "email"); + } + const std::vector<VCard::Telephone>& telephones = payload->getTelephones(); + if (!telephones.empty()) { + lua_createtable(L, boost::numeric_cast<int>(telephones.size()), 0); + for (size_t i = 0; i < telephones.size(); ++i) { + lua_createtable(L, 0, 0); + if (!telephones[i].number.empty()) { + lua_pushstring(L, telephones[i].number.c_str()); + lua_setfield(L, -2, "number"); + } + if (telephones[i].isHome) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "home"); + } + if (telephones[i].isWork) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "work"); + } + if (telephones[i].isVoice) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "voice"); + } + if (telephones[i].isFax) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "fax"); + } + if (telephones[i].isPager) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "pager"); + } + if (telephones[i].isMSG) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "msg"); + } + if (telephones[i].isCell) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "cell"); + } + if (telephones[i].isVideo) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "video"); + } + if (telephones[i].isBBS) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "bbs"); + } + if (telephones[i].isModem) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "modem"); + } + if (telephones[i].isISDN) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "isdn"); + } + if (telephones[i].isPCS) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "pcs"); + } + if (telephones[i].isPreferred) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "preferred"); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "telephone"); + } + const std::vector<VCard::Address>& addresses = payload->getAddresses(); + if (!addresses.empty()) { + lua_createtable(L, boost::numeric_cast<int>(addresses.size()), 0); + for (size_t i = 0; i < addresses.size(); ++i) { + lua_createtable(L, 0, 0); + if (!addresses[i].poBox.empty()) { + lua_pushstring(L, addresses[i].poBox.c_str()); + lua_setfield(L, -2, "pobox"); + } + if (!addresses[i].addressExtension.empty()) { + lua_pushstring(L, addresses[i].addressExtension.c_str()); + lua_setfield(L, -2, "extension"); + } + if (!addresses[i].street.empty()) { + lua_pushstring(L, addresses[i].street.c_str()); + lua_setfield(L, -2, "street"); + } + if (!addresses[i].locality.empty()) { + lua_pushstring(L, addresses[i].locality.c_str()); + lua_setfield(L, -2, "locality"); + } + if (!addresses[i].region.empty()) { + lua_pushstring(L, addresses[i].region.c_str()); + lua_setfield(L, -2, "region"); + } + if (!addresses[i].postalCode.empty()) { + lua_pushstring(L, addresses[i].postalCode.c_str()); + lua_setfield(L, -2, "postalcode"); + } + if (!addresses[i].country.empty()) { + lua_pushstring(L, addresses[i].country.c_str()); + lua_setfield(L, -2, "country"); + } + if (addresses[i].isHome) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "home"); + } + if (addresses[i].isWork) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "work"); + } + if (addresses[i].isPostal) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "postal"); + } + if (addresses[i].isParcel) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "parcel"); + } + if (addresses[i].isPreferred) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "preferred"); + } + if (addresses[i].deliveryType == VCard::DomesticDelivery) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "domestic"); + } + if (addresses[i].deliveryType == VCard::InternationalDelivery) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "international"); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "address"); + } + const std::vector<VCard::AddressLabel>& addresslabels = payload->getAddressLabels(); + if (!addresslabels.empty()) { + lua_createtable(L, boost::numeric_cast<int>(addresslabels.size()), 0); + for (size_t i = 0; i < addresslabels.size(); ++i) { + lua_createtable(L, 0, 0); + const std::vector<std::string>& lines = addresslabels[i].lines; + if (!lines.empty()) { + lua_createtable(L, boost::numeric_cast<int>(addresslabels[i].lines.size()), 0); + for (size_t j = 0; j < lines.size(); ++j) { + if (!lines[j].empty()) { + lua_pushstring(L, lines[j].c_str()); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(j+1)); + } + lua_setfield(L, -2, "lines"); + } + if (addresslabels[i].isHome) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "home"); + } + if (addresslabels[i].isWork) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "work"); + } + if (addresslabels[i].isPostal) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "postal"); + } + if (addresslabels[i].isParcel) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "parcel"); + } + if (addresslabels[i].isPreferred) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "preferred"); + } + if (addresslabels[i].deliveryType == VCard::DomesticDelivery) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "domestic"); + } + if (addresslabels[i].deliveryType == VCard::InternationalDelivery) { + lua_pushboolean(L, true); + lua_setfield(L, -2, "international"); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "addresslabel"); + } + const std::vector<VCard::Organization>& organizations = payload->getOrganizations(); + if (!organizations.empty()) { + lua_createtable(L, boost::numeric_cast<int>(organizations.size()), 0); + for (size_t i = 0; i < organizations.size(); ++i) { + lua_createtable(L, 0, 0); + if (!organizations[i].name.empty()) { + lua_pushstring(L, organizations[i].name.c_str()); + lua_setfield(L, -2, "name"); + } + const std::vector<std::string>& units = organizations[i].units; + if (!units.empty()) { + lua_createtable(L, boost::numeric_cast<int>(organizations[i].units.size()), 0); + for (size_t j = 0; j < units.size(); ++j) { + if (!units[j].empty()) { + lua_pushstring(L, units[j].c_str()); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(j+1)); + } + lua_setfield(L, -2, "units"); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "organization"); + } + const std::vector<JID>& jids = payload->getJIDs(); + if (!jids.empty()) { + lua_createtable(L, boost::numeric_cast<int>(jids.size()), 0); + for (size_t i = 0; i < jids.size(); ++i) { + if (!jids[i].toString().empty()) { + lua_pushstring(L, jids[i].toString().c_str()); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "jid"); + } + const std::vector<std::string>& titles = payload->getTitles(); + if (!titles.empty()) { + lua_createtable(L, boost::numeric_cast<int>(titles.size()), 0); + for (size_t i = 0; i < titles.size(); ++i) { + if (!titles[i].empty()) { + lua_pushstring(L, titles[i].c_str()); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "title"); + } + const std::vector<std::string>& roles = payload->getRoles(); + if (!roles.empty()) { + lua_createtable(L, boost::numeric_cast<int>(roles.size()), 0); + for (size_t i = 0; i < roles.size(); ++i) { + if (!roles[i].empty()) { + lua_pushstring(L, roles[i].c_str()); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "role"); + } + const std::vector<std::string>& urls = payload->getURLs(); + if (!urls.empty()) { + lua_createtable(L, boost::numeric_cast<int>(urls.size()), 0); + for (size_t i = 0; i < urls.size(); ++i) { + if (!urls[i].empty()) { + lua_pushstring(L, urls[i].c_str()); + } + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setfield(L, -2, "url"); + } } diff --git a/Sluift/ElementConvertors/VCardConvertor.h b/Sluift/ElementConvertors/VCardConvertor.h index 135eff0..d63ef10 100644 --- a/Sluift/ElementConvertors/VCardConvertor.h +++ b/Sluift/ElementConvertors/VCardConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,17 +7,17 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/VCard.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/VCard.h> namespace Swift { - class VCardConvertor : public GenericLuaElementConvertor<VCard> { - public: - VCardConvertor(); - virtual ~VCardConvertor(); + class VCardConvertor : public GenericLuaElementConvertor<VCard> { + public: + VCardConvertor(); + virtual ~VCardConvertor(); - virtual boost::shared_ptr<VCard> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<VCard>) SWIFTEN_OVERRIDE; - }; + virtual std::shared_ptr<VCard> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<VCard>) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/ElementConvertors/VCardUpdateConvertor.cpp b/Sluift/ElementConvertors/VCardUpdateConvertor.cpp index 579f064..21c3d68 100644 --- a/Sluift/ElementConvertors/VCardUpdateConvertor.cpp +++ b/Sluift/ElementConvertors/VCardUpdateConvertor.cpp @@ -1,14 +1,17 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/ElementConvertors/VCardUpdateConvertor.h> -#include <lua.hpp> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> + #include <boost/numeric/conversion/cast.hpp> + +#include <lua.hpp> + #include <Sluift/Lua/LuaUtils.h> using namespace Swift; @@ -19,18 +22,18 @@ VCardUpdateConvertor::VCardUpdateConvertor() : GenericLuaElementConvertor<VCardU VCardUpdateConvertor::~VCardUpdateConvertor() { } -boost::shared_ptr<VCardUpdate> VCardUpdateConvertor::doConvertFromLua(lua_State* L) { - boost::shared_ptr<VCardUpdate> result = boost::make_shared<VCardUpdate>(); - if (boost::optional<std::string> value = Lua::getStringField(L, -1, "photo_hash")) { - result->setPhotoHash(*value); - } - return result; +std::shared_ptr<VCardUpdate> VCardUpdateConvertor::doConvertFromLua(lua_State* L) { + std::shared_ptr<VCardUpdate> result = std::make_shared<VCardUpdate>(); + if (boost::optional<std::string> value = Lua::getStringField(L, -1, "photo_hash")) { + result->setPhotoHash(*value); + } + return result; } -void VCardUpdateConvertor::doConvertToLua(lua_State* L, boost::shared_ptr<VCardUpdate> payload) { - lua_newtable(L); - if (!payload->getPhotoHash().empty()) { - lua_pushstring(L, payload->getPhotoHash().c_str()); - lua_setfield(L, -2, "photo_hash"); - } +void VCardUpdateConvertor::doConvertToLua(lua_State* L, std::shared_ptr<VCardUpdate> payload) { + lua_newtable(L); + if (!payload->getPhotoHash().empty()) { + lua_pushstring(L, payload->getPhotoHash().c_str()); + lua_setfield(L, -2, "photo_hash"); + } } diff --git a/Sluift/ElementConvertors/VCardUpdateConvertor.h b/Sluift/ElementConvertors/VCardUpdateConvertor.h index b6ffac7..851f3b1 100644 --- a/Sluift/ElementConvertors/VCardUpdateConvertor.h +++ b/Sluift/ElementConvertors/VCardUpdateConvertor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,17 +7,17 @@ #pragma once #include <Swiften/Base/Override.h> +#include <Swiften/Elements/VCardUpdate.h> #include <Sluift/GenericLuaElementConvertor.h> -#include <Swiften/Elements/VCardUpdate.h> namespace Swift { - class VCardUpdateConvertor : public GenericLuaElementConvertor<VCardUpdate> { - public: - VCardUpdateConvertor(); - virtual ~VCardUpdateConvertor(); + class VCardUpdateConvertor : public GenericLuaElementConvertor<VCardUpdate> { + public: + VCardUpdateConvertor(); + virtual ~VCardUpdateConvertor(); - virtual boost::shared_ptr<VCardUpdate> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<VCardUpdate>) SWIFTEN_OVERRIDE; - }; + virtual std::shared_ptr<VCardUpdate> doConvertFromLua(lua_State*) SWIFTEN_OVERRIDE; + virtual void doConvertToLua(lua_State*, std::shared_ptr<VCardUpdate>) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/GenericLuaElementConvertor.h b/Sluift/GenericLuaElementConvertor.h index 430e2b5..d94a324 100644 --- a/Sluift/GenericLuaElementConvertor.h +++ b/Sluift/GenericLuaElementConvertor.h @@ -1,54 +1,56 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <lua.hpp> #include <string> +#include <lua.hpp> + #include <Swiften/Base/Override.h> -#include <Sluift/LuaElementConvertor.h> + #include <Sluift/Lua/Check.h> #include <Sluift/Lua/LuaUtils.h> +#include <Sluift/LuaElementConvertor.h> namespace Swift { - template<typename T> - class GenericLuaElementConvertor : public LuaElementConvertor { - public: - GenericLuaElementConvertor(const std::string& type) : type(type) { - } - - virtual ~GenericLuaElementConvertor() {} - - virtual boost::shared_ptr<Element> convertFromLua(lua_State* L, int index, const std::string& payloadType) SWIFTEN_OVERRIDE { - if (payloadType == type) { - Lua::checkType(L, index, LUA_TTABLE); - lua_pushvalue(L, index); - boost::shared_ptr<Element> result = doConvertFromLua(L); - lua_pop(L, 1); - return result; - } - return boost::shared_ptr<Element>(); - } - - virtual boost::optional<std::string> convertToLua( - lua_State* L, boost::shared_ptr<Element> payload) SWIFTEN_OVERRIDE { - if (boost::shared_ptr<T> actualPayload = boost::dynamic_pointer_cast<T>(payload)) { - doConvertToLua(L, actualPayload); - assert(lua_type(L, -1) == LUA_TTABLE); - return type; - } - return NO_RESULT; - } - - protected: - virtual boost::shared_ptr<T> doConvertFromLua(lua_State*) = 0; - virtual void doConvertToLua(lua_State*, boost::shared_ptr<T>) = 0; - - private: - std::string type; - }; + template<typename T> + class GenericLuaElementConvertor : public LuaElementConvertor { + public: + GenericLuaElementConvertor(const std::string& type) : type(type) { + } + + virtual ~GenericLuaElementConvertor() {} + + virtual std::shared_ptr<Element> convertFromLua(lua_State* L, int index, const std::string& payloadType) SWIFTEN_OVERRIDE { + if (payloadType == type) { + Lua::checkType(L, index, LUA_TTABLE); + lua_pushvalue(L, index); + std::shared_ptr<Element> result = doConvertFromLua(L); + lua_pop(L, 1); + return result; + } + return std::shared_ptr<Element>(); + } + + virtual boost::optional<std::string> convertToLua( + lua_State* L, std::shared_ptr<Element> payload) SWIFTEN_OVERRIDE { + if (std::shared_ptr<T> actualPayload = std::dynamic_pointer_cast<T>(payload)) { + doConvertToLua(L, actualPayload); + assert(lua_type(L, -1) == LUA_TTABLE); + return type; + } + return NO_RESULT; + } + + protected: + virtual std::shared_ptr<T> doConvertFromLua(lua_State*) = 0; + virtual void doConvertToLua(lua_State*, std::shared_ptr<T>) = 0; + + private: + std::string type; + }; } diff --git a/Sluift/Helpers.cpp b/Sluift/Helpers.cpp index 12d2f8f..97d14ad 100644 --- a/Sluift/Helpers.cpp +++ b/Sluift/Helpers.cpp @@ -12,54 +12,54 @@ using namespace Swift; std::string Swift::getErrorString(const ClientError& error) { - std::string reason = "Disconnected: "; - switch(error.getType()) { - case ClientError::UnknownError: reason += "Unknown Error"; break; - case ClientError::ConnectionError: reason += "Error connecting to server"; break; - case ClientError::ConnectionReadError: reason += "Error while receiving server data"; break; - case ClientError::ConnectionWriteError: reason += "Error while sending data to the server"; break; - case ClientError::XMLError: reason += "Error parsing server data"; break; - case ClientError::AuthenticationFailedError: reason += "Login/password invalid"; break; - case ClientError::UnexpectedElementError: reason += "Unexpected response"; break; - case ClientError::DomainNameResolveError: reason += "Unable to find server"; break; - case ClientError::CompressionFailedError: reason += "Error while compressing stream"; break; - case ClientError::ServerVerificationFailedError: reason += "Server verification failed"; break; - case ClientError::NoSupportedAuthMechanismsError: reason += "Authentication mechanisms not supported"; break; - case ClientError::ResourceBindError: reason += "Error binding resource"; break; - case ClientError::RevokedError: reason += "Certificate got revoked"; break; - case ClientError::RevocationCheckFailedError: reason += "Failed to do revokation check"; break; - case ClientError::SessionStartError: reason += "Error starting session"; break; - case ClientError::StreamError: reason += "Stream error"; break; - case ClientError::TLSError: reason += "Encryption error"; break; - case ClientError::ClientCertificateLoadError: reason += "Error loading certificate (Invalid file or password?)"; break; - case ClientError::ClientCertificateError: reason += "Certificate not authorized"; break; - case ClientError::UnknownCertificateError: reason += "Unknown certificate"; break; - case ClientError::CertificateCardRemoved: reason += "Certificate card removed"; break; - case ClientError::CertificateExpiredError: reason += "Certificate has expired"; break; - case ClientError::CertificateNotYetValidError: reason += "Certificate is not yet valid"; break; - case ClientError::CertificateSelfSignedError: reason += "Certificate is self-signed"; break; - case ClientError::CertificateRejectedError: reason += "Certificate has been rejected"; break; - case ClientError::CertificateUntrustedError: reason += "Certificate is not trusted"; break; - case ClientError::InvalidCertificatePurposeError: reason += "Certificate cannot be used for encrypting your connection"; break; - case ClientError::CertificatePathLengthExceededError: reason += "Certificate path length constraint exceeded"; break; - case ClientError::InvalidCertificateSignatureError: reason += "Invalid certificate signature"; break; - case ClientError::InvalidCAError: reason += "Invalid Certificate Authority"; break; - case ClientError::InvalidServerIdentityError: reason += "Certificate does not match the host identity"; break; - } - return reason; + std::string reason = "Disconnected: "; + switch(error.getType()) { + case ClientError::UnknownError: reason += "Unknown Error"; break; + case ClientError::ConnectionError: reason += "Error connecting to server"; break; + case ClientError::ConnectionReadError: reason += "Error while receiving server data"; break; + case ClientError::ConnectionWriteError: reason += "Error while sending data to the server"; break; + case ClientError::XMLError: reason += "Error parsing server data"; break; + case ClientError::AuthenticationFailedError: reason += "Login/password invalid"; break; + case ClientError::UnexpectedElementError: reason += "Unexpected response"; break; + case ClientError::DomainNameResolveError: reason += "Unable to find server"; break; + case ClientError::CompressionFailedError: reason += "Error while compressing stream"; break; + case ClientError::ServerVerificationFailedError: reason += "Server verification failed"; break; + case ClientError::NoSupportedAuthMechanismsError: reason += "Authentication mechanisms not supported"; break; + case ClientError::ResourceBindError: reason += "Error binding resource"; break; + case ClientError::RevokedError: reason += "Certificate got revoked"; break; + case ClientError::RevocationCheckFailedError: reason += "Failed to do revokation check"; break; + case ClientError::SessionStartError: reason += "Error starting session"; break; + case ClientError::StreamError: reason += "Stream error"; break; + case ClientError::TLSError: reason += "Encryption error"; break; + case ClientError::ClientCertificateLoadError: reason += "Error loading certificate (Invalid file or password?)"; break; + case ClientError::ClientCertificateError: reason += "Certificate not authorized"; break; + case ClientError::UnknownCertificateError: reason += "Unknown certificate"; break; + case ClientError::CertificateCardRemoved: reason += "Certificate card removed"; break; + case ClientError::CertificateExpiredError: reason += "Certificate has expired"; break; + case ClientError::CertificateNotYetValidError: reason += "Certificate is not yet valid"; break; + case ClientError::CertificateSelfSignedError: reason += "Certificate is self-signed"; break; + case ClientError::CertificateRejectedError: reason += "Certificate has been rejected"; break; + case ClientError::CertificateUntrustedError: reason += "Certificate is not trusted"; break; + case ClientError::InvalidCertificatePurposeError: reason += "Certificate cannot be used for encrypting your connection"; break; + case ClientError::CertificatePathLengthExceededError: reason += "Certificate path length constraint exceeded"; break; + case ClientError::InvalidCertificateSignatureError: reason += "Invalid certificate signature"; break; + case ClientError::InvalidCAError: reason += "Invalid Certificate Authority"; break; + case ClientError::InvalidServerIdentityError: reason += "Certificate does not match the host identity"; break; + } + return reason; } std::string Swift::getErrorString(const ComponentError& error) { - std::string reason = "Disconnected: "; - switch(error.getType()) { - case ComponentError::UnknownError: reason += "Unknown Error"; break; - case ComponentError::ConnectionError: reason += "Error connecting to server"; break; - case ComponentError::ConnectionReadError: reason += "Error while receiving server data"; break; - case ComponentError::ConnectionWriteError: reason += "Error while sending data to the server"; break; - case ComponentError::XMLError: reason += "Error parsing server data"; break; - case ComponentError::AuthenticationFailedError: reason += "Login/password invalid"; break; - case ComponentError::UnexpectedElementError: reason += "Unexpected response"; break; - } - return reason; + std::string reason = "Disconnected: "; + switch(error.getType()) { + case ComponentError::UnknownError: reason += "Unknown Error"; break; + case ComponentError::ConnectionError: reason += "Error connecting to server"; break; + case ComponentError::ConnectionReadError: reason += "Error while receiving server data"; break; + case ComponentError::ConnectionWriteError: reason += "Error while sending data to the server"; break; + case ComponentError::XMLError: reason += "Error parsing server data"; break; + case ComponentError::AuthenticationFailedError: reason += "Login/password invalid"; break; + case ComponentError::UnexpectedElementError: reason += "Unexpected response"; break; + } + return reason; } diff --git a/Sluift/Helpers.h b/Sluift/Helpers.h index 290508a..6af3906 100644 --- a/Sluift/Helpers.h +++ b/Sluift/Helpers.h @@ -1,20 +1,20 @@ /* - * Copyright (c) 2013-2014 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Swiften/Base/Override.h> -#include <Swiften/Base/API.h> - #include <string> +#include <Swiften/Base/API.h> +#include <Swiften/Base/Override.h> + namespace Swift { - class ClientError; - class ComponentError; + class ClientError; + class ComponentError; - std::string getErrorString(const ClientError& error); - std::string getErrorString(const ComponentError& error); + std::string getErrorString(const ClientError& error); + std::string getErrorString(const ComponentError& error); } diff --git a/Sluift/ITunesInterface.h b/Sluift/ITunesInterface.h index 73555d2..d44dcb1 100644 --- a/Sluift/ITunesInterface.h +++ b/Sluift/ITunesInterface.h @@ -1,38 +1,40 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Swiften/Base/API.h> +#include <memory> +#include <string> -#include <boost/shared_ptr.hpp> #include <boost/optional/optional.hpp> +#include <Swiften/Base/API.h> + namespace Swift { - class SWIFTEN_API ITunesInterface { - public: - struct Track { - std::string name; - std::string artist; - std::string album; - long trackNumber; - double duration; - long rating; - }; - - ITunesInterface(); - virtual ~ITunesInterface(); - - boost::optional<Track> getCurrentTrack() const; - - private: - bool haveApplication() const; - - private: - struct Private; - boost::shared_ptr<Private> p; - }; + class SWIFTEN_API ITunesInterface { + public: + struct Track { + std::string name; + std::string artist; + std::string album; + long trackNumber; + double duration; + long rating; + }; + + ITunesInterface(); + virtual ~ITunesInterface(); + + boost::optional<Track> getCurrentTrack() const; + + private: + bool haveApplication() const; + + private: + struct Private; + const std::unique_ptr<Private> p; + }; } diff --git a/Sluift/ITunesInterface.mm b/Sluift/ITunesInterface.mm index 0843aad..33cf1ca 100644 --- a/Sluift/ITunesInterface.mm +++ b/Sluift/ITunesInterface.mm @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -12,47 +12,47 @@ #pragma clang diagnostic pop #include <ScriptingBridge/ScriptingBridge.h> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> #include <boost/optional.hpp> #include <SwifTools/Cocoa/CocoaUtil.h> using namespace Swift; struct ITunesInterface::Private { - Private() : iTunes(nil) { - } + Private() : iTunes(nil) { + } - iTunesApplication* iTunes; + iTunesApplication* iTunes; }; -ITunesInterface::ITunesInterface() : p(boost::make_shared<Private>()) { +ITunesInterface::ITunesInterface() : p(new Private()) { } ITunesInterface::~ITunesInterface() { } boost::optional<ITunesInterface::Track> ITunesInterface::getCurrentTrack() const { - if (!haveApplication()) { - return boost::optional<ITunesInterface::Track>(); - } - iTunesTrack* currentTrack = p->iTunes.currentTrack; - if (!currentTrack) { - return boost::optional<ITunesInterface::Track>(); - } - ITunesInterface::Track result; - result.name = NS2STDSTRING(currentTrack.name); - result.artist = NS2STDSTRING(currentTrack.artist); - result.album = NS2STDSTRING(currentTrack.album); - result.trackNumber = currentTrack.trackNumber; - result.duration = currentTrack.duration; - result.rating = currentTrack.rating; - return result; + if (!haveApplication()) { + return boost::optional<ITunesInterface::Track>(); + } + iTunesTrack* currentTrack = p->iTunes.currentTrack; + if (!currentTrack) { + return boost::optional<ITunesInterface::Track>(); + } + ITunesInterface::Track result; + result.name = ns2StdString(currentTrack.name); + result.artist = ns2StdString(currentTrack.artist); + result.album = ns2StdString(currentTrack.album); + result.trackNumber = currentTrack.trackNumber; + result.duration = currentTrack.duration; + result.rating = currentTrack.rating; + return result; } bool ITunesInterface::haveApplication() const { - if (!p->iTunes) { - p->iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; - } - return p->iTunes != nil && [p->iTunes isRunning]; + if (!p->iTunes) { + p->iTunes = [SBApplication applicationWithBundleIdentifier:@"com.apple.iTunes"]; + } + return p->iTunes != nil && [p->iTunes isRunning]; } diff --git a/Sluift/Lua/Check.cpp b/Sluift/Lua/Check.cpp index 9a4951e..b956623 100644 --- a/Sluift/Lua/Check.cpp +++ b/Sluift/Lua/Check.cpp @@ -1,66 +1,68 @@ /* - * Copyright (c) 2013-2014 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/Lua/Check.h> -#include <boost/numeric/conversion/cast.hpp> -#include <iostream> #include <sstream> + +#include <boost/numeric/conversion/cast.hpp> + #include <lua.hpp> -#include <Sluift/Lua/Exception.h> #include <Swiften/Base/ByteArray.h> +#include <Sluift/Lua/Exception.h> + using namespace Swift; static std::string getArgTypeError(lua_State* L, int arg, int tag) { - std::ostringstream s; - s << "Arg " << arg << ": expected " << lua_typename(L, tag) << ", got " << luaL_typename(L, arg); - return s.str(); + std::ostringstream s; + s << "Arg " << arg << ": expected " << lua_typename(L, tag) << ", got " << luaL_typename(L, arg); + return s.str(); } void Lua::checkType(lua_State* L, int arg, int type) { - if (lua_type(L, arg) != type) { - throw Lua::Exception(getArgTypeError(L, arg, type)); - } + if (lua_type(L, arg) != type) { + throw Lua::Exception(getArgTypeError(L, arg, type)); + } } int Lua::checkIntNumber(lua_State* L, int arg) { - if (!lua_isnumber(L, arg)) { - throw Lua::Exception(getArgTypeError(L, arg, LUA_TNUMBER)); - } - return boost::numeric_cast<int>(lua_tonumber(L, arg)); + if (!lua_isnumber(L, arg)) { + throw Lua::Exception(getArgTypeError(L, arg, LUA_TNUMBER)); + } + return boost::numeric_cast<int>(lua_tonumber(L, arg)); } std::string Lua::checkString(lua_State* L, int arg) { - const char *s = lua_tolstring(L, arg, NULL); - if (!s) { - throw Lua::Exception(getArgTypeError(L, arg, LUA_TSTRING)); - } - return std::string(s); + const char *s = lua_tolstring(L, arg, nullptr); + if (!s) { + throw Lua::Exception(getArgTypeError(L, arg, LUA_TSTRING)); + } + return std::string(s); } ByteArray Lua::checkByteArray(lua_State* L, int arg) { - size_t len; - const char *s = lua_tolstring(L, arg, &len); - if (!s) { - throw Lua::Exception(getArgTypeError(L, arg, LUA_TSTRING)); - } - return createByteArray(s, len); + size_t len; + const char *s = lua_tolstring(L, arg, &len); + if (!s) { + throw Lua::Exception(getArgTypeError(L, arg, LUA_TSTRING)); + } + return createByteArray(s, len); } void* Lua::checkUserDataRaw(lua_State* L, int arg) { - void* userData = lua_touserdata(L, arg); - if (!userData) { - throw Lua::Exception(getArgTypeError(L, arg, LUA_TUSERDATA)); - } - if (!lua_getmetatable(L, arg)) { - throw Lua::Exception(getArgTypeError(L, arg, LUA_TUSERDATA)); - } - lua_pop(L, 1); - return userData; + void* userData = lua_touserdata(L, arg); + if (!userData) { + throw Lua::Exception(getArgTypeError(L, arg, LUA_TUSERDATA)); + } + if (!lua_getmetatable(L, arg)) { + throw Lua::Exception(getArgTypeError(L, arg, LUA_TUSERDATA)); + } + lua_pop(L, 1); + return userData; } diff --git a/Sluift/Lua/Check.h b/Sluift/Lua/Check.h index 4449cd5..61658a6 100644 --- a/Sluift/Lua/Check.h +++ b/Sluift/Lua/Check.h @@ -13,17 +13,17 @@ struct lua_State; namespace Swift { - namespace Lua { - void checkType(lua_State* L, int arg, int type); - int checkIntNumber(lua_State* L, int arg); - std::string checkString(lua_State* L, int arg); - ByteArray checkByteArray(lua_State* L, int arg); + namespace Lua { + void checkType(lua_State* L, int arg, int type); + int checkIntNumber(lua_State* L, int arg); + std::string checkString(lua_State* L, int arg); + ByteArray checkByteArray(lua_State* L, int arg); - void* checkUserDataRaw(lua_State* L, int arg); + void* checkUserDataRaw(lua_State* L, int arg); - template<typename T> - T** checkUserData(lua_State* L, int arg) { - return reinterpret_cast<T**>(checkUserDataRaw(L, arg)); - } - } + template<typename T> + T** checkUserData(lua_State* L, int arg) { + return reinterpret_cast<T**>(checkUserDataRaw(L, arg)); + } + } } diff --git a/Sluift/Lua/Debug.h b/Sluift/Lua/Debug.h index 368672d..5f141e1 100644 --- a/Sluift/Lua/Debug.h +++ b/Sluift/Lua/Debug.h @@ -1,28 +1,29 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <lua.hpp> #include <iostream> +#include <lua.hpp> + namespace Swift { - namespace Lua { - inline void dumpStack(lua_State *L) { - for (int i = 1; i <= lua_gettop(L); i++) { - int type = lua_type(L, i); - std::cout << i << ": [" << lua_typename(L, type) << "] "; - switch (type) { - case LUA_TSTRING: std::cout << lua_tostring(L, i); break; - case LUA_TNUMBER: std::cout << lua_tonumber(L, i); break; - case LUA_TBOOLEAN: std::cout << lua_toboolean(L, i); break; - default: break; - } - std::cout << std::endl; - } - } - } + namespace Lua { + inline void dumpStack(lua_State *L) { + for (int i = 1; i <= lua_gettop(L); i++) { + int type = lua_type(L, i); + std::cout << i << ": [" << lua_typename(L, type) << "] "; + switch (type) { + case LUA_TSTRING: std::cout << lua_tostring(L, i); break; + case LUA_TNUMBER: std::cout << lua_tonumber(L, i); break; + case LUA_TBOOLEAN: std::cout << lua_toboolean(L, i); break; + default: break; + } + std::cout << std::endl; + } + } + } } diff --git a/Sluift/Lua/Exception.h b/Sluift/Lua/Exception.h index a681b9c..a8ecc5f 100644 --- a/Sluift/Lua/Exception.h +++ b/Sluift/Lua/Exception.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2014 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,16 +7,17 @@ #pragma once #include <stdexcept> + #include <Swiften/Base/API.h> namespace Swift { - namespace Lua { - class Exception : public std::runtime_error { - public: - Exception(const std::string& what); - SWIFTEN_DEFAULT_COPY_CONSTRUCTOR(Exception) - virtual ~Exception() SWIFTEN_NOEXCEPT; - }; - } + namespace Lua { + class Exception : public std::runtime_error { + public: + Exception(const std::string& what); + SWIFTEN_DEFAULT_COPY_CONSTRUCTOR(Exception) + virtual ~Exception() SWIFTEN_NOEXCEPT; + }; + } } diff --git a/Sluift/Lua/FunctionRegistration.cpp b/Sluift/Lua/FunctionRegistration.cpp index 871ed1b..5a6d43e 100644 --- a/Sluift/Lua/FunctionRegistration.cpp +++ b/Sluift/Lua/FunctionRegistration.cpp @@ -9,7 +9,7 @@ using namespace Swift::Lua; FunctionRegistration::FunctionRegistration(const std::string& name, lua_CFunction function, const std::string& type, const std::string& helpDescription, const std::string& helpParameters, const std::string& helpOptions) { - FunctionRegistry::getInstance().addFunction(name, function, type, helpDescription, helpParameters, helpOptions); + FunctionRegistry::getInstance().addFunction(name, function, type, helpDescription, helpParameters, helpOptions); } FunctionRegistration::~FunctionRegistration() { diff --git a/Sluift/Lua/FunctionRegistration.h b/Sluift/Lua/FunctionRegistration.h index cc43d35..8e1410d 100644 --- a/Sluift/Lua/FunctionRegistration.h +++ b/Sluift/Lua/FunctionRegistration.h @@ -1,43 +1,46 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Swiften/Base/Override.h> +#include <string> + +#include <lua.hpp> + #include <Swiften/Base/API.h> +#include <Swiften/Base/Override.h> + #include <Sluift/Lua/FunctionRegistry.h> -#include <lua.hpp> -#include <string> namespace Swift { - namespace Lua { - class FunctionRegistration { - public: - FunctionRegistration( - const std::string& name, lua_CFunction function, const std::string& type, - const std::string& helpDescription, const std::string& helpParameters, const std::string& helpOptions); - ~FunctionRegistration(); - }; - } + namespace Lua { + class FunctionRegistration { + public: + FunctionRegistration( + const std::string& name, lua_CFunction function, const std::string& type, + const std::string& helpDescription, const std::string& helpParameters, const std::string& helpOptions); + ~FunctionRegistration(); + }; + } } #define SLUIFT_LUA_FUNCTION_WITH_HELP(TYPE, NAME, HELP_DESCRIPTION, HELP_PARAMETERS, HELP_OPTIONS) \ - static int TYPE##_##NAME(lua_State* L); \ - static int TYPE##_##NAME##_wrapper(lua_State* L); \ - static ::Swift::Lua::FunctionRegistration TYPE##_##NAME##_registration( #NAME , TYPE##_##NAME##_wrapper, #TYPE, HELP_DESCRIPTION, HELP_PARAMETERS, HELP_OPTIONS); \ - static int TYPE##_##NAME##_wrapper(lua_State* L) { \ - try { \ - return TYPE ## _ ## NAME (L); \ - } \ - catch (const std::exception& e) { \ - return luaL_error(L, e.what()); \ - } \ - } \ - static int TYPE ## _ ## NAME (lua_State* L) + static int TYPE##_##NAME(lua_State* L); \ + static int TYPE##_##NAME##_wrapper(lua_State* L); \ + static ::Swift::Lua::FunctionRegistration TYPE##_##NAME##_registration( #NAME , TYPE##_##NAME##_wrapper, #TYPE, HELP_DESCRIPTION, HELP_PARAMETERS, HELP_OPTIONS); \ + static int TYPE##_##NAME##_wrapper(lua_State* L) { \ + try { \ + return TYPE ## _ ## NAME (L); \ + } \ + catch (const std::exception& e) { \ + return luaL_error(L, e.what()); \ + } \ + } \ + static int TYPE ## _ ## NAME (lua_State* L) #define SLUIFT_LUA_FUNCTION(TYPE, NAME) \ - SLUIFT_LUA_FUNCTION_WITH_HELP(TYPE, NAME, "", "", "") + SLUIFT_LUA_FUNCTION_WITH_HELP(TYPE, NAME, "", "", "") diff --git a/Sluift/Lua/FunctionRegistry.cpp b/Sluift/Lua/FunctionRegistry.cpp index 99a1722..46c6d18 100644 --- a/Sluift/Lua/FunctionRegistry.cpp +++ b/Sluift/Lua/FunctionRegistry.cpp @@ -1,14 +1,13 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/Lua/FunctionRegistry.h> -#include <Swiften/Base/foreach.h> -#include <Sluift/Lua/LuaUtils.h> #include <Sluift/Lua/Exception.h> +#include <Sluift/Lua/LuaUtils.h> #include <Sluift/globals.h> using namespace Swift::Lua; @@ -20,39 +19,39 @@ FunctionRegistry::~FunctionRegistry() { } FunctionRegistry& FunctionRegistry::getInstance() { - static FunctionRegistry instance; - return instance; + static FunctionRegistry instance; + return instance; } void FunctionRegistry::addFunction( - const std::string& name, lua_CFunction function, const std::string& type, - const std::string& helpDescription, const std::string& helpParameters, const std::string& helpOptions) { - Registration registration; - registration.name = name; - registration.function = function; - registration.type = type; - registration.helpDescription = helpDescription; - registration.helpParameters = helpParameters; - registration.helpOptions = helpOptions; - registrations.push_back(registration); + const std::string& name, lua_CFunction function, const std::string& type, + const std::string& helpDescription, const std::string& helpParameters, const std::string& helpOptions) { + Registration registration; + registration.name = name; + registration.function = function; + registration.type = type; + registration.helpDescription = helpDescription; + registration.helpParameters = helpParameters; + registration.helpOptions = helpOptions; + registrations.push_back(registration); } void FunctionRegistry::createFunctionTable(lua_State* L, const std::string& type) { - lua_newtable(L); - addFunctionsToTable(L, type); + lua_newtable(L); + addFunctionsToTable(L, type); } void FunctionRegistry::addFunctionsToTable(lua_State* L, const std::string& type) { - foreach(const Registration& registration, registrations) { - if (registration.type == type) { - lua_pushcclosure(L, registration.function, 0); - if (!registration.helpDescription.empty()) { - Lua::registerHelp(L, -1, registration.helpDescription, registration.helpParameters, registration.helpOptions); - } - else { - Lua::registerExtraHelp(L, -1, registration.type + "." + registration.name); - } - lua_setfield(L, -2, registration.name.c_str()); - } - } + for (const auto& registration : registrations) { + if (registration.type == type) { + lua_pushcclosure(L, registration.function, 0); + if (!registration.helpDescription.empty()) { + Lua::registerHelp(L, -1, registration.helpDescription, registration.helpParameters, registration.helpOptions); + } + else { + Lua::registerExtraHelp(L, -1, registration.type + "." + registration.name); + } + lua_setfield(L, -2, registration.name.c_str()); + } + } } diff --git a/Sluift/Lua/FunctionRegistry.h b/Sluift/Lua/FunctionRegistry.h index 800cf05..acab3aa 100644 --- a/Sluift/Lua/FunctionRegistry.h +++ b/Sluift/Lua/FunctionRegistry.h @@ -1,47 +1,49 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Swiften/Base/Override.h> -#include <lua.hpp> #include <string> #include <vector> +#include <lua.hpp> + +#include <Swiften/Base/Override.h> + namespace Swift { - namespace Lua { - class FunctionRegistry { - public: - ~FunctionRegistry(); - static FunctionRegistry& getInstance(); - - void addFunction(const std::string& name, lua_CFunction function, const std::string& type, - const std::string& helpDescription, const std::string& helpParameters, const std::string& helpOptions); - - void createFunctionTable(lua_State* L, const std::string& type); - - /** - * Adds the functions to the table on the top of the stack. - */ - void addFunctionsToTable(lua_State* L, const std::string& type); - - private: - FunctionRegistry(); - - - private: - struct Registration { - std::string name; - lua_CFunction function; - std::string type; - std::string helpDescription; - std::string helpParameters; - std::string helpOptions; - }; - std::vector<Registration> registrations; - }; - } + namespace Lua { + class FunctionRegistry { + public: + ~FunctionRegistry(); + static FunctionRegistry& getInstance(); + + void addFunction(const std::string& name, lua_CFunction function, const std::string& type, + const std::string& helpDescription, const std::string& helpParameters, const std::string& helpOptions); + + void createFunctionTable(lua_State* L, const std::string& type); + + /** + * Adds the functions to the table on the top of the stack. + */ + void addFunctionsToTable(lua_State* L, const std::string& type); + + private: + FunctionRegistry(); + + + private: + struct Registration { + std::string name; + lua_CFunction function; + std::string type; + std::string helpDescription; + std::string helpParameters; + std::string helpOptions; + }; + std::vector<Registration> registrations; + }; + } } diff --git a/Sluift/Lua/LuaUtils.cpp b/Sluift/Lua/LuaUtils.cpp index 78951d8..c677381 100644 --- a/Sluift/Lua/LuaUtils.cpp +++ b/Sluift/Lua/LuaUtils.cpp @@ -1,20 +1,21 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/Lua/LuaUtils.h> -#include <lua.hpp> - -#include <boost/scope_exit.hpp> -#include <Sluift/Lua/Exception.h> -#include <iostream> #include <cassert> #include <sstream> -#include <boost/numeric/conversion/cast.hpp> + #include <boost/algorithm/string/trim.hpp> +#include <boost/numeric/conversion/cast.hpp> +#include <boost/scope_exit.hpp> + +#include <lua.hpp> + +#include <Sluift/Lua/Exception.h> #include <Sluift/globals.h> using namespace Swift::Lua; @@ -22,178 +23,178 @@ using namespace Swift::Lua; static const std::string INDENT = " "; void Swift::Lua::registerTableToString(lua_State* L, int index) { - index = Lua::absoluteOffset(L, index); - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - lua_getfield(L, -1, "register_table_tostring"); - lua_pushvalue(L, index); - if (lua_pcall(L, 1, 0, 0) != 0) { - throw Lua::Exception(lua_tostring(L, -1)); - } - lua_pop(L, 1); + index = Lua::absoluteOffset(L, index); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + lua_getfield(L, -1, "register_table_tostring"); + lua_pushvalue(L, index); + if (lua_pcall(L, 1, 0, 0) != 0) { + throw Lua::Exception(lua_tostring(L, -1)); + } + lua_pop(L, 1); } void Swift::Lua::registerTableEquals(lua_State* L, int index) { - index = Lua::absoluteOffset(L, index); - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - lua_getfield(L, -1, "register_table_equals"); - lua_pushvalue(L, index); - if (lua_pcall(L, 1, 0, 0) != 0) { - throw Lua::Exception(lua_tostring(L, -1)); - } - lua_pop(L, 1); + index = Lua::absoluteOffset(L, index); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + lua_getfield(L, -1, "register_table_equals"); + lua_pushvalue(L, index); + if (lua_pcall(L, 1, 0, 0) != 0) { + throw Lua::Exception(lua_tostring(L, -1)); + } + lua_pop(L, 1); } void Swift::Lua::registerGetByTypeIndex(lua_State* L, int index) { - index = Lua::absoluteOffset(L, index); - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - lua_getfield(L, -1, "register_get_by_type_index"); - lua_pushvalue(L, index); - if (lua_pcall(L, 1, 0, 0) != 0) { - throw Lua::Exception(lua_tostring(L, -1)); - } - lua_pop(L, 1); + index = Lua::absoluteOffset(L, index); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + lua_getfield(L, -1, "register_get_by_type_index"); + lua_pushvalue(L, index); + if (lua_pcall(L, 1, 0, 0) != 0) { + throw Lua::Exception(lua_tostring(L, -1)); + } + lua_pop(L, 1); } boost::optional<std::string> Swift::Lua::getStringField(lua_State* L, int index, const std::string& field) { - lua_getfield(L, index, field.c_str()); - // Seems to generate warnings with some versions of CLang that i can't turn off. - // Leaving the more elegant code here, hoping we can re-enable it later (newer boost? c++11?). - // The same applies to the other get*Field functions. - //BOOST_SCOPE_EXIT(&L) { lua_pop(L,1); } BOOST_SCOPE_EXIT_END - //return lua_isstring(L, -1) ? std::string(lua_tostring(L, -1)) : boost::optional<std::string>(); - - boost::optional<std::string> result; - if (lua_isstring(L, -1)) { - result = std::string(lua_tostring(L, -1)); - } - lua_pop(L, 1); - return result; + lua_getfield(L, index, field.c_str()); + // Seems to generate warnings with some versions of CLang that i can't turn off. + // Leaving the more elegant code here, hoping we can re-enable it later (newer boost? c++11?). + // The same applies to the other get*Field functions. + //BOOST_SCOPE_EXIT(&L) { lua_pop(L,1); } BOOST_SCOPE_EXIT_END + //return lua_isstring(L, -1) ? std::string(lua_tostring(L, -1)) : boost::optional<std::string>(); + + boost::optional<std::string> result; + if (lua_isstring(L, -1)) { + result = std::string(lua_tostring(L, -1)); + } + lua_pop(L, 1); + return result; } boost::optional<bool> Swift::Lua::getBooleanField(lua_State* L, int index, const std::string& field) { - lua_getfield(L, index, field.c_str()); - boost::optional<bool> result; - if (lua_isboolean(L, -1)) { - result = lua_toboolean(L, -1); - } - lua_pop(L, 1); - return result; + lua_getfield(L, index, field.c_str()); + boost::optional<bool> result; + if (lua_isboolean(L, -1)) { + result = lua_toboolean(L, -1); + } + lua_pop(L, 1); + return result; } boost::optional<int> Swift::Lua::getIntField(lua_State* L, int index, const std::string& field) { - lua_getfield(L, index, field.c_str()); - boost::optional<int> result; - if (lua_isnumber(L, -1)) { - result = boost::numeric_cast<int>(lua_tonumber(L, -1)); - } - lua_pop(L, 1); - return result; + lua_getfield(L, index, field.c_str()); + boost::optional<int> result; + if (lua_isnumber(L, -1)) { + result = boost::numeric_cast<int>(lua_tonumber(L, -1)); + } + lua_pop(L, 1); + return result; } void Swift::Lua::registerHelp(lua_State* L, int index, const std::string& description, const std::string& parameters, const std::string& options) { - index = Lua::absoluteOffset(L, index); - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - lua_getfield(L, -1, "register_help"); - lua_pushvalue(L, index); - - lua_newtable(L); - lua_pushstring(L, description.c_str()); - lua_rawseti(L, -2, 1); - - if (!parameters.empty()) { - std::istringstream s(parameters); - lua_newtable(L); - int i = 1; - for (std::string line; std::getline(s, line); ) { - std::string trimmedLine = boost::trim_copy(line); - if (trimmedLine.empty()) { - continue; - } - size_t splitIndex = trimmedLine.find_first_of(" \t"); - std::string key; - std::string value; - if (splitIndex == std::string::npos) { - key = trimmedLine; - } - else { - key = trimmedLine.substr(0, splitIndex); - value = boost::trim_copy(trimmedLine.substr(splitIndex+1)); - } - lua_createtable(L, 2, 0); - lua_pushstring(L, key.c_str()); - lua_rawseti(L, -2, 1); - lua_pushstring(L, value.c_str()); - lua_rawseti(L, -2, 2); - - lua_rawseti(L, -2, i++); - } - lua_setfield(L, -2, "parameters"); - } - if (!options.empty()) { - std::istringstream s(options); - lua_newtable(L); - for (std::string line; std::getline(s, line); ) { - std::string trimmedLine = boost::trim_copy(line); - if (trimmedLine.empty()) { - continue; - } - size_t splitIndex = trimmedLine.find_first_of(" \t"); - std::string key; - std::string value; - if (splitIndex == std::string::npos) { - key = trimmedLine; - } - else { - key = trimmedLine.substr(0, splitIndex); - value = boost::trim_copy(trimmedLine.substr(splitIndex+1)); - } - lua_pushstring(L, value.c_str()); - lua_setfield(L, -2, key.c_str()); - } - lua_setfield(L, -2, "options"); - } - - if (lua_pcall(L, 2, 0, 0) != 0) { - throw Lua::Exception(lua_tostring(L, -1)); - } - lua_pop(L, 1); + index = Lua::absoluteOffset(L, index); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + lua_getfield(L, -1, "register_help"); + lua_pushvalue(L, index); + + lua_newtable(L); + lua_pushstring(L, description.c_str()); + lua_rawseti(L, -2, 1); + + if (!parameters.empty()) { + std::istringstream s(parameters); + lua_newtable(L); + int i = 1; + for (std::string line; std::getline(s, line); ) { + std::string trimmedLine = boost::trim_copy(line); + if (trimmedLine.empty()) { + continue; + } + size_t splitIndex = trimmedLine.find_first_of(" \t"); + std::string key; + std::string value; + if (splitIndex == std::string::npos) { + key = trimmedLine; + } + else { + key = trimmedLine.substr(0, splitIndex); + value = boost::trim_copy(trimmedLine.substr(splitIndex+1)); + } + lua_createtable(L, 2, 0); + lua_pushstring(L, key.c_str()); + lua_rawseti(L, -2, 1); + lua_pushstring(L, value.c_str()); + lua_rawseti(L, -2, 2); + + lua_rawseti(L, -2, i++); + } + lua_setfield(L, -2, "parameters"); + } + if (!options.empty()) { + std::istringstream s(options); + lua_newtable(L); + for (std::string line; std::getline(s, line); ) { + std::string trimmedLine = boost::trim_copy(line); + if (trimmedLine.empty()) { + continue; + } + size_t splitIndex = trimmedLine.find_first_of(" \t"); + std::string key; + std::string value; + if (splitIndex == std::string::npos) { + key = trimmedLine; + } + else { + key = trimmedLine.substr(0, splitIndex); + value = boost::trim_copy(trimmedLine.substr(splitIndex+1)); + } + lua_pushstring(L, value.c_str()); + lua_setfield(L, -2, key.c_str()); + } + lua_setfield(L, -2, "options"); + } + + if (lua_pcall(L, 2, 0, 0) != 0) { + throw Lua::Exception(lua_tostring(L, -1)); + } + lua_pop(L, 1); } void Swift::Lua::registerClassHelp(lua_State* L, const std::string& name, const std::string& description) { - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - lua_getfield(L, -1, "register_class_help"); - lua_pushstring(L, name.c_str()); - - lua_newtable(L); - lua_pushstring(L, description.c_str()); - lua_rawseti(L, -2, 1); - - if (lua_pcall(L, 2, 0, 0) != 0) { - throw Lua::Exception(lua_tostring(L, -1)); - } - lua_pop(L, 1); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + lua_getfield(L, -1, "register_class_help"); + lua_pushstring(L, name.c_str()); + + lua_newtable(L); + lua_pushstring(L, description.c_str()); + lua_rawseti(L, -2, 1); + + if (lua_pcall(L, 2, 0, 0) != 0) { + throw Lua::Exception(lua_tostring(L, -1)); + } + lua_pop(L, 1); } void Swift::Lua::registerExtraHelp(lua_State* L, int index, const std::string& name) { - index = Lua::absoluteOffset(L, index); - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - lua_getfield(L, -1, "extra_help"); - lua_getfield(L, -1, name.c_str()); - if (!lua_isnil(L, -1)) { - lua_getfield(L, -3, "register_help"); - lua_pushvalue(L, index); - lua_pushvalue(L, -3); - if (lua_pcall(L, 2, 0, 0) != 0) { - throw Lua::Exception(lua_tostring(L, -1)); - } - } - lua_pop(L, 3); + index = Lua::absoluteOffset(L, index); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + lua_getfield(L, -1, "extra_help"); + lua_getfield(L, -1, name.c_str()); + if (!lua_isnil(L, -1)) { + lua_getfield(L, -3, "register_help"); + lua_pushvalue(L, index); + lua_pushvalue(L, -3); + if (lua_pcall(L, 2, 0, 0) != 0) { + throw Lua::Exception(lua_tostring(L, -1)); + } + } + lua_pop(L, 3); } void Swift::Lua::pushStringArray(lua_State* L, const std::vector<std::string>& strings) { - lua_createtable(L, boost::numeric_cast<int>(strings.size()), 0); - for (size_t i = 0; i < strings.size(); ++i) { - lua_pushstring(L, strings[i].c_str()); - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } + lua_createtable(L, boost::numeric_cast<int>(strings.size()), 0); + for (size_t i = 0; i < strings.size(); ++i) { + lua_pushstring(L, strings[i].c_str()); + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } } diff --git a/Sluift/Lua/LuaUtils.h b/Sluift/Lua/LuaUtils.h index 19b6691..b87eb38 100644 --- a/Sluift/Lua/LuaUtils.h +++ b/Sluift/Lua/LuaUtils.h @@ -16,28 +16,28 @@ #endif namespace Swift { - namespace Lua { - /** - * Can be used as __tostring metamethod on a table. - */ - int convertTableToString(lua_State* L); - - void registerTableToString(lua_State* L, int index); - void registerTableEquals(lua_State* L, int index); - void registerGetByTypeIndex(lua_State* L, int index); - void registerHelp(lua_State* L, int index, - const std::string& description, const std::string& parameters, const std::string& options); - void registerClassHelp(lua_State* L, const std::string& name, const std::string& description); - void registerExtraHelp(lua_State* L, int index, const std::string& name); - - inline int absoluteOffset(lua_State* L, int index) { - return index > 0 ? index : lua_gettop(L) + index + 1; - } - - boost::optional<std::string> getStringField(lua_State* L, int index, const std::string&); - boost::optional<bool> getBooleanField(lua_State* L, int index, const std::string&); - boost::optional<int> getIntField(lua_State* L, int index, const std::string&); - - void pushStringArray(lua_State* L, const std::vector<std::string>& strings); - } + namespace Lua { + /** + * Can be used as __tostring metamethod on a table. + */ + int convertTableToString(lua_State* L); + + void registerTableToString(lua_State* L, int index); + void registerTableEquals(lua_State* L, int index); + void registerGetByTypeIndex(lua_State* L, int index); + void registerHelp(lua_State* L, int index, + const std::string& description, const std::string& parameters, const std::string& options); + void registerClassHelp(lua_State* L, const std::string& name, const std::string& description); + void registerExtraHelp(lua_State* L, int index, const std::string& name); + + inline int absoluteOffset(lua_State* L, int index) { + return index > 0 ? index : lua_gettop(L) + index + 1; + } + + boost::optional<std::string> getStringField(lua_State* L, int index, const std::string&); + boost::optional<bool> getBooleanField(lua_State* L, int index, const std::string&); + boost::optional<int> getIntField(lua_State* L, int index, const std::string&); + + void pushStringArray(lua_State* L, const std::vector<std::string>& strings); + } } diff --git a/Sluift/Lua/Value.cpp b/Sluift/Lua/Value.cpp index 4ce3de8..96d954c 100644 --- a/Sluift/Lua/Value.cpp +++ b/Sluift/Lua/Value.cpp @@ -1,66 +1,66 @@ /* - * Copyright (c) 2011 Isode Limited. + * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ -#include "Value.h" +#include <Sluift/Lua/Value.h> + +#include <boost/numeric/conversion/cast.hpp> +#include <boost/variant/apply_visitor.hpp> extern "C" { - #include <lualib.h> + #include <lualib.h> } -#include <boost/variant/apply_visitor.hpp> -#include <boost/numeric/conversion/cast.hpp> -#include <Swiften/Base/foreach.h> using namespace Swift; using namespace Swift::Lua; namespace { - struct PushVisitor : public boost::static_visitor<> { - PushVisitor(lua_State* state) : state(state) { - } + struct PushVisitor : public boost::static_visitor<> { + PushVisitor(lua_State* state) : state(state) { + } - void operator()(const Nil&) const { - lua_pushnil(state); - } + void operator()(const Nil&) const { + lua_pushnil(state); + } - void operator()(const bool& b) const { - lua_pushboolean(state, b); - } + void operator()(const bool& b) const { + lua_pushboolean(state, b); + } - void operator()(const int& i) const { - lua_pushnumber(state, i); - } + void operator()(const int& i) const { + lua_pushnumber(state, i); + } - void operator()(const std::string& s) const { - lua_pushstring(state, s.c_str()); - } + void operator()(const std::string& s) const { + lua_pushstring(state, s.c_str()); + } - void operator()(const std::vector<Value>& values) const { - lua_createtable(state, boost::numeric_cast<int>(values.size()), 0); - for(size_t i = 0; i < values.size(); ++i) { - boost::apply_visitor(PushVisitor(state), values[i]); - lua_rawseti(state, -2, boost::numeric_cast<int>(i + 1)); - } - } + void operator()(const std::vector<Value>& values) const { + lua_createtable(state, boost::numeric_cast<int>(values.size()), 0); + for(size_t i = 0; i < values.size(); ++i) { + boost::apply_visitor(PushVisitor(state), values[i]); + lua_rawseti(state, -2, boost::numeric_cast<int>(i + 1)); + } + } - void operator()(const std::map<std::string, boost::shared_ptr<Value> >& table) const { - lua_createtable(state, 0, boost::numeric_cast<int>(table.size())); - for(std::map<std::string, boost::shared_ptr<Value> >::const_iterator i = table.begin(); i != table.end(); ++i) { - boost::apply_visitor(PushVisitor(state), *i->second); - lua_setfield(state, -2, i->first.c_str()); - } - } + void operator()(const std::map<std::string, std::shared_ptr<Value> >& table) const { + lua_createtable(state, 0, boost::numeric_cast<int>(table.size())); + for (const auto& i : table) { + boost::apply_visitor(PushVisitor(state), *i.second); + lua_setfield(state, -2, i.first.c_str()); + } + } - lua_State* state; - }; + lua_State* state; + }; } namespace Swift { namespace Lua { void pushValue(lua_State* state, const Value& value) { - boost::apply_visitor(PushVisitor(state), value); + boost::apply_visitor(PushVisitor(state), value); } }} diff --git a/Sluift/Lua/Value.h b/Sluift/Lua/Value.h index 9dd870f..13c4a0c 100644 --- a/Sluift/Lua/Value.h +++ b/Sluift/Lua/Value.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2013 Isode Limited. + * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,54 +7,54 @@ #pragma once #include <map> +#include <memory> #include <string> #include <vector> + #include <boost/variant.hpp> -#include <boost/shared_ptr.hpp> -#include <boost/smart_ptr/make_shared.hpp> struct lua_State; namespace Swift { - namespace Lua { - struct Nil {}; - - typedef boost::make_recursive_variant< - Nil, - bool, - int, - std::string, - std::vector< boost::recursive_variant_ >, - std::map<std::string, boost::shared_ptr<boost::recursive_variant_> > - >::type Value; - - typedef std::map<std::string, boost::shared_ptr<Value> > Table; - typedef std::vector<Value> Array; - - inline boost::shared_ptr<Value> nilRef() { - return boost::make_shared<Value>(Nil()); - } - - inline boost::shared_ptr<Value> valueRef(const std::string& value) { - return boost::make_shared<Value>(value); - } - - inline boost::shared_ptr<Value> intRef(int value) { - return boost::make_shared<Value>(value); - } - - inline boost::shared_ptr<Value> boolRef(bool value) { - return boost::make_shared<Value>(value); - } - - inline boost::shared_ptr<Value> valueRef(const Table& table) { - return boost::make_shared<Value>(table); - } - - inline boost::shared_ptr<Value> valueRef(const Array& array) { - return boost::make_shared<Value>(array); - } - - void pushValue(lua_State* state, const Value& value); - } + namespace Lua { + struct Nil {}; + + typedef boost::make_recursive_variant< + Nil, + bool, + int, + std::string, + std::vector< boost::recursive_variant_ >, + std::map<std::string, std::shared_ptr<boost::recursive_variant_> > + >::type Value; + + typedef std::map<std::string, std::shared_ptr<Value> > Table; + typedef std::vector<Value> Array; + + inline std::shared_ptr<Value> nilRef() { + return std::make_shared<Value>(Nil()); + } + + inline std::shared_ptr<Value> valueRef(const std::string& value) { + return std::make_shared<Value>(value); + } + + inline std::shared_ptr<Value> intRef(int value) { + return std::make_shared<Value>(value); + } + + inline std::shared_ptr<Value> boolRef(bool value) { + return std::make_shared<Value>(value); + } + + inline std::shared_ptr<Value> valueRef(const Table& table) { + return std::make_shared<Value>(table); + } + + inline std::shared_ptr<Value> valueRef(const Array& array) { + return std::make_shared<Value>(array); + } + + void pushValue(lua_State* state, const Value& value); + } } diff --git a/Sluift/LuaElementConvertor.h b/Sluift/LuaElementConvertor.h index b463980..2cf98e7 100644 --- a/Sluift/LuaElementConvertor.h +++ b/Sluift/LuaElementConvertor.h @@ -1,40 +1,41 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Swiften/Base/Override.h> - +#include <memory> #include <string> -#include <boost/shared_ptr.hpp> + #include <boost/optional.hpp> +#include <Swiften/Base/Override.h> + struct lua_State; namespace Swift { - class Element; + class Element; - class LuaElementConvertor { - public: - static boost::optional<std::string> NO_RESULT; + class LuaElementConvertor { + public: + static boost::optional<std::string> NO_RESULT; - struct Documentation { - Documentation(const std::string& className, const std::string& description) : - className(className), description(description) {} - std::string className; - std::string description; - }; + struct Documentation { + Documentation(const std::string& className, const std::string& description) : + className(className), description(description) {} + std::string className; + std::string description; + }; - virtual ~LuaElementConvertor(); + virtual ~LuaElementConvertor(); - virtual boost::shared_ptr<Element> convertFromLua(lua_State*, int index, const std::string& type) = 0; - virtual boost::optional<std::string> convertToLua(lua_State*, boost::shared_ptr<Element>) = 0; + virtual std::shared_ptr<Element> convertFromLua(lua_State*, int index, const std::string& type) = 0; + virtual boost::optional<std::string> convertToLua(lua_State*, std::shared_ptr<Element>) = 0; - virtual boost::optional<Documentation> getDocumentation() const { - return boost::optional<Documentation>(); - } - }; + virtual boost::optional<Documentation> getDocumentation() const { + return boost::optional<Documentation>(); + } + }; } diff --git a/Sluift/LuaElementConvertors.cpp b/Sluift/LuaElementConvertors.cpp index 15bb360..aac4d93 100644 --- a/Sluift/LuaElementConvertors.cpp +++ b/Sluift/LuaElementConvertors.cpp @@ -1,70 +1,73 @@ /* - * Copyright (c) 2013-2014 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/LuaElementConvertors.h> -#include <boost/smart_ptr/make_shared.hpp> +#include <memory> -#include <Swiften/Base/foreach.h> -#include <Sluift/LuaElementConvertor.h> -#include <Sluift/ElementConvertors/RawXMLElementConvertor.h> -#include <Sluift/ElementConvertors/PubSubEventConvertor.h> +#include <Sluift/ElementConvertors/BodyConvertor.h> +#include <Sluift/ElementConvertors/CarbonsReceivedConvertor.h> +#include <Sluift/ElementConvertors/CarbonsSentConvertor.h> +#include <Sluift/ElementConvertors/CommandConvertor.h> #include <Sluift/ElementConvertors/DOMElementConvertor.h> #include <Sluift/ElementConvertors/DefaultElementConvertor.h> -#include <Sluift/ElementConvertors/DiscoItemsConvertor.h> +#include <Sluift/ElementConvertors/DelayConvertor.h> #include <Sluift/ElementConvertors/DiscoInfoConvertor.h> +#include <Sluift/ElementConvertors/DiscoItemsConvertor.h> #include <Sluift/ElementConvertors/FormConvertor.h> -#include <Sluift/ElementConvertors/SoftwareVersionConvertor.h> -#include <Sluift/ElementConvertors/VCardUpdateConvertor.h> -#include <Sluift/ElementConvertors/VCardConvertor.h> -#include <Sluift/ElementConvertors/BodyConvertor.h> -#include <Sluift/ElementConvertors/SubjectConvertor.h> -#include <Sluift/ElementConvertors/CommandConvertor.h> -#include <Sluift/ElementConvertors/StatusShowConvertor.h> -#include <Sluift/ElementConvertors/StatusConvertor.h> -#include <Sluift/ElementConvertors/DelayConvertor.h> +#include <Sluift/ElementConvertors/ForwardedConvertor.h> #include <Sluift/ElementConvertors/IQConvertor.h> -#include <Sluift/ElementConvertors/PresenceConvertor.h> +#include <Sluift/ElementConvertors/MAMFinConvertor.h> +#include <Sluift/ElementConvertors/MAMQueryConvertor.h> +#include <Sluift/ElementConvertors/MAMResultConvertor.h> #include <Sluift/ElementConvertors/MessageConvertor.h> +#include <Sluift/ElementConvertors/PresenceConvertor.h> +#include <Sluift/ElementConvertors/PubSubEventConvertor.h> +#include <Sluift/ElementConvertors/RawXMLElementConvertor.h> #include <Sluift/ElementConvertors/ResultSetConvertor.h> -#include <Sluift/ElementConvertors/ForwardedConvertor.h> -#include <Sluift/ElementConvertors/MAMResultConvertor.h> -#include <Sluift/ElementConvertors/MAMQueryConvertor.h> -#include <Sluift/ElementConvertors/MAMFinConvertor.h> -#include <Sluift/Lua/LuaUtils.h> +#include <Sluift/ElementConvertors/SoftwareVersionConvertor.h> +#include <Sluift/ElementConvertors/StatusConvertor.h> +#include <Sluift/ElementConvertors/StatusShowConvertor.h> +#include <Sluift/ElementConvertors/SubjectConvertor.h> +#include <Sluift/ElementConvertors/VCardConvertor.h> +#include <Sluift/ElementConvertors/VCardUpdateConvertor.h> #include <Sluift/Lua/Exception.h> +#include <Sluift/Lua/LuaUtils.h> +#include <Sluift/LuaElementConvertor.h> using namespace Swift; LuaElementConvertors::LuaElementConvertors() { - registerConvertors(); - convertors.push_back(boost::make_shared<StatusConvertor>()); - convertors.push_back(boost::make_shared<StatusShowConvertor>()); - convertors.push_back(boost::make_shared<DelayConvertor>()); - convertors.push_back(boost::make_shared<CommandConvertor>(this)); - convertors.push_back(boost::make_shared<PubSubEventConvertor>(this)); - convertors.push_back(boost::make_shared<BodyConvertor>()); - convertors.push_back(boost::make_shared<SubjectConvertor>()); - convertors.push_back(boost::make_shared<VCardConvertor>()); - convertors.push_back(boost::make_shared<VCardUpdateConvertor>()); - convertors.push_back(boost::make_shared<FormConvertor>()); - convertors.push_back(boost::make_shared<SoftwareVersionConvertor>()); - convertors.push_back(boost::make_shared<DiscoInfoConvertor>()); - convertors.push_back(boost::make_shared<DiscoItemsConvertor>()); - convertors.push_back(boost::make_shared<IQConvertor>(this)); - convertors.push_back(boost::make_shared<PresenceConvertor>(this)); - convertors.push_back(boost::make_shared<MessageConvertor>(this)); - convertors.push_back(boost::make_shared<ResultSetConvertor>(this)); - convertors.push_back(boost::make_shared<ForwardedConvertor>(this)); - convertors.push_back(boost::make_shared<MAMResultConvertor>(this)); - convertors.push_back(boost::make_shared<MAMQueryConvertor>(this)); - convertors.push_back(boost::make_shared<MAMFinConvertor>(this)); - convertors.push_back(boost::make_shared<DOMElementConvertor>()); - convertors.push_back(boost::make_shared<RawXMLElementConvertor>()); - convertors.push_back(boost::make_shared<DefaultElementConvertor>()); + registerConvertors(); + convertors.push_back(std::make_shared<StatusConvertor>()); + convertors.push_back(std::make_shared<StatusShowConvertor>()); + convertors.push_back(std::make_shared<DelayConvertor>()); + convertors.push_back(std::make_shared<CommandConvertor>(this)); + convertors.push_back(std::make_shared<PubSubEventConvertor>(this)); + convertors.push_back(std::make_shared<BodyConvertor>()); + convertors.push_back(std::make_shared<SubjectConvertor>()); + convertors.push_back(std::make_shared<VCardConvertor>()); + convertors.push_back(std::make_shared<VCardUpdateConvertor>()); + convertors.push_back(std::make_shared<FormConvertor>()); + convertors.push_back(std::make_shared<SoftwareVersionConvertor>()); + convertors.push_back(std::make_shared<DiscoInfoConvertor>()); + convertors.push_back(std::make_shared<DiscoItemsConvertor>()); + convertors.push_back(std::make_shared<IQConvertor>(this)); + convertors.push_back(std::make_shared<PresenceConvertor>(this)); + convertors.push_back(std::make_shared<MessageConvertor>(this)); + convertors.push_back(std::make_shared<ResultSetConvertor>()); + convertors.push_back(std::make_shared<ForwardedConvertor>(this)); + convertors.push_back(std::make_shared<MAMResultConvertor>(this)); + convertors.push_back(std::make_shared<MAMQueryConvertor>(this)); + convertors.push_back(std::make_shared<MAMFinConvertor>(this)); + convertors.push_back(std::make_shared<CarbonsReceivedConvertor>(this)); + convertors.push_back(std::make_shared<CarbonsSentConvertor>(this)); + convertors.push_back(std::make_shared<DOMElementConvertor>()); + convertors.push_back(std::make_shared<RawXMLElementConvertor>()); + convertors.push_back(std::make_shared<DefaultElementConvertor>()); } LuaElementConvertors::~LuaElementConvertors() { @@ -72,65 +75,65 @@ LuaElementConvertors::~LuaElementConvertors() { #include <Sluift/ElementConvertors/ElementConvertors.ipp> -boost::shared_ptr<Element> LuaElementConvertors::convertFromLua(lua_State* L, int index) { - if (lua_isstring(L, index)) { - return convertFromLuaUntyped(L, index, "xml"); - } - else if (lua_istable(L, index)) { - lua_getfield(L, index, "_type"); - if (lua_isstring(L, -1)) { - std::string type = lua_tostring(L, -1); - lua_pop(L, 1); - return convertFromLuaUntyped(L, index, type); - } - lua_pop(L, 1); - } - throw Lua::Exception("Unable to determine type"); +std::shared_ptr<Element> LuaElementConvertors::convertFromLua(lua_State* L, int index) { + if (lua_isstring(L, index)) { + return convertFromLuaUntyped(L, index, "xml"); + } + else if (lua_istable(L, index)) { + lua_getfield(L, index, "_type"); + if (lua_isstring(L, -1)) { + std::string type = lua_tostring(L, -1); + lua_pop(L, 1); + return convertFromLuaUntyped(L, index, type); + } + lua_pop(L, 1); + } + throw Lua::Exception("Unable to determine type"); } -boost::shared_ptr<Element> LuaElementConvertors::convertFromLuaUntyped(lua_State* L, int index, const std::string& type) { - index = Lua::absoluteOffset(L, index); - foreach (boost::shared_ptr<LuaElementConvertor> convertor, convertors) { - if (boost::shared_ptr<Element> result = convertor->convertFromLua(L, index, type)) { - return result; - } - } - return boost::shared_ptr<Element>(); +std::shared_ptr<Element> LuaElementConvertors::convertFromLuaUntyped(lua_State* L, int index, const std::string& type) { + index = Lua::absoluteOffset(L, index); + for (auto&& convertor : convertors) { + if (std::shared_ptr<Element> result = convertor->convertFromLua(L, index, type)) { + return result; + } + } + return std::shared_ptr<Element>(); } -int LuaElementConvertors::convertToLua(lua_State* L, boost::shared_ptr<Element> payload) { - if (boost::optional<std::string> type = doConvertToLuaUntyped(L, payload)) { - if (lua_istable(L, -1)) { - lua_pushstring(L, type->c_str()); - lua_setfield(L, -2, "_type"); - Lua::registerTableToString(L, -1); - } - else { - assert(*type == "xml"); - } - return 1; - } - return 0; +int LuaElementConvertors::convertToLua(lua_State* L, std::shared_ptr<Element> payload) { + if (boost::optional<std::string> type = doConvertToLuaUntyped(L, payload)) { + if (lua_istable(L, -1)) { + lua_pushstring(L, type->c_str()); + lua_setfield(L, -2, "_type"); + Lua::registerTableToString(L, -1); + } + else { + assert(*type == "xml"); + } + return 1; + } + return 0; } -int LuaElementConvertors::convertToLuaUntyped(lua_State* L, boost::shared_ptr<Element> payload) { - if (doConvertToLuaUntyped(L, payload)) { - return 1; - } - return 0; +int LuaElementConvertors::convertToLuaUntyped(lua_State* L, std::shared_ptr<Element> payload) { + if (doConvertToLuaUntyped(L, payload)) { + return 1; + } + return 0; } boost::optional<std::string> LuaElementConvertors::doConvertToLuaUntyped( - lua_State* L, boost::shared_ptr<Element> payload) { - if (!payload) { - return LuaElementConvertor::NO_RESULT; - } - foreach (boost::shared_ptr<LuaElementConvertor> convertor, convertors) { - if (boost::optional<std::string> type = convertor->convertToLua(L, payload)) { - return *type; - } - } - return LuaElementConvertor::NO_RESULT; + lua_State* L, std::shared_ptr<Element> payload) { + if (!payload) { + return LuaElementConvertor::NO_RESULT; + } + for (auto&& convertor : convertors) { + if (boost::optional<std::string> type = convertor->convertToLua(L, payload)) { + return *type; + } + } + return LuaElementConvertor::NO_RESULT; } diff --git a/Sluift/LuaElementConvertors.h b/Sluift/LuaElementConvertors.h index 49acdf7..8e1d10b 100644 --- a/Sluift/LuaElementConvertors.h +++ b/Sluift/LuaElementConvertors.h @@ -1,51 +1,52 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Swiften/Base/Override.h> - +#include <memory> #include <vector> -#include <boost/shared_ptr.hpp> + #include <boost/optional.hpp> +#include <Swiften/Base/Override.h> + struct lua_State; namespace Swift { - class LuaElementConvertor; - class Element; - - class LuaElementConvertors { - public: - LuaElementConvertors(); - virtual ~LuaElementConvertors(); - - boost::shared_ptr<Element> convertFromLua(lua_State*, int index); - int convertToLua(lua_State*, boost::shared_ptr<Element>); - - /** - * Adds a toplevel type+data table with the given type. - */ - boost::shared_ptr<Element> convertFromLuaUntyped(lua_State*, int index, const std::string& type); - - /** - * Strips the toplevel type+data table, and only return the - * data. - */ - int convertToLuaUntyped(lua_State*, boost::shared_ptr<Element>); - - const std::vector< boost::shared_ptr<LuaElementConvertor> >& getConvertors() const { - return convertors; - } - - private: - boost::optional<std::string> doConvertToLuaUntyped(lua_State*, boost::shared_ptr<Element>); - void registerConvertors(); - - private: - std::vector< boost::shared_ptr<LuaElementConvertor> > convertors; - }; + class LuaElementConvertor; + class Element; + + class LuaElementConvertors { + public: + LuaElementConvertors(); + virtual ~LuaElementConvertors(); + + std::shared_ptr<Element> convertFromLua(lua_State*, int index); + int convertToLua(lua_State*, std::shared_ptr<Element>); + + /** + * Adds a toplevel type+data table with the given type. + */ + std::shared_ptr<Element> convertFromLuaUntyped(lua_State*, int index, const std::string& type); + + /** + * Strips the toplevel type+data table, and only return the + * data. + */ + int convertToLuaUntyped(lua_State*, std::shared_ptr<Element>); + + const std::vector< std::shared_ptr<LuaElementConvertor> >& getConvertors() const { + return convertors; + } + + private: + boost::optional<std::string> doConvertToLuaUntyped(lua_State*, std::shared_ptr<Element>); + void registerConvertors(); + + private: + std::vector< std::shared_ptr<LuaElementConvertor> > convertors; + }; } diff --git a/Sluift/Response.cpp b/Sluift/Response.cpp index a785f01..dd98a25 100644 --- a/Sluift/Response.cpp +++ b/Sluift/Response.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -8,73 +8,74 @@ #include <lua.hpp> -#include <Sluift/globals.h> #include <Swiften/Elements/ErrorPayload.h> + #include <Sluift/Lua/LuaUtils.h> +#include <Sluift/globals.h> using namespace Swift; using namespace Swift::Sluift; -static std::string getErrorString(boost::shared_ptr<ErrorPayload> error) { - // Copied from ChatControllerBase. - // TODO: Share this code; - std::string defaultMessage = "Error sending message"; - if (!error->getText().empty()) { - return error->getText(); - } - else { - switch (error->getCondition()) { - case ErrorPayload::BadRequest: return "Bad request"; - case ErrorPayload::Conflict: return "Conflict"; - case ErrorPayload::FeatureNotImplemented: return "This feature is not implemented"; - case ErrorPayload::Forbidden: return "Forbidden"; - case ErrorPayload::Gone: return "Recipient can no longer be contacted"; - case ErrorPayload::InternalServerError: return "Internal server error"; - case ErrorPayload::ItemNotFound: return "Item not found"; - case ErrorPayload::JIDMalformed: return "JID Malformed"; - case ErrorPayload::NotAcceptable: return "Message was rejected"; - case ErrorPayload::NotAllowed: return "Not allowed"; - case ErrorPayload::NotAuthorized: return "Not authorized"; - case ErrorPayload::PaymentRequired: return "Payment is required"; - case ErrorPayload::RecipientUnavailable: return "Recipient is unavailable"; - case ErrorPayload::Redirect: return "Redirect"; - case ErrorPayload::RegistrationRequired: return "Registration required"; - case ErrorPayload::RemoteServerNotFound: return "Recipient's server not found"; - case ErrorPayload::RemoteServerTimeout: return "Remote server timeout"; - case ErrorPayload::ResourceConstraint: return "The server is low on resources"; - case ErrorPayload::ServiceUnavailable: return "The service is unavailable"; - case ErrorPayload::SubscriptionRequired: return "A subscription is required"; - case ErrorPayload::UndefinedCondition: return "Undefined condition"; - case ErrorPayload::UnexpectedRequest: return "Unexpected request"; - } - } - assert(false); - return defaultMessage; +static std::string getErrorString(std::shared_ptr<ErrorPayload> error) { + // Copied from ChatControllerBase. + // TODO: Share this code; + std::string defaultMessage = "Error sending message"; + if (!error->getText().empty()) { + return error->getText(); + } + else { + switch (error->getCondition()) { + case ErrorPayload::BadRequest: return "Bad request"; + case ErrorPayload::Conflict: return "Conflict"; + case ErrorPayload::FeatureNotImplemented: return "This feature is not implemented"; + case ErrorPayload::Forbidden: return "Forbidden"; + case ErrorPayload::Gone: return "Recipient can no longer be contacted"; + case ErrorPayload::InternalServerError: return "Internal server error"; + case ErrorPayload::ItemNotFound: return "Item not found"; + case ErrorPayload::JIDMalformed: return "JID Malformed"; + case ErrorPayload::NotAcceptable: return "Message was rejected"; + case ErrorPayload::NotAllowed: return "Not allowed"; + case ErrorPayload::NotAuthorized: return "Not authorized"; + case ErrorPayload::PaymentRequired: return "Payment is required"; + case ErrorPayload::RecipientUnavailable: return "Recipient is unavailable"; + case ErrorPayload::Redirect: return "Redirect"; + case ErrorPayload::RegistrationRequired: return "Registration required"; + case ErrorPayload::RemoteServerNotFound: return "Recipient's server not found"; + case ErrorPayload::RemoteServerTimeout: return "Remote server timeout"; + case ErrorPayload::ResourceConstraint: return "The server is low on resources"; + case ErrorPayload::ServiceUnavailable: return "The service is unavailable"; + case ErrorPayload::SubscriptionRequired: return "A subscription is required"; + case ErrorPayload::UndefinedCondition: return "Undefined condition"; + case ErrorPayload::UnexpectedRequest: return "Unexpected request"; + } + } + assert(false); + return defaultMessage; } Response::~Response() { } int Response::convertToLuaResult(lua_State* L) { - if (error) { - lua_pushnil(L); - lua_pushstring(L, getErrorString(error).c_str()); - bool converted = Sluift::globals.elementConvertor.convertToLuaUntyped(L, error); - assert(converted); - Lua::registerTableToString(L, -1); - return 3; - } - else { - if (result) { - bool converted = Sluift::globals.elementConvertor.convertToLuaUntyped(L, result); - assert(converted); - Lua::registerTableToString(L, -1); - } - else { - lua_pushboolean(L, 1); - } - return 1; - } + if (error) { + lua_pushnil(L); + lua_pushstring(L, getErrorString(error).c_str()); + bool converted = Sluift::globals.elementConvertor.convertToLuaUntyped(L, error); + assert(converted); + Lua::registerTableToString(L, -1); + return 3; + } + else { + if (result) { + bool converted = Sluift::globals.elementConvertor.convertToLuaUntyped(L, result); + assert(converted); + Lua::registerTableToString(L, -1); + } + else { + lua_pushboolean(L, 1); + } + return 1; + } } diff --git a/Sluift/Response.h b/Sluift/Response.h index 591e54d..dc35289 100644 --- a/Sluift/Response.h +++ b/Sluift/Response.h @@ -1,36 +1,36 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <Swiften/Elements/Payload.h> -#include <Swiften/Elements/ErrorPayload.h> #include <Swiften/Base/API.h> +#include <Swiften/Elements/ErrorPayload.h> +#include <Swiften/Elements/Payload.h> struct lua_State; namespace Swift { - namespace Sluift { - struct Response { - Response(boost::shared_ptr<Payload> result, boost::shared_ptr<ErrorPayload> error) : result(result), error(error) {} - SWIFTEN_DEFAULT_COPY_CONSTRUCTOR(Response) - ~Response(); - - static Response withResult(boost::shared_ptr<Payload> response) { - return Response(response, boost::shared_ptr<ErrorPayload>()); - } - - static Response withError(boost::shared_ptr<ErrorPayload> error) { - return Response(boost::shared_ptr<Payload>(), error); - } - - int convertToLuaResult(lua_State* L); - - boost::shared_ptr<Payload> result; - boost::shared_ptr<ErrorPayload> error; - }; - } + namespace Sluift { + struct Response { + Response(std::shared_ptr<Payload> result, std::shared_ptr<ErrorPayload> error) : result(result), error(error) {} + SWIFTEN_DEFAULT_COPY_CONSTRUCTOR(Response) + ~Response(); + + static Response withResult(std::shared_ptr<Payload> response) { + return Response(response, std::shared_ptr<ErrorPayload>()); + } + + static Response withError(std::shared_ptr<ErrorPayload> error) { + return Response(std::shared_ptr<Payload>(), error); + } + + int convertToLuaResult(lua_State* L); + + std::shared_ptr<Payload> result; + std::shared_ptr<ErrorPayload> error; + }; + } } diff --git a/Sluift/SConscript b/Sluift/SConscript index 09da0a9..de9cab6 100644 --- a/Sluift/SConscript +++ b/Sluift/SConscript @@ -3,86 +3,86 @@ import Version, os.path Import(["env"]) if env["SCONS_STAGE"] == "build" and not GetOption("help") and not env.get("HAVE_LUA", 0) : - print "Warning: Lua was not found. Sluift will not be built." - if "Sluift" in env["PROJECTS"] : - env["PROJECTS"].remove("Sluift") - + print "Warning: Lua was not found. Sluift will not be built." + if "Sluift" in env["PROJECTS"] : + env["PROJECTS"].remove("Sluift") + elif env["SCONS_STAGE"] == "build" : - sluift_sources = [ - "Lua/Value.cpp", - "Lua/Exception.cpp", - "Lua/Check.cpp", - "Lua/FunctionRegistration.cpp", - "Lua/FunctionRegistry.cpp", - "Lua/LuaUtils.cpp", - "LuaElementConvertors.cpp", - "LuaElementConvertor.cpp", - "Response.cpp", - "ElementConvertors/BodyConvertor.cpp", - "ElementConvertors/VCardUpdateConvertor.cpp", - "ElementConvertors/PubSubEventConvertor.cpp", - "ElementConvertors/RawXMLElementConvertor.cpp", - "ElementConvertors/DOMElementConvertor.cpp", - "ElementConvertors/DefaultElementConvertor.cpp", - "ElementConvertors/DiscoInfoConvertor.cpp", - "ElementConvertors/DiscoItemsConvertor.cpp", - "ElementConvertors/FormConvertor.cpp", - "ElementConvertors/SoftwareVersionConvertor.cpp", - "ElementConvertors/VCardConvertor.cpp", - "ElementConvertors/CommandConvertor.cpp", - "ElementConvertors/StatusConvertor.cpp", - "ElementConvertors/StatusShowConvertor.cpp", - "ElementConvertors/DelayConvertor.cpp", - "Helpers.cpp", - "SluiftClient.cpp", - "SluiftComponent.cpp", - "Watchdog.cpp", - "core.c", - "client.cpp", - "component.cpp", - "sluift.cpp" - ] - sluift_sources += env.SConscript("ElementConvertors/SConscript") + sluift_sources = [ + "Lua/Value.cpp", + "Lua/Exception.cpp", + "Lua/Check.cpp", + "Lua/FunctionRegistration.cpp", + "Lua/FunctionRegistry.cpp", + "Lua/LuaUtils.cpp", + "LuaElementConvertors.cpp", + "LuaElementConvertor.cpp", + "Response.cpp", + "ElementConvertors/BodyConvertor.cpp", + "ElementConvertors/VCardUpdateConvertor.cpp", + "ElementConvertors/PubSubEventConvertor.cpp", + "ElementConvertors/RawXMLElementConvertor.cpp", + "ElementConvertors/DOMElementConvertor.cpp", + "ElementConvertors/DefaultElementConvertor.cpp", + "ElementConvertors/DiscoInfoConvertor.cpp", + "ElementConvertors/DiscoItemsConvertor.cpp", + "ElementConvertors/FormConvertor.cpp", + "ElementConvertors/SoftwareVersionConvertor.cpp", + "ElementConvertors/VCardConvertor.cpp", + "ElementConvertors/CommandConvertor.cpp", + "ElementConvertors/StatusConvertor.cpp", + "ElementConvertors/StatusShowConvertor.cpp", + "ElementConvertors/DelayConvertor.cpp", + "Helpers.cpp", + "SluiftClient.cpp", + "SluiftComponent.cpp", + "Watchdog.cpp", + "core.c", + "client.cpp", + "component.cpp", + "sluift.cpp" + ] + sluift_sources += env.SConscript("ElementConvertors/SConscript") - sluift_env = env.Clone() - sluift_env.UseFlags(env.get("LUA_FLAGS", {})) - sluift_env.UseFlags(env["SWIFTEN_FLAGS"]) - sluift_env.UseFlags(env["SWIFTEN_DEP_FLAGS"]) - # Support compilation on both Lua 5.1 and Lua 5.2 - sluift_env.Append(CPPDEFINES = ["LUA_COMPAT_ALL"]) - if sluift_env["PLATFORM"] == "win32" : - sluift_env.Append(CPPDEFINES = ["SLUIFT_BUILD_DLL"]) + sluift_env = env.Clone() + sluift_env.UseFlags(env.get("LUA_FLAGS", {})) + sluift_env.UseFlags(env["SWIFTEN_FLAGS"]) + sluift_env.UseFlags(env["SWIFTEN_DEP_FLAGS"]) + # Support compilation on both Lua 5.1 and Lua 5.2 + sluift_env.Append(CPPDEFINES = ["LUA_COMPAT_ALL"]) + if sluift_env["PLATFORM"] == "win32" : + sluift_env.Append(CPPDEFINES = ["SLUIFT_BUILD_DLL"]) - if sluift_env["PLATFORM"] == "darwin" and os.path.isdir("/Applications/iTunes.app") : - sluift_env.Append(FRAMEWORKS = ["ScriptingBridge"]) - sluift_env.Command("iTunes.h", "/Applications/iTunes.app", - "sdef ${SOURCE} | sdp -fh --basename iTunes -V 10.10 -o ${TARGET.dir}") - sluift_env.Append(CPPDEFINES = ["HAVE_ITUNES"]) - sluift_sources += ["ITunesInterface.mm"] + if sluift_env["PLATFORM"] == "darwin" and os.path.isdir("/Applications/iTunes.app") : + sluift_env.Append(FRAMEWORKS = ["ScriptingBridge"]) + sluift_env.Command("iTunes.h", "/Applications/iTunes.app", + "sdef ${SOURCE} | sdp -fh --basename iTunes -V 10.10 -o ${TARGET.dir}") + sluift_env.Append(CPPDEFINES = ["HAVE_ITUNES"]) + sluift_sources += ["ITunesInterface.mm"] - # Generate Version.h - version_header = "#pragma once\n\n" - version_header += "#define SLUIFT_VERSION_STRING \"" + Version.getBuildVersion(env.Dir("#").abspath, "sluift") + "\"\n" - sluift_env.WriteVal("Version.h", sluift_env.Value(version_header)) + # Generate Version.h + version_header = "#pragma once\n\n" + version_header += "#define SLUIFT_VERSION_STRING \"" + Version.getBuildVersion(env.Dir("#").abspath, "sluift") + "\"\n" + sluift_env.WriteVal("Version.h", sluift_env.Value(version_header)) - # Generate core.c - def generate_embedded_lua(env, target, source) : - f = open(source[0].abspath, "r") - data = f.read() - f.close() - f = open(target[0].abspath, "w") - f.write('#include <stddef.h>\n') - f.write('const size_t ' + source[0].name.replace(".", "_") + "_size = " + str(len(data)) + ";\n") - f.write('const char ' + source[0].name.replace(".", "_") + "[] = {" + ", ".join([str(ord(c)) for c in data]) + "};\n") - f.close() - sluift_env.Command("core.c", ["core.lua"], env.Action(generate_embedded_lua, cmdstr="$GENCOMSTR")) + # Generate core.c + def generate_embedded_lua(env, target, source) : + f = open(source[0].abspath, "r") + data = f.read() + f.close() + f = open(target[0].abspath, "w") + f.write('#include <stddef.h>\n') + f.write('const size_t ' + source[0].name.replace(".", "_") + "_size = " + str(len(data)) + ";\n") + f.write('const char ' + source[0].name.replace(".", "_") + "[] = {" + ", ".join([str(ord(c)) for c in data]) + "};\n") + f.close() + sluift_env.Command("core.c", ["core.lua"], env.Action(generate_embedded_lua, cmdstr="$GENCOMSTR")) - sluift_env.WriteVal("dll.c", sluift_env.Value("")) + sluift_env.WriteVal("dll.c", sluift_env.Value("")) - sluift_sources = [env.File(x) for x in sluift_sources] - for sluift_variant in ['dll', 'exe'] : - SConscript(["SConscript.variant"], variant_dir = sluift_variant, - duplicate = 0, - exports = ['sluift_sources', 'sluift_variant', 'sluift_env']) + sluift_sources = [env.File(x) for x in sluift_sources] + for sluift_variant in ['dll', 'exe'] : + SConscript(["SConscript.variant"], variant_dir = sluift_variant, + duplicate = 0, + exports = ['sluift_sources', 'sluift_variant', 'sluift_env']) diff --git a/Sluift/SConscript.variant b/Sluift/SConscript.variant index d0e2b18..9f56c91 100644 --- a/Sluift/SConscript.variant +++ b/Sluift/SConscript.variant @@ -6,37 +6,37 @@ Import('sluift_variant') Import('sluift_sources') if sluift_variant == 'exe' : - common_objects = sluift_env.StaticObject(sluift_sources) + common_objects = sluift_env.StaticObject(sluift_sources) - sluift_exe_env = sluift_env.Clone() - tokenize = sluift_exe_env.StaticObject("#/Sluift/tokenize.cpp") - exe_sources = tokenize + [ - "#/Sluift/Console.cpp", - "#/Sluift/Terminal.cpp", - "#/Sluift/StandardTerminal.cpp", - "#/Sluift/Completer.cpp", - "#/Sluift/main.cpp", - ] + sluift_exe_env = sluift_env.Clone() + tokenize = sluift_exe_env.StaticObject("#/Sluift/tokenize.cpp") + exe_sources = tokenize + [ + "#/Sluift/Console.cpp", + "#/Sluift/Terminal.cpp", + "#/Sluift/StandardTerminal.cpp", + "#/Sluift/Completer.cpp", + "#/Sluift/main.cpp", + ] - if sluift_exe_env.get("HAVE_EDITLINE", False) : - sluift_exe_env.Append(CPPDEFINES = ["HAVE_EDITLINE"]) - sluift_exe_env.MergeFlags(sluift_exe_env["EDITLINE_FLAGS"]) - exe_sources += ["#/Sluift/EditlineTerminal.cpp"] + if sluift_exe_env.get("HAVE_EDITLINE", False) : + sluift_exe_env.Append(CPPDEFINES = ["HAVE_EDITLINE"]) + sluift_exe_env.MergeFlags(sluift_exe_env["EDITLINE_FLAGS"]) + exe_sources += ["#/Sluift/EditlineTerminal.cpp"] - env["SLUIFT"] = sluift_exe_env.Program("sluift", common_objects + exe_sources) - if sluift_exe_env.get("SLUIFT_INSTALLDIR", "") : - sluift_exe_env.Install(os.path.join(sluift_exe_env["SLUIFT_INSTALLDIR"], "bin"), env["SLUIFT"]) + env["SLUIFT"] = sluift_exe_env.Program("sluift", common_objects + exe_sources) + if sluift_exe_env.get("SLUIFT_INSTALLDIR", "") : + sluift_exe_env.Install(os.path.join(sluift_exe_env["SLUIFT_INSTALLDIR"], "bin"), env["SLUIFT"]) - # Unit tests - env.Append(UNITTEST_OBJECTS = tokenize + ["#/Sluift/UnitTest/TokenizeTest.cpp"]) + # Unit tests + env.Append(UNITTEST_OBJECTS = tokenize + ["#/Sluift/UnitTest/TokenizeTest.cpp"]) else : - sluift_env["SLUIFT_DLL_SUFFIX"] = "${SHLIBSUFFIX}" - if sluift_env["PLATFORM"] == "darwin" : - sluift_env["SLUIFT_DLL_SUFFIX"] = ".so" - sluift_dll = sluift_env.SharedLibrary(sluift_env.File("sluift${SLUIFT_DLL_SUFFIX}"), - sluift_sources + ["#/Sluift/dll.c"]) - if sluift_env.get("SLUIFT_INSTALLDIR", False) and sluift_env.get("LUA_VERSION", False) : - sluift_env.Install( - os.path.join(sluift_env["SLUIFT_INSTALLDIR"], "lib", "lua", sluift_env["LUA_VERSION"]), - sluift_dll) + sluift_env["SLUIFT_DLL_SUFFIX"] = "${SHLIBSUFFIX}" + if sluift_env["PLATFORM"] == "darwin" : + sluift_env["SLUIFT_DLL_SUFFIX"] = ".so" + sluift_dll = sluift_env.SharedLibrary(sluift_env.File("sluift${SLUIFT_DLL_SUFFIX}"), + sluift_sources + ["#/Sluift/dll.c"]) + if sluift_env.get("SLUIFT_INSTALLDIR", False) and sluift_env.get("LUA_VERSION", False) : + sluift_env.Install( + os.path.join(sluift_env["SLUIFT_INSTALLDIR"], "lib", "lua", sluift_env["LUA_VERSION"]), + sluift_dll) diff --git a/Sluift/SluiftClient.cpp b/Sluift/SluiftClient.cpp index d2b1beb..f1c0191 100644 --- a/Sluift/SluiftClient.cpp +++ b/Sluift/SluiftClient.cpp @@ -8,182 +8,183 @@ #include <boost/numeric/conversion/cast.hpp> -#include <Swiften/Client/ClientXMLTracer.h> #include <Swiften/Client/Client.h> -#include <Swiften/Roster/XMPPRoster.h> -#include <Sluift/SluiftGlobals.h> -#include <Sluift/Lua/Exception.h> +#include <Swiften/Client/ClientXMLTracer.h> #include <Swiften/Elements/Message.h> +#include <Swiften/Elements/Presence.h> #include <Swiften/Elements/PubSubEvent.h> #include <Swiften/Queries/RawRequest.h> +#include <Swiften/Roster/XMPPRoster.h> + #include <Sluift/Helpers.h> -#include <Swiften/Elements/Presence.h> +#include <Sluift/Lua/Exception.h> +#include <Sluift/SluiftGlobals.h> using namespace Swift; SluiftClient::SluiftClient( - const JID& jid, - const std::string& password, - NetworkFactories* networkFactories, - SimpleEventLoop* eventLoop) : - networkFactories(networkFactories), - eventLoop(eventLoop), - tracer(NULL) { - client = new Client(jid, password, networkFactories); - client->setAlwaysTrustCertificates(); - client->onDisconnected.connect(boost::bind(&SluiftClient::handleDisconnected, this, _1)); - client->onMessageReceived.connect(boost::bind(&SluiftClient::handleIncomingMessage, this, _1)); - client->onPresenceReceived.connect(boost::bind(&SluiftClient::handleIncomingPresence, this, _1)); - client->getPubSubManager()->onEvent.connect(boost::bind(&SluiftClient::handleIncomingPubSubEvent, this, _1, _2)); - client->getRoster()->onInitialRosterPopulated.connect(boost::bind(&SluiftClient::handleInitialRosterPopulated, this)); + const JID& jid, + const std::string& password, + NetworkFactories* networkFactories, + SimpleEventLoop* eventLoop) : + networkFactories(networkFactories), + eventLoop(eventLoop), + tracer(nullptr) { + client = new Client(jid, password, networkFactories); + client->setAlwaysTrustCertificates(); + client->onDisconnected.connect(boost::bind(&SluiftClient::handleDisconnected, this, _1)); + client->onMessageReceived.connect(boost::bind(&SluiftClient::handleIncomingMessage, this, _1)); + client->onPresenceReceived.connect(boost::bind(&SluiftClient::handleIncomingPresence, this, _1)); + client->getPubSubManager()->onEvent.connect(boost::bind(&SluiftClient::handleIncomingPubSubEvent, this, _1, _2)); + client->getRoster()->onInitialRosterPopulated.connect(boost::bind(&SluiftClient::handleInitialRosterPopulated, this)); } SluiftClient::~SluiftClient() { - delete tracer; - delete client; + delete tracer; + delete client; } void SluiftClient::connect() { - rosterReceived = false; - disconnectedError = boost::optional<ClientError>(); - client->connect(options); + rosterReceived = false; + disconnectedError = boost::optional<ClientError>(); + client->connect(options); } void SluiftClient::connect(const std::string& host, int port) { - rosterReceived = false; - options.manualHostname = host; - options.manualPort = port; - disconnectedError = boost::optional<ClientError>(); - client->connect(options); + rosterReceived = false; + options.manualHostname = host; + options.manualPort = port; + disconnectedError = boost::optional<ClientError>(); + client->connect(options); } void SluiftClient::setTraceEnabled(bool b) { - if (b && !tracer) { - tracer = new ClientXMLTracer(client, options.boshURL.isEmpty()? false: true); - } - else if (!b && tracer) { - delete tracer; - tracer = NULL; - } + if (b && !tracer) { + tracer = new ClientXMLTracer(client, options.boshURL.isEmpty()? false: true); + } + else if (!b && tracer) { + delete tracer; + tracer = nullptr; + } } void SluiftClient::waitConnected(int timeout) { - Watchdog watchdog(timeout, networkFactories->getTimerFactory()); - while (!watchdog.getTimedOut() && client->isActive() && !client->isAvailable()) { - eventLoop->runUntilEvents(); - } - if (watchdog.getTimedOut()) { - client->disconnect(); - throw Lua::Exception("Timeout while connecting"); - } - if (disconnectedError) { - throw Lua::Exception(getErrorString(*disconnectedError)); - } + Watchdog watchdog(timeout, networkFactories->getTimerFactory()); + while (!watchdog.getTimedOut() && client->isActive() && !client->isAvailable()) { + eventLoop->runUntilEvents(); + } + if (watchdog.getTimedOut()) { + client->disconnect(); + throw Lua::Exception("Timeout while connecting"); + } + if (disconnectedError) { + throw Lua::Exception(getErrorString(*disconnectedError)); + } } bool SluiftClient::isConnected() const { - return client->isAvailable(); + return client->isAvailable(); } void SluiftClient::disconnect() { - client->disconnect(); - while (client->isActive()) { - eventLoop->runUntilEvents(); - } + client->disconnect(); + while (client->isActive()) { + eventLoop->runUntilEvents(); + } } void SluiftClient::setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os) { - client->setSoftwareVersion(name, version, os); + client->setSoftwareVersion(name, version, os); } boost::optional<SluiftClient::Event> SluiftClient::getNextEvent( - int timeout, boost::function<bool (const Event&)> condition) { - Watchdog watchdog(timeout, networkFactories->getTimerFactory()); - size_t currentIndex = 0; - while (true) { - // Look for pending events in the queue - while (currentIndex < pendingEvents.size()) { - Event event = pendingEvents[currentIndex]; - if (!condition || condition(event)) { - pendingEvents.erase( - pendingEvents.begin() - + boost::numeric_cast<int>(currentIndex)); - return event; - } - ++currentIndex; - } - - // Wait for new events - while (!watchdog.getTimedOut() && currentIndex >= pendingEvents.size() && client->isActive()) { - eventLoop->runUntilEvents(); - } - - // Finish if we're disconnected or timed out - if (watchdog.getTimedOut() || !client->isActive()) { - return boost::optional<Event>(); - } - } + int timeout, boost::function<bool (const Event&)> condition) { + Watchdog watchdog(timeout, networkFactories->getTimerFactory()); + size_t currentIndex = 0; + while (true) { + // Look for pending events in the queue + while (currentIndex < pendingEvents.size()) { + Event event = pendingEvents[currentIndex]; + if (!condition || condition(event)) { + pendingEvents.erase( + pendingEvents.begin() + + boost::numeric_cast<int>(currentIndex)); + return event; + } + ++currentIndex; + } + + // Wait for new events + while (!watchdog.getTimedOut() && currentIndex >= pendingEvents.size() && client->isActive()) { + eventLoop->runUntilEvents(); + } + + // Finish if we're disconnected or timed out + if (watchdog.getTimedOut() || !client->isActive()) { + return boost::optional<Event>(); + } + } } std::vector<XMPPRosterItem> SluiftClient::getRoster(int timeout) { - Watchdog watchdog(timeout, networkFactories->getTimerFactory()); - if (!rosterReceived) { - // If we haven't requested it yet, request it for the first time - client->requestRoster(); + Watchdog watchdog(timeout, networkFactories->getTimerFactory()); + if (!rosterReceived) { + // If we haven't requested it yet, request it for the first time + client->requestRoster(); - // Wait for new events - while (!watchdog.getTimedOut() && !rosterReceived) { - eventLoop->runUntilEvents(); - } + // Wait for new events + while (!watchdog.getTimedOut() && !rosterReceived) { + eventLoop->runUntilEvents(); + } - // Throw an error if we're timed out - if (watchdog.getTimedOut()) { - throw Lua::Exception("Timeout while requesting roster"); - } - } - return client->getRoster()->getItems(); + // Throw an error if we're timed out + if (watchdog.getTimedOut()) { + throw Lua::Exception("Timeout while requesting roster"); + } + } + return client->getRoster()->getItems(); } -void SluiftClient::handleIncomingMessage(boost::shared_ptr<Message> stanza) { - if (stanza->getPayload<PubSubEvent>()) { - // Already handled by pubsub manager - return; - } - pendingEvents.push_back(Event(stanza)); +void SluiftClient::handleIncomingMessage(std::shared_ptr<Message> stanza) { + if (stanza->getPayload<PubSubEvent>()) { + // Already handled by pubsub manager + return; + } + pendingEvents.push_back(Event(stanza)); } -void SluiftClient::handleIncomingPresence(boost::shared_ptr<Presence> stanza) { - pendingEvents.push_back(Event(stanza)); +void SluiftClient::handleIncomingPresence(std::shared_ptr<Presence> stanza) { + pendingEvents.push_back(Event(stanza)); } -void SluiftClient::handleIncomingPubSubEvent(const JID& from, boost::shared_ptr<PubSubEventPayload> event) { - pendingEvents.push_back(Event(from, event)); +void SluiftClient::handleIncomingPubSubEvent(const JID& from, std::shared_ptr<PubSubEventPayload> event) { + pendingEvents.push_back(Event(from, event)); } void SluiftClient::handleInitialRosterPopulated() { - rosterReceived = true; + rosterReceived = true; } -void SluiftClient::handleRequestResponse(boost::shared_ptr<Payload> response, boost::shared_ptr<ErrorPayload> error) { - requestResponse = response; - requestError = error; - requestResponseReceived = true; +void SluiftClient::handleRequestResponse(std::shared_ptr<Payload> response, std::shared_ptr<ErrorPayload> error) { + requestResponse = response; + requestError = error; + requestResponseReceived = true; } void SluiftClient::handleDisconnected(const boost::optional<ClientError>& error) { - disconnectedError = error; + disconnectedError = error; } -Sluift::Response SluiftClient::doSendRequest(boost::shared_ptr<Request> request, int timeout) { - requestResponse.reset(); - requestError.reset(); - requestResponseReceived = false; - request->send(); +Sluift::Response SluiftClient::doSendRequest(std::shared_ptr<Request> request, int timeout) { + requestResponse.reset(); + requestError.reset(); + requestResponseReceived = false; + request->send(); - Watchdog watchdog(timeout, networkFactories->getTimerFactory()); - while (!watchdog.getTimedOut() && !requestResponseReceived) { - eventLoop->runUntilEvents(); - } - return Sluift::Response(requestResponse, watchdog.getTimedOut() ? - boost::make_shared<ErrorPayload>(ErrorPayload::RemoteServerTimeout) : requestError); + Watchdog watchdog(timeout, networkFactories->getTimerFactory()); + while (!watchdog.getTimedOut() && !requestResponseReceived) { + eventLoop->runUntilEvents(); + } + return Sluift::Response(requestResponse, watchdog.getTimedOut() ? + std::make_shared<ErrorPayload>(ErrorPayload::RemoteServerTimeout) : requestError); } diff --git a/Sluift/SluiftClient.h b/Sluift/SluiftClient.h index 68c4b61..2c221e6 100644 --- a/Sluift/SluiftClient.h +++ b/Sluift/SluiftClient.h @@ -7,125 +7,127 @@ #pragma once #include <deque> -#include <boost/optional.hpp> + #include <boost/bind.hpp> #include <boost/function.hpp> +#include <boost/optional.hpp> +#include <Swiften/Client/Client.h> +#include <Swiften/Client/ClientError.h> #include <Swiften/Client/ClientOptions.h> #include <Swiften/Elements/IQ.h> #include <Swiften/Elements/Message.h> #include <Swiften/Elements/Presence.h> -#include <Swiften/Queries/GenericRequest.h> -#include <Swiften/Roster/XMPPRosterItem.h> -#include <Swiften/Client/ClientError.h> -#include <Swiften/Network/NetworkFactories.h> -#include <Swiften/Client/Client.h> #include <Swiften/EventLoop/SimpleEventLoop.h> -#include <Sluift/Watchdog.h> +#include <Swiften/Network/NetworkFactories.h> #include <Swiften/PubSub/PubSubManager.h> +#include <Swiften/Queries/GenericRequest.h> +#include <Swiften/Roster/XMPPRosterItem.h> + #include <Sluift/Response.h> +#include <Sluift/Watchdog.h> namespace Swift { - struct SluiftGlobals; - class ClientXMLTracer; - class Client; - class Stanza; - class Payload; - class ErrorPayload; - class JID; - - class SluiftClient { - public: - struct Event { - enum Type { - MessageType, - PresenceType, - PubSubEventType - }; - - Event(boost::shared_ptr<Message> stanza) : type(MessageType), stanza(stanza) {} - Event(boost::shared_ptr<Presence> stanza) : type(PresenceType), stanza(stanza) {} - Event(const JID& from, boost::shared_ptr<PubSubEventPayload> payload) : type(PubSubEventType), from(from), pubsubEvent(payload) {} - - Type type; - - // Message & Presence - boost::shared_ptr<Stanza> stanza; - - // PubSubEvent - JID from; - boost::shared_ptr<PubSubEventPayload> pubsubEvent; - }; - - SluiftClient( - const JID& jid, - const std::string& password, - NetworkFactories* networkFactories, - SimpleEventLoop* eventLoop); - ~SluiftClient(); - - Client* getClient() { - return client; - } - - ClientOptions& getOptions() { - return options; - } - - void connect(); - void connect(const std::string& host, int port); - void waitConnected(int timeout); - bool isConnected() const; - void setTraceEnabled(bool b); - - template<typename T> - Sluift::Response sendPubSubRequest( - IQ::Type type, const JID& jid, boost::shared_ptr<T> payload, int timeout) { - return sendRequest(client->getPubSubManager()->createRequest( - type, jid, payload), timeout); - } - - template<typename REQUEST_TYPE> - Sluift::Response sendRequest(REQUEST_TYPE request, int timeout) { - boost::signals::scoped_connection c = request->onResponse.connect( - boost::bind(&SluiftClient::handleRequestResponse, this, _1, _2)); - return doSendRequest(request, timeout); - } - - template<typename REQUEST_TYPE> - Sluift::Response sendVoidRequest(REQUEST_TYPE request, int timeout) { - boost::signals::scoped_connection c = request->onResponse.connect( - boost::bind(&SluiftClient::handleRequestResponse, this, boost::shared_ptr<Payload>(), _1)); - return doSendRequest(request, timeout); - } - - void disconnect(); - void setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os); - boost::optional<SluiftClient::Event> getNextEvent(int timeout, - boost::function<bool (const Event&)> condition = 0); - std::vector<XMPPRosterItem> getRoster(int timeout); - - private: - Sluift::Response doSendRequest(boost::shared_ptr<Request> request, int timeout); - - void handleIncomingMessage(boost::shared_ptr<Message> stanza); - void handleIncomingPresence(boost::shared_ptr<Presence> stanza); - void handleIncomingPubSubEvent(const JID& from, boost::shared_ptr<PubSubEventPayload> event); - void handleInitialRosterPopulated(); - void handleRequestResponse(boost::shared_ptr<Payload> response, boost::shared_ptr<ErrorPayload> error); - void handleDisconnected(const boost::optional<ClientError>& error); - - private: - NetworkFactories* networkFactories; - SimpleEventLoop* eventLoop; - Client* client; - ClientOptions options; - ClientXMLTracer* tracer; - bool rosterReceived; - std::deque<Event> pendingEvents; - boost::optional<ClientError> disconnectedError; - bool requestResponseReceived; - boost::shared_ptr<Payload> requestResponse; - boost::shared_ptr<ErrorPayload> requestError; - }; + struct SluiftGlobals; + class ClientXMLTracer; + class Client; + class Stanza; + class Payload; + class ErrorPayload; + class JID; + + class SluiftClient { + public: + struct Event { + enum Type { + MessageType, + PresenceType, + PubSubEventType + }; + + Event(std::shared_ptr<Message> stanza) : type(MessageType), stanza(stanza) {} + Event(std::shared_ptr<Presence> stanza) : type(PresenceType), stanza(stanza) {} + Event(const JID& from, std::shared_ptr<PubSubEventPayload> payload) : type(PubSubEventType), from(from), pubsubEvent(payload) {} + + Type type; + + // Message & Presence + std::shared_ptr<Stanza> stanza; + + // PubSubEvent + JID from; + std::shared_ptr<PubSubEventPayload> pubsubEvent; + }; + + SluiftClient( + const JID& jid, + const std::string& password, + NetworkFactories* networkFactories, + SimpleEventLoop* eventLoop); + ~SluiftClient(); + + Client* getClient() { + return client; + } + + ClientOptions& getOptions() { + return options; + } + + void connect(); + void connect(const std::string& host, int port); + void waitConnected(int timeout); + bool isConnected() const; + void setTraceEnabled(bool b); + + template<typename T> + Sluift::Response sendPubSubRequest( + IQ::Type type, const JID& jid, std::shared_ptr<T> payload, int timeout) { + return sendRequest(client->getPubSubManager()->createRequest( + type, jid, payload), timeout); + } + + template<typename REQUEST_TYPE> + Sluift::Response sendRequest(REQUEST_TYPE request, int timeout) { + boost::signals2::scoped_connection c(request->onResponse.connect( + boost::bind(&SluiftClient::handleRequestResponse, this, _1, _2))); + return doSendRequest(request, timeout); + } + + template<typename REQUEST_TYPE> + Sluift::Response sendVoidRequest(REQUEST_TYPE request, int timeout) { + boost::signals2::scoped_connection c(request->onResponse.connect( + boost::bind(&SluiftClient::handleRequestResponse, this, std::shared_ptr<Payload>(), _1))); + return doSendRequest(request, timeout); + } + + void disconnect(); + void setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os); + boost::optional<SluiftClient::Event> getNextEvent(int timeout, + boost::function<bool (const Event&)> condition = 0); + std::vector<XMPPRosterItem> getRoster(int timeout); + + private: + Sluift::Response doSendRequest(std::shared_ptr<Request> request, int timeout); + + void handleIncomingMessage(std::shared_ptr<Message> stanza); + void handleIncomingPresence(std::shared_ptr<Presence> stanza); + void handleIncomingPubSubEvent(const JID& from, std::shared_ptr<PubSubEventPayload> event); + void handleInitialRosterPopulated(); + void handleRequestResponse(std::shared_ptr<Payload> response, std::shared_ptr<ErrorPayload> error); + void handleDisconnected(const boost::optional<ClientError>& error); + + private: + NetworkFactories* networkFactories; + SimpleEventLoop* eventLoop; + Client* client; + ClientOptions options; + ClientXMLTracer* tracer; + bool rosterReceived = false; + std::deque<Event> pendingEvents; + boost::optional<ClientError> disconnectedError; + bool requestResponseReceived = false; + std::shared_ptr<Payload> requestResponse; + std::shared_ptr<ErrorPayload> requestError; + }; } diff --git a/Sluift/SluiftComponent.cpp b/Sluift/SluiftComponent.cpp index af3c33b..e1d1738 100644 --- a/Sluift/SluiftComponent.cpp +++ b/Sluift/SluiftComponent.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -8,138 +8,139 @@ #include <boost/numeric/conversion/cast.hpp> -#include <Swiften/Component/ComponentXMLTracer.h> #include <Swiften/Component/Component.h> -#include <Swiften/Roster/XMPPRoster.h> -#include <Sluift/SluiftGlobals.h> -#include <Sluift/Lua/Exception.h> +#include <Swiften/Component/ComponentXMLTracer.h> #include <Swiften/Elements/Message.h> +#include <Swiften/Elements/Presence.h> #include <Swiften/Queries/RawRequest.h> +#include <Swiften/Roster/XMPPRoster.h> + #include <Sluift/Helpers.h> -#include <Swiften/Elements/Presence.h> +#include <Sluift/Lua/Exception.h> +#include <Sluift/SluiftGlobals.h> using namespace Swift; SluiftComponent::SluiftComponent( - const JID& jid, - const std::string& password, - NetworkFactories* networkFactories, - SimpleEventLoop* eventLoop): - networkFactories(networkFactories), - eventLoop(eventLoop), - tracer(NULL) { - component = new Component(jid, password, networkFactories); - component->onError.connect(boost::bind(&SluiftComponent::handleError, this, _1)); - component->onMessageReceived.connect(boost::bind(&SluiftComponent::handleIncomingMessage, this, _1)); - component->onPresenceReceived.connect(boost::bind(&SluiftComponent::handleIncomingPresence, this, _1)); + const JID& jid, + const std::string& password, + NetworkFactories* networkFactories, + SimpleEventLoop* eventLoop): + networkFactories(networkFactories), + eventLoop(eventLoop), + tracer(nullptr) { + component = new Component(jid, password, networkFactories); + component->onError.connect(boost::bind(&SluiftComponent::handleError, this, _1)); + component->onMessageReceived.connect(boost::bind(&SluiftComponent::handleIncomingMessage, this, _1)); + component->onPresenceReceived.connect(boost::bind(&SluiftComponent::handleIncomingPresence, this, _1)); } SluiftComponent::~SluiftComponent() { - delete tracer; - delete component; + delete tracer; + delete component; } void SluiftComponent::connect(const std::string& host, int port) { - disconnectedError = boost::optional<ComponentError>(); - component->connect(host, port); + disconnectedError = boost::optional<ComponentError>(); + component->connect(host, port); } void SluiftComponent::setTraceEnabled(bool b) { - if (b && !tracer) { - tracer = new ComponentXMLTracer(component); - } - else if (!b && tracer) { - delete tracer; - tracer = NULL; - } + if (b && !tracer) { + tracer = new ComponentXMLTracer(component); + } + else if (!b && tracer) { + delete tracer; + tracer = nullptr; + } } void SluiftComponent::waitConnected(int timeout) { - Watchdog watchdog(timeout, networkFactories->getTimerFactory()); - while (!watchdog.getTimedOut() && !disconnectedError && !component->isAvailable()) { - eventLoop->runUntilEvents(); - } - if (watchdog.getTimedOut()) { - component->disconnect(); - throw Lua::Exception("Timeout while connecting"); - } - if (disconnectedError) { - throw Lua::Exception(getErrorString(*disconnectedError)); - } + Watchdog watchdog(timeout, networkFactories->getTimerFactory()); + while (!watchdog.getTimedOut() && !disconnectedError && !component->isAvailable()) { + eventLoop->runUntilEvents(); + } + if (watchdog.getTimedOut()) { + component->disconnect(); + throw Lua::Exception("Timeout while connecting"); + } + if (disconnectedError) { + throw Lua::Exception(getErrorString(*disconnectedError)); + } } bool SluiftComponent::isConnected() const { - return component->isAvailable(); + return component->isAvailable(); } void SluiftComponent::disconnect() { - component->disconnect(); - while (component->isAvailable()) { - eventLoop->runUntilEvents(); - } + component->disconnect(); + while (component->isAvailable()) { + eventLoop->runUntilEvents(); + } } void SluiftComponent::setSoftwareVersion(const std::string& name, const std::string& version, const std::string& /* os */) { - component->setSoftwareVersion(name, version); + component->setSoftwareVersion(name, version); } boost::optional<SluiftComponent::Event> SluiftComponent::getNextEvent( - int timeout, boost::function<bool (const Event&)> condition) { - Watchdog watchdog(timeout, networkFactories->getTimerFactory()); - size_t currentIndex = 0; - while (true) { - // Look for pending events in the queue - while (currentIndex < pendingEvents.size()) { - Event event = pendingEvents[currentIndex]; - if (!condition || condition(event)) { - pendingEvents.erase( - pendingEvents.begin() - + boost::numeric_cast<int>(currentIndex)); - return event; - } - ++currentIndex; - } - - // Wait for new events - while (!watchdog.getTimedOut() && currentIndex >= pendingEvents.size() && component->isAvailable()) { - eventLoop->runUntilEvents(); - } - - // Finish if we're disconnected or timed out - if (watchdog.getTimedOut() || !component->isAvailable()) { - return boost::optional<Event>(); - } - } + int timeout, boost::function<bool (const Event&)> condition) { + Watchdog watchdog(timeout, networkFactories->getTimerFactory()); + size_t currentIndex = 0; + while (true) { + // Look for pending events in the queue + while (currentIndex < pendingEvents.size()) { + Event event = pendingEvents[currentIndex]; + if (!condition || condition(event)) { + pendingEvents.erase( + pendingEvents.begin() + + boost::numeric_cast<int>(currentIndex)); + return event; + } + ++currentIndex; + } + + // Wait for new events + while (!watchdog.getTimedOut() && currentIndex >= pendingEvents.size() && component->isAvailable()) { + eventLoop->runUntilEvents(); + } + + // Finish if we're disconnected or timed out + if (watchdog.getTimedOut() || !component->isAvailable()) { + return boost::optional<Event>(); + } + } } -void SluiftComponent::handleIncomingMessage(boost::shared_ptr<Message> stanza) { - pendingEvents.push_back(Event(stanza)); +void SluiftComponent::handleIncomingMessage(std::shared_ptr<Message> stanza) { + pendingEvents.push_back(Event(stanza)); } -void SluiftComponent::handleIncomingPresence(boost::shared_ptr<Presence> stanza) { - pendingEvents.push_back(Event(stanza)); +void SluiftComponent::handleIncomingPresence(std::shared_ptr<Presence> stanza) { + pendingEvents.push_back(Event(stanza)); } -void SluiftComponent::handleRequestResponse(boost::shared_ptr<Payload> response, boost::shared_ptr<ErrorPayload> error) { - requestResponse = response; - requestError = error; - requestResponseReceived = true; +void SluiftComponent::handleRequestResponse(std::shared_ptr<Payload> response, std::shared_ptr<ErrorPayload> error) { + requestResponse = response; + requestError = error; + requestResponseReceived = true; } void SluiftComponent::handleError(const boost::optional<ComponentError>& error) { - disconnectedError = error; + disconnectedError = error; } -Sluift::Response SluiftComponent::doSendRequest(boost::shared_ptr<Request> request, int timeout) { - requestResponse.reset(); - requestError.reset(); - requestResponseReceived = false; - request->send(); - - Watchdog watchdog(timeout, networkFactories->getTimerFactory()); - while (!watchdog.getTimedOut() && !requestResponseReceived) { - eventLoop->runUntilEvents(); - } - return Sluift::Response(requestResponse, watchdog.getTimedOut() ? - boost::make_shared<ErrorPayload>(ErrorPayload::RemoteServerTimeout) : requestError); +Sluift::Response SluiftComponent::doSendRequest(std::shared_ptr<Request> request, int timeout) { + requestResponse.reset(); + requestError.reset(); + requestResponseReceived = false; + request->send(); + + Watchdog watchdog(timeout, networkFactories->getTimerFactory()); + while (!watchdog.getTimedOut() && !requestResponseReceived) { + eventLoop->runUntilEvents(); + } + return Sluift::Response(requestResponse, watchdog.getTimedOut() ? + std::make_shared<ErrorPayload>(ErrorPayload::RemoteServerTimeout) : requestError); } diff --git a/Sluift/SluiftComponent.h b/Sluift/SluiftComponent.h index 4e5e763..d45c3b2 100644 --- a/Sluift/SluiftComponent.h +++ b/Sluift/SluiftComponent.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,101 +7,103 @@ #pragma once #include <deque> -#include <boost/optional.hpp> + #include <boost/bind.hpp> #include <boost/function.hpp> +#include <boost/optional.hpp> #include <Swiften/Client/ClientOptions.h> +#include <Swiften/Component/Component.h> +#include <Swiften/Component/ComponentError.h> #include <Swiften/Elements/IQ.h> #include <Swiften/Elements/Message.h> #include <Swiften/Elements/Presence.h> +#include <Swiften/EventLoop/SimpleEventLoop.h> +#include <Swiften/Network/NetworkFactories.h> #include <Swiften/Queries/GenericRequest.h> #include <Swiften/Roster/XMPPRosterItem.h> -#include <Swiften/Component/ComponentError.h> -#include <Swiften/Network/NetworkFactories.h> -#include <Swiften/Component/Component.h> -#include <Swiften/EventLoop/SimpleEventLoop.h> -#include <Sluift/Watchdog.h> + #include <Sluift/Response.h> +#include <Sluift/Watchdog.h> namespace Swift { - struct SluiftGlobals; - class ComponentXMLTracer; - class Component; - class Stanza; - class Payload; - class ErrorPayload; - class JID; - - class SluiftComponent { - public: - struct Event { - enum Type { - MessageType, - PresenceType - }; - - Event(boost::shared_ptr<Message> stanza) : type(MessageType), stanza(stanza) {} - Event(boost::shared_ptr<Presence> stanza) : type(PresenceType), stanza(stanza) {} - - Type type; - - // Message & Presence - boost::shared_ptr<Stanza> stanza; - }; - - SluiftComponent( - const JID& jid, - const std::string& password, - NetworkFactories* networkFactories, - SimpleEventLoop* eventLoop); - ~SluiftComponent(); - - Component* getComponent() { - return component; - } - - void connect(const std::string& host, int port); - void waitConnected(int timeout); - bool isConnected() const; - void setTraceEnabled(bool b); - - template<typename REQUEST_TYPE> - Sluift::Response sendRequest(REQUEST_TYPE request, int timeout) { - boost::signals::scoped_connection c = request->onResponse.connect( - boost::bind(&SluiftComponent::handleRequestResponse, this, _1, _2)); - return doSendRequest(request, timeout); - } - - template<typename REQUEST_TYPE> - Sluift::Response sendVoidRequest(REQUEST_TYPE request, int timeout) { - boost::signals::scoped_connection c = request->onResponse.connect( - boost::bind(&SluiftComponent::handleRequestResponse, this, boost::shared_ptr<Payload>(), _1)); - return doSendRequest(request, timeout); - } - - void disconnect(); - void setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os); - boost::optional<SluiftComponent::Event> getNextEvent(int timeout, - boost::function<bool (const Event&)> condition = 0); - - private: - Sluift::Response doSendRequest(boost::shared_ptr<Request> request, int timeout); - - void handleIncomingMessage(boost::shared_ptr<Message> stanza); - void handleIncomingPresence(boost::shared_ptr<Presence> stanza); - void handleRequestResponse(boost::shared_ptr<Payload> response, boost::shared_ptr<ErrorPayload> error); - void handleError(const boost::optional<ComponentError>& error); - - private: - NetworkFactories* networkFactories; - SimpleEventLoop* eventLoop; - Component* component; - ComponentXMLTracer* tracer; - std::deque<Event> pendingEvents; - boost::optional<ComponentError> disconnectedError; - bool requestResponseReceived; - boost::shared_ptr<Payload> requestResponse; - boost::shared_ptr<ErrorPayload> requestError; - }; + struct SluiftGlobals; + class ComponentXMLTracer; + class Component; + class Stanza; + class Payload; + class ErrorPayload; + class JID; + + class SluiftComponent { + public: + struct Event { + enum Type { + MessageType, + PresenceType + }; + + Event(std::shared_ptr<Message> stanza) : type(MessageType), stanza(stanza) {} + Event(std::shared_ptr<Presence> stanza) : type(PresenceType), stanza(stanza) {} + + Type type; + + // Message & Presence + std::shared_ptr<Stanza> stanza; + }; + + SluiftComponent( + const JID& jid, + const std::string& password, + NetworkFactories* networkFactories, + SimpleEventLoop* eventLoop); + ~SluiftComponent(); + + Component* getComponent() { + return component; + } + + void connect(const std::string& host, int port); + void waitConnected(int timeout); + bool isConnected() const; + void setTraceEnabled(bool b); + + template<typename REQUEST_TYPE> + Sluift::Response sendRequest(REQUEST_TYPE request, int timeout) { + boost::signals2::scoped_connection c(request->onResponse.connect( + boost::bind(&SluiftComponent::handleRequestResponse, this, _1, _2))); + return doSendRequest(request, timeout); + } + + template<typename REQUEST_TYPE> + Sluift::Response sendVoidRequest(REQUEST_TYPE request, int timeout) { + boost::signals2::scoped_connection c(request->onResponse.connect( + boost::bind(&SluiftComponent::handleRequestResponse, this, std::shared_ptr<Payload>(), _1))); + return doSendRequest(request, timeout); + } + + void disconnect(); + void setSoftwareVersion(const std::string& name, const std::string& version, const std::string& os); + boost::optional<SluiftComponent::Event> getNextEvent(int timeout, + boost::function<bool (const Event&)> condition = 0); + + private: + Sluift::Response doSendRequest(std::shared_ptr<Request> request, int timeout); + + void handleIncomingMessage(std::shared_ptr<Message> stanza); + void handleIncomingPresence(std::shared_ptr<Presence> stanza); + void handleRequestResponse(std::shared_ptr<Payload> response, std::shared_ptr<ErrorPayload> error); + void handleError(const boost::optional<ComponentError>& error); + + private: + NetworkFactories* networkFactories; + SimpleEventLoop* eventLoop; + Component* component; + ComponentXMLTracer* tracer; + std::deque<Event> pendingEvents; + boost::optional<ComponentError> disconnectedError; + bool requestResponseReceived = false; + std::shared_ptr<Payload> requestResponse; + std::shared_ptr<ErrorPayload> requestError; + }; } diff --git a/Sluift/SluiftGlobals.h b/Sluift/SluiftGlobals.h index a9c5799..14ed6f3 100644 --- a/Sluift/SluiftGlobals.h +++ b/Sluift/SluiftGlobals.h @@ -16,22 +16,22 @@ #include <signal.h> namespace Swift { - struct SluiftGlobals { - SluiftGlobals() : - networkFactories(&eventLoop), - coreLibIndex(-1), - moduleLibIndex(-1), - interruptRequested(0) {} + struct SluiftGlobals { + SluiftGlobals() : + networkFactories(&eventLoop), + coreLibIndex(-1), + moduleLibIndex(-1), + interruptRequested(0) {} - LuaElementConvertors elementConvertor; - SimpleEventLoop eventLoop; - BoostNetworkFactories networkFactories; - PlatformTLSFactories tlsFactories; - int coreLibIndex; - int moduleLibIndex; - sig_atomic_t interruptRequested; + LuaElementConvertors elementConvertor; + SimpleEventLoop eventLoop; + BoostNetworkFactories networkFactories; + PlatformTLSFactories tlsFactories; + int coreLibIndex; + int moduleLibIndex; + sig_atomic_t interruptRequested; #ifdef HAVE_ITUNES - ITunesInterface iTunes; + ITunesInterface iTunes; #endif - }; + }; } diff --git a/Sluift/StandardTerminal.cpp b/Sluift/StandardTerminal.cpp index 6e4767d..1378346 100644 --- a/Sluift/StandardTerminal.cpp +++ b/Sluift/StandardTerminal.cpp @@ -1,15 +1,16 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/StandardTerminal.h> -#include <boost/optional.hpp> #include <iostream> #include <stdexcept> +#include <boost/optional.hpp> + using namespace Swift; StandardTerminal::StandardTerminal() { @@ -19,19 +20,19 @@ StandardTerminal::~StandardTerminal() { } void StandardTerminal::printError(const std::string& message) { - std::cout << message << std::endl; + std::cout << message << std::endl; } boost::optional<std::string> StandardTerminal::readLine(const std::string& prompt) { - std::cout << prompt << std::flush; - std::string input; - if (!std::getline(std::cin, input)) { - if (std::cin.eof()) { - return boost::optional<std::string>(); - } - throw std::runtime_error("Input error"); - } - return input; + std::cout << prompt << std::flush; + std::string input; + if (!std::getline(std::cin, input)) { + if (std::cin.eof()) { + return boost::optional<std::string>(); + } + throw std::runtime_error("Input error"); + } + return input; } void StandardTerminal::addToHistory(const std::string&) { diff --git a/Sluift/StandardTerminal.h b/Sluift/StandardTerminal.h index 6c0eed8..2109878 100644 --- a/Sluift/StandardTerminal.h +++ b/Sluift/StandardTerminal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,16 +7,17 @@ #pragma once #include <Swiften/Base/Override.h> + #include <Sluift/Terminal.h> namespace Swift { - class StandardTerminal : public Terminal { - public: - StandardTerminal(); - virtual ~StandardTerminal(); + class StandardTerminal : public Terminal { + public: + StandardTerminal(); + virtual ~StandardTerminal(); - virtual boost::optional<std::string> readLine(const std::string& prompt) SWIFTEN_OVERRIDE; - virtual void printError(const std::string& message) SWIFTEN_OVERRIDE; - virtual void addToHistory(const std::string& command) SWIFTEN_OVERRIDE; - }; + virtual boost::optional<std::string> readLine(const std::string& prompt) SWIFTEN_OVERRIDE; + virtual void printError(const std::string& message) SWIFTEN_OVERRIDE; + virtual void addToHistory(const std::string& command) SWIFTEN_OVERRIDE; + }; } diff --git a/Sluift/Terminal.cpp b/Sluift/Terminal.cpp index db1332a..4b54a87 100644 --- a/Sluift/Terminal.cpp +++ b/Sluift/Terminal.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -8,7 +8,7 @@ using namespace Swift; -Terminal::Terminal() : completer(NULL) { +Terminal::Terminal() : completer(nullptr) { } Terminal::~Terminal() { diff --git a/Sluift/Terminal.h b/Sluift/Terminal.h index 3bc63e3..3443d16 100644 --- a/Sluift/Terminal.h +++ b/Sluift/Terminal.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ @@ -7,29 +7,30 @@ #pragma once #include <string> + #include <boost/optional/optional.hpp> namespace Swift { - class Completer; + class Completer; - class Terminal { - public: - Terminal(); - virtual ~Terminal(); + class Terminal { + public: + Terminal(); + virtual ~Terminal(); - Completer* getCompleter() const { - return completer; - } + Completer* getCompleter() const { + return completer; + } - void setCompleter(Completer* completer) { - this->completer = completer; - } + void setCompleter(Completer* completer) { + this->completer = completer; + } - virtual boost::optional<std::string> readLine(const std::string& prompt) = 0; - virtual void addToHistory(const std::string& command) = 0; - virtual void printError(const std::string& message) = 0; + virtual boost::optional<std::string> readLine(const std::string& prompt) = 0; + virtual void addToHistory(const std::string& command) = 0; + virtual void printError(const std::string& message) = 0; - private: - Completer* completer; - }; + private: + Completer* completer; + }; } diff --git a/Sluift/Tests/FormTest.lua b/Sluift/Tests/FormTest.lua index 8065360..d584646 100644 --- a/Sluift/Tests/FormTest.lua +++ b/Sluift/Tests/FormTest.lua @@ -1,5 +1,5 @@ --[[ - Copyright (c) 2013 Isode Limited. + Copyright (c) 2013-2016 Isode Limited. All rights reserved. See the COPYING file for more information. --]] @@ -90,3 +90,15 @@ assert(type(text_multi_field['value']) == 'table') --print(sluift.to_xml({type = 'form', data = form})) + +-- test parsing an empty form -- this had issues as reported in SWIFT-174 +empty_form = [[<x xmlns='jabber:x:data' type='form'/>]] +form = sluift.from_xml(empty_form) +-- and check if we can access all fields without problems +assert(type(form._type)) +assert(type(form.title)) +assert(type(form.instructions)) +assert(type(form.type)) +assert(type(form.fields)) +assert(type(form.items)) +assert(type(form.reported_items)) diff --git a/Sluift/UnitTest/TokenizeTest.cpp b/Sluift/UnitTest/TokenizeTest.cpp index fb7dbbd..cd617b5 100644 --- a/Sluift/UnitTest/TokenizeTest.cpp +++ b/Sluift/UnitTest/TokenizeTest.cpp @@ -12,52 +12,52 @@ using namespace Swift; class TokenizeTest : public CppUnit::TestFixture { - CPPUNIT_TEST_SUITE(TokenizeTest); - CPPUNIT_TEST(testTokenize); - CPPUNIT_TEST(testTokenize); - CPPUNIT_TEST(testTokenize_String); - CPPUNIT_TEST(testTokenize_IncompleteString); - CPPUNIT_TEST(testTokenize_Identifier); - CPPUNIT_TEST_SUITE_END(); + CPPUNIT_TEST_SUITE(TokenizeTest); + CPPUNIT_TEST(testTokenize); + CPPUNIT_TEST(testTokenize); + CPPUNIT_TEST(testTokenize_String); + CPPUNIT_TEST(testTokenize_IncompleteString); + CPPUNIT_TEST(testTokenize_Identifier); + CPPUNIT_TEST_SUITE_END(); - public: - void testTokenize() { - std::vector<std::string> tokens = Lua::tokenize("foo.bar + 1.23 - bam"); + public: + void testTokenize() { + std::vector<std::string> tokens = Lua::tokenize("foo.bar + 1.23 - bam"); - CPPUNIT_ASSERT_EQUAL(7, static_cast<int>(tokens.size())); - CPPUNIT_ASSERT_EQUAL(std::string("foo"), tokens[0]); - CPPUNIT_ASSERT_EQUAL(std::string("."), tokens[1]); - CPPUNIT_ASSERT_EQUAL(std::string("bar"), tokens[2]); - CPPUNIT_ASSERT_EQUAL(std::string("+"), tokens[3]); - CPPUNIT_ASSERT_EQUAL(std::string("1.23"), tokens[4]); - CPPUNIT_ASSERT_EQUAL(std::string("-"), tokens[5]); - CPPUNIT_ASSERT_EQUAL(std::string("bam"), tokens[6]); - } + CPPUNIT_ASSERT_EQUAL(7, static_cast<int>(tokens.size())); + CPPUNIT_ASSERT_EQUAL(std::string("foo"), tokens[0]); + CPPUNIT_ASSERT_EQUAL(std::string("."), tokens[1]); + CPPUNIT_ASSERT_EQUAL(std::string("bar"), tokens[2]); + CPPUNIT_ASSERT_EQUAL(std::string("+"), tokens[3]); + CPPUNIT_ASSERT_EQUAL(std::string("1.23"), tokens[4]); + CPPUNIT_ASSERT_EQUAL(std::string("-"), tokens[5]); + CPPUNIT_ASSERT_EQUAL(std::string("bam"), tokens[6]); + } - void testTokenize_String() { - std::vector<std::string> tokens = Lua::tokenize(" foo .. \"1234\\\"bla blo\""); + void testTokenize_String() { + std::vector<std::string> tokens = Lua::tokenize(" foo .. \"1234\\\"bla blo\""); - CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(tokens.size())); - CPPUNIT_ASSERT_EQUAL(std::string("foo"), tokens[0]); - CPPUNIT_ASSERT_EQUAL(std::string(".."), tokens[1]); - CPPUNIT_ASSERT_EQUAL(std::string("\"1234\\\"bla blo\""), tokens[2]); - } + CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(tokens.size())); + CPPUNIT_ASSERT_EQUAL(std::string("foo"), tokens[0]); + CPPUNIT_ASSERT_EQUAL(std::string(".."), tokens[1]); + CPPUNIT_ASSERT_EQUAL(std::string("\"1234\\\"bla blo\""), tokens[2]); + } - void testTokenize_IncompleteString() { - std::vector<std::string> tokens = Lua::tokenize("\"1234"); + void testTokenize_IncompleteString() { + std::vector<std::string> tokens = Lua::tokenize("\"1234"); - CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(tokens.size())); - CPPUNIT_ASSERT_EQUAL(std::string("\"1234"), tokens[0]); - } + CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(tokens.size())); + CPPUNIT_ASSERT_EQUAL(std::string("\"1234"), tokens[0]); + } - void testTokenize_Identifier() { - std::vector<std::string> tokens = Lua::tokenize("foo.bar_baz"); + void testTokenize_Identifier() { + std::vector<std::string> tokens = Lua::tokenize("foo.bar_baz"); - CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(tokens.size())); - CPPUNIT_ASSERT_EQUAL(std::string("foo"), tokens[0]); - CPPUNIT_ASSERT_EQUAL(std::string("."), tokens[1]); - CPPUNIT_ASSERT_EQUAL(std::string("bar_baz"), tokens[2]); - } + CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(tokens.size())); + CPPUNIT_ASSERT_EQUAL(std::string("foo"), tokens[0]); + CPPUNIT_ASSERT_EQUAL(std::string("."), tokens[1]); + CPPUNIT_ASSERT_EQUAL(std::string("bar_baz"), tokens[2]); + } }; diff --git a/Sluift/Watchdog.cpp b/Sluift/Watchdog.cpp index 6494850..a99d63a 100644 --- a/Sluift/Watchdog.cpp +++ b/Sluift/Watchdog.cpp @@ -13,38 +13,38 @@ static const int INTERVAL_MS = 500; using namespace Swift; -Watchdog::Watchdog(int timeout, TimerFactory* timerFactory) : - remainingTime(timeout), - timerFactory(timerFactory), - timedOut(false) { - Sluift::globals.interruptRequested = 0; - - int nextTimeout = remainingTime >= 0 ? std::min(remainingTime, INTERVAL_MS) : INTERVAL_MS; - - timer = timerFactory->createTimer(nextTimeout); - timer->onTick.connect(boost::bind(&Watchdog::handleTimerTick, this)); - remainingTime -= nextTimeout; - timer->start(); +Watchdog::Watchdog(int timeout, TimerFactory* timerFactory) : + remainingTime(timeout), + timerFactory(timerFactory), + timedOut(false) { + Sluift::globals.interruptRequested = 0; + + int nextTimeout = remainingTime >= 0 ? std::min(remainingTime, INTERVAL_MS) : INTERVAL_MS; + + timer = timerFactory->createTimer(nextTimeout); + timer->onTick.connect(boost::bind(&Watchdog::handleTimerTick, this)); + remainingTime -= nextTimeout; + timer->start(); } Watchdog::~Watchdog() { - if (timer) { - timer->stop(); - } + if (timer) { + timer->stop(); + } } void Watchdog::handleTimerTick() { - if (Sluift::globals.interruptRequested || remainingTime == 0) { - timedOut = true; - } - else { - int nextTimeout = remainingTime >= 0 ? std::min(remainingTime, INTERVAL_MS) : INTERVAL_MS; - if (nextTimeout != INTERVAL_MS) { - timer->onTick.disconnect(boost::bind(&Watchdog::handleTimerTick, this)); - timer = timerFactory->createTimer(nextTimeout); - timer->onTick.connect(boost::bind(&Watchdog::handleTimerTick, this)); - } - remainingTime -= nextTimeout; - timer->start(); - } + if (Sluift::globals.interruptRequested || remainingTime == 0) { + timedOut = true; + } + else { + int nextTimeout = remainingTime >= 0 ? std::min(remainingTime, INTERVAL_MS) : INTERVAL_MS; + if (nextTimeout != INTERVAL_MS) { + timer->onTick.disconnect(boost::bind(&Watchdog::handleTimerTick, this)); + timer = timerFactory->createTimer(nextTimeout); + timer->onTick.connect(boost::bind(&Watchdog::handleTimerTick, this)); + } + remainingTime -= nextTimeout; + timer->start(); + } } diff --git a/Sluift/Watchdog.h b/Sluift/Watchdog.h index 8f73128..271c610 100644 --- a/Sluift/Watchdog.h +++ b/Sluift/Watchdog.h @@ -11,22 +11,22 @@ #include <Swiften/Network/TimerFactory.h> namespace Swift { - class Watchdog { - public: - Watchdog(int timeout, TimerFactory* timerFactory); - ~Watchdog(); + class Watchdog { + public: + Watchdog(int timeout, TimerFactory* timerFactory); + ~Watchdog(); - bool getTimedOut() const { - return timedOut; - } + bool getTimedOut() const { + return timedOut; + } - private: - void handleTimerTick(); + private: + void handleTimerTick(); - private: - Timer::ref timer; - int remainingTime; - TimerFactory* timerFactory; - bool timedOut; - }; + private: + Timer::ref timer; + int remainingTime; + TimerFactory* timerFactory; + bool timedOut; + }; } diff --git a/Sluift/client.cpp b/Sluift/client.cpp index 6373a20..186effc 100644 --- a/Sluift/client.cpp +++ b/Sluift/client.cpp @@ -4,774 +4,774 @@ * See the COPYING file for more information. */ -#include <boost/lambda/lambda.hpp> -#include <boost/lambda/bind.hpp> #include <boost/assign/list_of.hpp> -#include <iostream> +#include <boost/lambda/bind.hpp> +#include <boost/lambda/lambda.hpp> -#include <Sluift/SluiftClient.h> -#include <Swiften/JID/JID.h> -#include <Swiften/Elements/SoftwareVersion.h> +#include <Swiften/Base/IDGenerator.h> +#include <Swiften/Disco/ClientDiscoManager.h> +#include <Swiften/Elements/DiscoInfo.h> #include <Swiften/Elements/Message.h> #include <Swiften/Elements/Presence.h> #include <Swiften/Elements/RawXMLPayload.h> #include <Swiften/Elements/RosterItemPayload.h> #include <Swiften/Elements/RosterPayload.h> -#include <Swiften/Elements/DiscoInfo.h> -#include <Swiften/Elements/MAMQuery.h> -#include <Swiften/Disco/ClientDiscoManager.h> -#include <Swiften/Queries/GenericRequest.h> +#include <Swiften/Elements/SoftwareVersion.h> +#include <Swiften/JID/JID.h> #include <Swiften/Presence/PresenceSender.h> -#include <Swiften/Roster/XMPPRoster.h> -#include <Swiften/Roster/SetRosterRequest.h> #include <Swiften/Presence/SubscriptionManager.h> -#include <Swiften/Roster/XMPPRosterItem.h> +#include <Swiften/Queries/GenericRequest.h> #include <Swiften/Queries/IQRouter.h> #include <Swiften/Queries/Requests/GetSoftwareVersionRequest.h> +#include <Swiften/Roster/SetRosterRequest.h> +#include <Swiften/Roster/XMPPRoster.h> +#include <Swiften/Roster/XMPPRosterItem.h> #include <Swiften/TLS/PKCS12Certificate.h> -#include <Sluift/Lua/FunctionRegistration.h> -#include <Swiften/Base/foreach.h> -#include <Swiften/Base/IDGenerator.h> + +#include <Sluift/ElementConvertors/IQConvertor.h> +#include <Sluift/ElementConvertors/MessageConvertor.h> +#include <Sluift/ElementConvertors/PresenceConvertor.h> +#include <Sluift/ElementConvertors/StanzaConvertor.h> +#include <Sluift/ElementConvertors/StatusShowConvertor.h> #include <Sluift/Lua/Check.h> -#include <Sluift/Lua/Value.h> #include <Sluift/Lua/Exception.h> +#include <Sluift/Lua/FunctionRegistration.h> #include <Sluift/Lua/LuaUtils.h> +#include <Sluift/Lua/Value.h> +#include <Sluift/SluiftClient.h> #include <Sluift/globals.h> -#include <Sluift/ElementConvertors/StanzaConvertor.h> -#include <Sluift/ElementConvertors/IQConvertor.h> -#include <Sluift/ElementConvertors/PresenceConvertor.h> -#include <Sluift/ElementConvertors/MessageConvertor.h> -#include <Sluift/ElementConvertors/StatusShowConvertor.h> using namespace Swift; namespace lambda = boost::lambda; static inline SluiftClient* getClient(lua_State* L) { - return *Lua::checkUserData<SluiftClient>(L, 1); + return *Lua::checkUserData<SluiftClient>(L, 1); } static inline int getGlobalTimeout(lua_State* L) { - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.moduleLibIndex); - lua_getfield(L, -1, "timeout"); - int result = boost::numeric_cast<int>(lua_tointeger(L, -1)); - lua_pop(L, 2); - return result; -} - -static void addPayloadsToTable(lua_State* L, const std::vector<boost::shared_ptr<Payload> >& payloads) { - if (!payloads.empty()) { - lua_createtable(L, boost::numeric_cast<int>(payloads.size()), 0); - for (size_t i = 0; i < payloads.size(); ++i) { - Sluift::globals.elementConvertor.convertToLua(L, payloads[i]); - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - Lua::registerGetByTypeIndex(L, -1); - lua_setfield(L, -2, "payloads"); - } -} - -static boost::shared_ptr<Payload> getPayload(lua_State* L, int index) { - if (lua_type(L, index) == LUA_TTABLE) { - return boost::dynamic_pointer_cast<Payload>(Sluift::globals.elementConvertor.convertFromLua(L, index)); - } - else if (lua_type(L, index) == LUA_TSTRING) { - return boost::make_shared<RawXMLPayload>(Lua::checkString(L, index)); - } - else { - return boost::shared_ptr<Payload>(); - } -} - -static std::vector< boost::shared_ptr<Payload> > getPayloadsFromTable(lua_State* L, int index) { - index = Lua::absoluteOffset(L, index); - std::vector< boost::shared_ptr<Payload> > result; - lua_getfield(L, index, "payloads"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { - boost::shared_ptr<Payload> payload = getPayload(L, -1); - if (payload) { - result.push_back(payload); - } - } - } - lua_pop(L, 1); - return result; + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.moduleLibIndex); + lua_getfield(L, -1, "timeout"); + int result = boost::numeric_cast<int>(lua_tointeger(L, -1)); + lua_pop(L, 2); + return result; +} + +static void addPayloadsToTable(lua_State* L, const std::vector<std::shared_ptr<Payload> >& payloads) { + if (!payloads.empty()) { + lua_createtable(L, boost::numeric_cast<int>(payloads.size()), 0); + for (size_t i = 0; i < payloads.size(); ++i) { + Sluift::globals.elementConvertor.convertToLua(L, payloads[i]); + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + Lua::registerGetByTypeIndex(L, -1); + lua_setfield(L, -2, "payloads"); + } +} + +static std::shared_ptr<Payload> getPayload(lua_State* L, int index) { + if (lua_type(L, index) == LUA_TTABLE) { + return std::dynamic_pointer_cast<Payload>(Sluift::globals.elementConvertor.convertFromLua(L, index)); + } + else if (lua_type(L, index) == LUA_TSTRING) { + return std::make_shared<RawXMLPayload>(Lua::checkString(L, index)); + } + else { + return std::shared_ptr<Payload>(); + } +} + +static std::vector< std::shared_ptr<Payload> > getPayloadsFromTable(lua_State* L, int index) { + index = Lua::absoluteOffset(L, index); + std::vector< std::shared_ptr<Payload> > result; + lua_getfield(L, index, "payloads"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { + std::shared_ptr<Payload> payload = getPayload(L, -1); + if (payload) { + result.push_back(payload); + } + } + } + lua_pop(L, 1); + return result; } SLUIFT_LUA_FUNCTION(Client, async_connect) { - SluiftClient* client = getClient(L); - - std::string host = client->getOptions().manualHostname; - int port = client->getOptions().manualPort; - if (lua_istable(L, 2)) { - if (boost::optional<std::string> hostString = Lua::getStringField(L, 2, "host")) { - host = *hostString; - } - if (boost::optional<int> portInt = Lua::getIntField(L, 2, "port")) { - port = *portInt; - } - } - client->connect(host, port); - return 0; + SluiftClient* client = getClient(L); + + std::string host = client->getOptions().manualHostname; + int port = client->getOptions().manualPort; + if (lua_istable(L, 2)) { + if (boost::optional<std::string> hostString = Lua::getStringField(L, 2, "host")) { + host = *hostString; + } + if (boost::optional<int> portInt = Lua::getIntField(L, 2, "port")) { + port = *portInt; + } + } + client->connect(host, port); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, set_trace_enabled, - "Enable/disable tracing of the data sent/received.\n\n.", - "self\n" - "enable a boolean specifying whether to enable/disable tracing", - "" + Client, set_trace_enabled, + "Enable/disable tracing of the data sent/received.\n\n.", + "self\n" + "enable a boolean specifying whether to enable/disable tracing", + "" ) { - getClient(L)->setTraceEnabled(lua_toboolean(L, 1)); - return 0; + getClient(L)->setTraceEnabled(lua_toboolean(L, 1)); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, wait_connected, - "Block until the client is connected.\n\nThis is useful after an `async_connect`.", - "self", - "" + Client, wait_connected, + "Block until the client is connected.\n\nThis is useful after an `async_connect`.", + "self", + "" ) { - getClient(L)->waitConnected(getGlobalTimeout(L)); - return 0; + getClient(L)->waitConnected(getGlobalTimeout(L)); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, is_connected, - "Checks whether this client is still connected.\n\nReturns a boolean.", - "self\n", - "" + Client, is_connected, + "Checks whether this client is still connected.\n\nReturns a boolean.", + "self\n", + "" ) { - lua_pushboolean(L, getClient(L)->isConnected()); - return 1; + lua_pushboolean(L, getClient(L)->isConnected()); + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, disconnect, - "Disconnect from the server", - "self\n", - "" + Client, disconnect, + "Disconnect from the server", + "self\n", + "" ) { - Sluift::globals.eventLoop.runOnce(); - getClient(L)->disconnect(); - return 0; + Sluift::globals.eventLoop.runOnce(); + getClient(L)->disconnect(); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, set_version, + Client, set_version, - "Sets the published version of this client.", + "Sets the published version of this client.", - "self", + "self", - "name the name of the client software\n" - "version the version identifier of this client\n" - "os the OS this client is running on\n" + "name the name of the client software\n" + "version the version identifier of this client\n" + "os the OS this client is running on\n" ) { - Sluift::globals.eventLoop.runOnce(); - SluiftClient* client = getClient(L); - if (boost::shared_ptr<SoftwareVersion> version = boost::dynamic_pointer_cast<SoftwareVersion>(Sluift::globals.elementConvertor.convertFromLuaUntyped(L, 2, "software_version"))) { - client->setSoftwareVersion(version->getName(), version->getVersion(), version->getOS()); - } - return 0; + Sluift::globals.eventLoop.runOnce(); + SluiftClient* client = getClient(L); + if (std::shared_ptr<SoftwareVersion> version = std::dynamic_pointer_cast<SoftwareVersion>(Sluift::globals.elementConvertor.convertFromLuaUntyped(L, 2, "software_version"))) { + client->setSoftwareVersion(version->getName(), version->getVersion(), version->getOS()); + } + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, get_contacts, - "Returns a table of all the contacts in the contact list.", - "self\n", - "" + Client, get_contacts, + "Returns a table of all the contacts in the contact list.", + "self\n", + "" ) { - Sluift::globals.eventLoop.runOnce(); - - SluiftClient* client = getClient(L); - Lua::Table contactsTable; - foreach(const XMPPRosterItem& item, client->getRoster(getGlobalTimeout(L))) { - std::string subscription; - switch(item.getSubscription()) { - case RosterItemPayload::None: subscription = "none"; break; - case RosterItemPayload::To: subscription = "to"; break; - case RosterItemPayload::From: subscription = "from"; break; - case RosterItemPayload::Both: subscription = "both"; break; - case RosterItemPayload::Remove: subscription = "remove"; break; - } - Lua::Table itemTable = boost::assign::map_list_of - ("jid", boost::make_shared<Lua::Value>(item.getJID().toString())) - ("name", boost::make_shared<Lua::Value>(item.getName())) - ("subscription", boost::make_shared<Lua::Value>(subscription)) - ("groups", boost::make_shared<Lua::Value>(std::vector<Lua::Value>(item.getGroups().begin(), item.getGroups().end()))); - contactsTable[item.getJID().toString()] = boost::make_shared<Lua::Value>(itemTable); - } - pushValue(L, contactsTable); - Lua::registerTableToString(L, -1); - return 1; + Sluift::globals.eventLoop.runOnce(); + + SluiftClient* client = getClient(L); + Lua::Table contactsTable; + for (const auto& item : client->getRoster(getGlobalTimeout(L))) { + std::string subscription; + switch(item.getSubscription()) { + case RosterItemPayload::None: subscription = "none"; break; + case RosterItemPayload::To: subscription = "to"; break; + case RosterItemPayload::From: subscription = "from"; break; + case RosterItemPayload::Both: subscription = "both"; break; + case RosterItemPayload::Remove: subscription = "remove"; break; + } + Lua::Table itemTable = boost::assign::map_list_of + ("jid", std::make_shared<Lua::Value>(item.getJID().toString())) + ("name", std::make_shared<Lua::Value>(item.getName())) + ("subscription", std::make_shared<Lua::Value>(subscription)) + ("groups", std::make_shared<Lua::Value>(std::vector<Lua::Value>(item.getGroups().begin(), item.getGroups().end()))); + contactsTable[item.getJID().toString()] = std::make_shared<Lua::Value>(itemTable); + } + pushValue(L, contactsTable); + Lua::registerTableToString(L, -1); + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, send_message, - "Send a message.", - "self\n" - "to the JID to send the message to\n" - "body the body of the message. Can alternatively be specified using the `body` option\n", - - "to the JID to send the message to\n" - "body the body of the message\n" - "subject the subject of the MUC room to set\n" - "type the type of message to send (`normal`, `chat`, `error`, `groupchat`, `headline`)\n" - "payloads payloads to add to the message\n" + Client, send_message, + "Send a message.", + "self\n" + "to the JID to send the message to\n" + "body the body of the message. Can alternatively be specified using the `body` option\n", + + "to the JID to send the message to\n" + "body the body of the message\n" + "subject the subject of the MUC room to set\n" + "type the type of message to send (`normal`, `chat`, `error`, `groupchat`, `headline`)\n" + "payloads payloads to add to the message\n" ) { - Sluift::globals.eventLoop.runOnce(); - JID to; - boost::optional<std::string> body; - boost::optional<std::string> subject; - std::vector<boost::shared_ptr<Payload> > payloads; - int index = 2; - Message::Type type = Message::Chat; - if (lua_isstring(L, index)) { - to = std::string(lua_tostring(L, index)); - ++index; - if (lua_isstring(L, index)) { - body = lua_tostring(L, index); - ++index; - } - } - if (lua_istable(L, index)) { - if (boost::optional<std::string> value = Lua::getStringField(L, index, "to")) { - to = *value; - } - - if (boost::optional<std::string> value = Lua::getStringField(L, index, "body")) { - body = value; - } - - if (boost::optional<std::string> value = Lua::getStringField(L, index, "type")) { - type = MessageConvertor::convertMessageTypeFromString(*value); - } - - if (boost::optional<std::string> value = Lua::getStringField(L, index, "subject")) { - subject = value; - } - - payloads = getPayloadsFromTable(L, index); - } - - if (!to.isValid()) { - throw Lua::Exception("Missing 'to'"); - } - if ((!body || body->empty()) && !subject && payloads.empty()) { - throw Lua::Exception("Missing any of 'body', 'subject' or 'payloads'"); - } - Message::ref message = boost::make_shared<Message>(); - message->setTo(to); - if (body && !body->empty()) { - message->setBody(*body); - } - if (subject) { - message->setSubject(*subject); - } - message->addPayloads(payloads.begin(), payloads.end()); - message->setType(type); - getClient(L)->getClient()->sendMessage(message); - return 0; + Sluift::globals.eventLoop.runOnce(); + JID to; + boost::optional<std::string> body; + boost::optional<std::string> subject; + std::vector<std::shared_ptr<Payload> > payloads; + int index = 2; + Message::Type type = Message::Chat; + if (lua_isstring(L, index)) { + to = std::string(lua_tostring(L, index)); + ++index; + if (lua_isstring(L, index)) { + body = lua_tostring(L, index); + ++index; + } + } + if (lua_istable(L, index)) { + if (boost::optional<std::string> value = Lua::getStringField(L, index, "to")) { + to = *value; + } + + if (boost::optional<std::string> value = Lua::getStringField(L, index, "body")) { + body = value; + } + + if (boost::optional<std::string> value = Lua::getStringField(L, index, "type")) { + type = MessageConvertor::convertMessageTypeFromString(*value); + } + + if (boost::optional<std::string> value = Lua::getStringField(L, index, "subject")) { + subject = value; + } + + payloads = getPayloadsFromTable(L, index); + } + + if (!to.isValid()) { + throw Lua::Exception("Missing 'to'"); + } + if ((!body || body->empty()) && !subject && payloads.empty()) { + throw Lua::Exception("Missing any of 'body', 'subject' or 'payloads'"); + } + Message::ref message = std::make_shared<Message>(); + message->setTo(to); + if (body && !body->empty()) { + message->setBody(*body); + } + if (subject) { + message->setSubject(*subject); + } + message->addPayloads(payloads.begin(), payloads.end()); + message->setType(type); + getClient(L)->getClient()->sendMessage(message); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, send_presence, - "Send presence.", - - "self\n" - "body the text of the presence. Can alternatively be specified using the `status` option\n", - - "to the JID to send the message to\n" - "status the text of the presence\n" - "show the availability of the presence (`online`, `ffc`, `away`, `xa`, `dnd`)\n" - "priority the priority of the presence\n" - "type the type of message to send (`available`, `error`, `probe`, `subscribe`, `subscribed`, `unavailable`, `unsubscribe`, `unsubscribed`)\n" - "payloads payloads to add to the presence\n" + Client, send_presence, + "Send presence.", + + "self\n" + "body the text of the presence. Can alternatively be specified using the `status` option\n", + + "to the JID to send the message to\n" + "status the text of the presence\n" + "show the availability of the presence (`online`, `ffc`, `away`, `xa`, `dnd`)\n" + "priority the priority of the presence\n" + "type the type of message to send (`available`, `error`, `probe`, `subscribe`, `subscribed`, `unavailable`, `unsubscribe`, `unsubscribed`)\n" + "payloads payloads to add to the presence\n" ) { - Sluift::globals.eventLoop.runOnce(); - boost::shared_ptr<Presence> presence = boost::make_shared<Presence>(); - - int index = 2; - if (lua_isstring(L, index)) { - presence->setStatus(lua_tostring(L, index)); - ++index; - } - if (lua_istable(L, index)) { - if (boost::optional<std::string> value = Lua::getStringField(L, index, "to")) { - presence->setTo(*value); - } - if (boost::optional<std::string> value = Lua::getStringField(L, index, "status")) { - presence->setStatus(*value); - } - if (boost::optional<int> value = Lua::getIntField(L, index, "priority")) { - presence->setPriority(*value); - } - if (boost::optional<std::string> value = Lua::getStringField(L, index, "type")) { - presence->setType(PresenceConvertor::convertPresenceTypeFromString(*value)); - } - if (boost::optional<std::string> value = Lua::getStringField(L, index, "show")) { - presence->setShow(StatusShowConvertor::convertStatusShowTypeFromString(*value)); - } - std::vector< boost::shared_ptr<Payload> > payloads = getPayloadsFromTable(L, index); - presence->addPayloads(payloads.begin(), payloads.end()); - } - - getClient(L)->getClient()->getPresenceSender()->sendPresence(presence); - lua_pushvalue(L, 1); - return 0; + Sluift::globals.eventLoop.runOnce(); + std::shared_ptr<Presence> presence = std::make_shared<Presence>(); + + int index = 2; + if (lua_isstring(L, index)) { + presence->setStatus(lua_tostring(L, index)); + ++index; + } + if (lua_istable(L, index)) { + if (boost::optional<std::string> value = Lua::getStringField(L, index, "to")) { + presence->setTo(*value); + } + if (boost::optional<std::string> value = Lua::getStringField(L, index, "status")) { + presence->setStatus(*value); + } + if (boost::optional<int> value = Lua::getIntField(L, index, "priority")) { + presence->setPriority(*value); + } + if (boost::optional<std::string> value = Lua::getStringField(L, index, "type")) { + presence->setType(PresenceConvertor::convertPresenceTypeFromString(*value)); + } + if (boost::optional<std::string> value = Lua::getStringField(L, index, "show")) { + presence->setShow(StatusShowConvertor::convertStatusShowTypeFromString(*value)); + } + std::vector< std::shared_ptr<Payload> > payloads = getPayloadsFromTable(L, index); + presence->addPayloads(payloads.begin(), payloads.end()); + } + + getClient(L)->getClient()->getPresenceSender()->sendPresence(presence); + lua_pushvalue(L, 1); + return 0; } static int sendQuery(lua_State* L, IQ::Type type) { - SluiftClient* client = getClient(L); + SluiftClient* client = getClient(L); - JID to; - if (boost::optional<std::string> toString = Lua::getStringField(L, 2, "to")) { - to = JID(*toString); - } + JID to; + if (boost::optional<std::string> toString = Lua::getStringField(L, 2, "to")) { + to = JID(*toString); + } - int timeout = getGlobalTimeout(L); - if (boost::optional<int> timeoutInt = Lua::getIntField(L, 2, "timeout")) { - timeout = *timeoutInt; - } + int timeout = getGlobalTimeout(L); + if (boost::optional<int> timeoutInt = Lua::getIntField(L, 2, "timeout")) { + timeout = *timeoutInt; + } - boost::shared_ptr<Payload> payload; - lua_getfield(L, 2, "query"); - payload = getPayload(L, -1); - lua_pop(L, 1); + std::shared_ptr<Payload> payload; + lua_getfield(L, 2, "query"); + payload = getPayload(L, -1); + lua_pop(L, 1); - return client->sendRequest( - boost::make_shared< GenericRequest<Payload> >(type, to, payload, client->getClient()->getIQRouter()), timeout).convertToLuaResult(L); + return client->sendRequest( + std::make_shared< GenericRequest<Payload> >(type, to, payload, client->getClient()->getIQRouter()), timeout).convertToLuaResult(L); } #define DISPATCH_PUBSUB_PAYLOAD(payloadType, container, response) \ - else if (boost::shared_ptr<payloadType> p = boost::dynamic_pointer_cast<payloadType>(payload)) { \ - return client->sendPubSubRequest(type, to, p, timeout).convertToLuaResult(L); \ - } + else if (std::shared_ptr<payloadType> p = std::dynamic_pointer_cast<payloadType>(payload)) { \ + return client->sendPubSubRequest(type, to, p, timeout).convertToLuaResult(L); \ + } SLUIFT_LUA_FUNCTION(Client, query_pubsub) { - SluiftClient* client = getClient(L); + SluiftClient* client = getClient(L); - JID to; - if (boost::optional<std::string> toString = Lua::getStringField(L, 2, "to")) { - to = JID(*toString); - } + JID to; + if (boost::optional<std::string> toString = Lua::getStringField(L, 2, "to")) { + to = JID(*toString); + } - int timeout = getGlobalTimeout(L); - if (boost::optional<int> timeoutInt = Lua::getIntField(L, 2, "timeout")) { - timeout = *timeoutInt; - } + int timeout = getGlobalTimeout(L); + if (boost::optional<int> timeoutInt = Lua::getIntField(L, 2, "timeout")) { + timeout = *timeoutInt; + } - IQ::Type type; - if (boost::optional<std::string> queryType = Lua::getStringField(L, 2, "type")) { - type = IQConvertor::convertIQTypeFromString(*queryType); - } - else { - throw Lua::Exception("Missing query type"); - } + IQ::Type type; + if (boost::optional<std::string> queryType = Lua::getStringField(L, 2, "type")) { + type = IQConvertor::convertIQTypeFromString(*queryType); + } + else { + throw Lua::Exception("Missing query type"); + } - lua_getfield(L, 2, "query"); - if (!lua_istable(L, -1)) { - throw Lua::Exception("Missing/incorrect query"); - } - boost::shared_ptr<Payload> payload = getPayload(L, -1); + lua_getfield(L, 2, "query"); + if (!lua_istable(L, -1)) { + throw Lua::Exception("Missing/incorrect query"); + } + std::shared_ptr<Payload> payload = getPayload(L, -1); - if (false) { } - SWIFTEN_PUBSUB_FOREACH_PUBSUB_PAYLOAD_TYPE(DISPATCH_PUBSUB_PAYLOAD) - else { - throw Lua::Exception("Incorrect PubSub payload"); - } + if (false) { } + SWIFTEN_PUBSUB_FOREACH_PUBSUB_PAYLOAD_TYPE(DISPATCH_PUBSUB_PAYLOAD) + else { + throw Lua::Exception("Incorrect PubSub payload"); + } } SLUIFT_LUA_FUNCTION(Client, get) { - return sendQuery(L, IQ::Get); + return sendQuery(L, IQ::Get); } SLUIFT_LUA_FUNCTION(Client, set) { - return sendQuery(L, IQ::Set); + return sendQuery(L, IQ::Set); } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, send, - "Sends a raw string", + Client, send, + "Sends a raw string", - "self\n" - "data the string to send\n", + "self\n" + "data the string to send\n", - "" + "" ) { - Sluift::globals.eventLoop.runOnce(); + Sluift::globals.eventLoop.runOnce(); - getClient(L)->getClient()->sendData(std::string(Lua::checkString(L, 2))); - lua_pushvalue(L, 1); - return 0; + getClient(L)->getClient()->sendData(std::string(Lua::checkString(L, 2))); + lua_pushvalue(L, 1); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, set_options, + Client, set_options, - "Sets the connection options of this client.", + "Sets the connection options of this client.", - "self", + "self", - "host The host to connect to. When omitted, is determined from resolving the JID domain.\n" - "port The port to connect to. When omitted, is determined from resolving the JID domain.\n" - "ack Request acknowledgements\n" - "compress Use stream compression when available\n" - "tls Use TLS when available\n" - "bosh_url Connect using the specified BOSH URL\n" - "allow_plain_without_tls Allow PLAIN authentication without a TLS encrypted connection\n" + "host The host to connect to. When omitted, is determined from resolving the JID domain.\n" + "port The port to connect to. When omitted, is determined from resolving the JID domain.\n" + "ack Request acknowledgements\n" + "compress Use stream compression when available\n" + "tls Use TLS when available\n" + "bosh_url Connect using the specified BOSH URL\n" + "allow_plain_without_tls Allow PLAIN authentication without a TLS encrypted connection\n" ) { - SluiftClient* client = getClient(L); - Lua::checkType(L, 2, LUA_TTABLE); - lua_getfield(L, 2, "host"); - if (!lua_isnil(L, -1)) { - client->getOptions().manualHostname = lua_tostring(L, -1); - } - lua_getfield(L, 2, "port"); - if (!lua_isnil(L, -1)) { - client->getOptions().manualPort = boost::numeric_cast<int>(lua_tointeger(L, -1)); - } - lua_getfield(L, 2, "ack"); - if (!lua_isnil(L, -1)) { - client->getOptions().useAcks = lua_toboolean(L, -1); - } - lua_getfield(L, 2, "compress"); - if (!lua_isnil(L, -1)) { - client->getOptions().useStreamCompression = lua_toboolean(L, -1); - } - lua_getfield(L, 2, "tls"); - if (!lua_isnil(L, -1)) { - bool useTLS = lua_toboolean(L, -1); - client->getOptions().useTLS = (useTLS ? ClientOptions::UseTLSWhenAvailable : ClientOptions::NeverUseTLS); - } - lua_getfield(L, 2, "bosh_url"); - if (!lua_isnil(L, -1)) { - client->getOptions().boshURL = URL::fromString(lua_tostring(L, -1)); - } - lua_getfield(L, 2, "allow_plain_without_tls"); - if (!lua_isnil(L, -1)) { - client->getOptions().allowPLAINWithoutTLS = lua_toboolean(L, -1); - } - lua_pushvalue(L, 1); - return 0; + SluiftClient* client = getClient(L); + Lua::checkType(L, 2, LUA_TTABLE); + lua_getfield(L, 2, "host"); + if (!lua_isnil(L, -1)) { + client->getOptions().manualHostname = lua_tostring(L, -1); + } + lua_getfield(L, 2, "port"); + if (!lua_isnil(L, -1)) { + client->getOptions().manualPort = boost::numeric_cast<int>(lua_tointeger(L, -1)); + } + lua_getfield(L, 2, "ack"); + if (!lua_isnil(L, -1)) { + client->getOptions().useAcks = lua_toboolean(L, -1); + } + lua_getfield(L, 2, "compress"); + if (!lua_isnil(L, -1)) { + client->getOptions().useStreamCompression = lua_toboolean(L, -1); + } + lua_getfield(L, 2, "tls"); + if (!lua_isnil(L, -1)) { + bool useTLS = lua_toboolean(L, -1); + client->getOptions().useTLS = (useTLS ? ClientOptions::UseTLSWhenAvailable : ClientOptions::NeverUseTLS); + } + lua_getfield(L, 2, "bosh_url"); + if (!lua_isnil(L, -1)) { + client->getOptions().boshURL = URL::fromString(lua_tostring(L, -1)); + } + lua_getfield(L, 2, "allow_plain_without_tls"); + if (!lua_isnil(L, -1)) { + client->getOptions().allowPLAINWithoutTLS = lua_toboolean(L, -1); + } + lua_pushvalue(L, 1); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, get_options, - "Returns a table with all the connection options of this client.", - "self\n", - "" + Client, get_options, + "Returns a table with all the connection options of this client.", + "self\n", + "" ) { - Sluift::globals.eventLoop.runOnce(); - - SluiftClient* client = getClient(L); - Lua::Table optionsTable = boost::assign::map_list_of - ("host", boost::make_shared<Lua::Value>(client->getOptions().manualHostname)) - ("port", boost::make_shared<Lua::Value>(client->getOptions().manualPort)) - ("ack", boost::make_shared<Lua::Value>(client->getOptions().useAcks)) - ("compress", boost::make_shared<Lua::Value>(client->getOptions().useStreamCompression)) - ("tls", boost::make_shared<Lua::Value>(client->getOptions().useTLS == ClientOptions::NeverUseTLS ? false : true)) - ("bosh_url", boost::make_shared<Lua::Value>(client->getOptions().boshURL.toString())) - ("allow_plain_without_tls", boost::make_shared<Lua::Value>(client->getOptions().allowPLAINWithoutTLS)); - pushValue(L, optionsTable); - Lua::registerTableToString(L, -1); - return 1; + Sluift::globals.eventLoop.runOnce(); + + SluiftClient* client = getClient(L); + Lua::Table optionsTable = boost::assign::map_list_of + ("host", std::make_shared<Lua::Value>(client->getOptions().manualHostname)) + ("port", std::make_shared<Lua::Value>(client->getOptions().manualPort)) + ("ack", std::make_shared<Lua::Value>(client->getOptions().useAcks)) + ("compress", std::make_shared<Lua::Value>(client->getOptions().useStreamCompression)) + ("tls", std::make_shared<Lua::Value>(client->getOptions().useTLS == ClientOptions::NeverUseTLS ? false : true)) + ("bosh_url", std::make_shared<Lua::Value>(client->getOptions().boshURL.toString())) + ("allow_plain_without_tls", std::make_shared<Lua::Value>(client->getOptions().allowPLAINWithoutTLS)); + pushValue(L, optionsTable); + Lua::registerTableToString(L, -1); + return 1; } static void pushEvent(lua_State* L, const SluiftClient::Event& event) { - switch (event.type) { - case SluiftClient::Event::MessageType: { - Message::ref message = boost::dynamic_pointer_cast<Message>(event.stanza); - Lua::Table result = boost::assign::map_list_of - ("type", boost::make_shared<Lua::Value>(std::string("message"))) - ("from", boost::make_shared<Lua::Value>(message->getFrom().toString())) - ("body", boost::make_shared<Lua::Value>(message->getBody().get_value_or(""))) - ("message_type", boost::make_shared<Lua::Value>(MessageConvertor::convertMessageTypeToString(message->getType()))); - Lua::pushValue(L, result); - addPayloadsToTable(L, message->getPayloads()); - Lua::registerTableToString(L, -1); - break; - } - case SluiftClient::Event::PresenceType: { - Presence::ref presence = boost::dynamic_pointer_cast<Presence>(event.stanza); - Lua::Table result = boost::assign::map_list_of - ("type", boost::make_shared<Lua::Value>(std::string("presence"))) - ("from", boost::make_shared<Lua::Value>(presence->getFrom().toString())) - ("status", boost::make_shared<Lua::Value>(presence->getStatus())) - ("presence_type", boost::make_shared<Lua::Value>(PresenceConvertor::convertPresenceTypeToString(presence->getType()))); - Lua::pushValue(L, result); - addPayloadsToTable(L, presence->getPayloads()); - Lua::registerTableToString(L, -1); - break; - } - case SluiftClient::Event::PubSubEventType: { - Sluift::globals.elementConvertor.convertToLua(L, event.pubsubEvent); - lua_pushstring(L, "pubsub"); - lua_setfield(L, -2, "type"); - lua_pushstring(L, event.from.toString().c_str()); - lua_setfield(L, -2, "from"); - - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - lua_getfield(L, -1, "process_pubsub_event"); - lua_pushvalue(L, -3); - lua_call(L, 1, 0); - lua_pop(L, 1); - } - } + switch (event.type) { + case SluiftClient::Event::MessageType: { + Message::ref message = std::dynamic_pointer_cast<Message>(event.stanza); + Lua::Table result = boost::assign::map_list_of + ("type", std::make_shared<Lua::Value>(std::string("message"))) + ("from", std::make_shared<Lua::Value>(message->getFrom().toString())) + ("to", std::make_shared<Lua::Value>(message->getTo().toString())) + ("body", std::make_shared<Lua::Value>(message->getBody().get_value_or(""))) + ("message_type", std::make_shared<Lua::Value>(MessageConvertor::convertMessageTypeToString(message->getType()))); + Lua::pushValue(L, result); + addPayloadsToTable(L, message->getPayloads()); + Lua::registerTableToString(L, -1); + break; + } + case SluiftClient::Event::PresenceType: { + Presence::ref presence = std::dynamic_pointer_cast<Presence>(event.stanza); + Lua::Table result = boost::assign::map_list_of + ("type", std::make_shared<Lua::Value>(std::string("presence"))) + ("from", std::make_shared<Lua::Value>(presence->getFrom().toString())) + ("to", std::make_shared<Lua::Value>(presence->getTo().toString())) + ("status", std::make_shared<Lua::Value>(presence->getStatus())) + ("presence_type", std::make_shared<Lua::Value>(PresenceConvertor::convertPresenceTypeToString(presence->getType()))); + Lua::pushValue(L, result); + addPayloadsToTable(L, presence->getPayloads()); + Lua::registerTableToString(L, -1); + break; + } + case SluiftClient::Event::PubSubEventType: { + Sluift::globals.elementConvertor.convertToLua(L, event.pubsubEvent); + lua_pushstring(L, "pubsub"); + lua_setfield(L, -2, "type"); + lua_pushstring(L, event.from.toString().c_str()); + lua_setfield(L, -2, "from"); + + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + lua_getfield(L, -1, "process_pubsub_event"); + lua_pushvalue(L, -3); + lua_call(L, 1, 0); + lua_pop(L, 1); + } + } } struct CallUnaryLuaPredicateOnEvent { - CallUnaryLuaPredicateOnEvent(lua_State* L, int index) : L(L), index(index) { - } - - bool operator()(const SluiftClient::Event& event) { - lua_pushvalue(L, index); - pushEvent(L, event); - if (lua_pcall(L, 1, 1, 0) != 0) { - throw Lua::Exception(lua_tostring(L, -1)); - } - bool result = lua_toboolean(L, -1); - lua_pop(L, 1); - return result; - } - - lua_State* L; - int index; + CallUnaryLuaPredicateOnEvent(lua_State* L, int index) : L(L), index(index) { + } + + bool operator()(const SluiftClient::Event& event) { + lua_pushvalue(L, index); + pushEvent(L, event); + if (lua_pcall(L, 1, 1, 0) != 0) { + throw Lua::Exception(lua_tostring(L, -1)); + } + bool result = lua_toboolean(L, -1); + lua_pop(L, 1); + return result; + } + + lua_State* L; + int index; }; SLUIFT_LUA_FUNCTION(Client, get_next_event) { - Sluift::globals.eventLoop.runOnce(); - SluiftClient* client = getClient(L); - - int timeout = getGlobalTimeout(L); - boost::optional<SluiftClient::Event::Type> type; - int condition = 0; - if (lua_istable(L, 2)) { - if (boost::optional<std::string> typeString = Lua::getStringField(L, 2, "type")) { - if (*typeString == "message") { - type = SluiftClient::Event::MessageType; - } - else if (*typeString == "presence") { - type = SluiftClient::Event::PresenceType; - } - else if (*typeString == "pubsub") { - type = SluiftClient::Event::PubSubEventType; - } - } - if (boost::optional<int> timeoutInt = Lua::getIntField(L, 2, "timeout")) { - timeout = *timeoutInt; - } - lua_getfield(L, 2, "if"); - if (lua_isfunction(L, -1)) { - condition = Lua::absoluteOffset(L, -1); - } - } - - boost::optional<SluiftClient::Event> event; - if (condition) { - event = client->getNextEvent(timeout, CallUnaryLuaPredicateOnEvent(L, condition)); - } - else if (type) { - event = client->getNextEvent( - timeout, lambda::bind(&SluiftClient::Event::type, lambda::_1) == *type); - } - else { - event = client->getNextEvent(timeout); - } - - if (event) { - pushEvent(L, *event); - } - else { - lua_pushnil(L); - } - return 1; + Sluift::globals.eventLoop.runOnce(); + SluiftClient* client = getClient(L); + + int timeout = getGlobalTimeout(L); + boost::optional<SluiftClient::Event::Type> type; + int condition = 0; + if (lua_istable(L, 2)) { + if (boost::optional<std::string> typeString = Lua::getStringField(L, 2, "type")) { + if (*typeString == "message") { + type = SluiftClient::Event::MessageType; + } + else if (*typeString == "presence") { + type = SluiftClient::Event::PresenceType; + } + else if (*typeString == "pubsub") { + type = SluiftClient::Event::PubSubEventType; + } + } + if (boost::optional<int> timeoutInt = Lua::getIntField(L, 2, "timeout")) { + timeout = *timeoutInt; + } + lua_getfield(L, 2, "if"); + if (lua_isfunction(L, -1)) { + condition = Lua::absoluteOffset(L, -1); + } + } + + boost::optional<SluiftClient::Event> event; + if (condition) { + event = client->getNextEvent(timeout, CallUnaryLuaPredicateOnEvent(L, condition)); + } + else if (type) { + event = client->getNextEvent( + timeout, lambda::bind(&SluiftClient::Event::type, lambda::_1) == *type); + } + else { + event = client->getNextEvent(timeout); + } + + if (event) { + pushEvent(L, *event); + } + else { + lua_pushnil(L); + } + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, add_contact, - "Add a contact to the contact list.", - "self\n", - "jid The JID of the contact to add\n" - "name The name to use in the contact list\n" - "groups An array of group names to add the contact to\n") { - Sluift::globals.eventLoop.runOnce(); - SluiftClient* client = getClient(L); - RosterItemPayload item; - int timeout = getGlobalTimeout(L); - - if (lua_type(L, 2) == LUA_TTABLE) { - lua_getfield(L, 2, "jid"); - const char* rawJID = lua_tostring(L, -1); - if (rawJID) { - item.setJID(std::string(rawJID)); - } - lua_getfield(L, 2, "name"); - const char* rawName = lua_tostring(L, -1); - if (rawName) { - item.setName(rawName); - } - lua_getfield(L, 2, "groups"); - if (!lua_isnil(L, -1)) { - if (lua_type(L, -1) == LUA_TTABLE) { - for (size_t i = 1; i <= lua_objlen(L, -1); ++i) { - lua_rawgeti(L, -1, boost::numeric_cast<int>(i)); - const char* rawGroup = lua_tostring(L, -1); - if (rawGroup) { - item.addGroup(rawGroup); - } - lua_pop(L, 1); - } - } - else { - throw Lua::Exception("Groups should be a table"); - } - } - } - else { - item.setJID(Lua::checkString(L, 2)); - } - - client->getRoster(timeout); - if (!client->getClient()->getRoster()->containsJID(item.getJID())) { - RosterPayload::ref roster = boost::make_shared<RosterPayload>(); - roster->addItem(item); - - Sluift::Response response = client->sendVoidRequest( - SetRosterRequest::create(roster, client->getClient()->getIQRouter()), timeout); - if (response.error) { - return response.convertToLuaResult(L); - } - } - client->getClient()->getSubscriptionManager()->requestSubscription(item.getJID()); - lua_pushboolean(L, true); - return 1; + Client, add_contact, + "Add a contact to the contact list.", + "self\n", + "jid The JID of the contact to add\n" + "name The name to use in the contact list\n" + "groups An array of group names to add the contact to\n") { + Sluift::globals.eventLoop.runOnce(); + SluiftClient* client = getClient(L); + RosterItemPayload item; + int timeout = getGlobalTimeout(L); + + if (lua_type(L, 2) == LUA_TTABLE) { + lua_getfield(L, 2, "jid"); + const char* rawJID = lua_tostring(L, -1); + if (rawJID) { + item.setJID(std::string(rawJID)); + } + lua_getfield(L, 2, "name"); + const char* rawName = lua_tostring(L, -1); + if (rawName) { + item.setName(rawName); + } + lua_getfield(L, 2, "groups"); + if (!lua_isnil(L, -1)) { + if (lua_type(L, -1) == LUA_TTABLE) { + for (size_t i = 1; i <= lua_objlen(L, -1); ++i) { + lua_rawgeti(L, -1, boost::numeric_cast<int>(i)); + const char* rawGroup = lua_tostring(L, -1); + if (rawGroup) { + item.addGroup(rawGroup); + } + lua_pop(L, 1); + } + } + else { + throw Lua::Exception("Groups should be a table"); + } + } + } + else { + item.setJID(Lua::checkString(L, 2)); + } + + client->getRoster(timeout); + if (!client->getClient()->getRoster()->containsJID(item.getJID())) { + RosterPayload::ref roster = std::make_shared<RosterPayload>(); + roster->addItem(item); + + Sluift::Response response = client->sendVoidRequest( + SetRosterRequest::create(roster, client->getClient()->getIQRouter()), timeout); + if (response.error) { + return response.convertToLuaResult(L); + } + } + client->getClient()->getSubscriptionManager()->requestSubscription(item.getJID()); + lua_pushboolean(L, true); + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, remove_contact, - "Remove a contact from the contact list.", - "self\n" - "jid the JID of the contact to remove\n", - "" + Client, remove_contact, + "Remove a contact from the contact list.", + "self\n" + "jid the JID of the contact to remove\n", + "" ) { - Sluift::globals.eventLoop.runOnce(); - SluiftClient* client = getClient(L); - JID jid(Lua::checkString(L, 2)); - int timeout = getGlobalTimeout(L); + Sluift::globals.eventLoop.runOnce(); + SluiftClient* client = getClient(L); + JID jid(Lua::checkString(L, 2)); + int timeout = getGlobalTimeout(L); + + RosterPayload::ref roster = std::make_shared<RosterPayload>(); + roster->addItem(RosterItemPayload(JID(Lua::checkString(L, 2)), "", RosterItemPayload::Remove)); - RosterPayload::ref roster = boost::make_shared<RosterPayload>(); - roster->addItem(RosterItemPayload(JID(Lua::checkString(L, 2)), "", RosterItemPayload::Remove)); - - return client->sendVoidRequest( - SetRosterRequest::create(roster, client->getClient()->getIQRouter()), timeout).convertToLuaResult(L); + return client->sendVoidRequest( + SetRosterRequest::create(roster, client->getClient()->getIQRouter()), timeout).convertToLuaResult(L); } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, confirm_subscription, - "Confirm subscription of a contact.", - "self\n" - "jid the JID of the contact to confirm the subscription of\n", - "" + Client, confirm_subscription, + "Confirm subscription of a contact.", + "self\n" + "jid the JID of the contact to confirm the subscription of\n", + "" ) { - Sluift::globals.eventLoop.runOnce(); - SluiftClient* client = getClient(L); - JID jid(Lua::checkString(L, 2)); - client->getClient()->getSubscriptionManager()->confirmSubscription(jid); - return 0; + Sluift::globals.eventLoop.runOnce(); + SluiftClient* client = getClient(L); + JID jid(Lua::checkString(L, 2)); + client->getClient()->getSubscriptionManager()->confirmSubscription(jid); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, cancel_subscription, - "Cancel the subscription of a contact.", - "self\n" - "jid the JID of the contact to cancel the subscription of\n", - "" + Client, cancel_subscription, + "Cancel the subscription of a contact.", + "self\n" + "jid the JID of the contact to cancel the subscription of\n", + "" ) { - Sluift::globals.eventLoop.runOnce(); - SluiftClient* client = getClient(L); - JID jid(Lua::checkString(L, 2)); - client->getClient()->getSubscriptionManager()->cancelSubscription(jid); - return 0; + Sluift::globals.eventLoop.runOnce(); + SluiftClient* client = getClient(L); + JID jid(Lua::checkString(L, 2)); + client->getClient()->getSubscriptionManager()->cancelSubscription(jid); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, set_disco_info, - "Sets the service discovery information for this client", - "self\n" - "disco_info A structured representation of the service discovery information\n", - "" + Client, set_disco_info, + "Sets the service discovery information for this client", + "self\n" + "disco_info A structured representation of the service discovery information\n", + "" ) { - SluiftClient* client = getClient(L); - if (!lua_istable(L, 2)) { - throw Lua::Exception("Missing disco info"); - } - if (boost::shared_ptr<DiscoInfo> discoInfo = boost::dynamic_pointer_cast<DiscoInfo>(Sluift::globals.elementConvertor.convertFromLuaUntyped(L, 2, "disco_info"))) { - client->getClient()->getDiscoManager()->setDiscoInfo(*discoInfo); - } - else { - throw Lua::Exception("Illegal disco info"); - } - return 0; + SluiftClient* client = getClient(L); + if (!lua_istable(L, 2)) { + throw Lua::Exception("Missing disco info"); + } + if (std::shared_ptr<DiscoInfo> discoInfo = std::dynamic_pointer_cast<DiscoInfo>(Sluift::globals.elementConvertor.convertFromLuaUntyped(L, 2, "disco_info"))) { + client->getClient()->getDiscoManager()->setDiscoInfo(*discoInfo); + } + else { + throw Lua::Exception("Illegal disco info"); + } + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, set_caps_node, - "Sets the caps node of this client", - "self\n" - "node The caps node (e.g. 'http://swift.im/sluift')\n", - "" + Client, set_caps_node, + "Sets the caps node of this client", + "self\n" + "node The caps node (e.g. 'http://swift.im/sluift')\n", + "" ) { - SluiftClient* client = getClient(L); - std::string node(Lua::checkString(L, 2)); - client->getClient()->getDiscoManager()->setCapsNode(Lua::checkString(L, 2)); - return 0; + SluiftClient* client = getClient(L); + std::string node(Lua::checkString(L, 2)); + client->getClient()->getDiscoManager()->setCapsNode(Lua::checkString(L, 2)); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, set_certificate, - "Sets a client certificate to use for strong authentication with the server.", - "self\n" - "file PKCS #12 file\n" - "pwd passphrase for the certificate private key\n", - "" + Client, set_certificate, + "Sets a client certificate to use for strong authentication with the server.", + "self\n" + "file PKCS #12 file\n" + "pwd passphrase for the certificate private key\n", + "" ) { - std::string file; - std::string pwd; - int index = 2; - if (!lua_isnoneornil(L, index)) { - file = Lua::checkString(L, index); - ++index; - if (!lua_isnoneornil(L, index)) { - pwd = Lua::checkString(L, index); - ++index; - } - } - if (file.empty()) { - getClient(L)->getClient()->setCertificate(CertificateWithKey::ref()); - } else { - getClient(L)->getClient()->setCertificate(boost::make_shared<PKCS12Certificate>(file, createSafeByteArray(pwd))); - } - return 0; + std::string file; + std::string pwd; + int index = 2; + if (!lua_isnoneornil(L, index)) { + file = Lua::checkString(L, index); + ++index; + if (!lua_isnoneornil(L, index)) { + pwd = Lua::checkString(L, index); + ++index; + } + } + if (file.empty()) { + getClient(L)->getClient()->setCertificate(CertificateWithKey::ref()); + } else { + getClient(L)->getClient()->setCertificate(std::make_shared<PKCS12Certificate>(file, createSafeByteArray(pwd))); + } + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Client, jid, - "Returns the JID of this client", - "self\n", - "" + Client, jid, + "Returns the JID of this client", + "self\n", + "" ) { - SluiftClient* client = getClient(L); - lua_pushstring(L, client->getClient()->getJID().toString().c_str()); - return 1; + SluiftClient* client = getClient(L); + lua_pushstring(L, client->getClient()->getJID().toString().c_str()); + return 1; } SLUIFT_LUA_FUNCTION(Client, __gc) { - SluiftClient* client = getClient(L); - delete client; - return 0; + SluiftClient* client = getClient(L); + delete client; + return 0; } diff --git a/Sluift/component.cpp b/Sluift/component.cpp index a9ac2d9..df96d43 100644 --- a/Sluift/component.cpp +++ b/Sluift/component.cpp @@ -1,30 +1,14 @@ /* - * Copyright (c) 2014-2015 Isode Limited. + * Copyright (c) 2014-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ -#include <iostream> - #include <boost/assign/list_of.hpp> #include <boost/lambda/bind.hpp> #include <boost/lambda/lambda.hpp> -#include <Sluift/ElementConvertors/IQConvertor.h> -#include <Sluift/ElementConvertors/MessageConvertor.h> -#include <Sluift/ElementConvertors/PresenceConvertor.h> -#include <Sluift/ElementConvertors/StanzaConvertor.h> -#include <Sluift/ElementConvertors/StatusShowConvertor.h> -#include <Sluift/Lua/Check.h> -#include <Sluift/Lua/Exception.h> -#include <Sluift/Lua/FunctionRegistration.h> -#include <Sluift/Lua/LuaUtils.h> -#include <Sluift/Lua/Value.h> -#include <Sluift/SluiftComponent.h> -#include <Sluift/globals.h> - #include <Swiften/Base/IDGenerator.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Elements/DiscoInfo.h> #include <Swiften/Elements/MAMQuery.h> #include <Swiften/Elements/Message.h> @@ -43,427 +27,440 @@ #include <Swiften/Roster/XMPPRoster.h> #include <Swiften/Roster/XMPPRosterItem.h> +#include <Sluift/ElementConvertors/IQConvertor.h> +#include <Sluift/ElementConvertors/MessageConvertor.h> +#include <Sluift/ElementConvertors/PresenceConvertor.h> +#include <Sluift/ElementConvertors/StanzaConvertor.h> +#include <Sluift/ElementConvertors/StatusShowConvertor.h> +#include <Sluift/Lua/Check.h> +#include <Sluift/Lua/Exception.h> +#include <Sluift/Lua/FunctionRegistration.h> +#include <Sluift/Lua/LuaUtils.h> +#include <Sluift/Lua/Value.h> +#include <Sluift/SluiftComponent.h> +#include <Sluift/globals.h> + using namespace Swift; namespace lambda = boost::lambda; static inline SluiftComponent* getComponent(lua_State* L) { - return *Lua::checkUserData<SluiftComponent>(L, 1); + return *Lua::checkUserData<SluiftComponent>(L, 1); } static inline int getGlobalTimeout(lua_State* L) { - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.moduleLibIndex); - lua_getfield(L, -1, "timeout"); - int result = boost::numeric_cast<int>(lua_tointeger(L, -1)); - lua_pop(L, 2); - return result; + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.moduleLibIndex); + lua_getfield(L, -1, "timeout"); + int result = boost::numeric_cast<int>(lua_tointeger(L, -1)); + lua_pop(L, 2); + return result; } -static void addPayloadsToTable(lua_State* L, const std::vector<boost::shared_ptr<Payload> >& payloads) { - if (!payloads.empty()) { - lua_createtable(L, boost::numeric_cast<int>(payloads.size()), 0); - for (size_t i = 0; i < payloads.size(); ++i) { - Sluift::globals.elementConvertor.convertToLua(L, payloads[i]); - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - Lua::registerGetByTypeIndex(L, -1); - lua_setfield(L, -2, "payloads"); - } +static void addPayloadsToTable(lua_State* L, const std::vector<std::shared_ptr<Payload> >& payloads) { + if (!payloads.empty()) { + lua_createtable(L, boost::numeric_cast<int>(payloads.size()), 0); + for (size_t i = 0; i < payloads.size(); ++i) { + Sluift::globals.elementConvertor.convertToLua(L, payloads[i]); + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + Lua::registerGetByTypeIndex(L, -1); + lua_setfield(L, -2, "payloads"); + } } -static boost::shared_ptr<Payload> getPayload(lua_State* L, int index) { - if (lua_type(L, index) == LUA_TTABLE) { - return boost::dynamic_pointer_cast<Payload>(Sluift::globals.elementConvertor.convertFromLua(L, index)); - } - else if (lua_type(L, index) == LUA_TSTRING) { - return boost::make_shared<RawXMLPayload>(Lua::checkString(L, index)); - } - else { - return boost::shared_ptr<Payload>(); - } +static std::shared_ptr<Payload> getPayload(lua_State* L, int index) { + if (lua_type(L, index) == LUA_TTABLE) { + return std::dynamic_pointer_cast<Payload>(Sluift::globals.elementConvertor.convertFromLua(L, index)); + } + else if (lua_type(L, index) == LUA_TSTRING) { + return std::make_shared<RawXMLPayload>(Lua::checkString(L, index)); + } + else { + return std::shared_ptr<Payload>(); + } } -static std::vector< boost::shared_ptr<Payload> > getPayloadsFromTable(lua_State* L, int index) { - index = Lua::absoluteOffset(L, index); - std::vector< boost::shared_ptr<Payload> > result; - lua_getfield(L, index, "payloads"); - if (lua_istable(L, -1)) { - for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { - boost::shared_ptr<Payload> payload = getPayload(L, -1); - if (payload) { - result.push_back(payload); - } - } - } - lua_pop(L, 1); - return result; +static std::vector< std::shared_ptr<Payload> > getPayloadsFromTable(lua_State* L, int index) { + index = Lua::absoluteOffset(L, index); + std::vector< std::shared_ptr<Payload> > result; + lua_getfield(L, index, "payloads"); + if (lua_istable(L, -1)) { + for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { + std::shared_ptr<Payload> payload = getPayload(L, -1); + if (payload) { + result.push_back(payload); + } + } + } + lua_pop(L, 1); + return result; } SLUIFT_LUA_FUNCTION(Component, async_connect) { - SluiftComponent* component = getComponent(L); - - std::string host; - int port = 0; - if (lua_istable(L, 2)) { - if (boost::optional<std::string> hostString = Lua::getStringField(L, 2, "host")) { - host = *hostString; - } - if (boost::optional<int> portInt = Lua::getIntField(L, 2, "port")) { - port = *portInt; - } - } - component->connect(host, port); - return 0; + SluiftComponent* component = getComponent(L); + + std::string host; + int port = 0; + if (lua_istable(L, 2)) { + if (boost::optional<std::string> hostString = Lua::getStringField(L, 2, "host")) { + host = *hostString; + } + if (boost::optional<int> portInt = Lua::getIntField(L, 2, "port")) { + port = *portInt; + } + } + component->connect(host, port); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Component, set_trace_enabled, - "Enable/disable tracing of the data sent/received.\n\n.", - "self\n" - "enable a boolean specifying whether to enable/disable tracing", - "" + Component, set_trace_enabled, + "Enable/disable tracing of the data sent/received.\n\n.", + "self\n" + "enable a boolean specifying whether to enable/disable tracing", + "" ) { - getComponent(L)->setTraceEnabled(lua_toboolean(L, 1)); - return 0; + getComponent(L)->setTraceEnabled(lua_toboolean(L, 1)); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Component, wait_connected, - "Block until the component is connected.\n\nThis is useful after an `async_connect`.", - "self", - "" + Component, wait_connected, + "Block until the component is connected.\n\nThis is useful after an `async_connect`.", + "self", + "" ) { - getComponent(L)->waitConnected(getGlobalTimeout(L)); - return 0; + getComponent(L)->waitConnected(getGlobalTimeout(L)); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Component, is_connected, - "Checks whether this component is still connected.\n\nReturns a boolean.", - "self\n", - "" + Component, is_connected, + "Checks whether this component is still connected.\n\nReturns a boolean.", + "self\n", + "" ) { - lua_pushboolean(L, getComponent(L)->isConnected()); - return 1; + lua_pushboolean(L, getComponent(L)->isConnected()); + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Component, disconnect, - "Disconnect from the server", - "self\n", - "" + Component, disconnect, + "Disconnect from the server", + "self\n", + "" ) { - Sluift::globals.eventLoop.runOnce(); - getComponent(L)->disconnect(); - return 0; + Sluift::globals.eventLoop.runOnce(); + getComponent(L)->disconnect(); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Component, set_version, + Component, set_version, - "Sets the published version of this component.", + "Sets the published version of this component.", - "self", + "self", - "name the name of the component software\n" - "version the version identifier of this component\n" - "os the OS this component is running on\n" + "name the name of the component software\n" + "version the version identifier of this component\n" + "os the OS this component is running on\n" ) { - Sluift::globals.eventLoop.runOnce(); - SluiftComponent* component = getComponent(L); - if (boost::shared_ptr<SoftwareVersion> version = boost::dynamic_pointer_cast<SoftwareVersion>(Sluift::globals.elementConvertor.convertFromLuaUntyped(L, 2, "software_version"))) { - component->setSoftwareVersion(version->getName(), version->getVersion(), version->getOS()); - } - return 0; + Sluift::globals.eventLoop.runOnce(); + SluiftComponent* component = getComponent(L); + if (std::shared_ptr<SoftwareVersion> version = std::dynamic_pointer_cast<SoftwareVersion>(Sluift::globals.elementConvertor.convertFromLuaUntyped(L, 2, "software_version"))) { + component->setSoftwareVersion(version->getName(), version->getVersion(), version->getOS()); + } + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Component, send_message, - "Send a message.", - "self\n" - "to the JID to send the message to\n" - "body the body of the message. Can alternatively be specified using the `body` option\n", - - "to the JID to send the message to\n" - "body the body of the message\n" - "subject the subject of the MUC room to set\n" - "type the type of message to send (`normal`, `chat`, `error`, `groupchat`, `headline`)\n" - "payloads payloads to add to the message\n" + Component, send_message, + "Send a message.", + "self\n" + "to the JID to send the message to\n" + "body the body of the message. Can alternatively be specified using the `body` option\n", + + "to the JID to send the message to\n" + "body the body of the message\n" + "subject the subject of the MUC room to set\n" + "type the type of message to send (`normal`, `chat`, `error`, `groupchat`, `headline`)\n" + "payloads payloads to add to the message\n" ) { - Sluift::globals.eventLoop.runOnce(); - JID to; - boost::optional<std::string> from; - boost::optional<std::string> body; - boost::optional<std::string> subject; - std::vector<boost::shared_ptr<Payload> > payloads; - int index = 2; - Message::Type type = Message::Chat; - if (lua_isstring(L, index)) { - to = std::string(lua_tostring(L, index)); - ++index; - if (lua_isstring(L, index)) { - body = lua_tostring(L, index); - ++index; - } - } - if (lua_istable(L, index)) { - if (boost::optional<std::string> value = Lua::getStringField(L, index, "to")) { - to = *value; - } - - if (boost::optional<std::string> value = Lua::getStringField(L, index, "from")) { - from = value; - } - - if (boost::optional<std::string> value = Lua::getStringField(L, index, "body")) { - body = value; - } - - if (boost::optional<std::string> value = Lua::getStringField(L, index, "type")) { - type = MessageConvertor::convertMessageTypeFromString(*value); - } - - if (boost::optional<std::string> value = Lua::getStringField(L, index, "subject")) { - subject = value; - } - - payloads = getPayloadsFromTable(L, index); - } - - if (!to.isValid()) { - throw Lua::Exception("Missing 'to'"); - } - if ((!body || body->empty()) && !subject && payloads.empty()) { - throw Lua::Exception("Missing any of 'body', 'subject' or 'payloads'"); - } - Message::ref message = boost::make_shared<Message>(); - message->setTo(to); - if (from && !from->empty()) { - message->setFrom(*from); - } - if (body && !body->empty()) { - message->setBody(*body); - } - if (subject) { - message->setSubject(*subject); - } - message->addPayloads(payloads.begin(), payloads.end()); - message->setType(type); - getComponent(L)->getComponent()->sendMessage(message); - return 0; + Sluift::globals.eventLoop.runOnce(); + JID to; + boost::optional<std::string> from; + boost::optional<std::string> body; + boost::optional<std::string> subject; + std::vector<std::shared_ptr<Payload> > payloads; + int index = 2; + Message::Type type = Message::Chat; + if (lua_isstring(L, index)) { + to = std::string(lua_tostring(L, index)); + ++index; + if (lua_isstring(L, index)) { + body = lua_tostring(L, index); + ++index; + } + } + if (lua_istable(L, index)) { + if (boost::optional<std::string> value = Lua::getStringField(L, index, "to")) { + to = *value; + } + + if (boost::optional<std::string> value = Lua::getStringField(L, index, "from")) { + from = value; + } + + if (boost::optional<std::string> value = Lua::getStringField(L, index, "body")) { + body = value; + } + + if (boost::optional<std::string> value = Lua::getStringField(L, index, "type")) { + type = MessageConvertor::convertMessageTypeFromString(*value); + } + + if (boost::optional<std::string> value = Lua::getStringField(L, index, "subject")) { + subject = value; + } + + payloads = getPayloadsFromTable(L, index); + } + + if (!to.isValid()) { + throw Lua::Exception("Missing 'to'"); + } + if ((!body || body->empty()) && !subject && payloads.empty()) { + throw Lua::Exception("Missing any of 'body', 'subject' or 'payloads'"); + } + Message::ref message = std::make_shared<Message>(); + message->setTo(to); + if (from && !from->empty()) { + message->setFrom(*from); + } + if (body && !body->empty()) { + message->setBody(*body); + } + if (subject) { + message->setSubject(*subject); + } + message->addPayloads(payloads.begin(), payloads.end()); + message->setType(type); + getComponent(L)->getComponent()->sendMessage(message); + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Component, send_presence, - "Send presence.", - - "self\n" - "body the text of the presence. Can alternatively be specified using the `status` option\n", - - "to the JID to send the message to\n" - "from the JID to send the message from\n" - "status the text of the presence\n" - "show the availability of the presence (`online`, `ffc`, `away`, `xa`, `dnd`)\n" - "priority the priority of the presence\n" - "type the type of message to send (`available`, `error`, `probe`, `subscribe`, `subscribed`, `unavailable`, `unsubscribe`, `unsubscribed`)\n" - "payloads payloads to add to the presence\n" + Component, send_presence, + "Send presence.", + + "self\n" + "body the text of the presence. Can alternatively be specified using the `status` option\n", + + "to the JID to send the message to\n" + "from the JID to send the message from\n" + "status the text of the presence\n" + "show the availability of the presence (`online`, `ffc`, `away`, `xa`, `dnd`)\n" + "priority the priority of the presence\n" + "type the type of message to send (`available`, `error`, `probe`, `subscribe`, `subscribed`, `unavailable`, `unsubscribe`, `unsubscribed`)\n" + "payloads payloads to add to the presence\n" ) { - Sluift::globals.eventLoop.runOnce(); - boost::shared_ptr<Presence> presence = boost::make_shared<Presence>(); - - int index = 2; - if (lua_isstring(L, index)) { - presence->setStatus(lua_tostring(L, index)); - ++index; - } - if (lua_istable(L, index)) { - if (boost::optional<std::string> value = Lua::getStringField(L, index, "to")) { - presence->setTo(*value); - } - if (boost::optional<std::string> value = Lua::getStringField(L, index, "from")) { - presence->setFrom(*value); - } - if (boost::optional<std::string> value = Lua::getStringField(L, index, "status")) { - presence->setStatus(*value); - } - if (boost::optional<int> value = Lua::getIntField(L, index, "priority")) { - presence->setPriority(*value); - } - if (boost::optional<std::string> value = Lua::getStringField(L, index, "type")) { - presence->setType(PresenceConvertor::convertPresenceTypeFromString(*value)); - } - if (boost::optional<std::string> value = Lua::getStringField(L, index, "show")) { - presence->setShow(StatusShowConvertor::convertStatusShowTypeFromString(*value)); - } - std::vector< boost::shared_ptr<Payload> > payloads = getPayloadsFromTable(L, index); - presence->addPayloads(payloads.begin(), payloads.end()); - } - - getComponent(L)->getComponent()->sendPresence(presence); - lua_pushvalue(L, 1); - return 0; + Sluift::globals.eventLoop.runOnce(); + std::shared_ptr<Presence> presence = std::make_shared<Presence>(); + + int index = 2; + if (lua_isstring(L, index)) { + presence->setStatus(lua_tostring(L, index)); + ++index; + } + if (lua_istable(L, index)) { + if (boost::optional<std::string> value = Lua::getStringField(L, index, "to")) { + presence->setTo(*value); + } + if (boost::optional<std::string> value = Lua::getStringField(L, index, "from")) { + presence->setFrom(*value); + } + if (boost::optional<std::string> value = Lua::getStringField(L, index, "status")) { + presence->setStatus(*value); + } + if (boost::optional<int> value = Lua::getIntField(L, index, "priority")) { + presence->setPriority(*value); + } + if (boost::optional<std::string> value = Lua::getStringField(L, index, "type")) { + presence->setType(PresenceConvertor::convertPresenceTypeFromString(*value)); + } + if (boost::optional<std::string> value = Lua::getStringField(L, index, "show")) { + presence->setShow(StatusShowConvertor::convertStatusShowTypeFromString(*value)); + } + std::vector< std::shared_ptr<Payload> > payloads = getPayloadsFromTable(L, index); + presence->addPayloads(payloads.begin(), payloads.end()); + } + + getComponent(L)->getComponent()->sendPresence(presence); + lua_pushvalue(L, 1); + return 0; } static int sendQuery(lua_State* L, IQ::Type type) { - SluiftComponent* component = getComponent(L); - - JID to; - if (boost::optional<std::string> toString = Lua::getStringField(L, 2, "to")) { - to = JID(*toString); - } - - JID from; - if (boost::optional<std::string> fromString = Lua::getStringField(L, 2, "from")) { - from = JID(*fromString); - } - - int timeout = getGlobalTimeout(L); - if (boost::optional<int> timeoutInt = Lua::getIntField(L, 2, "timeout")) { - timeout = *timeoutInt; - } - - boost::shared_ptr<Payload> payload; - lua_getfield(L, 2, "query"); - payload = getPayload(L, -1); - lua_pop(L, 1); - - return component->sendRequest( - boost::make_shared< GenericRequest<Payload> >(type, from, to, payload, component->getComponent()->getIQRouter()), timeout).convertToLuaResult(L); + SluiftComponent* component = getComponent(L); + + JID to; + if (boost::optional<std::string> toString = Lua::getStringField(L, 2, "to")) { + to = JID(*toString); + } + + JID from; + if (boost::optional<std::string> fromString = Lua::getStringField(L, 2, "from")) { + from = JID(*fromString); + } + + int timeout = getGlobalTimeout(L); + if (boost::optional<int> timeoutInt = Lua::getIntField(L, 2, "timeout")) { + timeout = *timeoutInt; + } + + std::shared_ptr<Payload> payload; + lua_getfield(L, 2, "query"); + payload = getPayload(L, -1); + lua_pop(L, 1); + + return component->sendRequest( + std::make_shared< GenericRequest<Payload> >(type, from, to, payload, component->getComponent()->getIQRouter()), timeout).convertToLuaResult(L); } SLUIFT_LUA_FUNCTION(Component, get) { - return sendQuery(L, IQ::Get); + return sendQuery(L, IQ::Get); } SLUIFT_LUA_FUNCTION(Component, set) { - return sendQuery(L, IQ::Set); + return sendQuery(L, IQ::Set); } SLUIFT_LUA_FUNCTION_WITH_HELP( - Component, send, - "Sends a raw string", + Component, send, + "Sends a raw string", - "self\n" - "data the string to send\n", + "self\n" + "data the string to send\n", - "" + "" ) { - Sluift::globals.eventLoop.runOnce(); + Sluift::globals.eventLoop.runOnce(); - getComponent(L)->getComponent()->sendData(std::string(Lua::checkString(L, 2))); - lua_pushvalue(L, 1); - return 0; + getComponent(L)->getComponent()->sendData(std::string(Lua::checkString(L, 2))); + lua_pushvalue(L, 1); + return 0; } static void pushEvent(lua_State* L, const SluiftComponent::Event& event) { - switch (event.type) { - case SluiftComponent::Event::MessageType: { - Message::ref message = boost::dynamic_pointer_cast<Message>(event.stanza); - Lua::Table result = boost::assign::map_list_of - ("type", boost::make_shared<Lua::Value>(std::string("message"))) - ("from", boost::make_shared<Lua::Value>(message->getFrom().toString())) - ("to", boost::make_shared<Lua::Value>(message->getTo().toString())) - ("body", boost::make_shared<Lua::Value>(message->getBody().get_value_or(""))) - ("message_type", boost::make_shared<Lua::Value>(MessageConvertor::convertMessageTypeToString(message->getType()))); - Lua::pushValue(L, result); - addPayloadsToTable(L, message->getPayloads()); - Lua::registerTableToString(L, -1); - break; - } - case SluiftComponent::Event::PresenceType: { - Presence::ref presence = boost::dynamic_pointer_cast<Presence>(event.stanza); - Lua::Table result = boost::assign::map_list_of - ("type", boost::make_shared<Lua::Value>(std::string("presence"))) - ("from", boost::make_shared<Lua::Value>(presence->getFrom().toString())) - ("to", boost::make_shared<Lua::Value>(presence->getTo().toString())) - ("status", boost::make_shared<Lua::Value>(presence->getStatus())) - ("presence_type", boost::make_shared<Lua::Value>(PresenceConvertor::convertPresenceTypeToString(presence->getType()))); - Lua::pushValue(L, result); - addPayloadsToTable(L, presence->getPayloads()); - Lua::registerTableToString(L, -1); - break; - } - } + switch (event.type) { + case SluiftComponent::Event::MessageType: { + Message::ref message = std::dynamic_pointer_cast<Message>(event.stanza); + Lua::Table result = boost::assign::map_list_of + ("type", std::make_shared<Lua::Value>(std::string("message"))) + ("from", std::make_shared<Lua::Value>(message->getFrom().toString())) + ("to", std::make_shared<Lua::Value>(message->getTo().toString())) + ("body", std::make_shared<Lua::Value>(message->getBody().get_value_or(""))) + ("message_type", std::make_shared<Lua::Value>(MessageConvertor::convertMessageTypeToString(message->getType()))); + Lua::pushValue(L, result); + addPayloadsToTable(L, message->getPayloads()); + Lua::registerTableToString(L, -1); + break; + } + case SluiftComponent::Event::PresenceType: { + Presence::ref presence = std::dynamic_pointer_cast<Presence>(event.stanza); + Lua::Table result = boost::assign::map_list_of + ("type", std::make_shared<Lua::Value>(std::string("presence"))) + ("from", std::make_shared<Lua::Value>(presence->getFrom().toString())) + ("to", std::make_shared<Lua::Value>(presence->getTo().toString())) + ("status", std::make_shared<Lua::Value>(presence->getStatus())) + ("presence_type", std::make_shared<Lua::Value>(PresenceConvertor::convertPresenceTypeToString(presence->getType()))); + Lua::pushValue(L, result); + addPayloadsToTable(L, presence->getPayloads()); + Lua::registerTableToString(L, -1); + break; + } + } } struct CallUnaryLuaPredicateOnEvent { - CallUnaryLuaPredicateOnEvent(lua_State* L, int index) : L(L), index(index) { - } - - bool operator()(const SluiftComponent::Event& event) { - lua_pushvalue(L, index); - pushEvent(L, event); - if (lua_pcall(L, 1, 1, 0) != 0) { - throw Lua::Exception(lua_tostring(L, -1)); - } - bool result = lua_toboolean(L, -1); - lua_pop(L, 1); - return result; - } - - lua_State* L; - int index; + CallUnaryLuaPredicateOnEvent(lua_State* L, int index) : L(L), index(index) { + } + + bool operator()(const SluiftComponent::Event& event) { + lua_pushvalue(L, index); + pushEvent(L, event); + if (lua_pcall(L, 1, 1, 0) != 0) { + throw Lua::Exception(lua_tostring(L, -1)); + } + bool result = lua_toboolean(L, -1); + lua_pop(L, 1); + return result; + } + + lua_State* L; + int index; }; SLUIFT_LUA_FUNCTION(Component, get_next_event) { - Sluift::globals.eventLoop.runOnce(); - SluiftComponent* component = getComponent(L); - - int timeout = getGlobalTimeout(L); - boost::optional<SluiftComponent::Event::Type> type; - int condition = 0; - if (lua_istable(L, 2)) { - if (boost::optional<std::string> typeString = Lua::getStringField(L, 2, "type")) { - if (*typeString == "message") { - type = SluiftComponent::Event::MessageType; - } - else if (*typeString == "presence") { - type = SluiftComponent::Event::PresenceType; - } - } - if (boost::optional<int> timeoutInt = Lua::getIntField(L, 2, "timeout")) { - timeout = *timeoutInt; - } - lua_getfield(L, 2, "if"); - if (lua_isfunction(L, -1)) { - condition = Lua::absoluteOffset(L, -1); - } - } - - boost::optional<SluiftComponent::Event> event; - if (condition) { - event = component->getNextEvent(timeout, CallUnaryLuaPredicateOnEvent(L, condition)); - } - else if (type) { - event = component->getNextEvent( - timeout, lambda::bind(&SluiftComponent::Event::type, lambda::_1) == *type); - } - else { - event = component->getNextEvent(timeout); - } - - if (event) { - pushEvent(L, *event); - } - else { - lua_pushnil(L); - } - return 1; + Sluift::globals.eventLoop.runOnce(); + SluiftComponent* component = getComponent(L); + + int timeout = getGlobalTimeout(L); + boost::optional<SluiftComponent::Event::Type> type; + int condition = 0; + if (lua_istable(L, 2)) { + if (boost::optional<std::string> typeString = Lua::getStringField(L, 2, "type")) { + if (*typeString == "message") { + type = SluiftComponent::Event::MessageType; + } + else if (*typeString == "presence") { + type = SluiftComponent::Event::PresenceType; + } + } + if (boost::optional<int> timeoutInt = Lua::getIntField(L, 2, "timeout")) { + timeout = *timeoutInt; + } + lua_getfield(L, 2, "if"); + if (lua_isfunction(L, -1)) { + condition = Lua::absoluteOffset(L, -1); + } + } + + boost::optional<SluiftComponent::Event> event; + if (condition) { + event = component->getNextEvent(timeout, CallUnaryLuaPredicateOnEvent(L, condition)); + } + else if (type) { + event = component->getNextEvent( + timeout, lambda::bind(&SluiftComponent::Event::type, lambda::_1) == *type); + } + else { + event = component->getNextEvent(timeout); + } + + if (event) { + pushEvent(L, *event); + } + else { + lua_pushnil(L); + } + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Component, jid, - "Returns the JID of this component", - "self\n", - "" + Component, jid, + "Returns the JID of this component", + "self\n", + "" ) { - SluiftComponent* component = getComponent(L); - lua_pushstring(L, component->getComponent()->getJID().toString().c_str()); - return 1; + SluiftComponent* component = getComponent(L); + lua_pushstring(L, component->getComponent()->getJID().toString().c_str()); + return 1; } SLUIFT_LUA_FUNCTION(Component, __gc) { - SluiftComponent* component = getComponent(L); - delete component; - return 0; + SluiftComponent* component = getComponent(L); + delete component; + return 0; } diff --git a/Sluift/globals.h b/Sluift/globals.h index e414eb0..f92beeb 100644 --- a/Sluift/globals.h +++ b/Sluift/globals.h @@ -9,7 +9,7 @@ #include <Sluift/SluiftGlobals.h> namespace Swift { - namespace Sluift { - extern SluiftGlobals globals; - } + namespace Sluift { + extern SluiftGlobals globals; + } } diff --git a/Sluift/main.cpp b/Sluift/main.cpp index 425f7fa..65d6d60 100644 --- a/Sluift/main.cpp +++ b/Sluift/main.cpp @@ -1,20 +1,24 @@ /* - * Copyright (c) 2013-2014 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ +#include <iostream> #include <string> #include <vector> -#include <lua.hpp> -#include <Swiften/Base/foreach.h> -#include <Swiften/Base/Platform.h> + +#include <boost/assign/list_of.hpp> +#include <boost/numeric/conversion/cast.hpp> +#include <boost/program_options.hpp> #include <boost/program_options/options_description.hpp> #include <boost/program_options/variables_map.hpp> -#include <boost/program_options.hpp> #include <boost/version.hpp> -#include <boost/numeric/conversion/cast.hpp> -#include <boost/assign/list_of.hpp> + +#include <lua.hpp> + +#include <Swiften/Base/Platform.h> + #include <Sluift/globals.h> #include <Sluift/Console.h> #include <Sluift/StandardTerminal.h> @@ -34,155 +38,155 @@ using namespace Swift; #endif static const std::string SLUIFT_WELCOME_STRING( - "== Sluift XMPP Console (" SLUIFT_VERSION_STRING ")\nPress Ctrl-" EXIT_KEY " to exit. Type help() for help."); + "== Sluift XMPP Console (" SLUIFT_VERSION_STRING ")\nPress Ctrl-" EXIT_KEY " to exit. Type help() for help."); static const luaL_Reg defaultLibraries[] = { - {"", luaopen_base}, - {LUA_LOADLIBNAME, luaopen_package}, - {LUA_TABLIBNAME, luaopen_table}, - {LUA_IOLIBNAME, luaopen_io}, - {LUA_OSLIBNAME, luaopen_os}, - {LUA_STRLIBNAME, luaopen_string}, - {LUA_MATHLIBNAME, luaopen_math}, - {LUA_DBLIBNAME, luaopen_debug}, - {"sluift", luaopen_sluift}, - {NULL, NULL} + {"", luaopen_base}, + {LUA_LOADLIBNAME, luaopen_package}, + {LUA_TABLIBNAME, luaopen_table}, + {LUA_IOLIBNAME, luaopen_io}, + {LUA_OSLIBNAME, luaopen_os}, + {LUA_STRLIBNAME, luaopen_string}, + {LUA_MATHLIBNAME, luaopen_math}, + {LUA_DBLIBNAME, luaopen_debug}, + {"sluift", luaopen_sluift}, + {nullptr, nullptr} }; static void handleInterruptSignal(int) { - Sluift::globals.interruptRequested = 1; + Sluift::globals.interruptRequested = 1; } static void checkResult(lua_State* L, int result) { - if (result && !lua_isnil(L, -1)) { - const char* errorMessage = lua_tostring(L, -1); - throw std::runtime_error(errorMessage ? errorMessage : "Unknown error"); - } + if (result && !lua_isnil(L, -1)) { + const char* errorMessage = lua_tostring(L, -1); + throw std::runtime_error(errorMessage ? errorMessage : "Unknown error"); + } } static void initialize(lua_State* L) { - lua_gc(L, LUA_GCSTOP, 0); - for (const luaL_Reg* lib = defaultLibraries; lib->func; lib++) { + lua_gc(L, LUA_GCSTOP, 0); + for (const luaL_Reg* lib = defaultLibraries; lib->func; lib++) { #if LUA_VERSION_NUM >= 502 - luaL_requiref(L, lib->name, lib->func, 1); - lua_pop(L, 1); + luaL_requiref(L, lib->name, lib->func, 1); + lua_pop(L, 1); #else - lua_pushcfunction(L, lib->func); - lua_pushstring(L, lib->name); - lua_call(L, 1, 0); + lua_pushcfunction(L, lib->func); + lua_pushstring(L, lib->name); + lua_call(L, 1, 0); #endif - } - lua_gc(L, LUA_GCRESTART, 0); + } + lua_gc(L, LUA_GCRESTART, 0); } static void runScript(lua_State* L, const std::string& script, const std::vector<std::string>& scriptArguments) { - // Create arguments table - lua_createtable(L, boost::numeric_cast<int>(scriptArguments.size()), 0); - for (size_t i = 0; i < scriptArguments.size(); ++i) { - lua_pushstring(L, scriptArguments[i].c_str()); - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - lua_setglobal(L, "arg"); - - // Load file - checkResult(L, luaL_loadfile(L, script.c_str())); - foreach (const std::string& scriptArgument, scriptArguments) { - lua_pushstring(L, scriptArgument.c_str()); - } - checkResult(L, Console::call(L, boost::numeric_cast<int>(scriptArguments.size()), false)); + // Create arguments table + lua_createtable(L, boost::numeric_cast<int>(scriptArguments.size()), 0); + for (size_t i = 0; i < scriptArguments.size(); ++i) { + lua_pushstring(L, scriptArguments[i].c_str()); + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + lua_setglobal(L, "arg"); + + // Load file + checkResult(L, luaL_loadfile(L, script.c_str())); + for (const auto& scriptArgument : scriptArguments) { + lua_pushstring(L, scriptArgument.c_str()); + } + checkResult(L, Console::call(L, boost::numeric_cast<int>(scriptArguments.size()), false)); } int main(int argc, char* argv[]) { - // Parse program options - boost::program_options::options_description visibleOptions("Options"); - visibleOptions.add_options() - ("help,h", "Display this help message") - ("version,v", "Display version information") - ("interactive,i", "Enter interactive mode after executing script") - ; - boost::program_options::options_description hiddenOptions("Hidden Options"); - hiddenOptions.add_options() - ("script", boost::program_options::value< std::string >(), "Script to be executed") - ("script-arguments", boost::program_options::value< std::vector<std::string> >(), "Script arguments") - ; - boost::program_options::options_description options("All Options"); - options.add(visibleOptions).add(hiddenOptions); - - boost::program_options::positional_options_description positional_options; - positional_options.add("script", 1).add("script-arguments", -1); - - boost::program_options::variables_map arguments; - try { - boost::program_options::store( - boost::program_options::command_line_parser(argc, argv) - .options(options) - .positional(positional_options).run(), arguments); - } - catch (const boost::program_options::unknown_option& option) { + // Parse program options + boost::program_options::options_description visibleOptions("Options"); + visibleOptions.add_options() + ("help,h", "Display this help message") + ("version,v", "Display version information") + ("interactive,i", "Enter interactive mode after executing script") + ; + boost::program_options::options_description hiddenOptions("Hidden Options"); + hiddenOptions.add_options() + ("script", boost::program_options::value< std::string >(), "Script to be executed") + ("script-arguments", boost::program_options::value< std::vector<std::string> >(), "Script arguments") + ; + boost::program_options::options_description options("All Options"); + options.add(visibleOptions).add(hiddenOptions); + + boost::program_options::positional_options_description positional_options; + positional_options.add("script", 1).add("script-arguments", -1); + + boost::program_options::variables_map arguments; + try { + boost::program_options::store( + boost::program_options::command_line_parser(argc, argv) + .options(options) + .positional(positional_options).run(), arguments); + } + catch (const boost::program_options::unknown_option& option) { #if BOOST_VERSION >= 104200 - std::cout << "Ignoring unknown option " << option.get_option_name() << " but continuing." << std::endl; + std::cout << "Ignoring unknown option " << option.get_option_name() << " but continuing." << std::endl; #else - std::cout << "Error: " << option.what() << " (continuing)" << std::endl; + std::cout << "Error: " << option.what() << " (continuing)" << std::endl; #endif - } - catch (const std::exception& e) { - std::cout << "Error: " << e.what() << std::endl; - return -1; - } - boost::program_options::notify(arguments); - - // Help & version - if (arguments.count("help")) { - std::cout << visibleOptions << "\n"; - return 0; - } - else if (arguments.count("version")) { - std::cout << SLUIFT_VERSION_STRING; - return 0; - } - - lua_State* L = luaL_newstate(); - initialize(L); - try { - // Run script - if (arguments.count("script")) { - std::vector<std::string> scriptArguments; - if (arguments.count("script-arguments")) { - scriptArguments = arguments["script-arguments"].as< std::vector<std::string> >(); - } - runScript(L, arguments["script"].as<std::string>(), scriptArguments); - } - - // Run console - if (arguments.count("interactive") || arguments.count("script") == 0) { - // Set up signal handler - signal(SIGINT, handleInterruptSignal); - - // Import some useful functions into the global namespace - lua_getglobal(L, "sluift"); - std::vector<std::string> globalImports = boost::assign::list_of - ("help")("with"); - foreach (const std::string& globalImport, globalImports) { - lua_getfield(L, -1, globalImport.c_str()); - lua_setglobal(L, globalImport.c_str()); - } - lua_pop(L, 1); - - std::cout << SLUIFT_WELCOME_STRING << std::endl; + } + catch (const std::exception& e) { + std::cout << "Error: " << e.what() << std::endl; + return -1; + } + boost::program_options::notify(arguments); + + // Help & version + if (arguments.count("help")) { + std::cout << visibleOptions << "\n"; + return 0; + } + else if (arguments.count("version")) { + std::cout << SLUIFT_VERSION_STRING; + return 0; + } + + lua_State* L = luaL_newstate(); + initialize(L); + try { + // Run script + if (arguments.count("script")) { + std::vector<std::string> scriptArguments; + if (arguments.count("script-arguments")) { + scriptArguments = arguments["script-arguments"].as< std::vector<std::string> >(); + } + runScript(L, arguments["script"].as<std::string>(), scriptArguments); + } + + // Run console + if (arguments.count("interactive") || arguments.count("script") == 0) { + // Set up signal handler + signal(SIGINT, handleInterruptSignal); + + // Import some useful functions into the global namespace + lua_getglobal(L, "sluift"); + std::vector<std::string> globalImports = boost::assign::list_of + ("help")("with"); + for (const auto& globalImport : globalImports) { + lua_getfield(L, -1, globalImport.c_str()); + lua_setglobal(L, globalImport.c_str()); + } + lua_pop(L, 1); + + std::cout << SLUIFT_WELCOME_STRING << std::endl; #ifdef HAVE_EDITLINE - EditlineTerminal& terminal = EditlineTerminal::getInstance(); + EditlineTerminal& terminal = EditlineTerminal::getInstance(); #else - StandardTerminal terminal; + StandardTerminal terminal; #endif - Console console(L, &terminal); - console.run(); - } - } - catch (const std::exception& e) { - std::cerr << e.what() << std::endl; - lua_close(L); - return -1; - } - lua_close(L); - return 0; + Console console(L, &terminal); + console.run(); + } + } + catch (const std::exception& e) { + std::cerr << e.what() << std::endl; + lua_close(L); + return -1; + } + lua_close(L); + return 0; } diff --git a/Sluift/sluift.cpp b/Sluift/sluift.cpp index 7a40270..561f404 100644 --- a/Sluift/sluift.cpp +++ b/Sluift/sluift.cpp @@ -1,61 +1,62 @@ /* - * Copyright (c) 2011-2014 Isode Limited. + * Copyright (c) 2011-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/sluift.h> -#include <lua.hpp> - #include <string> -#include <boost/bind.hpp> -#include <boost/numeric/conversion/cast.hpp> + #include <boost/assign/list_of.hpp> +#include <boost/bind.hpp> #include <boost/filesystem.hpp> +#include <boost/numeric/conversion/cast.hpp> + +#include <lua.hpp> -#include "Watchdog.h" -#include <Sluift/Lua/Check.h> -#include <Sluift/SluiftClient.h> -#include <Sluift/SluiftComponent.h> -#include <Sluift/globals.h> -#include <Sluift/Lua/Exception.h> -#include <Sluift/Lua/LuaUtils.h> -#include <Sluift/Lua/FunctionRegistration.h> -#include <Swiften/Base/sleep.h> -#include <Swiften/Base/foreach.h> #include <Swiften/Base/IDGenerator.h> +#include <Swiften/Base/sleep.h> +#include <Swiften/Crypto/CryptoProvider.h> +#include <Swiften/Crypto/PlatformCryptoProvider.h> +#include <Swiften/IDN/IDNConverter.h> #include <Swiften/Parser/PayloadParsers/UnitTest/PayloadsParserTester.h> -#include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h> #include <Swiften/Serializer/PayloadSerializer.h> -#include <Swiften/TLS/Certificate.h> -#include <Swiften/TLS/CertificateFactory.h> -#include <Sluift/LuaElementConvertor.h> -#include <Sluift/Lua/Debug.h> +#include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h> #include <Swiften/StringCodecs/Base64.h> #include <Swiften/StringCodecs/Hexify.h> -#include <Swiften/IDN/IDNConverter.h> -#include <Swiften/Crypto/CryptoProvider.h> -#include <Swiften/Crypto/PlatformCryptoProvider.h> +#include <Swiften/TLS/Certificate.h> +#include <Swiften/TLS/CertificateFactory.h> + #include <Sluift/ITunesInterface.h> +#include <Sluift/Lua/Check.h> +#include <Sluift/Lua/Debug.h> +#include <Sluift/Lua/Exception.h> +#include <Sluift/Lua/FunctionRegistration.h> +#include <Sluift/Lua/LuaUtils.h> +#include <Sluift/LuaElementConvertor.h> +#include <Sluift/SluiftClient.h> +#include <Sluift/SluiftComponent.h> +#include <Sluift/Watchdog.h> +#include <Sluift/globals.h> using namespace Swift; namespace Swift { - namespace Sluift { - SluiftGlobals globals; - } + namespace Sluift { + SluiftGlobals globals; + } } extern "C" const char core_lua[]; extern "C" size_t core_lua_size; static inline bool getGlobalDebug(lua_State* L) { - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.moduleLibIndex); - lua_getfield(L, -1, "debug"); - int result = lua_toboolean(L, -1); - lua_pop(L, 2); - return result; + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.moduleLibIndex); + lua_getfield(L, -1, "debug"); + int result = lua_toboolean(L, -1); + lua_pop(L, 2); + return result; } @@ -64,157 +65,157 @@ static inline bool getGlobalDebug(lua_State* L) { ******************************************************************************/ SLUIFT_LUA_FUNCTION_WITH_HELP( - Sluift, new_client, + Sluift, new_client, - "Creates a new client.\n\nReturns a @{Client} object.\n", + "Creates a new client.\n\nReturns a @{Client} object.\n", - "jid The JID to connect as\n" - "passphrase The passphrase to use\n", + "jid The JID to connect as\n" + "passphrase The passphrase to use\n", - "" + "" ) { - Lua::checkString(L, 1); - JID jid(std::string(Lua::checkString(L, 1))); - std::string password(Lua::checkString(L, 2)); + Lua::checkString(L, 1); + JID jid(std::string(Lua::checkString(L, 1))); + std::string password(Lua::checkString(L, 2)); - SluiftClient** client = reinterpret_cast<SluiftClient**>(lua_newuserdata(L, sizeof(SluiftClient*))); + SluiftClient** client = reinterpret_cast<SluiftClient**>(lua_newuserdata(L, sizeof(SluiftClient*))); - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - lua_getfield(L, -1, "Client"); - lua_setmetatable(L, -3); - lua_pop(L, 1); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + lua_getfield(L, -1, "Client"); + lua_setmetatable(L, -3); + lua_pop(L, 1); - *client = new SluiftClient(jid, password, &Sluift::globals.networkFactories, &Sluift::globals.eventLoop); - (*client)->setTraceEnabled(getGlobalDebug(L)); - return 1; + *client = new SluiftClient(jid, password, &Sluift::globals.networkFactories, &Sluift::globals.eventLoop); + (*client)->setTraceEnabled(getGlobalDebug(L)); + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Sluift, new_component, + Sluift, new_component, - "Creates a new component.\n\nReturns a @{Component} object.\n", + "Creates a new component.\n\nReturns a @{Component} object.\n", - "jid The JID to connect as\n" - "passphrase The passphrase to use\n", + "jid The JID to connect as\n" + "passphrase The passphrase to use\n", - "" + "" ) { - Lua::checkString(L, 1); - JID jid(std::string(Lua::checkString(L, 1))); - std::string password(Lua::checkString(L, 2)); + Lua::checkString(L, 1); + JID jid(std::string(Lua::checkString(L, 1))); + std::string password(Lua::checkString(L, 2)); - SluiftComponent** component = reinterpret_cast<SluiftComponent**>(lua_newuserdata(L, sizeof(SluiftComponent*))); + SluiftComponent** component = reinterpret_cast<SluiftComponent**>(lua_newuserdata(L, sizeof(SluiftComponent*))); - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - lua_getfield(L, -1, "Component"); - lua_setmetatable(L, -3); - lua_pop(L, 1); + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + lua_getfield(L, -1, "Component"); + lua_setmetatable(L, -3); + lua_pop(L, 1); - *component = new SluiftComponent(jid, password, &Sluift::globals.networkFactories, &Sluift::globals.eventLoop); - (*component)->setTraceEnabled(getGlobalDebug(L)); - return 1; + *component = new SluiftComponent(jid, password, &Sluift::globals.networkFactories, &Sluift::globals.eventLoop); + (*component)->setTraceEnabled(getGlobalDebug(L)); + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Sluift, sha1, - "Compute the SHA-1 hash of given data", - "data the data to hash", - "" + Sluift, sha1, + "Compute the SHA-1 hash of given data", + "data the data to hash", + "" ) { - static boost::shared_ptr<CryptoProvider> crypto(PlatformCryptoProvider::create()); - if (!lua_isstring(L, 1)) { - throw Lua::Exception("Expected string"); - } - size_t len; - const char* data = lua_tolstring(L, 1, &len); - ByteArray result = crypto->getSHA1Hash(createByteArray(data, len)); - lua_pushlstring(L, reinterpret_cast<char*>(vecptr(result)), result.size()); - return 1; + static std::shared_ptr<CryptoProvider> crypto(PlatformCryptoProvider::create()); + if (!lua_isstring(L, 1)) { + throw Lua::Exception("Expected string"); + } + size_t len; + const char* data = lua_tolstring(L, 1, &len); + ByteArray result = crypto->getSHA1Hash(createByteArray(data, len)); + lua_pushlstring(L, reinterpret_cast<char*>(vecptr(result)), result.size()); + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Sluift, sleep, - "Sleeps for the given time.", - "milliseconds the amount of milliseconds to sleep", - "" + Sluift, sleep, + "Sleeps for the given time.", + "milliseconds the amount of milliseconds to sleep", + "" ) { - Sluift::globals.eventLoop.runOnce(); - int timeout = Lua::checkIntNumber(L, 1); - Watchdog watchdog(timeout, Sluift::globals.networkFactories.getTimerFactory()); - while (!watchdog.getTimedOut()) { - Swift::sleep(boost::numeric_cast<unsigned int>(std::min(100, timeout))); - Sluift::globals.eventLoop.runOnce(); - } - return 0; + Sluift::globals.eventLoop.runOnce(); + int timeout = Lua::checkIntNumber(L, 1); + Watchdog watchdog(timeout, Sluift::globals.networkFactories.getTimerFactory()); + while (!watchdog.getTimedOut()) { + Swift::sleep(boost::numeric_cast<unsigned int>(std::min(100, timeout))); + Sluift::globals.eventLoop.runOnce(); + } + return 0; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Sluift, new_uuid, - "Generates a new UUID", "", "" + Sluift, new_uuid, + "Generates a new UUID", "", "" ) { - lua_pushstring(L, IDGenerator().generateID().c_str()); - return 1; + lua_pushstring(L, IDGenerator().generateID().c_str()); + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Sluift, from_xml, - "Convert a raw XML string into a structured representation.", - "string the string to convert", - "" + Sluift, from_xml, + "Convert a raw XML string into a structured representation.", + "string the string to convert", + "" ) { - PayloadsParserTester parser; - if (!parser.parse(Lua::checkString(L, 1))) { - throw Lua::Exception("Error in XML"); - } - return Sluift::globals.elementConvertor.convertToLua(L, parser.getPayload()); + PayloadsParserTester parser; + if (!parser.parse(Lua::checkString(L, 1))) { + throw Lua::Exception("Error in XML"); + } + return Sluift::globals.elementConvertor.convertToLua(L, parser.getPayload()); } SLUIFT_LUA_FUNCTION_WITH_HELP( - Sluift, to_xml, - "Convert a structured element into XML.", - "element the element to convert", - "" + Sluift, to_xml, + "Convert a structured element into XML.", + "element the element to convert", + "" ) { - static FullPayloadSerializerCollection serializers; - boost::shared_ptr<Payload> payload = boost::dynamic_pointer_cast<Payload>(Sluift::globals.elementConvertor.convertFromLua(L, 1)); - if (!payload) { - throw Lua::Exception("Unrecognized XML"); - } - PayloadSerializer* serializer = serializers.getPayloadSerializer(payload); - if (!payload) { - throw Lua::Exception("Unrecognized XML"); - } - lua_pushstring(L, serializer->serialize(payload).c_str()); - return 1; + static FullPayloadSerializerCollection serializers; + std::shared_ptr<Payload> payload = std::dynamic_pointer_cast<Payload>(Sluift::globals.elementConvertor.convertFromLua(L, 1)); + if (!payload) { + throw Lua::Exception("Unrecognized XML"); + } + PayloadSerializer* serializer = serializers.getPayloadSerializer(payload); + if (!payload) { + throw Lua::Exception("Unrecognized XML"); + } + lua_pushstring(L, serializer->serialize(payload).c_str()); + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Sluift, hexify, - "Convert binary data into hexadecimal format.", - "data the data to convert", - "" + Sluift, hexify, + "Convert binary data into hexadecimal format.", + "data the data to convert", + "" ) { - if (!lua_isstring(L, 1)) { - throw Lua::Exception("Expected string"); - } - size_t len; - const char* data = lua_tolstring(L, 1, &len); - lua_pushstring(L, Hexify::hexify(createByteArray(data, len)).c_str()); - return 1; + if (!lua_isstring(L, 1)) { + throw Lua::Exception("Expected string"); + } + size_t len; + const char* data = lua_tolstring(L, 1, &len); + lua_pushstring(L, Hexify::hexify(createByteArray(data, len)).c_str()); + return 1; } SLUIFT_LUA_FUNCTION_WITH_HELP( - Sluift, unhexify, - "Convert hexadecimal data into binary data.", - "data the data in hexadecimal format", - "" + Sluift, unhexify, + "Convert hexadecimal data into binary data.", + "data the data in hexadecimal format", + "" ) { - if (!lua_isstring(L, 1)) { - throw Lua::Exception("Expected string"); - } - ByteArray result = Hexify::unhexify(lua_tostring(L, 1)); - lua_pushlstring(L, reinterpret_cast<char*>(vecptr(result)), result.size()); - return 1; + if (!lua_isstring(L, 1)) { + throw Lua::Exception("Expected string"); + } + ByteArray result = Hexify::unhexify(lua_tostring(L, 1)); + lua_pushlstring(L, reinterpret_cast<char*>(vecptr(result)), result.size()); + return 1; } /******************************************************************************* @@ -222,34 +223,34 @@ SLUIFT_LUA_FUNCTION_WITH_HELP( ******************************************************************************/ SLUIFT_LUA_FUNCTION_WITH_HELP( - Crypto, new_certificate, - "Creates a new X.509 certificate from DER data.\n", + Crypto, new_certificate, + "Creates a new X.509 certificate from DER data.\n", - "der the DER-encoded certificate data", + "der the DER-encoded certificate data", - "") { - ByteArray certData(Lua::checkByteArray(L, 1)); - Certificate::ref cert(Sluift::globals.tlsFactories.getCertificateFactory()->createCertificateFromDER(certData)); - lua_createtable(L, 0, 0); - lua_pushstring(L, cert->getSubjectName().c_str()); - lua_setfield(L, -2, "subject_name"); - lua_pushstring(L, Certificate::getSHA1Fingerprint(cert, Sluift::globals.networkFactories.getCryptoProvider()).c_str()); - lua_setfield(L, -2, "sha1_fingerprint"); + "") { + ByteArray certData(Lua::checkByteArray(L, 1)); + Certificate::ref cert(Sluift::globals.tlsFactories.getCertificateFactory()->createCertificateFromDER(certData)); + lua_createtable(L, 0, 0); + lua_pushstring(L, cert->getSubjectName().c_str()); + lua_setfield(L, -2, "subject_name"); + lua_pushstring(L, Certificate::getSHA1Fingerprint(cert, Sluift::globals.networkFactories.getCryptoProvider()).c_str()); + lua_setfield(L, -2, "sha1_fingerprint"); - Lua::pushStringArray(L, cert->getCommonNames()); - lua_setfield(L, -2, "common_names"); + Lua::pushStringArray(L, cert->getCommonNames()); + lua_setfield(L, -2, "common_names"); - Lua::pushStringArray(L, cert->getSRVNames()); - lua_setfield(L, -2, "srv_names"); + Lua::pushStringArray(L, cert->getSRVNames()); + lua_setfield(L, -2, "srv_names"); - Lua::pushStringArray(L, cert->getDNSNames()); - lua_setfield(L, -2, "dns_names"); + Lua::pushStringArray(L, cert->getDNSNames()); + lua_setfield(L, -2, "dns_names"); - Lua::pushStringArray(L, cert->getXMPPAddresses()); - lua_setfield(L, -2, "xmpp_addresses"); + Lua::pushStringArray(L, cert->getXMPPAddresses()); + lua_setfield(L, -2, "xmpp_addresses"); - Lua::registerTableToString(L, -1); - return 1; + Lua::registerTableToString(L, -1); + return 1; } /******************************************************************************* @@ -257,30 +258,30 @@ SLUIFT_LUA_FUNCTION_WITH_HELP( ******************************************************************************/ SLUIFT_LUA_FUNCTION(FS, list) { - boost::filesystem::path dir(std::string(Lua::checkString(L, 1))); - if (!boost::filesystem::exists(dir) || !boost::filesystem::is_directory(dir)) { - lua_pushnil(L); - lua_pushstring(L, "Argument is not an existing directory"); - return 2; - } - - boost::filesystem::directory_iterator i(dir); - std::vector<boost::filesystem::path> items( - i, boost::filesystem::directory_iterator()); - - lua_createtable(L, boost::numeric_cast<int>(items.size()), 0); - for (size_t i = 0; i < items.size(); ++i) { - lua_pushstring(L, items[i].string().c_str()); - lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); - } - Lua::registerTableToString(L, -1); - return 1; + boost::filesystem::path dir(std::string(Lua::checkString(L, 1))); + if (!boost::filesystem::exists(dir) || !boost::filesystem::is_directory(dir)) { + lua_pushnil(L); + lua_pushstring(L, "Argument is not an existing directory"); + return 2; + } + + boost::filesystem::directory_iterator i(dir); + std::vector<boost::filesystem::path> items( + i, boost::filesystem::directory_iterator()); + + lua_createtable(L, boost::numeric_cast<int>(items.size()), 0); + for (size_t i = 0; i < items.size(); ++i) { + lua_pushstring(L, items[i].string().c_str()); + lua_rawseti(L, -2, boost::numeric_cast<int>(i+1)); + } + Lua::registerTableToString(L, -1); + return 1; } SLUIFT_LUA_FUNCTION(FS, is_file) { - boost::filesystem::path file(std::string(Lua::checkString(L, 1))); - lua_pushboolean(L, boost::filesystem::is_regular_file(file)); - return 1; + boost::filesystem::path file(std::string(Lua::checkString(L, 1))); + lua_pushboolean(L, boost::filesystem::is_regular_file(file)); + return 1; } @@ -289,32 +290,32 @@ SLUIFT_LUA_FUNCTION(FS, is_file) { ******************************************************************************/ SLUIFT_LUA_FUNCTION(JID, to_bare) { - JID jid(std::string(Lua::checkString(L, 1))); - lua_pushstring(L, jid.toBare().toString().c_str()); - return 1; + JID jid(std::string(Lua::checkString(L, 1))); + lua_pushstring(L, jid.toBare().toString().c_str()); + return 1; } SLUIFT_LUA_FUNCTION(JID, node) { - JID jid(std::string(Lua::checkString(L, 1))); - lua_pushstring(L, jid.getNode().c_str()); - return 1; + JID jid(std::string(Lua::checkString(L, 1))); + lua_pushstring(L, jid.getNode().c_str()); + return 1; } SLUIFT_LUA_FUNCTION(JID, domain) { - JID jid(std::string(Lua::checkString(L, 1))); - lua_pushstring(L, jid.getDomain().c_str()); - return 1; + JID jid(std::string(Lua::checkString(L, 1))); + lua_pushstring(L, jid.getDomain().c_str()); + return 1; } SLUIFT_LUA_FUNCTION(JID, resource) { - JID jid(std::string(Lua::checkString(L, 1))); - lua_pushstring(L, jid.getResource().c_str()); - return 1; + JID jid(std::string(Lua::checkString(L, 1))); + lua_pushstring(L, jid.getResource().c_str()); + return 1; } SLUIFT_LUA_FUNCTION(JID, escape_node) { - lua_pushstring(L, JID::getEscapedNode(Lua::checkString(L, 1)).c_str()); - return 1; + lua_pushstring(L, JID::getEscapedNode(Lua::checkString(L, 1)).c_str()); + return 1; } /******************************************************************************* @@ -322,22 +323,22 @@ SLUIFT_LUA_FUNCTION(JID, escape_node) { ******************************************************************************/ SLUIFT_LUA_FUNCTION(Base64, encode) { - if (!lua_isstring(L, 1)) { - throw Lua::Exception("Expected string"); - } - size_t len; - const char* data = lua_tolstring(L, 1, &len); - lua_pushstring(L, Base64::encode(createByteArray(data, len)).c_str()); - return 1; + if (!lua_isstring(L, 1)) { + throw Lua::Exception("Expected string"); + } + size_t len; + const char* data = lua_tolstring(L, 1, &len); + lua_pushstring(L, Base64::encode(createByteArray(data, len)).c_str()); + return 1; } SLUIFT_LUA_FUNCTION(Base64, decode) { - if (!lua_isstring(L, 1)) { - throw Lua::Exception("Expected string"); - } - ByteArray result = Base64::decode(lua_tostring(L, 1)); - lua_pushlstring(L, reinterpret_cast<char*>(vecptr(result)), result.size()); - return 1; + if (!lua_isstring(L, 1)) { + throw Lua::Exception("Expected string"); + } + ByteArray result = Base64::decode(lua_tostring(L, 1)); + lua_pushlstring(L, reinterpret_cast<char*>(vecptr(result)), result.size()); + return 1; } /******************************************************************************* @@ -345,43 +346,43 @@ SLUIFT_LUA_FUNCTION(Base64, decode) { ******************************************************************************/ SLUIFT_LUA_FUNCTION(IDN, encode) { - IDNConverter* converter = Sluift::globals.networkFactories.getIDNConverter(); - boost::optional<std::string> encoded = converter->getIDNAEncoded(Lua::checkString(L, 1)); - if (!encoded) { - lua_pushnil(L); - lua_pushstring(L, "Error encoding domain name"); - return 2; - } - lua_pushstring(L, encoded->c_str()); - return 1; + IDNConverter* converter = Sluift::globals.networkFactories.getIDNConverter(); + boost::optional<std::string> encoded = converter->getIDNAEncoded(Lua::checkString(L, 1)); + if (!encoded) { + lua_pushnil(L); + lua_pushstring(L, "Error encoding domain name"); + return 2; + } + lua_pushstring(L, encoded->c_str()); + return 1; } SLUIFT_LUA_FUNCTION(IDN, stringprep) { - IDNConverter* converter = Sluift::globals.networkFactories.getIDNConverter(); - IDNConverter::StringPrepProfile profile; - std::string profileString = Lua::checkString(L, 2); - if (profileString == "nameprep") { - profile = IDNConverter::NamePrep; - } - else if (profileString == "xmpp_nodeprep") { - profile = IDNConverter::XMPPNodePrep; - } - else if (profileString == "xmpp_resourceprep") { - profile = IDNConverter::XMPPResourcePrep; - } - else if (profileString == "saslprep") { - profile = IDNConverter::SASLPrep; - } - else { - throw Lua::Exception("Invalid profile"); - } - try { - lua_pushstring(L, converter->getStringPrepared(Lua::checkString(L, 1), profile).c_str()); - } - catch (const std::exception&) { - throw Lua::Exception("Error"); - } - return 1; + IDNConverter* converter = Sluift::globals.networkFactories.getIDNConverter(); + IDNConverter::StringPrepProfile profile; + std::string profileString = Lua::checkString(L, 2); + if (profileString == "nameprep") { + profile = IDNConverter::NamePrep; + } + else if (profileString == "xmpp_nodeprep") { + profile = IDNConverter::XMPPNodePrep; + } + else if (profileString == "xmpp_resourceprep") { + profile = IDNConverter::XMPPResourcePrep; + } + else if (profileString == "saslprep") { + profile = IDNConverter::SASLPrep; + } + else { + throw Lua::Exception("Invalid profile"); + } + try { + lua_pushstring(L, converter->getStringPrepared(Lua::checkString(L, 1), profile).c_str()); + } + catch (const std::exception&) { + throw Lua::Exception("Error"); + } + return 1; } /******************************************************************************* @@ -390,26 +391,26 @@ SLUIFT_LUA_FUNCTION(IDN, stringprep) { #ifdef HAVE_ITUNES SLUIFT_LUA_FUNCTION(iTunes, get_current_track) { - boost::optional<ITunesInterface::Track> track = Sluift::globals.iTunes.getCurrentTrack(); - if (!track) { - return 0; - } - lua_createtable(L, 0, 0); - lua_pushstring(L, track->artist.c_str()); - lua_setfield(L, -2, "artist"); - lua_pushstring(L, track->name.c_str()); - lua_setfield(L, -2, "name"); - lua_pushstring(L, track->album.c_str()); - lua_setfield(L, -2, "album"); - lua_pushinteger(L, track->trackNumber); - lua_setfield(L, -2, "track_number"); - lua_pushnumber(L, track->duration); - lua_setfield(L, -2, "duration"); - lua_pushinteger(L, track->rating); - lua_setfield(L, -2, "rating"); - Lua::registerTableToString(L, -1); - Lua::registerTableEquals(L, -1); - return 1; + boost::optional<ITunesInterface::Track> track = Sluift::globals.iTunes.getCurrentTrack(); + if (!track) { + return 0; + } + lua_createtable(L, 0, 0); + lua_pushstring(L, track->artist.c_str()); + lua_setfield(L, -2, "artist"); + lua_pushstring(L, track->name.c_str()); + lua_setfield(L, -2, "name"); + lua_pushstring(L, track->album.c_str()); + lua_setfield(L, -2, "album"); + lua_pushinteger(L, track->trackNumber); + lua_setfield(L, -2, "track_number"); + lua_pushnumber(L, track->duration); + lua_setfield(L, -2, "duration"); + lua_pushinteger(L, track->rating); + lua_setfield(L, -2, "rating"); + Lua::registerTableToString(L, -1); + Lua::registerTableEquals(L, -1); + return 1; } #endif @@ -417,84 +418,84 @@ SLUIFT_LUA_FUNCTION(iTunes, get_current_track) { * Module registration ******************************************************************************/ -static const luaL_Reg sluift_functions[] = { {NULL, NULL} }; +static const luaL_Reg sluift_functions[] = { {nullptr, nullptr} }; SLUIFT_API int luaopen_sluift(lua_State* L) { - // Initialize & store the module table - luaL_register(L, lua_tostring(L, 1), sluift_functions); - lua_pushinteger(L, -1); - lua_setfield(L, -2, "timeout"); - lua_pushboolean(L, 0); - lua_setfield(L, -2, "debug"); - - lua_pushvalue(L, -1); - Sluift::globals.moduleLibIndex = luaL_ref(L, LUA_REGISTRYINDEX); - - // Load core lib code - if (luaL_loadbuffer(L, core_lua, core_lua_size, "core.lua") != 0) { - lua_error(L); - } - lua_pushvalue(L, -2); - lua_call(L, 1, 1); - Sluift::globals.coreLibIndex = luaL_ref(L, LUA_REGISTRYINDEX); - - // Register functions - Lua::FunctionRegistry::getInstance().addFunctionsToTable(L, "Sluift"); - Lua::FunctionRegistry::getInstance().createFunctionTable(L, "JID"); - lua_setfield(L, -2, "jid"); - Lua::FunctionRegistry::getInstance().createFunctionTable(L, "Base64"); - lua_setfield(L, -2, "base64"); - Lua::FunctionRegistry::getInstance().createFunctionTable(L, "IDN"); - lua_setfield(L, -2, "idn"); - Lua::FunctionRegistry::getInstance().createFunctionTable(L, "Crypto"); - lua_setfield(L, -2, "crypto"); - Lua::FunctionRegistry::getInstance().createFunctionTable(L, "FS"); - lua_setfield(L, -2, "fs"); + // Initialize & store the module table + luaL_register(L, lua_tostring(L, 1), sluift_functions); + lua_pushinteger(L, -1); + lua_setfield(L, -2, "timeout"); + lua_pushboolean(L, 0); + lua_setfield(L, -2, "debug"); + + lua_pushvalue(L, -1); + Sluift::globals.moduleLibIndex = luaL_ref(L, LUA_REGISTRYINDEX); + + // Load core lib code + if (luaL_loadbuffer(L, core_lua, core_lua_size, "core.lua") != 0) { + lua_error(L); + } + lua_pushvalue(L, -2); + lua_call(L, 1, 1); + Sluift::globals.coreLibIndex = luaL_ref(L, LUA_REGISTRYINDEX); + + // Register functions + Lua::FunctionRegistry::getInstance().addFunctionsToTable(L, "Sluift"); + Lua::FunctionRegistry::getInstance().createFunctionTable(L, "JID"); + lua_setfield(L, -2, "jid"); + Lua::FunctionRegistry::getInstance().createFunctionTable(L, "Base64"); + lua_setfield(L, -2, "base64"); + Lua::FunctionRegistry::getInstance().createFunctionTable(L, "IDN"); + lua_setfield(L, -2, "idn"); + Lua::FunctionRegistry::getInstance().createFunctionTable(L, "Crypto"); + lua_setfield(L, -2, "crypto"); + Lua::FunctionRegistry::getInstance().createFunctionTable(L, "FS"); + lua_setfield(L, -2, "fs"); #ifdef HAVE_ITUNES - Lua::FunctionRegistry::getInstance().createFunctionTable(L, "iTunes"); - lua_setfield(L, -2, "itunes"); + Lua::FunctionRegistry::getInstance().createFunctionTable(L, "iTunes"); + lua_setfield(L, -2, "itunes"); #endif - // Register convenience functions - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - std::vector<std::string> coreLibExports = boost::assign::list_of - ("tprint")("disco")("help")("get_help")("copy")("with")("read_file")("create_form"); - foreach (const std::string& coreLibExport, coreLibExports) { - lua_getfield(L, -1, coreLibExport.c_str()); - lua_setfield(L, -3, coreLibExport.c_str()); - } - lua_pop(L, 1); - - // Load client metatable - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - std::vector<std::string> tables = boost::assign::list_of("Client"); - foreach(const std::string& table, tables) { - lua_getfield(L, -1, table.c_str()); - Lua::FunctionRegistry::getInstance().addFunctionsToTable(L, table); - lua_pop(L, 1); - } - lua_pop(L, 1); - - // Load component metatable - lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); - std::vector<std::string> comp_tables = boost::assign::list_of("Component"); - foreach(const std::string& table, comp_tables) { - lua_getfield(L, -1, table.c_str()); - Lua::FunctionRegistry::getInstance().addFunctionsToTable(L, table); - lua_pop(L, 1); - } - lua_pop(L, 1); - - // Register documentation for all elements - foreach (boost::shared_ptr<LuaElementConvertor> convertor, Sluift::globals.elementConvertor.getConvertors()) { - boost::optional<LuaElementConvertor::Documentation> documentation = convertor->getDocumentation(); - if (documentation) { - Lua::registerClassHelp(L, documentation->className, documentation->description); - } - } - - // Register global documentation - Lua::registerExtraHelp(L, -1, "sluift"); - - return 1; + // Register convenience functions + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + std::vector<std::string> coreLibExports = boost::assign::list_of + ("tprint")("disco")("help")("get_help")("copy")("with")("read_file")("create_form"); + for (const auto& coreLibExport : coreLibExports) { + lua_getfield(L, -1, coreLibExport.c_str()); + lua_setfield(L, -3, coreLibExport.c_str()); + } + lua_pop(L, 1); + + // Load client metatable + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + std::vector<std::string> tables = boost::assign::list_of("Client"); + for (const auto& table : tables) { + lua_getfield(L, -1, table.c_str()); + Lua::FunctionRegistry::getInstance().addFunctionsToTable(L, table); + lua_pop(L, 1); + } + lua_pop(L, 1); + + // Load component metatable + lua_rawgeti(L, LUA_REGISTRYINDEX, Sluift::globals.coreLibIndex); + std::vector<std::string> comp_tables = boost::assign::list_of("Component"); + for (const auto& table : comp_tables) { + lua_getfield(L, -1, table.c_str()); + Lua::FunctionRegistry::getInstance().addFunctionsToTable(L, table); + lua_pop(L, 1); + } + lua_pop(L, 1); + + // Register documentation for all elements + for (auto&& convertor : Sluift::globals.elementConvertor.getConvertors()) { + boost::optional<LuaElementConvertor::Documentation> documentation = convertor->getDocumentation(); + if (documentation) { + Lua::registerClassHelp(L, documentation->className, documentation->description); + } + } + + // Register global documentation + Lua::registerExtraHelp(L, -1, "sluift"); + + return 1; } diff --git a/Sluift/tokenize.cpp b/Sluift/tokenize.cpp index 55ab744..ff162d6 100644 --- a/Sluift/tokenize.cpp +++ b/Sluift/tokenize.cpp @@ -1,86 +1,87 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include <Sluift/tokenize.h> -#include <boost/tokenizer.hpp> #include <cctype> +#include <boost/tokenizer.hpp> + using namespace Swift; namespace { - struct LuaTokenizeFunctor { - void reset() { - } + struct LuaTokenizeFunctor { + void reset() { + } + + template<typename InputIterator, typename Token> + bool operator()(InputIterator& next, InputIterator& end, Token& result) { + while (next != end && std::isspace(*next)) { + ++next; + } + if (next == end) { + return false; + } - template<typename InputIterator, typename Token> - bool operator()(InputIterator& next, InputIterator& end, Token& result) { - while (next != end && std::isspace(*next)) { - ++next; - } - if (next == end) { - return false; - } + std::vector<char> token; + char c = *next++; + token.push_back(c); - std::vector<char> token; - char c = *next++; - token.push_back(c); + // String literal + if (c == '\'' || c == '"') { + char quote = c; + bool inEscape = false; + for (; next != end; ++next) { + c = *next; + token.push_back(c); + if (inEscape) { + inEscape = false; + } + else if (c == '\\') { + inEscape = true; + } + else if (c == quote) { + break; + } + } + if (next != end) { + ++next; + } + } + // Identifier + else if (std::isalpha(c) || c == '_') { + while (next != end && (std::isalpha(*next) || *next == '_' || std::isdigit(*next))) { + token.push_back(*next); + ++next; + } + } + // Digit + else if (std::isdigit(c)) { + while (next != end && !std::isspace(*next)) { + token.push_back(*next); + ++next; + } + } + // Dots + else if (c == '.') { + while (next != end && *next == '.') { + token.push_back(*next); + ++next; + } + } - // String literal - if (c == '\'' || c == '"') { - char quote = c; - bool inEscape = false; - for (; next != end; ++next) { - c = *next; - token.push_back(c); - if (inEscape) { - inEscape = false; - } - else if (c == '\\') { - inEscape = true; - } - else if (c == quote) { - break; - } - } - if (next != end) { - ++next; - } - } - // Identifier - else if (std::isalpha(c) || c == '_') { - while (next != end && (std::isalpha(*next) || *next == '_' || std::isdigit(*next))) { - token.push_back(*next); - ++next; - } - } - // Digit - else if (std::isdigit(c)) { - while (next != end && !std::isspace(*next)) { - token.push_back(*next); - ++next; - } - } - // Dots - else if (c == '.') { - while (next != end && *next == '.') { - token.push_back(*next); - ++next; - } - } - - result = Token(&token[0], token.size()); - return true; - } - }; + result = Token(&token[0], token.size()); + return true; + } + }; } std::vector<std::string> Lua::tokenize(const std::string& input) { - boost::tokenizer<LuaTokenizeFunctor> tokenizer(input); - return std::vector<std::string>(tokenizer.begin(), tokenizer.end()); + boost::tokenizer<LuaTokenizeFunctor> tokenizer(input); + return std::vector<std::string>(tokenizer.begin(), tokenizer.end()); } diff --git a/Sluift/tokenize.h b/Sluift/tokenize.h index 9a65b07..33ea435 100644 --- a/Sluift/tokenize.h +++ b/Sluift/tokenize.h @@ -1,16 +1,16 @@ /* - * Copyright (c) 2013 Isode Limited. + * Copyright (c) 2013-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #pragma once -#include <vector> #include <string> +#include <vector> namespace Swift { - namespace Lua { - std::vector<std::string> tokenize(const std::string&); - } + namespace Lua { + std::vector<std::string> tokenize(const std::string&); + } } |