From 0071e9ed46775ee4e49ed969099ce08c49c9a07b Mon Sep 17 00:00:00 2001 From: Mateusz Piekos Date: Thu, 5 Jul 2012 17:06:57 +0200 Subject: Handling less simple server side operations diff --git a/Swiften/Whiteboard/UnitTest/WhiteboardServerTest.cpp b/Swiften/Whiteboard/UnitTest/WhiteboardServerTest.cpp index 3d17064..c61f9d1 100644 --- a/Swiften/Whiteboard/UnitTest/WhiteboardServerTest.cpp +++ b/Swiften/Whiteboard/UnitTest/WhiteboardServerTest.cpp @@ -18,6 +18,7 @@ using namespace Swift; class WhiteboardServerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(WhiteboardServerTest); CPPUNIT_TEST(testSimpleOp); + CPPUNIT_TEST(testFewSimpleOps); CPPUNIT_TEST_SUITE_END(); public: void testSimpleOp() { @@ -42,6 +43,39 @@ public: CPPUNIT_ASSERT_EQUAL(1, op->getPos()); CPPUNIT_ASSERT_EQUAL(clientElement, boost::dynamic_pointer_cast(op->getElement())); } + + void testFewSimpleOps() { + WhiteboardServer server; + WhiteboardInsertOperation::ref firstOp = boost::make_shared(); + firstOp->setID("0"); + server.handleLocalOperationReceived(firstOp); + WhiteboardInsertOperation::ref serverOp = boost::make_shared(); + serverOp->setID("a"); + serverOp->setParentID("0"); + serverOp->setPos(1); + server.handleLocalOperationReceived(serverOp); + serverOp = boost::make_shared(); + serverOp->setID("b"); + serverOp->setParentID("a"); + serverOp->setPos(2); + server.handleLocalOperationReceived(serverOp); + serverOp = boost::make_shared(); + serverOp->setID("c"); + serverOp->setParentID("b"); + serverOp->setPos(3); + server.handleLocalOperationReceived(serverOp); + WhiteboardInsertOperation::ref clientOp = boost::make_shared(); + WhiteboardEllipseElement::ref clientElement = boost::make_shared(0,0,0,0); + clientOp->setID("d"); + clientOp->setParentID("0"); + clientOp->setPos(1); + clientOp->setElement(clientElement); + WhiteboardInsertOperation::ref op = boost::dynamic_pointer_cast(server.handleClientOperationReceived(clientOp)); + CPPUNIT_ASSERT_EQUAL(std::string("c"), op->getParentID()); + CPPUNIT_ASSERT_EQUAL(std::string("d"), op->getID()); + CPPUNIT_ASSERT_EQUAL(1, op->getPos()); + CPPUNIT_ASSERT_EQUAL(clientElement, boost::dynamic_pointer_cast(op->getElement())); + } }; CPPUNIT_TEST_SUITE_REGISTRATION(WhiteboardServerTest); diff --git a/Swiften/Whiteboard/WhiteboardServer.cpp b/Swiften/Whiteboard/WhiteboardServer.cpp index 89fb00d..a12e4e8 100644 --- a/Swiften/Whiteboard/WhiteboardServer.cpp +++ b/Swiften/Whiteboard/WhiteboardServer.cpp @@ -12,18 +12,26 @@ namespace Swift { operations_.push_back(operation); } - WhiteboardOperation::ref WhiteboardServer::handleClientOperationReceived(WhiteboardInsertOperation::ref operation) { - std::list::iterator it; - for (it = operations_.begin(); it != operations_.end(); ++it) { - if (operation->getParentID() == (*it)->getParentID()) { - WhiteboardInsertOperation::ref insertOperation = boost::dynamic_pointer_cast(*it); + WhiteboardOperation::ref WhiteboardServer::handleClientOperationReceived(WhiteboardInsertOperation::ref newOperation) { + std::list::reverse_iterator it; + for (it = operations_.rbegin(); it != operations_.rend(); ++it) { + WhiteboardOperation::ref operation = *it; + + while (newOperation->getParentID() == operation->getParentID()) { + WhiteboardInsertOperation::ref insertOperation = boost::dynamic_pointer_cast(operation); if (insertOperation) { - std::pair tResult = WhiteboardTransformer::transform(operation, insertOperation); - operations_.push_back(tResult.second); - return tResult.second; - } - else { - operations_.push_back(*it); + std::pair tResult = WhiteboardTransformer::transform(newOperation, insertOperation); + + if (it == operations_.rbegin()) { + operations_.push_back(tResult.second); + return tResult.second; + } else { + newOperation = tResult.second; + --it; + operation = *it; + } + } else { + operations_.push_back(operation); return *it; } } -- cgit v0.10.2-6-g49f6