summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/isode/stroke/serializer/payloadserializers/WhiteboardSerializer.java')
-rw-r--r--src/com/isode/stroke/serializer/payloadserializers/WhiteboardSerializer.java221
1 files changed, 221 insertions, 0 deletions
diff --git a/src/com/isode/stroke/serializer/payloadserializers/WhiteboardSerializer.java b/src/com/isode/stroke/serializer/payloadserializers/WhiteboardSerializer.java
new file mode 100644
index 0000000..b0f84f5
--- /dev/null
+++ b/src/com/isode/stroke/serializer/payloadserializers/WhiteboardSerializer.java
@@ -0,0 +1,221 @@
+/* Copyright (c) 2016, Isode Limited, London, England.
+ * All rights reserved.
+ *
+ * Acquisition and use of this software and related materials for any
+ * purpose requires a written license agreement from Isode Limited,
+ * or a written license from an organisation licensed by Isode Limited
+ * to grant such a license.
+ *
+ */
+package com.isode.stroke.serializer.payloadserializers;
+
+import java.util.Iterator;
+import java.util.logging.Logger;
+
+import com.isode.stroke.elements.WhiteboardDeleteOperation;
+import com.isode.stroke.elements.WhiteboardElementVisitor;
+import com.isode.stroke.elements.WhiteboardEllipseElement;
+import com.isode.stroke.elements.WhiteboardFreehandPathElement;
+import com.isode.stroke.elements.WhiteboardInsertOperation;
+import com.isode.stroke.elements.WhiteboardLineElement;
+import com.isode.stroke.elements.WhiteboardOperation;
+import com.isode.stroke.elements.WhiteboardPayload;
+import com.isode.stroke.elements.WhiteboardPayload.Type;
+import com.isode.stroke.elements.WhiteboardPolygonElement;
+import com.isode.stroke.elements.WhiteboardRectElement;
+import com.isode.stroke.elements.WhiteboardTextElement;
+import com.isode.stroke.elements.WhiteboardUpdateOperation;
+import com.isode.stroke.serializer.GenericPayloadSerializer;
+import com.isode.stroke.serializer.xml.XMLElement;
+import com.isode.stroke.serializer.xml.XMLTextNode;
+
+public class WhiteboardSerializer extends GenericPayloadSerializer<WhiteboardPayload> {
+
+ private static class WhiteboardElementSerializingVisitor implements WhiteboardElementVisitor {
+
+ private XMLElement element;
+
+ @Override
+ public void visit(WhiteboardLineElement line) {
+ element = new XMLElement("line");
+ element.setAttribute("x1", String.valueOf(line.x1()));
+ element.setAttribute("y1", String.valueOf(line.y1()));
+ element.setAttribute("x2", String.valueOf(line.x2()));
+ element.setAttribute("y2", String.valueOf(line.y2()));
+ element.setAttribute("id", line.getID());
+ element.setAttribute("stroke", line.getColor().toHex());
+ element.setAttribute("stroke-width", String.valueOf(line.getPenWidth()));
+ element.setAttribute("opacity", alphaToOpacity(line.getColor().getAlpha()));
+ }
+
+ @Override
+ public void visit(WhiteboardFreehandPathElement path) {
+ element = new XMLElement("path");
+ element.setAttribute("id", path.getID());
+ element.setAttribute("stroke", path.getColor().toHex());
+ element.setAttribute("stroke-width", String.valueOf(path.getPenWidth()));
+ element.setAttribute("opacity", alphaToOpacity(path.getColor().getAlpha()));
+ StringBuilder pathDataBuilder = new StringBuilder();
+ if (!path.getPoints().isEmpty()) {
+ Iterator<WhiteboardFreehandPathElement.Point> it = path.getPoints().iterator();
+ WhiteboardFreehandPathElement.Point point = it.next();
+ pathDataBuilder.append('M');
+ pathDataBuilder.append(point.x);
+ pathDataBuilder.append(' ');
+ pathDataBuilder.append(point.y);
+ pathDataBuilder.append('L');
+ while (it.hasNext()) {
+ point = it.next();
+ pathDataBuilder.append(point.x);
+ pathDataBuilder.append(' ');
+ pathDataBuilder.append(point.y);
+ pathDataBuilder.append(' ');
+ }
+ }
+ element.setAttribute("d", pathDataBuilder.toString());
+ }
+
+ @Override
+ public void visit(WhiteboardRectElement rect) {
+ element = new XMLElement("rect");
+ element.setAttribute("x", String.valueOf(rect.getX()));
+ element.setAttribute("y", String.valueOf(rect.getY()));
+ element.setAttribute("width", String.valueOf(rect.getWidth()));
+ element.setAttribute("height", String.valueOf(rect.getHeight()));
+ element.setAttribute("id", rect.getID());
+ element.setAttribute("stroke", rect.getPenColor().toHex());
+ element.setAttribute("fill", rect.getBrushColor().toHex());;
+ element.setAttribute("stroke-width", String.valueOf(rect.getPenWidth()));
+ element.setAttribute("opacity", alphaToOpacity(rect.getPenColor().getAlpha()));
+ element.setAttribute("fill-opacity", alphaToOpacity(rect.getBrushColor().getAlpha()));
+ }
+
+ @Override
+ public void visit(WhiteboardPolygonElement polygon) {
+ element = new XMLElement("polygon");
+ element.setAttribute("id", polygon.getID());
+ element.setAttribute("stroke", polygon.getPenColor().toHex());
+ element.setAttribute("fill", polygon.getBrushColor().toHex());;
+ element.setAttribute("stroke-width", String.valueOf(polygon.getPenWidth()));
+ element.setAttribute("opacity", alphaToOpacity(polygon.getPenColor().getAlpha()));
+ element.setAttribute("fill-opacity", alphaToOpacity(polygon.getBrushColor().getAlpha()));
+ StringBuilder points = new StringBuilder();
+ for (WhiteboardPolygonElement.Point point : polygon.getPoints()) {
+ points.append(point.x);
+ points.append(',');
+ points.append(point.y);
+ points.append(' ');
+ }
+ element.setAttribute("points", points.toString());
+
+ }
+
+ @Override
+ public void visit(WhiteboardTextElement text) {
+ element = new XMLElement("text");
+ element.setAttribute("x", String.valueOf(text.getX()));
+ element.setAttribute("y", String.valueOf(text.getY()));
+ element.setAttribute("font-size", String.valueOf(text.getSize()));
+ element.setAttribute("id", text.getID());
+ element.setAttribute("fill", text.getColor().toHex());
+ element.setAttribute("opacity", alphaToOpacity(text.getColor().getAlpha()));
+ element.addNode(new XMLTextNode(text.getText()));
+
+ }
+
+ @Override
+ public void visit(WhiteboardEllipseElement ellipse) {
+ element = new XMLElement("ellipse");
+ element.setAttribute("cx", String.valueOf(ellipse.getCX()));
+ element.setAttribute("cy", String.valueOf(ellipse.getCY()));
+ element.setAttribute("rx", String.valueOf(ellipse.getRX()));
+ element.setAttribute("ry", String.valueOf(ellipse.getRY()));
+ element.setAttribute("id", ellipse.getID());
+ element.setAttribute("stroke", ellipse.getPenColor().toHex());
+ element.setAttribute("fill", ellipse.getBrushColor().toHex());;
+ element.setAttribute("stroke-width", String.valueOf(ellipse.getPenWidth()));
+ element.setAttribute("opacity", alphaToOpacity(ellipse.getPenColor().getAlpha()));
+ element.setAttribute("fill-opacity", alphaToOpacity(ellipse.getBrushColor().getAlpha()));
+ }
+
+ public XMLElement getResult() {
+ return element;
+ }
+
+ private String alphaToOpacity(int alpha) {
+ int opacity = 100*alpha/254;
+ if (opacity == 100) {
+ return "1";
+ } else {
+ return String.format(".%d", opacity);
+ }
+ }
+
+ }
+
+ private final Logger logger = Logger.getLogger(this.getClass().getName());
+
+ public WhiteboardSerializer() {
+ super(WhiteboardPayload.class);
+ }
+
+ @Override
+ protected String serializePayload(WhiteboardPayload payload) {
+ XMLElement element = new XMLElement("wb","http://swift.im/whiteboard");
+ if (payload.getType() == Type.Data) {
+ XMLElement operationNode = new XMLElement("operation");
+ WhiteboardElementSerializingVisitor visitor = new WhiteboardElementSerializingVisitor();
+ WhiteboardOperation operation = payload.getOperation();
+ if (operation instanceof WhiteboardInsertOperation) {
+ WhiteboardInsertOperation insertOp = (WhiteboardInsertOperation) operation;
+ operationNode.setAttribute("type", "insert");
+ operationNode.setAttribute("pos", String.valueOf(insertOp.getPos()));
+ operationNode.setAttribute("id", insertOp.getID());
+ operationNode.setAttribute("parentid", insertOp.getParentID());
+ insertOp.getElement().accept(visitor);
+ operationNode.addNode(operationNode);
+ }
+ if (operation instanceof WhiteboardUpdateOperation) {
+ WhiteboardUpdateOperation updateOp = (WhiteboardUpdateOperation) operation;
+ operationNode.setAttribute("type", "update");
+ operationNode.setAttribute("pos", String.valueOf(updateOp.getPos()));
+ operationNode.setAttribute("id", updateOp.getID());
+ operationNode.setAttribute("parentid", updateOp.getParentID());
+ operationNode.setAttribute("newpos", String.valueOf(updateOp.getNewPos()));
+ updateOp.getElement().accept(visitor);
+ operationNode.addNode(visitor.getResult());
+ }
+ if (operation instanceof WhiteboardDeleteOperation) {
+ WhiteboardDeleteOperation deleteOp = new WhiteboardDeleteOperation();
+ operationNode.setAttribute("type", "delete");
+ operationNode.setAttribute("pos", String.valueOf(deleteOp.getPos()));
+ operationNode.setAttribute("id", deleteOp.getID());
+ operationNode.setAttribute("parentid", deleteOp.getParentID());
+ operationNode.setAttribute("elementid", deleteOp.getElementID());
+ }
+ element.addNode(operationNode);
+ }
+ element.setAttribute("type", typeToString(payload.getType()));
+ return element.serialize();
+ }
+
+ private String typeToString(Type type) {
+ switch (type) {
+ case Data:
+ return "data";
+ case SessionAccept:
+ return "session-accept";
+ case SessionRequest:
+ return "session-request";
+ case SessionTerminate:
+ return "session-terminate";
+ case UnknownType:
+ logger.warning("Warning: Serializing unknown action value.");
+ return "";
+ default:
+ assert(false);
+ return "";
+ }
+ }
+
+}