summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Parser/PayloadParsers/InputEventParser.cpp')
-rw-r--r--Swiften/Parser/PayloadParsers/InputEventParser.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/Swiften/Parser/PayloadParsers/InputEventParser.cpp b/Swiften/Parser/PayloadParsers/InputEventParser.cpp
new file mode 100644
index 0000000..44d9849
--- /dev/null
+++ b/Swiften/Parser/PayloadParsers/InputEventParser.cpp
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2012 Yoann Blein
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include <Swiften/Parser/PayloadParsers/InputEventParser.h>
+
+#include <boost/optional.hpp>
+#include <boost/lexical_cast.hpp>
+
+namespace Swift {
+
+void InputEventParser::handleStartElement(const std::string& element, const std::string&, const AttributeMap& attributes) {
+ if (level == 0) {
+ // <inputevt> tag
+ InputEventPayload::ref payload = getPayloadInternal();
+ payload->setAction(actionFromString(attributes.getAttributeValue("action").get_value_or("")));
+ } else if (level == 1) {
+ // <remote-control> tag
+ } else if (level == 2) {
+ InputEventPayload::Event event(eventTypeFromString(element));
+ switch (event.type) {
+ case InputEventPayload::Event::MouseMove:
+ try {
+ event.realArg1 = boost::lexical_cast<float>(attributes.getAttributeValue("x").get_value_or("0"));
+ event.realArg2 = boost::lexical_cast<float>(attributes.getAttributeValue("y").get_value_or("0"));
+ } catch (boost::bad_lexical_cast &) {}
+ break;
+ case InputEventPayload::Event::MouseWheel:
+ case InputEventPayload::Event::MousePress:
+ case InputEventPayload::Event::MouseRelease:
+ case InputEventPayload::Event::KeyType:
+ case InputEventPayload::Event::KeyPress:
+ case InputEventPayload::Event::KeyRelease:
+ try {
+ event.integerArg = boost::lexical_cast<int>(attributes.getEntries().front().getValue());
+ } catch (boost::bad_lexical_cast &) {}
+ default:
+ break;
+ }
+ }
+ ++level;
+}
+
+void InputEventParser::handleEndElement(const std::string&, const std::string&) {
+ --level;
+}
+
+void InputEventParser::handleCharacterData(const std::string&){
+
+}
+
+InputEventPayload::Action InputEventParser::actionFromString(const std::string& action)
+{
+ if (action == "notify")
+ return InputEventPayload::Notify;
+
+ return InputEventPayload::Unknown;
+}
+
+InputEventPayload::Event::EventType InputEventParser::eventTypeFromString(const std::string& eventType) {
+ if (eventType == "mouse-move")
+ return InputEventPayload::Event::MouseMove;
+ else if (eventType == "mouse-wheel")
+ return InputEventPayload::Event::MouseWheel;
+ else if (eventType == "mouse-press")
+ return InputEventPayload::Event::MousePress;
+ else if (eventType == "mouse-release")
+ return InputEventPayload::Event::MouseRelease;
+ else if (eventType == "key-type")
+ return InputEventPayload::Event::KeyType;
+ else if (eventType == "key-press")
+ return InputEventPayload::Event::KeyPress;
+ else if (eventType == "key-release")
+ return InputEventPayload::Event::KeyRelease;
+
+ return InputEventPayload::Event::Unknown;
+}
+
+}