/* * Copyright (c) 2011 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ #include "DefaultLocalJingleTransportCandidateGenerator.h" #include #include #include #include #include #include #include #include #include #include namespace Swift { DefaultLocalJingleTransportCandidateGenerator::DefaultLocalJingleTransportCandidateGenerator(ConnectivityManager* connectivityManager, SOCKS5BytestreamRegistry* s5bRegistry, SOCKS5BytestreamProxy* s5bProxy, JID& ownJID) : connectivityManager(connectivityManager), s5bRegistry(s5bRegistry), s5bProxy(s5bProxy), ownJID(ownJID) { } DefaultLocalJingleTransportCandidateGenerator::~DefaultLocalJingleTransportCandidateGenerator() { } void DefaultLocalJingleTransportCandidateGenerator::generateLocalTransportCandidates(JingleTransportPayload::ref transportPayload) { if (boost::dynamic_pointer_cast(transportPayload)) { JingleTransportPayload::ref payL = boost::make_shared(); payL->setSessionID(transportPayload->getSessionID()); onLocalTransportCandidatesGenerated(payL); } if (boost::dynamic_pointer_cast(transportPayload)) { JingleS5BTransportPayload::ref payL = boost::make_shared(); payL->setSessionID(transportPayload->getSessionID()); payL->setMode(JingleS5BTransportPayload::TCPMode); const unsigned long localPreference = 0; // get direct candidates std::vector directCandidates = connectivityManager->getHostAddressPorts(); foreach(HostAddressPort addressPort, directCandidates) { JingleS5BTransportPayload::Candidate candidate; candidate.type = JingleS5BTransportPayload::Candidate::DirectType; candidate.jid = ownJID; candidate.hostPort = addressPort; candidate.priority = 65536 * 126 + localPreference; candidate.cid = idGenerator.generateID(); payL->addCandidate(candidate); } // get assissted candidates std::vector assisstedCandidates = connectivityManager->getAssistedHostAddressPorts(); foreach(HostAddressPort addressPort, assisstedCandidates) { JingleS5BTransportPayload::Candidate candidate; candidate.type = JingleS5BTransportPayload::Candidate::AssistedType; candidate.jid = ownJID; candidate.hostPort = addressPort; candidate.priority = 65536 * 120 + localPreference; candidate.cid = idGenerator.generateID(); payL->addCandidate(candidate); } // get proxy candidates std::vector proxyCandidates = s5bProxy->getS5BProxies(); foreach(S5BProxyRequest::ref proxy, proxyCandidates) { if (proxy->getStreamHost()) { // FIXME: Added this test, because there were cases where this wasn't initialized. Investigate this. (Remko) JingleS5BTransportPayload::Candidate candidate; candidate.type = JingleS5BTransportPayload::Candidate::ProxyType; candidate.jid = (*proxy->getStreamHost()).jid; candidate.hostPort = (*proxy->getStreamHost()).addressPort; candidate.priority = 65536 * 10 + localPreference; candidate.cid = idGenerator.generateID(); payL->addCandidate(candidate); } } onLocalTransportCandidatesGenerated(payL); } } bool DefaultLocalJingleTransportCandidateGenerator::isActualCandidate(JingleTransportPayload::ref transportPayload) { if (!transportPayload.get()) return false; return false; } int DefaultLocalJingleTransportCandidateGenerator::getPriority(JingleTransportPayload::ref /* transportPayload */) { return 0; } JingleTransport::ref DefaultLocalJingleTransportCandidateGenerator::selectTransport(JingleTransportPayload::ref /* transportPayload */) { return JingleTransport::ref(); } }