summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMateusz Piekos <mateuszpiekos@gmail.com>2012-07-05 15:06:57 (GMT)
committerMateusz Piekos <mateuszpiekos@gmail.com>2012-07-05 15:06:57 (GMT)
commit0071e9ed46775ee4e49ed969099ce08c49c9a07b (patch)
treec29abf4e0f67a995148766086fd435b5455b5096 /Swiften/Whiteboard/WhiteboardServer.cpp
parent349cda4b8e178dc4a6694c47a3eb45e5a1368fb8 (diff)
downloadswift-contrib-0071e9ed46775ee4e49ed969099ce08c49c9a07b.zip
swift-contrib-0071e9ed46775ee4e49ed969099ce08c49c9a07b.tar.bz2
Handling less simple server side operations
Diffstat (limited to 'Swiften/Whiteboard/WhiteboardServer.cpp')
-rw-r--r--Swiften/Whiteboard/WhiteboardServer.cpp30
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;
}
}