diff options
Diffstat (limited to 'Swift/Controllers/ScreenSharing/ScreenSharingController.cpp')
-rw-r--r-- | Swift/Controllers/ScreenSharing/ScreenSharingController.cpp | 93 |
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(); +} + +} |