Index: remoting/protocol/jingle_session.cc |
diff --git a/remoting/protocol/jingle_session.cc b/remoting/protocol/jingle_session.cc |
index bff155d3d8518dc27b11925d6244f87906d334e8..79654d13cab7dd913be5d803bd479e175ec14b37 100644 |
--- a/remoting/protocol/jingle_session.cc |
+++ b/remoting/protocol/jingle_session.cc |
@@ -13,16 +13,11 @@ |
#include "base/time/time.h" |
#include "remoting/base/constants.h" |
#include "remoting/protocol/authenticator.h" |
-#include "remoting/protocol/channel_authenticator.h" |
-#include "remoting/protocol/channel_multiplexer.h" |
#include "remoting/protocol/content_description.h" |
#include "remoting/protocol/jingle_messages.h" |
#include "remoting/protocol/jingle_session_manager.h" |
-#include "remoting/protocol/pseudotcp_channel_factory.h" |
#include "remoting/protocol/quic_channel_factory.h" |
-#include "remoting/protocol/secure_channel_factory.h" |
#include "remoting/protocol/session_config.h" |
-#include "remoting/protocol/stream_channel_factory.h" |
#include "remoting/signaling/iq_sender.h" |
#include "third_party/webrtc/libjingle/xmllite/xmlelement.h" |
#include "third_party/webrtc/p2p/base/candidate.h" |
@@ -34,11 +29,6 @@ namespace protocol { |
namespace { |
-// Delay after candidate creation before sending transport-info message to |
-// accumulate multiple candidates. This is an optimization to reduce number of |
-// transport-info messages. |
-const int kTransportInfoSendDelayMs = 20; |
- |
// How long we should wait for a response from the other end. This value is used |
// for all requests except |transport-info|. |
const int kDefaultMessageTimeout = 10; |
@@ -52,9 +42,6 @@ const int kSessionInitiateAndAcceptTimeout = kDefaultMessageTimeout * 3; |
// Timeout for the transport-info messages. |
const int kTransportInfoTimeout = 10 * 60; |
-// Name of the multiplexed channel. |
-const char kMuxChannelName[] = "mux"; |
- |
ErrorCode AuthRejectionReasonToErrorCode( |
Authenticator::RejectionReason reason) { |
switch (reason) { |
@@ -78,15 +65,14 @@ JingleSession::JingleSession(JingleSessionManager* session_manager) |
} |
JingleSession::~JingleSession() { |
- channel_multiplexer_.reset(); |
quic_channel_factory_.reset(); |
+ transport_session_.reset(); |
+ |
STLDeleteContainerPointers(pending_requests_.begin(), |
pending_requests_.end()); |
STLDeleteContainerPointers(transport_info_requests_.begin(), |
transport_info_requests_.end()); |
- DCHECK(channels_.empty()); |
- |
session_manager_->SessionDestroyed(this); |
} |
@@ -116,6 +102,8 @@ void JingleSession::StartConnection(const std::string& peer_jid, |
// clients generate the same session ID concurrently. |
session_id_ = base::Uint64ToString(base::RandGenerator(kuint64max)); |
+ transport_session_ = |
+ session_manager_->transport_factory_->CreateTransportSession(); |
quic_channel_factory_.reset(new QuicChannelFactory(session_id_, false)); |
// Send session-initiate message. |
@@ -162,6 +150,9 @@ void JingleSession::InitializeIncomingConnection( |
CloseInternal(INCOMPATIBLE_PROTOCOL); |
} |
} |
+ |
+ transport_session_ = |
+ session_manager_->transport_factory_->CreateTransportSession(); |
} |
void JingleSession::AcceptIncomingConnection( |
@@ -231,18 +222,9 @@ const SessionConfig& JingleSession::config() { |
return *config_; |
} |
-StreamChannelFactory* JingleSession::GetTransportChannelFactory() { |
- DCHECK(CalledOnValidThread()); |
- return secure_channel_factory_.get(); |
-} |
- |
-StreamChannelFactory* JingleSession::GetMultiplexedChannelFactory() { |
+TransportSession* JingleSession::GetTransportSession() { |
DCHECK(CalledOnValidThread()); |
- if (!channel_multiplexer_.get()) { |
- channel_multiplexer_.reset( |
- new ChannelMultiplexer(GetTransportChannelFactory(), kMuxChannelName)); |
- } |
- return channel_multiplexer_.get(); |
+ return transport_session_.get(); |
} |
StreamChannelFactory* JingleSession::GetQuicChannelFactory() { |
@@ -256,81 +238,6 @@ void JingleSession::Close() { |
CloseInternal(OK); |
} |
-void JingleSession::AddPendingRemoteTransportInfo(Transport* channel) { |
- std::list<JingleMessage::IceCredentials>::iterator credentials = |
- pending_remote_ice_credentials_.begin(); |
- while (credentials != pending_remote_ice_credentials_.end()) { |
- if (credentials->channel == channel->name()) { |
- channel->SetRemoteCredentials(credentials->ufrag, credentials->password); |
- credentials = pending_remote_ice_credentials_.erase(credentials); |
- } else { |
- ++credentials; |
- } |
- } |
- |
- std::list<JingleMessage::NamedCandidate>::iterator candidate = |
- pending_remote_candidates_.begin(); |
- while (candidate != pending_remote_candidates_.end()) { |
- if (candidate->name == channel->name()) { |
- channel->AddRemoteCandidate(candidate->candidate); |
- candidate = pending_remote_candidates_.erase(candidate); |
- } else { |
- ++candidate; |
- } |
- } |
-} |
- |
-void JingleSession::CreateChannel(const std::string& name, |
- const ChannelCreatedCallback& callback) { |
- DCHECK(!channels_[name]); |
- |
- scoped_ptr<Transport> channel = |
- session_manager_->transport_factory_->CreateTransport(); |
- channel->Connect(name, this, callback); |
- AddPendingRemoteTransportInfo(channel.get()); |
- channels_[name] = channel.release(); |
-} |
- |
-void JingleSession::CancelChannelCreation(const std::string& name) { |
- ChannelsMap::iterator it = channels_.find(name); |
- if (it != channels_.end()) { |
- DCHECK(!it->second->is_connected()); |
- delete it->second; |
- DCHECK(channels_.find(name) == channels_.end()); |
- } |
-} |
- |
-void JingleSession::OnTransportIceCredentials(Transport* transport, |
- const std::string& ufrag, |
- const std::string& password) { |
- EnsurePendingTransportInfoMessage(); |
- pending_transport_info_message_->ice_credentials.push_back( |
- JingleMessage::IceCredentials(transport->name(), ufrag, password)); |
-} |
- |
-void JingleSession::OnTransportCandidate(Transport* transport, |
- const cricket::Candidate& candidate) { |
- EnsurePendingTransportInfoMessage(); |
- pending_transport_info_message_->candidates.push_back( |
- JingleMessage::NamedCandidate(transport->name(), candidate)); |
-} |
- |
-void JingleSession::OnTransportRouteChange(Transport* transport, |
- const TransportRoute& route) { |
- if (event_handler_) |
- event_handler_->OnSessionRouteChange(transport->name(), route); |
-} |
- |
-void JingleSession::OnTransportFailed(Transport* transport) { |
- CloseInternal(CHANNEL_CONNECTION_ERROR); |
-} |
- |
-void JingleSession::OnTransportDeleted(Transport* transport) { |
- ChannelsMap::iterator it = channels_.find(transport->name()); |
- DCHECK_EQ(it->second, transport); |
- channels_.erase(it); |
-} |
- |
void JingleSession::SendMessage(const JingleMessage& message) { |
scoped_ptr<IqRequest> request = session_manager_->iq_sender()->SendIq( |
message.ToXml(), |
@@ -386,31 +293,14 @@ void JingleSession::OnMessageResponse( |
} |
} |
-void JingleSession::EnsurePendingTransportInfoMessage() { |
- // |transport_info_timer_| must be running iff |
- // |pending_transport_info_message_| exists. |
- DCHECK_EQ(pending_transport_info_message_ != nullptr, |
- transport_info_timer_.IsRunning()); |
- |
- if (!pending_transport_info_message_) { |
- pending_transport_info_message_.reset(new JingleMessage( |
- peer_jid_, JingleMessage::TRANSPORT_INFO, session_id_)); |
- // Delay sending the new candidates in case we get more candidates |
- // that we can send in one message. |
- transport_info_timer_.Start( |
- FROM_HERE, base::TimeDelta::FromMilliseconds(kTransportInfoSendDelayMs), |
- this, &JingleSession::SendTransportInfo); |
- } |
-} |
- |
-void JingleSession::SendTransportInfo() { |
- DCHECK(pending_transport_info_message_); |
+void JingleSession::OnOutgoingTransportInfo( |
+ scoped_ptr<XmlElement> transport_info) { |
+ JingleMessage message(peer_jid_, JingleMessage::TRANSPORT_INFO, session_id_); |
+ message.transport_info = transport_info.Pass(); |
scoped_ptr<IqRequest> request = session_manager_->iq_sender()->SendIq( |
- pending_transport_info_message_->ToXml(), |
- base::Bind(&JingleSession::OnTransportInfoResponse, |
- base::Unretained(this))); |
- pending_transport_info_message_.reset(); |
+ message.ToXml(), base::Bind(&JingleSession::OnTransportInfoResponse, |
+ base::Unretained(this))); |
if (request) { |
request->SetTimeout(base::TimeDelta::FromSeconds(kTransportInfoTimeout)); |
transport_info_requests_.push_back(request.release()); |
@@ -419,6 +309,15 @@ void JingleSession::SendTransportInfo() { |
} |
} |
+void JingleSession::OnTransportRouteChange(const std::string& channel_name, |
+ const TransportRoute& route) { |
+ event_handler_->OnSessionRouteChange(channel_name, route); |
+} |
+ |
+void JingleSession::OnTransportError(ErrorCode error) { |
+ CloseInternal(error); |
+} |
+ |
void JingleSession::OnTransportInfoResponse(IqRequest* request, |
const buzz::XmlElement* response) { |
DCHECK(!transport_info_requests_.empty()); |
@@ -469,8 +368,12 @@ void JingleSession::OnIncomingMessage(const JingleMessage& message, |
break; |
case JingleMessage::TRANSPORT_INFO: |
- reply_callback.Run(JingleMessageReply::NONE); |
- ProcessTransportInfo(message); |
+ if (transport_session_->ProcessTransportInfo( |
+ message.transport_info.get())) { |
+ reply_callback.Run(JingleMessageReply::NONE); |
+ } else { |
+ reply_callback.Run(JingleMessageReply::BAD_REQUEST); |
+ } |
break; |
case JingleMessage::SESSION_TERMINATE: |
@@ -544,34 +447,6 @@ void JingleSession::OnSessionInfo(const JingleMessage& message, |
&JingleSession::ProcessAuthenticationStep, base::Unretained(this))); |
} |
-void JingleSession::ProcessTransportInfo(const JingleMessage& message) { |
- for (std::list<JingleMessage::IceCredentials>::const_iterator it = |
- message.ice_credentials.begin(); |
- it != message.ice_credentials.end(); ++it) { |
- ChannelsMap::iterator channel = channels_.find(it->channel); |
- if (channel != channels_.end()) { |
- channel->second->SetRemoteCredentials(it->ufrag, it->password); |
- } else { |
- // Transport info was received before the channel was created. |
- // This could happen due to messages being reordered on the wire. |
- pending_remote_ice_credentials_.push_back(*it); |
- } |
- } |
- |
- for (std::list<JingleMessage::NamedCandidate>::const_iterator it = |
- message.candidates.begin(); |
- it != message.candidates.end(); ++it) { |
- ChannelsMap::iterator channel = channels_.find(it->name); |
- if (channel != channels_.end()) { |
- channel->second->AddRemoteCandidate(it->candidate); |
- } else { |
- // Transport info was received before the channel was created. |
- // This could happen due to messages being reordered on the wire. |
- pending_remote_candidates_.push_back(*it); |
- } |
- } |
-} |
- |
void JingleSession::OnTerminate(const JingleMessage& message, |
const ReplyCallback& reply_callback) { |
if (!is_session_active()) { |
@@ -672,13 +547,13 @@ void JingleSession::ContinueAuthenticationStep() { |
} |
void JingleSession::OnAuthenticated() { |
- pseudotcp_channel_factory_.reset(new PseudoTcpChannelFactory(this)); |
- secure_channel_factory_.reset( |
- new SecureChannelFactory(pseudotcp_channel_factory_.get(), |
- authenticator_.get())); |
+ transport_session_->Start(this, authenticator_.get()); |
- if (quic_channel_factory_) |
- quic_channel_factory_->Start(this, authenticator_->GetAuthKey()); |
+ if (quic_channel_factory_) { |
+ quic_channel_factory_->Start( |
+ transport_session_->GetDatagramChannelFactory(), |
+ authenticator_->GetAuthKey()); |
+ } |
SetState(AUTHENTICATED); |
} |