/* * Copyright (c) 2010 Kevin Smith * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #include "Swiften/Serializer/PayloadSerializers/CommandSerializer.h" #include #include "Swiften/Base/foreach.h" #include "Swiften/Serializer/XML/XMLElement.h" #include "Swiften/Serializer/XML/XMLTextNode.h" #include "Swiften/Serializer/XML/XMLRawTextNode.h" #include "Swiften/Serializer/PayloadSerializerCollection.h" #include "Swiften/Serializer/PayloadSerializers/FormSerializer.h" namespace Swift { CommandSerializer::CommandSerializer() { } String CommandSerializer::serializePayload(boost::shared_ptr command) const { XMLElement commandElement("command", "http://jabber.org/protocol/comands"); commandElement.setAttribute("node", command->getNode()); if (!command->getSessionID().isEmpty()) { commandElement.setAttribute("sessionid", command->getSessionID()); } String action = actionToString(command->getAction()); if (!action.isEmpty()) { commandElement.setAttribute("action", action); } String status; switch (command->getStatus()) { case Command::Executing: status = "executing";break; case Command::Completed: status = "completed";break; case Command::Canceled: status = "canceled";break; case Command::NoStatus: break; } if (!status.isEmpty()) { commandElement.setAttribute("status", status); } if (command->getAvailableActions().size() > 0) { String actions = "getExecuteAction()); if (!executeAction.isEmpty()) { actions += " execute='" + executeAction + "'"; } actions += ">"; foreach (Command::Action action, command->getAvailableActions()) { actions += "<" + actionToString(action) + "/>"; } actions += ""; commandElement.addNode(boost::shared_ptr(new XMLRawTextNode(actions))); } foreach (Command::Note note, command->getNotes()) { boost::shared_ptr noteElement(new XMLElement("note")); String type; switch (note.type) { case Command::Note::Info: type = "info"; case Command::Note::Warn: type = "warn"; case Command::Note::Error: type = "error"; } if (!type.isEmpty()) { noteElement->setAttribute("type", type); } noteElement->addNode(boost::shared_ptr(new XMLTextNode(note.note))); commandElement.addNode(noteElement); } Form::ref form = command->getForm(); if (form) { commandElement.addNode(boost::shared_ptr(new XMLRawTextNode(FormSerializer().serialize(form)))); } return commandElement.serialize(); } String CommandSerializer::actionToString(Command::Action action) const { String string; switch (action) { case Command::Cancel: string = "cancel"; break; case Command::Execute: string = "execute"; break; case Command::Complete: string = "complete"; break; case Command::Prev: string = "prev"; break; case Command::Next: string = "next"; break; case Command::NoAction: break; } return string; } }