summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Whiteboard/WhiteboardTransformer.cpp')
-rw-r--r--Swiften/Whiteboard/WhiteboardTransformer.cpp35
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;