diff options
Diffstat (limited to 'Swiften/Whiteboard/WhiteboardTransformer.cpp')
-rw-r--r-- | Swiften/Whiteboard/WhiteboardTransformer.cpp | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/Swiften/Whiteboard/WhiteboardTransformer.cpp b/Swiften/Whiteboard/WhiteboardTransformer.cpp index 8ee206b..c9dbbbd 100644 --- a/Swiften/Whiteboard/WhiteboardTransformer.cpp +++ b/Swiften/Whiteboard/WhiteboardTransformer.cpp @@ -94,10 +94,19 @@ namespace Swift { result.first->setParentID(clientOp->getID()); result.second = boost::make_shared<WhiteboardDeleteOperation>(*clientOp); result.second->setParentID(serverOp->getID()); + if (clientOp->getPos() == -1) { + result.second->setPos(-1); + } + if (serverOp->getPos() == -1) { + result.first->setPos(-1); + } if (clientOp->getPos() < serverOp->getPos()) { result.first->setPos(result.first->getPos()-1); } else if (clientOp->getPos() > serverOp->getPos()) { result.second->setPos(result.second->getPos()-1); + } else { + result.first->setPos(-1); + result.second->setPos(-1); } //TODO: situation with deletion of the same item return result; @@ -111,7 +120,7 @@ namespace Swift { result.second->setParentID(serverOp->getID()); if (clientOp->getPos() <= serverOp->getPos()) { result.first->setPos(result.first->getPos()+1); - } else { + } else if (serverOp->getPos() != -1) { result.second->setPos(result.second->getPos()-1); } return result; @@ -125,19 +134,26 @@ namespace Swift { result.second->setParentID(serverOp->getID()); if (serverOp->getPos() <= clientOp->getPos()) { result.second->setPos(result.second->getPos()+1); - } else { + } else if (clientOp->getPos() != -1) { result.first->setPos(result.first->getPos()-1); } return result; } std::pair<WhiteboardOperation::ref, WhiteboardOperation::ref> WhiteboardTransformer::transform(WhiteboardUpdateOperation::ref clientOp, WhiteboardDeleteOperation::ref serverOp) { - std::pair<WhiteboardDeleteOperation::ref, WhiteboardUpdateOperation::ref> result; + std::pair<WhiteboardDeleteOperation::ref, WhiteboardOperation::ref> result; result.first = boost::make_shared<WhiteboardDeleteOperation>(*serverOp); result.first->setParentID(clientOp->getID()); result.second = boost::make_shared<WhiteboardUpdateOperation>(*clientOp); result.second->setParentID(serverOp->getID()); - if (clientOp->getPos() > serverOp->getPos()) { + if (clientOp->getPos() == serverOp->getPos()) { + WhiteboardDeleteOperation::ref deleteOp = boost::make_shared<WhiteboardDeleteOperation>(); + result.second = deleteOp; + result.second->setPos(-1); + result.second->setID(clientOp->getID()); + result.second->setParentID(serverOp->getID()); + deleteOp->setElementID(serverOp->getElementID()); + } else if (clientOp->getPos() > serverOp->getPos()) { result.second->setPos(result.second->getPos()-1); } return result; @@ -145,12 +161,19 @@ namespace Swift { } std::pair<WhiteboardOperation::ref, WhiteboardOperation::ref> WhiteboardTransformer::transform(WhiteboardDeleteOperation::ref clientOp, WhiteboardUpdateOperation::ref serverOp) { - std::pair<WhiteboardUpdateOperation::ref, WhiteboardDeleteOperation::ref> result; + std::pair<WhiteboardOperation::ref, WhiteboardDeleteOperation::ref> result; result.first = boost::make_shared<WhiteboardUpdateOperation>(*serverOp); result.first->setParentID(clientOp->getID()); result.second = boost::make_shared<WhiteboardDeleteOperation>(*clientOp); result.second->setParentID(serverOp->getID()); - if (clientOp->getPos() < serverOp->getPos()) { + if (clientOp->getPos() == serverOp->getPos()) { + WhiteboardDeleteOperation::ref deleteOp = boost::make_shared<WhiteboardDeleteOperation>(); + result.first = deleteOp; + result.first->setPos(-1); + result.first->setID(serverOp->getID()); + result.first->setParentID(clientOp->getID()); + deleteOp->setElementID(clientOp->getElementID()); + } else if (clientOp->getPos() < serverOp->getPos()) { result.first->setPos(result.first->getPos()-1); } return result; |