diff options
Diffstat (limited to 'Swiften/Serializer/PayloadSerializers/CommandSerializer.cpp')
| -rw-r--r-- | Swiften/Serializer/PayloadSerializers/CommandSerializer.cpp | 98 | 
1 files changed, 98 insertions, 0 deletions
diff --git a/Swiften/Serializer/PayloadSerializers/CommandSerializer.cpp b/Swiften/Serializer/PayloadSerializers/CommandSerializer.cpp new file mode 100644 index 0000000..3ac0c2c --- /dev/null +++ b/Swiften/Serializer/PayloadSerializers/CommandSerializer.cpp @@ -0,0 +1,98 @@ +/* + * 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 <boost/shared_ptr.hpp> + +#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" + +namespace Swift { + +CommandSerializer::CommandSerializer(PayloadSerializerCollection* serializers) : serializers(serializers) { +} + +String CommandSerializer::serializePayload(boost::shared_ptr<Command> 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->getPerformedAction()); +	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 = "<actions"; +		String executeAction = actionToString(command->getExecuteAction()); +		if (!executeAction.isEmpty()) { +			actions += " execute='" + executeAction + "'"; +		} +		actions += ">"; +		foreach (Command::Action action, command->getAvailableActions()) { +			actions += "<" + actionToString(action) + "/>"; +		} +		actions += "</actions>"; +		commandElement.addNode(boost::shared_ptr<XMLRawTextNode>(new XMLRawTextNode(actions))); +	} + +	foreach (Command::Note note, command->getNotes()) { +		boost::shared_ptr<XMLElement> 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<XMLTextNode>(new XMLTextNode(note.note))); +		commandElement.addNode(noteElement); +	} + +	boost::shared_ptr<Payload> payload = command->getPayload(); +	if (payload) { +		PayloadSerializer* serializer = serializers->getPayloadSerializer(payload); +		if (serializer) { +			commandElement.addNode(boost::shared_ptr<XMLRawTextNode>(new XMLRawTextNode(serializer->serialize(payload)))); +		} +	} +	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; +} + +}  | 
 Swift