/* * Copyright (c) 2012 Mateusz Piękos * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ #include #include #include #include #include #include #include namespace Swift { void WhiteboardElementSerializingVisitor::visit(WhiteboardLineElement& line) { element = boost::make_shared("line"); try { element->setAttribute("x1", boost::lexical_cast(line.x1())); element->setAttribute("y1", boost::lexical_cast(line.y1())); element->setAttribute("x2", boost::lexical_cast(line.x2())); element->setAttribute("y2", boost::lexical_cast(line.y2())); element->setAttribute("id", line.getID()); element->setAttribute("stroke", line.getColor().toHex()); element->setAttribute("stroke-width", boost::lexical_cast(line.getPenWidth())); element->setAttribute("opacity", alphaToOpacity(line.getColor().getAlpha())); } catch (boost::bad_lexical_cast&) { } } void WhiteboardElementSerializingVisitor::visit(WhiteboardFreehandPathElement& path) { element = boost::make_shared("path"); element->setAttribute("id", path.getID()); element->setAttribute("stroke", path.getColor().toHex()); try { element->setAttribute("stroke-width", boost::lexical_cast(path.getPenWidth())); element->setAttribute("opacity", alphaToOpacity(path.getColor().getAlpha())); std::string pathData; if (path.getPoints().size() != 0) { std::vector >::const_iterator it = path.getPoints().begin(); pathData = "M"+boost::lexical_cast(it->first)+" "+boost::lexical_cast(it->second)+"L"; for (; it != path.getPoints().end(); ++it) { pathData += boost::lexical_cast(it->first)+" "+boost::lexical_cast(it->second)+" "; } } element->setAttribute("d", pathData); } catch (boost::bad_lexical_cast&) { } } void WhiteboardElementSerializingVisitor::visit(WhiteboardRectElement& rect) { element = boost::make_shared("rect"); try { element->setAttribute("x", boost::lexical_cast(rect.getX())); element->setAttribute("y", boost::lexical_cast(rect.getY())); element->setAttribute("width", boost::lexical_cast(rect.getWidth())); element->setAttribute("height", boost::lexical_cast(rect.getHeight())); element->setAttribute("id", rect.getID()); element->setAttribute("stroke", rect.getPenColor().toHex()); element->setAttribute("fill", rect.getBrushColor().toHex());; element->setAttribute("stroke-width", boost::lexical_cast(rect.getPenWidth())); element->setAttribute("opacity", alphaToOpacity(rect.getPenColor().getAlpha())); element->setAttribute("fill-opacity", alphaToOpacity(rect.getBrushColor().getAlpha())); } catch (boost::bad_lexical_cast&) { } } void WhiteboardElementSerializingVisitor::visit(WhiteboardPolygonElement& polygon) { element = boost::make_shared("polygon"); try { element->setAttribute("id", polygon.getID()); element->setAttribute("stroke", polygon.getPenColor().toHex()); element->setAttribute("fill", polygon.getBrushColor().toHex());; element->setAttribute("stroke-width", boost::lexical_cast(polygon.getPenWidth())); element->setAttribute("opacity", alphaToOpacity(polygon.getPenColor().getAlpha())); element->setAttribute("fill-opacity", alphaToOpacity(polygon.getBrushColor().getAlpha())); std::string points; std::vector >::const_iterator it = polygon.getPoints().begin(); for (; it != polygon.getPoints().end(); ++it) { points += boost::lexical_cast(it->first)+","+boost::lexical_cast(it->second)+" "; } element->setAttribute("points", points); } catch (boost::bad_lexical_cast&) { } } void WhiteboardElementSerializingVisitor::visit(WhiteboardTextElement& text) { element = boost::make_shared("text"); try { element->setAttribute("x", boost::lexical_cast(text.getX())); element->setAttribute("y", boost::lexical_cast(text.getY())); element->setAttribute("font-size", boost::lexical_cast(text.getSize())); element->setAttribute("id", text.getID()); element->setAttribute("fill", text.getColor().toHex()); element->setAttribute("opacity", alphaToOpacity(text.getColor().getAlpha())); element->addNode(boost::make_shared(text.getText())); } catch (boost::bad_lexical_cast&) { } } void WhiteboardElementSerializingVisitor::visit(WhiteboardEllipseElement& ellipse) { element = boost::make_shared("ellipse"); try { element->setAttribute("cx", boost::lexical_cast(ellipse.getCX())); element->setAttribute("cy", boost::lexical_cast(ellipse.getCY())); element->setAttribute("rx", boost::lexical_cast(ellipse.getRX())); element->setAttribute("ry", boost::lexical_cast(ellipse.getRY())); element->setAttribute("id", ellipse.getID()); element->setAttribute("stroke", ellipse.getPenColor().toHex()); element->setAttribute("fill", ellipse.getBrushColor().toHex());; element->setAttribute("stroke-width", boost::lexical_cast(ellipse.getPenWidth())); element->setAttribute("opacity", alphaToOpacity(ellipse.getPenColor().getAlpha())); element->setAttribute("fill-opacity", alphaToOpacity(ellipse.getBrushColor().getAlpha())); } catch (boost::bad_lexical_cast&) { } } std::string WhiteboardElementSerializingVisitor::intToStr(const int t) const { std::stringstream ss; ss << t; return ss.str(); } XMLElement::ref WhiteboardElementSerializingVisitor::getResult() const { return element; } std::string WhiteboardElementSerializingVisitor::alphaToOpacity(int alpha) const { int opacity = 100*alpha/254; if (opacity == 100) { return "1"; } else { return "."+boost::lexical_cast(opacity); } } std::string WhiteboardSerializer::serializePayload(boost::shared_ptr payload) const { XMLElement element("wb"); if (payload->getType() == WhiteboardPayload::Data) { XMLElement::ref operationNode = boost::make_shared("operation"); WhiteboardElementSerializingVisitor visitor; // payload->getElement()->accept(visitor); WhiteboardInsertOperation::ref insertOp = boost::dynamic_pointer_cast(payload->getOperation()); if (insertOp) { try { operationNode->setAttribute("type", "insert"); operationNode->setAttribute("pos", boost::lexical_cast(insertOp->getPos())); operationNode->setAttribute("id", insertOp->getID()); operationNode->setAttribute("parentid", insertOp->getParentID()); } catch (boost::bad_lexical_cast&) { } insertOp->getElement()->accept(visitor); operationNode->addNode(visitor.getResult()); } WhiteboardUpdateOperation::ref updateOp = boost::dynamic_pointer_cast(payload->getOperation()); if (updateOp) { try { operationNode->setAttribute("type", "update"); operationNode->setAttribute("pos", boost::lexical_cast(updateOp->getPos())); operationNode->setAttribute("id", updateOp->getID()); operationNode->setAttribute("parentid", updateOp->getParentID()); } catch (boost::bad_lexical_cast&) { } updateOp->getElement()->accept(visitor); operationNode->addNode(visitor.getResult()); } WhiteboardDeleteOperation::ref deleteOp = boost::dynamic_pointer_cast(payload->getOperation()); if (deleteOp) { try { operationNode->setAttribute("type", "delete"); operationNode->setAttribute("pos", boost::lexical_cast(deleteOp->getPos())); operationNode->setAttribute("id", deleteOp->getID()); operationNode->setAttribute("parentid", deleteOp->getParentID()); } catch (boost::bad_lexical_cast&) { } } element.addNode(operationNode); } element.setAttribute("type", typeToString(payload->getType())); return element.serialize(); } std::string WhiteboardSerializer::typeToString(WhiteboardPayload::Type type) const { if(type == WhiteboardPayload::Data) { return ""; } else if (type == WhiteboardPayload::SessionRequest) { return "session-request"; } else if (type == WhiteboardPayload::SessionAccept) { return "session-accept"; } else if (type == WhiteboardPayload::SessionTerminate) { return "session-terminate"; } } }