diff --git a/src/settingsadhoccommand.cpp b/src/settingsadhoccommand.cpp index 82dcfa4da5a898b0230e5a352a6f6a9462eafdfd..d888a3b31e4e278b4c38218219a92cd4a1f91d1b 100644 --- a/src/settingsadhoccommand.cpp +++ b/src/settingsadhoccommand.cpp @@ -26,6 +26,7 @@ #include "transport/user.h" #include "transport/logging.h" #include "transport/storagebackend.h" +#include "transport/formutils.h" namespace Transport { @@ -34,32 +35,6 @@ DEFINE_LOGGER(logger, "SettingsAdHocCommand"); SettingsAdHocCommand::SettingsAdHocCommand(Component *component, UserManager *userManager, StorageBackend *storageBackend, const Swift::JID &initiator, const Swift::JID &to) : AdHocCommand(component, userManager, storageBackend, initiator, to) { m_state = Init; -#if HAVE_SWIFTEN_3 - Swift::FormField::ref field = boost::make_shared(Swift::FormField::BooleanType, "1"); -#else - Swift::BooleanFormField::ref field; - - field = Swift::BooleanFormField::create(true); -#endif - field->setName("enable_transport"); - field->setLabel("Enable transport"); - addFormField(field); -#if HAVE_SWIFTEN_3 - field = boost::make_shared(Swift::FormField::BooleanType, CONFIG_STRING_DEFAULTED(component->getConfig(), "settings.send_headlines", "0")); -#else - field = Swift::BooleanFormField::create(CONFIG_STRING_DEFAULTED(component->getConfig(), "settings.send_headlines", "0") == "1"); -#endif - field->setName("send_headlines"); - field->setLabel("Allow sending messages as headlines"); - addFormField(field); -#if HAVE_SWIFTEN_3 - field = boost::make_shared(Swift::FormField::BooleanType, CONFIG_STRING_DEFAULTED(component->getConfig(), "settings.stay_connected", "0")); -#else - field = Swift::BooleanFormField::create(CONFIG_STRING_DEFAULTED(component->getConfig(), "settings.stay_connected", "0") == "1"); -#endif - field->setName("stay_connected"); - field->setLabel("Stay connected to legacy network when offline on XMPP"); - addFormField(field); } SettingsAdHocCommand::~SettingsAdHocCommand() { @@ -69,11 +44,7 @@ boost::shared_ptr SettingsAdHocCommand::getForm() { if (!m_storageBackend) { boost::shared_ptr response(new Swift::Command("settings", m_id, Swift::Command::Completed)); boost::shared_ptr form(new Swift::Form()); -#if HAVE_SWIFTEN_3 - form->addField(boost::make_shared(Swift::FormField::FixedType, "This server does not support transport settings. There is no storage backend configured")); -#else - form->addField(Swift::FixedFormField::create("This server does not support transport settings. There is no storage backend configured")); -#endif + FormUtils::addTextFixedField(form, "This server does not support transport settings. There is no storage backend configured"); response->setForm(form); return response; } @@ -82,11 +53,7 @@ boost::shared_ptr SettingsAdHocCommand::getForm() { if (m_storageBackend->getUser(m_initiator.toBare().toString(), user) == false) { boost::shared_ptr response(new Swift::Command("settings", m_id, Swift::Command::Completed)); boost::shared_ptr form(new Swift::Form()); -#if HAVE_SWIFTEN_3 - form->addField(boost::make_shared(Swift::FormField::FixedType, "You are not registered.")); -#else - form->addField(Swift::FixedFormField::create("You are not registered.")); -#endif + FormUtils::addTextFixedField(form, "You are not registered."); response->setForm(form); return response; } @@ -94,62 +61,42 @@ boost::shared_ptr SettingsAdHocCommand::getForm() { boost::shared_ptr response(new Swift::Command("settings", m_id, Swift::Command::Executing)); boost::shared_ptr form(new Swift::Form()); - BOOST_FOREACH(Swift::FormField::ref field, m_fields) { - // FIXME: Support for more types than boolean -#if HAVE_SWIFTEN_3 - if (field->getType() == Swift::FormField::BooleanType) { - std::string value = field->getBoolValue() ? "1" : "0"; - int type = (int) TYPE_BOOLEAN; - m_storageBackend->getUserSetting(user.id, field->getName(), type, value); - field->setBoolValue(value == "1"); - } -#else - if (boost::dynamic_pointer_cast(field)) { - Swift::BooleanFormField::ref f(boost::dynamic_pointer_cast(field)); - std::string value = f->getValue() ? "1" : "0"; - int type = (int)TYPE_BOOLEAN; - m_storageBackend->getUserSetting(user.id, f->getName(), type, value); - f->setValue(value == "1"); - } -#endif - - form->addField(field); - } + std::string value; + int type = (int) TYPE_BOOLEAN; + + value = "1"; + m_storageBackend->getUserSetting(user.id, "enable_transport", type, value); + FormUtils::addBooleanField(form, "enable_transport", value, "Enable transport"); + + value = CONFIG_STRING_DEFAULTED(m_component->getConfig(), "settings.send_headlines", "0"); + m_storageBackend->getUserSetting(user.id, "send_headlines", type, value); + FormUtils::addBooleanField(form, "send_headlines", value, "Allow sending messages as headlines"); + + value = CONFIG_STRING_DEFAULTED(m_component->getConfig(), "settings.stay_connected", "0"); + m_storageBackend->getUserSetting(user.id, "stay_connected", type, value); + FormUtils::addBooleanField(form, "stay_connected", value, "Stay connected to legacy network when offline on XMPP"); response->setForm(form); return response; } +void SettingsAdHocCommand::updateUserSetting(Swift::Form::ref form, UserInfo &user, const std::string &name) { + std::string value = FormUtils::fieldValue(form, name, ""); + if (value.empty()) { + return; + } + + m_storageBackend->updateUserSetting(user.id, name, value); +} + boost::shared_ptr SettingsAdHocCommand::handleResponse(boost::shared_ptr payload) { UserInfo user; bool registered = m_storageBackend->getUser(m_initiator.toBare().toString(), user); if (registered && payload->getForm()) { - BOOST_FOREACH(Swift::FormField::ref field, m_fields) { - Swift::FormField::ref received = payload->getForm()->getField(field->getName()); - if (!received) { - continue; - } -#if HAVE_SWIFTEN_3 - if (received->getType() == Swift::FormField::BooleanType) { - std::string value = received->getBoolValue() ? "1" : "0"; - m_storageBackend->updateUserSetting(user.id, received->getName(), value); - } else if (received->getType() == Swift::FormField::TextSingleType) { - m_storageBackend->updateUserSetting(user.id, received->getName(), received->getTextSingleValue()); - } -#else - // FIXME: Support for more types than boolean - if (boost::dynamic_pointer_cast(received)) { - Swift::BooleanFormField::ref f(boost::dynamic_pointer_cast(received)); - std::string value = f->getValue() ? "1" : "0"; - m_storageBackend->updateUserSetting(user.id, f->getName(), value); - } - else if (boost::dynamic_pointer_cast(received)) { - Swift::TextSingleFormField::ref f(boost::dynamic_pointer_cast(received)); - m_storageBackend->updateUserSetting(user.id, f->getName(), f->getValue()); - } -#endif - } + updateUserSetting(payload->getForm(), user, "enable_transport"); + updateUserSetting(payload->getForm(), user, "send_headlines"); + updateUserSetting(payload->getForm(), user, "stay_connected"); } boost::shared_ptr response(new Swift::Command("settings", m_id, Swift::Command::Completed));