| Index: webrtc/libjingle/session/tunnel/tunnelsessionclient.cc
|
| diff --git a/webrtc/libjingle/session/tunnel/tunnelsessionclient.cc b/webrtc/libjingle/session/tunnel/tunnelsessionclient.cc
|
| deleted file mode 100644
|
| index 7d2a7d1d2199ceac89b1761e2238e51eac4a9e71..0000000000000000000000000000000000000000
|
| --- a/webrtc/libjingle/session/tunnel/tunnelsessionclient.cc
|
| +++ /dev/null
|
| @@ -1,432 +0,0 @@
|
| -/*
|
| - * libjingle
|
| - * Copyright 2004--2008, Google Inc.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions are met:
|
| - *
|
| - * 1. Redistributions of source code must retain the above copyright notice,
|
| - * this list of conditions and the following disclaimer.
|
| - * 2. Redistributions in binary form must reproduce the above copyright notice,
|
| - * this list of conditions and the following disclaimer in the documentation
|
| - * and/or other materials provided with the distribution.
|
| - * 3. The name of the author may not be used to endorse or promote products
|
| - * derived from this software without specific prior written permission.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
| - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
| - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
| - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
| - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
| - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
| - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
| - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
| - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "pseudotcpchannel.h"
|
| -#include "webrtc/p2p/base/constants.h"
|
| -#include "webrtc/p2p/base/transportchannel.h"
|
| -#include "webrtc/libjingle/xmllite/xmlelement.h"
|
| -#include "tunnelsessionclient.h"
|
| -#include "webrtc/base/basicdefs.h"
|
| -#include "webrtc/base/basictypes.h"
|
| -#include "webrtc/base/common.h"
|
| -#include "webrtc/base/helpers.h"
|
| -#include "webrtc/base/logging.h"
|
| -#include "webrtc/base/stringutils.h"
|
| -
|
| -namespace cricket {
|
| -
|
| -const char NS_TUNNEL[] = "http://www.google.com/talk/tunnel";
|
| -const buzz::StaticQName QN_TUNNEL_DESCRIPTION = { NS_TUNNEL, "description" };
|
| -const buzz::StaticQName QN_TUNNEL_TYPE = { NS_TUNNEL, "type" };
|
| -const char CN_TUNNEL[] = "tunnel";
|
| -
|
| -enum {
|
| - MSG_CLOCK = 1,
|
| - MSG_DESTROY,
|
| - MSG_TERMINATE,
|
| - MSG_EVENT,
|
| - MSG_CREATE_TUNNEL,
|
| -};
|
| -
|
| -struct EventData : public rtc::MessageData {
|
| - int event, error;
|
| - EventData(int ev, int err = 0) : event(ev), error(err) { }
|
| -};
|
| -
|
| -struct CreateTunnelData : public rtc::MessageData {
|
| - buzz::Jid jid;
|
| - std::string description;
|
| - rtc::Thread* thread;
|
| - rtc::StreamInterface* stream;
|
| -};
|
| -
|
| -extern const rtc::ConstantLabel SESSION_STATES[];
|
| -
|
| -const rtc::ConstantLabel SESSION_STATES[] = {
|
| - KLABEL(Session::STATE_INIT),
|
| - KLABEL(Session::STATE_SENTINITIATE),
|
| - KLABEL(Session::STATE_RECEIVEDINITIATE),
|
| - KLABEL(Session::STATE_SENTACCEPT),
|
| - KLABEL(Session::STATE_RECEIVEDACCEPT),
|
| - KLABEL(Session::STATE_SENTMODIFY),
|
| - KLABEL(Session::STATE_RECEIVEDMODIFY),
|
| - KLABEL(Session::STATE_SENTREJECT),
|
| - KLABEL(Session::STATE_RECEIVEDREJECT),
|
| - KLABEL(Session::STATE_SENTREDIRECT),
|
| - KLABEL(Session::STATE_SENTTERMINATE),
|
| - KLABEL(Session::STATE_RECEIVEDTERMINATE),
|
| - KLABEL(Session::STATE_INPROGRESS),
|
| - KLABEL(Session::STATE_DEINIT),
|
| - LASTLABEL
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -// TunnelContentDescription
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -struct TunnelContentDescription : public ContentDescription {
|
| - std::string description;
|
| -
|
| - TunnelContentDescription(const std::string& desc) : description(desc) { }
|
| - virtual ContentDescription* Copy() const {
|
| - return new TunnelContentDescription(*this);
|
| - }
|
| -};
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -// TunnelSessionClientBase
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -TunnelSessionClientBase::TunnelSessionClientBase(const buzz::Jid& jid,
|
| - SessionManager* manager, const std::string &ns)
|
| - : jid_(jid), session_manager_(manager), namespace_(ns), shutdown_(false) {
|
| - session_manager_->AddClient(namespace_, this);
|
| -}
|
| -
|
| -TunnelSessionClientBase::~TunnelSessionClientBase() {
|
| - shutdown_ = true;
|
| - for (std::vector<TunnelSession*>::iterator it = sessions_.begin();
|
| - it != sessions_.end();
|
| - ++it) {
|
| - Session* session = (*it)->ReleaseSession(true);
|
| - session_manager_->DestroySession(session);
|
| - }
|
| - session_manager_->RemoveClient(namespace_);
|
| -}
|
| -
|
| -void TunnelSessionClientBase::OnSessionCreate(Session* session, bool received) {
|
| - LOG(LS_INFO) << "TunnelSessionClientBase::OnSessionCreate: received="
|
| - << received;
|
| - ASSERT(session_manager_->signaling_thread()->IsCurrent());
|
| - if (received)
|
| - sessions_.push_back(
|
| - MakeTunnelSession(session, rtc::Thread::Current(), RESPONDER));
|
| -}
|
| -
|
| -void TunnelSessionClientBase::OnSessionDestroy(Session* session) {
|
| - LOG(LS_INFO) << "TunnelSessionClientBase::OnSessionDestroy";
|
| - ASSERT(session_manager_->signaling_thread()->IsCurrent());
|
| - if (shutdown_)
|
| - return;
|
| - for (std::vector<TunnelSession*>::iterator it = sessions_.begin();
|
| - it != sessions_.end();
|
| - ++it) {
|
| - if ((*it)->HasSession(session)) {
|
| - VERIFY((*it)->ReleaseSession(false) == session);
|
| - sessions_.erase(it);
|
| - return;
|
| - }
|
| - }
|
| -}
|
| -
|
| -rtc::StreamInterface* TunnelSessionClientBase::CreateTunnel(
|
| - const buzz::Jid& to, const std::string& description) {
|
| - // Valid from any thread
|
| - CreateTunnelData data;
|
| - data.jid = to;
|
| - data.description = description;
|
| - data.thread = rtc::Thread::Current();
|
| - data.stream = NULL;
|
| - session_manager_->signaling_thread()->Send(this, MSG_CREATE_TUNNEL, &data);
|
| - return data.stream;
|
| -}
|
| -
|
| -rtc::StreamInterface* TunnelSessionClientBase::AcceptTunnel(
|
| - Session* session) {
|
| - ASSERT(session_manager_->signaling_thread()->IsCurrent());
|
| - TunnelSession* tunnel = NULL;
|
| - for (std::vector<TunnelSession*>::iterator it = sessions_.begin();
|
| - it != sessions_.end();
|
| - ++it) {
|
| - if ((*it)->HasSession(session)) {
|
| - tunnel = *it;
|
| - break;
|
| - }
|
| - }
|
| - ASSERT(tunnel != NULL);
|
| -
|
| - SessionDescription* answer = CreateAnswer(session->remote_description());
|
| - if (answer == NULL)
|
| - return NULL;
|
| -
|
| - session->Accept(answer);
|
| - return tunnel->GetStream();
|
| -}
|
| -
|
| -void TunnelSessionClientBase::DeclineTunnel(Session* session) {
|
| - ASSERT(session_manager_->signaling_thread()->IsCurrent());
|
| - session->Reject(STR_TERMINATE_DECLINE);
|
| -}
|
| -
|
| -void TunnelSessionClientBase::OnMessage(rtc::Message* pmsg) {
|
| - if (pmsg->message_id == MSG_CREATE_TUNNEL) {
|
| - ASSERT(session_manager_->signaling_thread()->IsCurrent());
|
| - CreateTunnelData* data = static_cast<CreateTunnelData*>(pmsg->pdata);
|
| - SessionDescription* offer = CreateOffer(data->jid, data->description);
|
| - if (offer == NULL) {
|
| - return;
|
| - }
|
| -
|
| - Session* session = session_manager_->CreateSession(jid_.Str(), namespace_);
|
| - TunnelSession* tunnel = MakeTunnelSession(session, data->thread,
|
| - INITIATOR);
|
| - sessions_.push_back(tunnel);
|
| - session->Initiate(data->jid.Str(), offer);
|
| - data->stream = tunnel->GetStream();
|
| - }
|
| -}
|
| -
|
| -TunnelSession* TunnelSessionClientBase::MakeTunnelSession(
|
| - Session* session, rtc::Thread* stream_thread,
|
| - TunnelSessionRole /*role*/) {
|
| - return new TunnelSession(this, session, stream_thread);
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -// TunnelSessionClient
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -TunnelSessionClient::TunnelSessionClient(const buzz::Jid& jid,
|
| - SessionManager* manager,
|
| - const std::string &ns)
|
| - : TunnelSessionClientBase(jid, manager, ns) {
|
| -}
|
| -
|
| -TunnelSessionClient::TunnelSessionClient(const buzz::Jid& jid,
|
| - SessionManager* manager)
|
| - : TunnelSessionClientBase(jid, manager, NS_TUNNEL) {
|
| -}
|
| -
|
| -TunnelSessionClient::~TunnelSessionClient() {
|
| -}
|
| -
|
| -
|
| -bool TunnelSessionClient::ParseContent(SignalingProtocol protocol,
|
| - const buzz::XmlElement* elem,
|
| - ContentDescription** content,
|
| - ParseError* error) {
|
| - if (const buzz::XmlElement* type_elem = elem->FirstNamed(QN_TUNNEL_TYPE)) {
|
| - *content = new TunnelContentDescription(type_elem->BodyText());
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -bool TunnelSessionClient::WriteContent(
|
| - SignalingProtocol protocol,
|
| - const ContentDescription* untyped_content,
|
| - buzz::XmlElement** elem, WriteError* error) {
|
| - const TunnelContentDescription* content =
|
| - static_cast<const TunnelContentDescription*>(untyped_content);
|
| -
|
| - buzz::XmlElement* root = new buzz::XmlElement(QN_TUNNEL_DESCRIPTION, true);
|
| - buzz::XmlElement* type_elem = new buzz::XmlElement(QN_TUNNEL_TYPE);
|
| - type_elem->SetBodyText(content->description);
|
| - root->AddElement(type_elem);
|
| - *elem = root;
|
| - return true;
|
| -}
|
| -
|
| -SessionDescription* NewTunnelSessionDescription(
|
| - const std::string& content_name, ContentDescription* content) {
|
| - SessionDescription* sdesc = new SessionDescription();
|
| - sdesc->AddContent(content_name, NS_TUNNEL, content);
|
| - return sdesc;
|
| -}
|
| -
|
| -bool FindTunnelContent(const cricket::SessionDescription* sdesc,
|
| - std::string* name,
|
| - const TunnelContentDescription** content) {
|
| - const ContentInfo* cinfo = sdesc->FirstContentByType(NS_TUNNEL);
|
| - if (cinfo == NULL)
|
| - return false;
|
| -
|
| - *name = cinfo->name;
|
| - *content = static_cast<const TunnelContentDescription*>(
|
| - cinfo->description);
|
| - return true;
|
| -}
|
| -
|
| -void TunnelSessionClient::OnIncomingTunnel(const buzz::Jid &jid,
|
| - Session *session) {
|
| - std::string content_name;
|
| - const TunnelContentDescription* content = NULL;
|
| - if (!FindTunnelContent(session->remote_description(),
|
| - &content_name, &content)) {
|
| - session->Reject(STR_TERMINATE_INCOMPATIBLE_PARAMETERS);
|
| - return;
|
| - }
|
| -
|
| - SignalIncomingTunnel(this, jid, content->description, session);
|
| -}
|
| -
|
| -SessionDescription* TunnelSessionClient::CreateOffer(
|
| - const buzz::Jid &jid, const std::string &description) {
|
| - SessionDescription* offer = NewTunnelSessionDescription(
|
| - CN_TUNNEL, new TunnelContentDescription(description));
|
| - rtc::scoped_ptr<TransportDescription> tdesc(
|
| - session_manager_->transport_desc_factory()->CreateOffer(
|
| - TransportOptions(), NULL));
|
| - if (tdesc.get()) {
|
| - offer->AddTransportInfo(TransportInfo(CN_TUNNEL, *tdesc));
|
| - } else {
|
| - delete offer;
|
| - offer = NULL;
|
| - }
|
| - return offer;
|
| -}
|
| -
|
| -SessionDescription* TunnelSessionClient::CreateAnswer(
|
| - const SessionDescription* offer) {
|
| - std::string content_name;
|
| - const TunnelContentDescription* offer_tunnel = NULL;
|
| - if (!FindTunnelContent(offer, &content_name, &offer_tunnel))
|
| - return NULL;
|
| -
|
| - SessionDescription* answer = NewTunnelSessionDescription(
|
| - content_name, new TunnelContentDescription(offer_tunnel->description));
|
| - const TransportInfo* tinfo = offer->GetTransportInfoByName(content_name);
|
| - if (tinfo) {
|
| - const TransportDescription* offer_tdesc = &tinfo->description;
|
| - ASSERT(offer_tdesc != NULL);
|
| - rtc::scoped_ptr<TransportDescription> tdesc(
|
| - session_manager_->transport_desc_factory()->CreateAnswer(
|
| - offer_tdesc, TransportOptions(), NULL));
|
| - if (tdesc.get()) {
|
| - answer->AddTransportInfo(TransportInfo(content_name, *tdesc));
|
| - } else {
|
| - delete answer;
|
| - answer = NULL;
|
| - }
|
| - }
|
| - return answer;
|
| -}
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -// TunnelSession
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -//
|
| -// Signalling thread methods
|
| -//
|
| -
|
| -TunnelSession::TunnelSession(TunnelSessionClientBase* client, Session* session,
|
| - rtc::Thread* stream_thread)
|
| - : client_(client), session_(session), channel_(NULL) {
|
| - ASSERT(client_ != NULL);
|
| - ASSERT(session_ != NULL);
|
| - session_->SignalState.connect(this, &TunnelSession::OnSessionState);
|
| - channel_ = new PseudoTcpChannel(stream_thread, session_);
|
| - channel_->SignalChannelClosed.connect(this, &TunnelSession::OnChannelClosed);
|
| -}
|
| -
|
| -TunnelSession::~TunnelSession() {
|
| - ASSERT(client_ != NULL);
|
| - ASSERT(session_ == NULL);
|
| - ASSERT(channel_ == NULL);
|
| -}
|
| -
|
| -rtc::StreamInterface* TunnelSession::GetStream() {
|
| - ASSERT(channel_ != NULL);
|
| - return channel_->GetStream();
|
| -}
|
| -
|
| -bool TunnelSession::HasSession(Session* session) {
|
| - ASSERT(NULL != session_);
|
| - return (session_ == session);
|
| -}
|
| -
|
| -Session* TunnelSession::ReleaseSession(bool channel_exists) {
|
| - ASSERT(NULL != session_);
|
| - ASSERT(NULL != channel_);
|
| - Session* session = session_;
|
| - session_->SignalState.disconnect(this);
|
| - session_ = NULL;
|
| - if (channel_exists)
|
| - channel_->SignalChannelClosed.disconnect(this);
|
| - channel_ = NULL;
|
| - delete this;
|
| - return session;
|
| -}
|
| -
|
| -void TunnelSession::OnSessionState(BaseSession* session,
|
| - BaseSession::State state) {
|
| - LOG(LS_INFO) << "TunnelSession::OnSessionState("
|
| - << rtc::nonnull(
|
| - rtc::FindLabel(state, SESSION_STATES), "Unknown")
|
| - << ")";
|
| - ASSERT(session == session_);
|
| -
|
| - switch (state) {
|
| - case Session::STATE_RECEIVEDINITIATE:
|
| - OnInitiate();
|
| - break;
|
| - case Session::STATE_SENTACCEPT:
|
| - case Session::STATE_RECEIVEDACCEPT:
|
| - OnAccept();
|
| - break;
|
| - case Session::STATE_SENTTERMINATE:
|
| - case Session::STATE_RECEIVEDTERMINATE:
|
| - OnTerminate();
|
| - break;
|
| - case Session::STATE_DEINIT:
|
| - // ReleaseSession should have been called before this.
|
| - ASSERT(false);
|
| - break;
|
| - default:
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void TunnelSession::OnInitiate() {
|
| - ASSERT(client_ != NULL);
|
| - ASSERT(session_ != NULL);
|
| - client_->OnIncomingTunnel(buzz::Jid(session_->remote_name()), session_);
|
| -}
|
| -
|
| -void TunnelSession::OnAccept() {
|
| - ASSERT(channel_ != NULL);
|
| - const ContentInfo* content =
|
| - session_->remote_description()->FirstContentByType(NS_TUNNEL);
|
| - ASSERT(content != NULL);
|
| - VERIFY(channel_->Connect(
|
| - content->name, "tcp", ICE_CANDIDATE_COMPONENT_DEFAULT));
|
| -}
|
| -
|
| -void TunnelSession::OnTerminate() {
|
| - ASSERT(channel_ != NULL);
|
| - channel_->OnSessionTerminate(session_);
|
| -}
|
| -
|
| -void TunnelSession::OnChannelClosed(PseudoTcpChannel* channel) {
|
| - ASSERT(channel_ == channel);
|
| - ASSERT(session_ != NULL);
|
| - session_->Terminate();
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -} // namespace cricket
|
|
|