diff options
Diffstat (limited to 'Swiften/Parser/PayloadParsers/WhiteboardParser.cpp')
-rw-r--r-- | Swiften/Parser/PayloadParsers/WhiteboardParser.cpp | 563 |
1 files changed, 286 insertions, 277 deletions
diff --git a/Swiften/Parser/PayloadParsers/WhiteboardParser.cpp b/Swiften/Parser/PayloadParsers/WhiteboardParser.cpp index a480813..d3a7211 100644 --- a/Swiften/Parser/PayloadParsers/WhiteboardParser.cpp +++ b/Swiften/Parser/PayloadParsers/WhiteboardParser.cpp @@ -4,312 +4,321 @@ * See Documentation/Licenses/BSD-simplified.txt for more information. */ +/* + * Copyright (c) 2016 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ + #include <Swiften/Parser/PayloadParsers/WhiteboardParser.h> -#include <Swiften/Elements/Whiteboard/WhiteboardLineElement.h> -#include <Swiften/Elements/Whiteboard/WhiteboardRectElement.h> -#include <Swiften/Elements/Whiteboard/WhiteboardTextElement.h> -#include <Swiften/Elements/Whiteboard/WhiteboardPolygonElement.h> + +#include <memory> + +#include <boost/lexical_cast.hpp> +#include <boost/optional.hpp> + +#include <Swiften/Elements/Whiteboard/WhiteboardColor.h> +#include <Swiften/Elements/Whiteboard/WhiteboardDeleteOperation.h> #include <Swiften/Elements/Whiteboard/WhiteboardEllipseElement.h> #include <Swiften/Elements/Whiteboard/WhiteboardFreehandPathElement.h> -#include <Swiften/Elements/Whiteboard/WhiteboardColor.h> #include <Swiften/Elements/Whiteboard/WhiteboardInsertOperation.h> +#include <Swiften/Elements/Whiteboard/WhiteboardLineElement.h> +#include <Swiften/Elements/Whiteboard/WhiteboardPolygonElement.h> +#include <Swiften/Elements/Whiteboard/WhiteboardRectElement.h> +#include <Swiften/Elements/Whiteboard/WhiteboardTextElement.h> #include <Swiften/Elements/Whiteboard/WhiteboardUpdateOperation.h> -#include <Swiften/Elements/Whiteboard/WhiteboardDeleteOperation.h> -#include <boost/optional.hpp> -#include <boost/smart_ptr/make_shared.hpp> -#include <boost/lexical_cast.hpp> namespace Swift { - WhiteboardParser::WhiteboardParser() : actualIsText(false), level_(0) { - } + WhiteboardParser::WhiteboardParser() : actualIsText(false), level_(0) { + } - void WhiteboardParser::handleStartElement(const std::string& element, const std::string&, const AttributeMap& attributes) { - if (level_ == 0) { - getPayloadInternal()->setType(stringToType(attributes.getAttributeValue("type").get_value_or(""))); - } else if (level_ == 1) { - std::string type = attributes.getAttributeValue("type").get_value_or(""); - if (type == "insert") { - WhiteboardInsertOperation::ref insertOp = boost::make_shared<WhiteboardInsertOperation>(); - operation = insertOp; - } else if (type == "update") { - WhiteboardUpdateOperation::ref updateOp = boost::make_shared<WhiteboardUpdateOperation>(); - std::string move = attributes.getAttributeValue("newpos").get_value_or("0"); - updateOp->setNewPos(boost::lexical_cast<int>(attributes.getAttributeValue("newpos").get_value_or("0"))); - operation = updateOp; - } else if (type == "delete") { - WhiteboardDeleteOperation::ref deleteOp = boost::make_shared<WhiteboardDeleteOperation>(); - deleteOp->setElementID(attributes.getAttributeValue("elementid").get_value_or("")); - operation = deleteOp; - } - if (operation) { - try { - operation->setID(attributes.getAttributeValue("id").get_value_or("")); - operation->setParentID(attributes.getAttributeValue("parentid").get_value_or("")); - operation->setPos(boost::lexical_cast<int>(attributes.getAttributeValue("pos").get_value_or("0"))); - } catch (boost::bad_lexical_cast&) { - } - } + void WhiteboardParser::handleStartElement(const std::string& element, const std::string&, const AttributeMap& attributes) { + if (level_ == 0) { + getPayloadInternal()->setType(stringToType(attributes.getAttributeValue("type").get_value_or(""))); + } else if (level_ == 1) { + std::string type = attributes.getAttributeValue("type").get_value_or(""); + if (type == "insert") { + WhiteboardInsertOperation::ref insertOp = std::make_shared<WhiteboardInsertOperation>(); + operation = insertOp; + } else if (type == "update") { + WhiteboardUpdateOperation::ref updateOp = std::make_shared<WhiteboardUpdateOperation>(); + std::string move = attributes.getAttributeValue("newpos").get_value_or("0"); + updateOp->setNewPos(boost::lexical_cast<int>(attributes.getAttributeValue("newpos").get_value_or("0"))); + operation = updateOp; + } else if (type == "delete") { + WhiteboardDeleteOperation::ref deleteOp = std::make_shared<WhiteboardDeleteOperation>(); + deleteOp->setElementID(attributes.getAttributeValue("elementid").get_value_or("")); + operation = deleteOp; + } + if (operation) { + try { + operation->setID(attributes.getAttributeValue("id").get_value_or("")); + operation->setParentID(attributes.getAttributeValue("parentid").get_value_or("")); + operation->setPos(boost::lexical_cast<int>(attributes.getAttributeValue("pos").get_value_or("0"))); + } catch (boost::bad_lexical_cast&) { + } + } - } else if (level_ == 2) { - if (element == "line") { - int x1 = 0; - int y1 = 0; - int x2 = 0; - int y2 = 0; - try { - x1 = boost::lexical_cast<int>(attributes.getAttributeValue("x1").get_value_or("0")); - y1 = boost::lexical_cast<int>(attributes.getAttributeValue("y1").get_value_or("0")); - x2 = boost::lexical_cast<int>(attributes.getAttributeValue("x2").get_value_or("0")); - y2 = boost::lexical_cast<int>(attributes.getAttributeValue("y2").get_value_or("0")); - } catch (boost::bad_lexical_cast&) { - } - WhiteboardLineElement::ref whiteboardElement = boost::make_shared<WhiteboardLineElement>(x1, y1, x2, y2); + } else if (level_ == 2) { + if (element == "line") { + int x1 = 0; + int y1 = 0; + int x2 = 0; + int y2 = 0; + try { + x1 = boost::lexical_cast<int>(attributes.getAttributeValue("x1").get_value_or("0")); + y1 = boost::lexical_cast<int>(attributes.getAttributeValue("y1").get_value_or("0")); + x2 = boost::lexical_cast<int>(attributes.getAttributeValue("x2").get_value_or("0")); + y2 = boost::lexical_cast<int>(attributes.getAttributeValue("y2").get_value_or("0")); + } catch (boost::bad_lexical_cast&) { + } + WhiteboardLineElement::ref whiteboardElement = std::make_shared<WhiteboardLineElement>(x1, y1, x2, y2); - WhiteboardColor color(attributes.getAttributeValue("stroke").get_value_or("#000000")); - color.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); - whiteboardElement->setColor(color); + WhiteboardColor color(attributes.getAttributeValue("stroke").get_value_or("#000000")); + color.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); + whiteboardElement->setColor(color); - int penWidth = 1; - try { - penWidth = boost::lexical_cast<int>(attributes.getAttributeValue("stroke-width").get_value_or("1")); - } catch (boost::bad_lexical_cast&) { - } - whiteboardElement->setPenWidth(penWidth); - whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); - getPayloadInternal()->setElement(whiteboardElement); - wbElement = whiteboardElement; - } else if (element == "path") { - WhiteboardFreehandPathElement::ref whiteboardElement = boost::make_shared<WhiteboardFreehandPathElement>(); - std::string pathData = attributes.getAttributeValue("d").get_value_or(""); - std::vector<std::pair<int, int> > points; - if (pathData[0] == 'M') { - size_t pos = 1; - size_t npos; - int x, y; - if (pathData[pos] == ' ') { - pos++; - } - try { - npos = pathData.find(' ', pos); - x = boost::lexical_cast<int>(pathData.substr(pos, npos-pos)); - pos = npos+1; - npos = pathData.find('L', pos); - y = boost::lexical_cast<int>(pathData.substr(pos, npos-pos)); - pos = npos+1; - if (pathData[pos] == ' ') { - pos++; - } - points.push_back(std::pair<int, int>(x, y)); - while (pos < pathData.size()) { - npos = pathData.find(' ', pos); - x = boost::lexical_cast<int>(pathData.substr(pos, npos-pos)); - pos = npos+1; - npos = pathData.find(' ', pos); - y = boost::lexical_cast<int>(pathData.substr(pos, npos-pos)); - pos = npos+1; - points.push_back(std::pair<int, int>(x, y)); - } - } catch (boost::bad_lexical_cast&) { - } - } - whiteboardElement->setPoints(points); + int penWidth = 1; + try { + penWidth = boost::lexical_cast<int>(attributes.getAttributeValue("stroke-width").get_value_or("1")); + } catch (boost::bad_lexical_cast&) { + } + whiteboardElement->setPenWidth(penWidth); + whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); + getPayloadInternal()->setElement(whiteboardElement); + wbElement = whiteboardElement; + } else if (element == "path") { + WhiteboardFreehandPathElement::ref whiteboardElement = std::make_shared<WhiteboardFreehandPathElement>(); + std::string pathData = attributes.getAttributeValue("d").get_value_or(""); + std::vector<std::pair<int, int> > points; + if (pathData[0] == 'M') { + size_t pos = 1; + size_t npos; + int x, y; + if (pathData[pos] == ' ') { + pos++; + } + try { + npos = pathData.find(' ', pos); + x = boost::lexical_cast<int>(pathData.substr(pos, npos-pos)); + pos = npos+1; + npos = pathData.find('L', pos); + y = boost::lexical_cast<int>(pathData.substr(pos, npos-pos)); + pos = npos+1; + if (pathData[pos] == ' ') { + pos++; + } + points.push_back(std::pair<int, int>(x, y)); + while (pos < pathData.size()) { + npos = pathData.find(' ', pos); + x = boost::lexical_cast<int>(pathData.substr(pos, npos-pos)); + pos = npos+1; + npos = pathData.find(' ', pos); + y = boost::lexical_cast<int>(pathData.substr(pos, npos-pos)); + pos = npos+1; + points.push_back(std::pair<int, int>(x, y)); + } + } catch (boost::bad_lexical_cast&) { + } + } + whiteboardElement->setPoints(points); - int penWidth = 1; - try { - penWidth = boost::lexical_cast<int>(attributes.getAttributeValue("stroke-width").get_value_or("1")); - } catch (boost::bad_lexical_cast&) { - } - whiteboardElement->setPenWidth(penWidth); + int penWidth = 1; + try { + penWidth = boost::lexical_cast<int>(attributes.getAttributeValue("stroke-width").get_value_or("1")); + } catch (boost::bad_lexical_cast&) { + } + whiteboardElement->setPenWidth(penWidth); - WhiteboardColor color(attributes.getAttributeValue("stroke").get_value_or("#000000")); - color.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); - whiteboardElement->setColor(color); - whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); - getPayloadInternal()->setElement(whiteboardElement); - wbElement = whiteboardElement; - } else if (element == "rect") { - int x = 0; - int y = 0; - int width = 0; - int height = 0; - try { - x = boost::lexical_cast<int>(attributes.getAttributeValue("x").get_value_or("0")); - y = boost::lexical_cast<int>(attributes.getAttributeValue("y").get_value_or("0")); - width = boost::lexical_cast<int>(attributes.getAttributeValue("width").get_value_or("0")); - height = boost::lexical_cast<int>(attributes.getAttributeValue("height").get_value_or("0")); - } catch (boost::bad_lexical_cast&) { - } + WhiteboardColor color(attributes.getAttributeValue("stroke").get_value_or("#000000")); + color.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); + whiteboardElement->setColor(color); + whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); + getPayloadInternal()->setElement(whiteboardElement); + wbElement = whiteboardElement; + } else if (element == "rect") { + int x = 0; + int y = 0; + int width = 0; + int height = 0; + try { + x = boost::lexical_cast<int>(attributes.getAttributeValue("x").get_value_or("0")); + y = boost::lexical_cast<int>(attributes.getAttributeValue("y").get_value_or("0")); + width = boost::lexical_cast<int>(attributes.getAttributeValue("width").get_value_or("0")); + height = boost::lexical_cast<int>(attributes.getAttributeValue("height").get_value_or("0")); + } catch (boost::bad_lexical_cast&) { + } - WhiteboardRectElement::ref whiteboardElement = boost::make_shared<WhiteboardRectElement>(x, y, width, height); + WhiteboardRectElement::ref whiteboardElement = std::make_shared<WhiteboardRectElement>(x, y, width, height); - int penWidth = 1; - try { - penWidth = boost::lexical_cast<int>(attributes.getAttributeValue("stroke-width").get_value_or("1")); - } catch (boost::bad_lexical_cast&) { - } - whiteboardElement->setPenWidth(penWidth); + int penWidth = 1; + try { + penWidth = boost::lexical_cast<int>(attributes.getAttributeValue("stroke-width").get_value_or("1")); + } catch (boost::bad_lexical_cast&) { + } + whiteboardElement->setPenWidth(penWidth); - WhiteboardColor penColor(attributes.getAttributeValue("stroke").get_value_or("#000000")); - WhiteboardColor brushColor(attributes.getAttributeValue("fill").get_value_or("#000000")); - penColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); - brushColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("fill-opacity").get_value_or("1"))); - whiteboardElement->setPenColor(penColor); - whiteboardElement->setBrushColor(brushColor); - whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); - getPayloadInternal()->setElement(whiteboardElement); - wbElement = whiteboardElement; - } else if (element == "polygon") { - WhiteboardPolygonElement::ref whiteboardElement = boost::make_shared<WhiteboardPolygonElement>(); + WhiteboardColor penColor(attributes.getAttributeValue("stroke").get_value_or("#000000")); + WhiteboardColor brushColor(attributes.getAttributeValue("fill").get_value_or("#000000")); + penColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); + brushColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("fill-opacity").get_value_or("1"))); + whiteboardElement->setPenColor(penColor); + whiteboardElement->setBrushColor(brushColor); + whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); + getPayloadInternal()->setElement(whiteboardElement); + wbElement = whiteboardElement; + } else if (element == "polygon") { + WhiteboardPolygonElement::ref whiteboardElement = std::make_shared<WhiteboardPolygonElement>(); - std::string pointsData = attributes.getAttributeValue("points").get_value_or(""); - std::vector<std::pair<int, int> > points; - size_t pos = 0; - size_t npos; - int x, y; - try { - while (pos < pointsData.size()) { - npos = pointsData.find(',', pos); - x = boost::lexical_cast<int>(pointsData.substr(pos, npos-pos)); - pos = npos+1; - npos = pointsData.find(' ', pos); - y = boost::lexical_cast<int>(pointsData.substr(pos, npos-pos)); - pos = npos+1; - points.push_back(std::pair<int, int>(x, y)); - } - } catch (boost::bad_lexical_cast&) { - } + std::string pointsData = attributes.getAttributeValue("points").get_value_or(""); + std::vector<std::pair<int, int> > points; + size_t pos = 0; + size_t npos; + int x, y; + try { + while (pos < pointsData.size()) { + npos = pointsData.find(',', pos); + x = boost::lexical_cast<int>(pointsData.substr(pos, npos-pos)); + pos = npos+1; + npos = pointsData.find(' ', pos); + y = boost::lexical_cast<int>(pointsData.substr(pos, npos-pos)); + pos = npos+1; + points.push_back(std::pair<int, int>(x, y)); + } + } catch (boost::bad_lexical_cast&) { + } - whiteboardElement->setPoints(points); + whiteboardElement->setPoints(points); - int penWidth = 1; - try { - penWidth = boost::lexical_cast<int>(attributes.getAttributeValue("stroke-width").get_value_or("1")); - } catch (boost::bad_lexical_cast&) { - } - whiteboardElement->setPenWidth(penWidth); + int penWidth = 1; + try { + penWidth = boost::lexical_cast<int>(attributes.getAttributeValue("stroke-width").get_value_or("1")); + } catch (boost::bad_lexical_cast&) { + } + whiteboardElement->setPenWidth(penWidth); - WhiteboardColor penColor(attributes.getAttributeValue("stroke").get_value_or("#000000")); - WhiteboardColor brushColor(attributes.getAttributeValue("fill").get_value_or("#000000")); - penColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); - brushColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("fill-opacity").get_value_or("1"))); - whiteboardElement->setPenColor(penColor); - whiteboardElement->setBrushColor(brushColor); - whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); - getPayloadInternal()->setElement(whiteboardElement); - wbElement = whiteboardElement; - } else if (element == "text") { - int x = 0; - int y = 0; - try { - x = boost::lexical_cast<int>(attributes.getAttributeValue("x").get_value_or("0")); - y = boost::lexical_cast<int>(attributes.getAttributeValue("y").get_value_or("0")); - } catch (boost::bad_lexical_cast&) { - } + WhiteboardColor penColor(attributes.getAttributeValue("stroke").get_value_or("#000000")); + WhiteboardColor brushColor(attributes.getAttributeValue("fill").get_value_or("#000000")); + penColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); + brushColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("fill-opacity").get_value_or("1"))); + whiteboardElement->setPenColor(penColor); + whiteboardElement->setBrushColor(brushColor); + whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); + getPayloadInternal()->setElement(whiteboardElement); + wbElement = whiteboardElement; + } else if (element == "text") { + int x = 0; + int y = 0; + try { + x = boost::lexical_cast<int>(attributes.getAttributeValue("x").get_value_or("0")); + y = boost::lexical_cast<int>(attributes.getAttributeValue("y").get_value_or("0")); + } catch (boost::bad_lexical_cast&) { + } - WhiteboardTextElement::ref whiteboardElement = boost::make_shared<WhiteboardTextElement>(x, y); + WhiteboardTextElement::ref whiteboardElement = std::make_shared<WhiteboardTextElement>(x, y); - actualIsText = true; - WhiteboardColor color(attributes.getAttributeValue("fill").get_value_or("#000000")); - color.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); - whiteboardElement->setColor(color); + actualIsText = true; + WhiteboardColor color(attributes.getAttributeValue("fill").get_value_or("#000000")); + color.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); + whiteboardElement->setColor(color); - int fontSize = 1; - try { - fontSize = boost::lexical_cast<int>(attributes.getAttributeValue("font-size").get_value_or("12")); - } catch (boost::bad_lexical_cast&) { - } - whiteboardElement->setSize(fontSize); - whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); - getPayloadInternal()->setElement(whiteboardElement); - wbElement = whiteboardElement; - } else if (element == "ellipse") { - int cx = 0; - int cy = 0; - int rx = 0; - int ry = 0; - try { - cx = boost::lexical_cast<int>(attributes.getAttributeValue("cx").get_value_or("0")); - cy = boost::lexical_cast<int>(attributes.getAttributeValue("cy").get_value_or("0")); - rx = boost::lexical_cast<int>(attributes.getAttributeValue("rx").get_value_or("0")); - ry = boost::lexical_cast<int>(attributes.getAttributeValue("ry").get_value_or("0")); - } catch (boost::bad_lexical_cast&) { - } + int fontSize = 1; + try { + fontSize = boost::lexical_cast<int>(attributes.getAttributeValue("font-size").get_value_or("12")); + } catch (boost::bad_lexical_cast&) { + } + whiteboardElement->setSize(fontSize); + whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); + getPayloadInternal()->setElement(whiteboardElement); + wbElement = whiteboardElement; + } else if (element == "ellipse") { + int cx = 0; + int cy = 0; + int rx = 0; + int ry = 0; + try { + cx = boost::lexical_cast<int>(attributes.getAttributeValue("cx").get_value_or("0")); + cy = boost::lexical_cast<int>(attributes.getAttributeValue("cy").get_value_or("0")); + rx = boost::lexical_cast<int>(attributes.getAttributeValue("rx").get_value_or("0")); + ry = boost::lexical_cast<int>(attributes.getAttributeValue("ry").get_value_or("0")); + } catch (boost::bad_lexical_cast&) { + } - WhiteboardEllipseElement::ref whiteboardElement = boost::make_shared<WhiteboardEllipseElement>(cx, cy, rx, ry); + WhiteboardEllipseElement::ref whiteboardElement = std::make_shared<WhiteboardEllipseElement>(cx, cy, rx, ry); - int penWidth = 1; - try { - penWidth = boost::lexical_cast<int>(attributes.getAttributeValue("stroke-width").get_value_or("1")); - } catch (boost::bad_lexical_cast&) { - } - whiteboardElement->setPenWidth(penWidth); + int penWidth = 1; + try { + penWidth = boost::lexical_cast<int>(attributes.getAttributeValue("stroke-width").get_value_or("1")); + } catch (boost::bad_lexical_cast&) { + } + whiteboardElement->setPenWidth(penWidth); - WhiteboardColor penColor(attributes.getAttributeValue("stroke").get_value_or("#000000")); - WhiteboardColor brushColor(attributes.getAttributeValue("fill").get_value_or("#000000")); - penColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); - brushColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("fill-opacity").get_value_or("1"))); - whiteboardElement->setPenColor(penColor); - whiteboardElement->setBrushColor(brushColor); - whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); - getPayloadInternal()->setElement(whiteboardElement); - wbElement = whiteboardElement; - } - } - ++level_; - } + WhiteboardColor penColor(attributes.getAttributeValue("stroke").get_value_or("#000000")); + WhiteboardColor brushColor(attributes.getAttributeValue("fill").get_value_or("#000000")); + penColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("opacity").get_value_or("1"))); + brushColor.setAlpha(opacityToAlpha(attributes.getAttributeValue("fill-opacity").get_value_or("1"))); + whiteboardElement->setPenColor(penColor); + whiteboardElement->setBrushColor(brushColor); + whiteboardElement->setID(attributes.getAttributeValue("id").get_value_or("")); + getPayloadInternal()->setElement(whiteboardElement); + wbElement = whiteboardElement; + } + } + ++level_; + } - void WhiteboardParser::handleEndElement(const std::string& element, const std::string&) { - --level_; - if (level_ == 0) { - getPayloadInternal()->setData(data_); - } else if (level_ == 1) { - WhiteboardInsertOperation::ref insertOp = boost::dynamic_pointer_cast<WhiteboardInsertOperation>(operation); - if (insertOp) { - insertOp->setElement(wbElement); - } + void WhiteboardParser::handleEndElement(const std::string& element, const std::string&) { + --level_; + if (level_ == 0) { + getPayloadInternal()->setData(data_); + } else if (level_ == 1) { + WhiteboardInsertOperation::ref insertOp = std::dynamic_pointer_cast<WhiteboardInsertOperation>(operation); + if (insertOp) { + insertOp->setElement(wbElement); + } - WhiteboardUpdateOperation::ref updateOp = boost::dynamic_pointer_cast<WhiteboardUpdateOperation>(operation); - if (updateOp) { - updateOp->setElement(wbElement); - } - getPayloadInternal()->setOperation(operation); - } else if (level_ == 2) { - if (element == "text") { - actualIsText = false; - } - } - } + WhiteboardUpdateOperation::ref updateOp = std::dynamic_pointer_cast<WhiteboardUpdateOperation>(operation); + if (updateOp) { + updateOp->setElement(wbElement); + } + getPayloadInternal()->setOperation(operation); + } else if (level_ == 2) { + if (element == "text") { + actualIsText = false; + } + } + } - void WhiteboardParser::handleCharacterData(const std::string& data) { - if (level_ == 3 && actualIsText) { - WhiteboardTextElement::ref element = boost::dynamic_pointer_cast<WhiteboardTextElement>(getPayloadInternal()->getElement()); - element->setText(data); - } - } + void WhiteboardParser::handleCharacterData(const std::string& data) { + if (level_ == 3 && actualIsText) { + WhiteboardTextElement::ref element = std::dynamic_pointer_cast<WhiteboardTextElement>(getPayloadInternal()->getElement()); + element->setText(data); + } + } - WhiteboardPayload::Type WhiteboardParser::stringToType(const std::string& type) const { - if (type == "data") { - return WhiteboardPayload::Data; - } else if (type == "session-request") { - return WhiteboardPayload::SessionRequest; - } else if (type == "session-accept") { - return WhiteboardPayload::SessionAccept; - } else if (type == "session-terminate") { - return WhiteboardPayload::SessionTerminate; - } else { - return WhiteboardPayload::UnknownType; - } - } + WhiteboardPayload::Type WhiteboardParser::stringToType(const std::string& type) const { + if (type == "data") { + return WhiteboardPayload::Data; + } else if (type == "session-request") { + return WhiteboardPayload::SessionRequest; + } else if (type == "session-accept") { + return WhiteboardPayload::SessionAccept; + } else if (type == "session-terminate") { + return WhiteboardPayload::SessionTerminate; + } else { + return WhiteboardPayload::UnknownType; + } + } - int WhiteboardParser::opacityToAlpha(std::string opacity) const { - int value = 255; - if (opacity.find('.') != std::string::npos) { - opacity = opacity.substr(opacity.find('.')+1, 2); - try { - value = boost::lexical_cast<int>(opacity)*255/100; - } catch (boost::bad_lexical_cast&) { - } - } - return value; - } + int WhiteboardParser::opacityToAlpha(std::string opacity) const { + int value = 255; + if (opacity.find('.') != std::string::npos) { + opacity = opacity.substr(opacity.find('.')+1, 2); + try { + value = boost::lexical_cast<int>(opacity)*255/100; + } catch (boost::bad_lexical_cast&) { + } + } + return value; + } } |