/* * Copyright (c) 2012 Yoann Blein * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ #include #include #include #include #include #include #include #include #include namespace Swift { OutgoingScreenSharing::OutgoingScreenSharing(boost::shared_ptr session, UDPSocketFactory* udpSocketFactory, TimerFactory* timerFactory) : ScreenSharing(session, udpSocketFactory), contentID(JingleContentID(idGenerator.generateID(), JingleContentPayload::InitiatorCreator)), canceled(false), sessionAccepted(false), socketConnected(false), timerFactory(timerFactory) { } OutgoingScreenSharing::~OutgoingScreenSharing() { } void OutgoingScreenSharing::cancel() { canceled = true; session->sendTerminate(JinglePayload::Reason::Cancel); onStateChange(ScreenSharing::Canceled); } void OutgoingScreenSharing::start() { //onStateChange(ScreenSharing::WaitingForStart); SWIFT_LOG(debug) << "Screen sharing: start" << std::endl; JingleRTPDescription::ref desc = boost::make_shared(JingleRTPDescription::Video); desc->addPayloadType(RTPPayloadType(98, "VP8", 90000)); JingleRawUDPTransportPayload::ref transport = boost::make_shared(); addBestCandidate(transport); session->sendInitiate(contentID, desc, transport); onStateChange(ScreenSharing::WaitingForAccept); serverSocket->onConnected.connect(boost::bind(&OutgoingScreenSharing::handleSocketConnected, this)); serverSocket->connectToFirstIncoming(); } void OutgoingScreenSharing::handleSocketConnected() { SWIFT_LOG(debug) << "Screen sharing: UDP socket connected" << std::endl; if (canceled) return; socketConnected = true; if (sessionAccepted) startRTPSession(); } void OutgoingScreenSharing::handleSessionAcceptReceived(const JingleContentID& /*id*/, boost::shared_ptr /*desc*/, boost::shared_ptr /*transport*/) { SWIFT_LOG(debug) << "Screen sharing: accepted" << std::endl; if (canceled) return; sessionAccepted = true; if (socketConnected) { startRTPSession(); } else { connectionTimer = timerFactory->createTimer(1000); connectionTimer->onTick.connect(boost::bind(&OutgoingScreenSharing::handleConnectionFailed, this)); connectionTimer->start(); onStateChange(ScreenSharing::Connecting); } } void OutgoingScreenSharing::handleConnectionFailed() { SWIFT_LOG(debug) << "Screen sharing: unable to connect" << std::endl; session->sendTerminate(JinglePayload::Reason::ConnectivityError); canceled = true; onStateChange(ScreenSharing::Failed); } void OutgoingScreenSharing::startRTPSession() { SWIFT_LOG(debug) << "Screen sharing: accepted and connect, start screen sharing" << std::endl; // Session accepted and socket connected, we can start the rtp session } }