diff options
Diffstat (limited to 'Swiften/Whiteboard/WhiteboardServer.cpp')
-rw-r--r-- | Swiften/Whiteboard/WhiteboardServer.cpp | 30 |
1 files changed, 19 insertions, 11 deletions
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<WhiteboardOperation::ref>::iterator it; - for (it = operations_.begin(); it != operations_.end(); ++it) { - if (operation->getParentID() == (*it)->getParentID()) { - WhiteboardInsertOperation::ref insertOperation = boost::dynamic_pointer_cast<WhiteboardInsertOperation>(*it); + WhiteboardOperation::ref WhiteboardServer::handleClientOperationReceived(WhiteboardInsertOperation::ref newOperation) { + std::list<WhiteboardOperation::ref>::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<WhiteboardInsertOperation>(operation); if (insertOperation) { - std::pair<WhiteboardInsertOperation::ref, WhiteboardInsertOperation::ref> tResult = WhiteboardTransformer::transform(operation, insertOperation); - operations_.push_back(tResult.second); - return tResult.second; - } - else { - operations_.push_back(*it); + std::pair<WhiteboardInsertOperation::ref, WhiteboardInsertOperation::ref> 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; } } |