diff options
Diffstat (limited to 'Swiften/Whiteboard/WhiteboardClient.cpp')
-rw-r--r-- | Swiften/Whiteboard/WhiteboardClient.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/Swiften/Whiteboard/WhiteboardClient.cpp b/Swiften/Whiteboard/WhiteboardClient.cpp new file mode 100644 index 0000000..6b352f5 --- /dev/null +++ b/Swiften/Whiteboard/WhiteboardClient.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2012 Mateusz Piękos + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +#include <Swiften/Whiteboard/WhiteboardClient.h> +#include <Swiften/Whiteboard/WhiteboardTransformer.h> + +namespace Swift { + WhiteboardOperation::ref WhiteboardClient::handleLocalOperationReceived(WhiteboardOperation::ref operation) { + localOperations_.push_back(operation); + if (lastSentOperationID_.empty()) + { + lastSentOperationID_ = operation->getID(); + return operation; + } + return WhiteboardOperation::ref(); + } + + std::pair<WhiteboardOperation::ref, WhiteboardOperation::ref> WhiteboardClient::handleServerOperationReceived(WhiteboardOperation::ref operation) { + serverOperations_.push_back(operation); + WhiteboardOperation::ref clientOp; + WhiteboardOperation::ref serverOp; + if (localOperations_.empty()) {// || localOperations_.back()->getID() == operation->getParentID()) { + localOperations_.push_back(operation); + clientOp = operation; + } else if (lastSentOperationID_ == operation->getID()) { + std::list<WhiteboardOperation::ref>::iterator it; + for (it = bridge_.begin(); it != bridge_.end(); ++it) { + if ((*it)->getParentID() == lastSentOperationID_) { + lastSentOperationID_ = (*it)->getID(); + serverOperations_.push_back(*it); + serverOp = *it; + serverOp->setOrigin(WhiteboardOperation::Other); + break; + } + } + } else { + if (bridge_.size() > 0 && bridge_.front()->getParentID() == operation->getParentID()) { + std::list<WhiteboardOperation::ref>::iterator it = bridge_.begin(); + std::pair<WhiteboardInsertOperation::ref, WhiteboardInsertOperation::ref> opPair; + WhiteboardInsertOperation::ref temp; + opPair = WhiteboardTransformer::transform(boost::dynamic_pointer_cast<WhiteboardInsertOperation>(*it), boost::dynamic_pointer_cast<WhiteboardInsertOperation>(operation)); + temp = opPair.first; + + *it = opPair.second; + std::string previousID = (*it)->getID(); + ++it; + for (; it != bridge_.end(); ++it) { + opPair = WhiteboardTransformer::transform(boost::dynamic_pointer_cast<WhiteboardInsertOperation>(*it), temp); + temp = opPair.first; + *it = opPair.second; + (*it)->setParentID(previousID); + previousID = (*it)->getID(); + } + temp->setParentID(localOperations_.back()->getID()); + localOperations_.push_back(temp); + clientOp = temp; + } else { + std::list<WhiteboardOperation::ref>::reverse_iterator it; + std::pair<WhiteboardInsertOperation::ref, WhiteboardInsertOperation::ref> opPair; + WhiteboardInsertOperation::ref temp = boost::dynamic_pointer_cast<WhiteboardInsertOperation>(operation); + bool end = false; + for (it = localOperations_.rbegin(); it != localOperations_.rend(); ++it) { + while ((*it)->getParentID() == temp->getParentID()) { + opPair = WhiteboardTransformer::transform(boost::dynamic_pointer_cast<WhiteboardInsertOperation>(*it), temp); + if (bridge_.size() > 0) { + opPair.second->setParentID(bridge_.back()->getID()); + } + temp = opPair.first; + bridge_.push_back(opPair.second); + if (it == localOperations_.rbegin()) { + localOperations_.push_back(temp); + clientOp = temp; + end = true; + break; + } else { + --it; + } + } + if (end) { + break; + } + } + } + } + + return std::pair<WhiteboardOperation::ref, WhiteboardOperation::ref>(clientOp, serverOp); + } +} |