summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swift/Controllers/ScreenSharing/ScreenSharingController.cpp')
-rw-r--r--Swift/Controllers/ScreenSharing/ScreenSharingController.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/Swift/Controllers/ScreenSharing/ScreenSharingController.cpp b/Swift/Controllers/ScreenSharing/ScreenSharingController.cpp
new file mode 100644
index 0000000..fd3357d
--- /dev/null
+++ b/Swift/Controllers/ScreenSharing/ScreenSharingController.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2012 Yoann Blein
+ * Licensed under the simplified BSD license.
+ * See Documentation/Licenses/BSD-simplified.txt for more information.
+ */
+
+#include "ScreenSharingController.h"
+
+#include <Swiften/ScreenSharing/ScreenSharingManager.h>
+#include <Swiften/ScreenSharing/IncomingScreenSharing.h>
+#include <Swiften/ScreenSharing/OutgoingScreenSharing.h>
+#include <Swiften/ScreenSharing/Image.h>
+#include <Swiften/Network/TimerFactory.h>
+#include <Swiften/Network/Timer.h>
+#include "Swift/QtUI/ScreenSharing/QtDesktopScreenGrabber.h"
+#include "Swift/Controllers/UIInterfaces/RemoteScreenWindowFactory.h"
+#include "Swift/Controllers/UIInterfaces/RemoteScreenWindow.h"
+
+#include <boost/bind.hpp>
+
+namespace Swift {
+
+ScreenSharingController::ScreenSharingController(ScreenSharingManager *screenSharingManager, RemoteScreenWindowFactory* remoteScreenViewerFactory, TimerFactory* timerFactory)
+ : screenSharingManager(screenSharingManager), remoteScreenWindowFactory(remoteScreenViewerFactory), remoteScreenWindow(0),
+ grabTimer(timerFactory->createTimer(500)), screenGrabber(new QtDesktopScreenGrabber)
+{
+ screenSharingManager->onIncomingScreenSharing.connect(boost::bind(&ScreenSharingController::handleIncomingScreenSharing, this, _1));
+ grabTimer->onTick.connect(boost::bind(&ScreenSharingController::handleGrabTimerTick, this));
+}
+
+ScreenSharingController::~ScreenSharingController()
+{
+ grabTimer->onTick.disconnect(boost::bind(&ScreenSharingController::handleGrabTimerTick, this));
+ delete remoteScreenWindow;
+}
+
+boost::shared_ptr<OutgoingScreenSharing> ScreenSharingController::createOugoingScreenSharing(const JID& to)
+{
+ if (!oss) {
+ oss = screenSharingManager->createOutgoingScreenSharing(to);
+ if (oss) {
+ oss->onReady.connect(boost::bind(&ScreenSharingController::handleOssReady, this));
+ oss->onFinished.connect(boost::bind(&ScreenSharingController::handleOutgoingFinished, this));
+ const Image& image = screenGrabber->grab();
+ oss->start(image.width, image.height);
+ }
+ return oss;
+ }
+ return boost::shared_ptr<OutgoingScreenSharing>();
+}
+
+void ScreenSharingController::handleIncomingScreenSharing(boost::shared_ptr<IncomingScreenSharing> incomingScreenSharing)
+{
+ if (iss) {
+ incomingScreenSharing->cancel();
+ } else {
+ iss = incomingScreenSharing;
+ iss->accept();
+ iss->onFinished.connect(boost::bind(&ScreenSharingController::handleIncomingFinished, this));
+ remoteScreenWindow = remoteScreenWindowFactory->createRemoteScreenViewer(iss);
+// onNewIncomingScreenSharing(iss);
+ }
+}
+
+void ScreenSharingController::handleGrabTimerTick()
+{
+ if (oss) {
+ grabTimer->start();
+ oss->addImage(screenGrabber->grab());
+ }
+}
+
+void ScreenSharingController::handleOssReady()
+{
+ handleGrabTimerTick();
+}
+
+void ScreenSharingController::handleIncomingFinished()
+{
+ iss->onFinished.disconnect(boost::bind(&ScreenSharingController::handleIncomingFinished, this));
+ iss.reset();
+ delete remoteScreenWindow;
+ remoteScreenWindow = 0;
+}
+
+void ScreenSharingController::handleOutgoingFinished()
+{
+ oss->onReady.disconnect(boost::bind(&ScreenSharingController::handleOssReady, this));
+ oss->onFinished.disconnect(boost::bind(&ScreenSharingController::handleOutgoingFinished, this));
+ oss.reset();
+}
+
+}