summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swiften/Whiteboard/WhiteboardClient.cpp')
-rw-r--r--Swiften/Whiteboard/WhiteboardClient.cpp91
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);
+ }
+}