/* * Copyright (c) 2012 Mateusz Piękos * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ #include #include namespace Swift { std::pair WhiteboardTransformer::transform(WhiteboardOperation::ref clientOp, WhiteboardOperation::ref serverOp) { WhiteboardInsertOperation::ref clientInsert = boost::dynamic_pointer_cast(clientOp); WhiteboardInsertOperation::ref serverInsert = boost::dynamic_pointer_cast(serverOp); WhiteboardUpdateOperation::ref clientUpdate = boost::dynamic_pointer_cast(clientOp); WhiteboardUpdateOperation::ref serverUpdate = boost::dynamic_pointer_cast(serverOp); WhiteboardDeleteOperation::ref clientDelete = boost::dynamic_pointer_cast(clientOp); WhiteboardDeleteOperation::ref serverDelete = boost::dynamic_pointer_cast(serverOp); if (clientInsert && serverInsert) { return transform(clientInsert, serverInsert); } else if (clientUpdate && serverUpdate) { return transform(clientUpdate, serverUpdate); } else if (clientInsert && serverUpdate) { return transform(clientInsert, serverUpdate); } else if (clientUpdate && serverInsert) { return transform(clientUpdate, serverInsert); } else if (clientDelete && serverDelete) { return transform(clientDelete, serverDelete); } else if (clientInsert && serverDelete) { return transform(clientInsert, serverDelete); } else if (clientDelete && serverInsert) { return transform(clientDelete, serverInsert); } else if (clientUpdate && serverDelete) { return transform(clientUpdate, serverDelete); } else if (clientDelete && serverUpdate) { return transform(clientDelete, serverUpdate); } else { return std::pair(); } } std::pair WhiteboardTransformer::transform(WhiteboardInsertOperation::ref clientOp, WhiteboardInsertOperation::ref serverOp) { std::pair result; result.first = boost::make_shared(*serverOp); result.first->setParentID(clientOp->getID()); result.first->setPos(result.first->getPos()+1); result.second = boost::make_shared(*clientOp); result.second->setParentID(serverOp->getID()); return result; } std::pair WhiteboardTransformer::transform(WhiteboardUpdateOperation::ref clientOp, WhiteboardUpdateOperation::ref serverOp) { std::pair result; result.first = boost::make_shared(*serverOp); result.first->setParentID(clientOp->getID()); if (clientOp->getPos() == serverOp->getPos()) { result.second = boost::make_shared(*serverOp); result.second->setID(clientOp->getID()); result.second->setParentID(serverOp->getID()); } else { result.second = boost::make_shared(*clientOp); result.second->setParentID(serverOp->getID()); } return result; } std::pair WhiteboardTransformer::transform(WhiteboardUpdateOperation::ref clientOp, WhiteboardInsertOperation::ref serverOp) { std::pair result; result.first = boost::make_shared(*serverOp); result.first->setParentID(clientOp->getID()); result.second = boost::make_shared(*clientOp); result.second->setParentID(serverOp->getID()); if (serverOp->getPos() <= clientOp->getPos()) { result.second->setPos(result.second->getPos()+1); } return result; } std::pair WhiteboardTransformer::transform(WhiteboardInsertOperation::ref clientOp, WhiteboardUpdateOperation::ref serverOp) { std::pair result; result.first = boost::make_shared(*serverOp); result.first->setParentID(clientOp->getID()); result.second = boost::make_shared(*clientOp); result.second->setParentID(serverOp->getID()); if (serverOp->getPos() >= clientOp->getPos()) { result.first->setPos(result.first->getPos()+1); } return result; } std::pair WhiteboardTransformer::transform(WhiteboardDeleteOperation::ref clientOp, WhiteboardDeleteOperation::ref serverOp) { std::pair result; result.first = boost::make_shared(*serverOp); result.first->setParentID(clientOp->getID()); result.second = boost::make_shared(*clientOp); result.second->setParentID(serverOp->getID()); 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); } //TODO: situation with deletion of the same item return result; } std::pair WhiteboardTransformer::transform(WhiteboardInsertOperation::ref clientOp, WhiteboardDeleteOperation::ref serverOp) { std::pair result; result.first = boost::make_shared(*serverOp); result.first->setParentID(clientOp->getID()); result.second = boost::make_shared(*clientOp); result.second->setParentID(serverOp->getID()); if (clientOp->getPos() <= serverOp->getPos()) { result.first->setPos(result.first->getPos()+1); } else { result.second->setPos(result.second->getPos()-1); } return result; } std::pair WhiteboardTransformer::transform(WhiteboardDeleteOperation::ref clientOp, WhiteboardInsertOperation::ref serverOp) { std::pair result; result.first = boost::make_shared(*serverOp); result.first->setParentID(clientOp->getID()); result.second = boost::make_shared(*clientOp); result.second->setParentID(serverOp->getID()); if (serverOp->getPos() <= clientOp->getPos()) { result.second->setPos(result.second->getPos()+1); } else { result.first->setPos(result.first->getPos()-1); } return result; } std::pair WhiteboardTransformer::transform(WhiteboardUpdateOperation::ref clientOp, WhiteboardDeleteOperation::ref serverOp) { std::pair result; result.first = boost::make_shared(*serverOp); result.first->setParentID(clientOp->getID()); result.second = boost::make_shared(*clientOp); result.second->setParentID(serverOp->getID()); if (clientOp->getPos() > serverOp->getPos()) { result.second->setPos(result.second->getPos()-1); } return result; //TODO: situation with the same pos } std::pair WhiteboardTransformer::transform(WhiteboardDeleteOperation::ref clientOp, WhiteboardUpdateOperation::ref serverOp) { std::pair result; result.first = boost::make_shared(*serverOp); result.first->setParentID(clientOp->getID()); result.second = boost::make_shared(*clientOp); result.second->setParentID(serverOp->getID()); if (clientOp->getPos() < serverOp->getPos()) { result.first->setPos(result.first->getPos()-1); } return result; //TODO: situation with the same pos } }