summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Serializer/PayloadSerializers/InputEventSerializer.cpp')
-rw-r--r--Swiften/Serializer/PayloadSerializers/InputEventSerializer.cpp85
1 files changed, 85 insertions, 0 deletions
diff --git a/Swiften/Serializer/PayloadSerializers/InputEventSerializer.cpp b/Swiften/Serializer/PayloadSerializers/InputEventSerializer.cpp
new file mode 100644
index 0000000..5692308
--- /dev/null
+++ b/Swiften/Serializer/PayloadSerializers/InputEventSerializer.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2012 Yoann Blein
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include <Swiften/Serializer/PayloadSerializers/InputEventSerializer.h>
+
+#include <boost/smart_ptr/make_shared.hpp>
+#include <boost/lexical_cast.hpp>
+
+#include <Swiften/Base/foreach.h>
+#include <Swiften/Serializer/XML/XMLElement.h>
+
+namespace Swift {
+
+std::string InputEventSerializer::serializePayload(boost::shared_ptr<InputEventPayload> payload) const {
+ XMLElement inputevt("inputevt", "http://sip-comunicator.org/protocol/inputevt");
+ inputevt.setAttribute("action", actionToString(payload->getAction()));
+
+ XMLElement::ref remoteControlNode = boost::make_shared<XMLElement>("remote-control", "http://sip-communicator.org/protocol/inputevt");
+ foreach (InputEventPayload::Event event, payload->getEvents()) {
+ XMLElement::ref eventNode = boost::make_shared<XMLElement>(eventTypeToString(event.type));
+ switch (event.type) {
+ case InputEventPayload::Event::MouseMove:
+ eventNode->setAttribute("x", boost::lexical_cast<std::string>(event.realArg1));
+ eventNode->setAttribute("y", boost::lexical_cast<std::string>(event.realArg2));
+ break;
+ case InputEventPayload::Event::MouseWheel:
+ eventNode->setAttribute("notch", boost::lexical_cast<std::string>(event.integerArg));
+ break;
+ case InputEventPayload::Event::MousePress:
+ case InputEventPayload::Event::MouseRelease:
+ eventNode->setAttribute("btns", boost::lexical_cast<std::string>(event.integerArg));
+ break;
+ case InputEventPayload::Event::KeyType:
+ eventNode->setAttribute("keychar", boost::lexical_cast<std::string>(event.integerArg));
+ break;
+ case InputEventPayload::Event::KeyPress:
+ case InputEventPayload::Event::KeyRelease:
+ eventNode->setAttribute("keycode", boost::lexical_cast<std::string>(event.integerArg));
+ break;
+ default:
+ break;
+ }
+ remoteControlNode->addNode(eventNode);
+ }
+
+ inputevt.addNode(remoteControlNode);
+ return inputevt.serialize();
+}
+
+std::string InputEventSerializer::actionToString(InputEventPayload::Action action) {
+ switch (action) {
+ case InputEventPayload::Notify:
+ return "notify";
+ default:
+ std::cerr << "Serializing unknown action." << std::endl;
+ }
+ return "";
+}
+
+std::string InputEventSerializer::eventTypeToString(InputEventPayload::Event::EventType eventType) {
+ switch (eventType) {
+ case InputEventPayload::Event::MouseMove:
+ return "mouse-move";
+ case InputEventPayload::Event::MousePress:
+ return "mouse-press";
+ case InputEventPayload::Event::MouseRelease:
+ return "mouse-release";
+ case InputEventPayload::Event::MouseWheel:
+ return "mouse-wheel";
+ case InputEventPayload::Event::KeyPress:
+ return "key-press";
+ case InputEventPayload::Event::KeyRelease:
+ return "key-release";
+ case InputEventPayload::Event::KeyType:
+ return "key-type";
+ default:
+ std::cerr << "Serializing unknown event type." << std::endl;
+ }
+ return "";
+}
+
+}