| Index: remoting/protocol/jingle_session.cc
|
| diff --git a/remoting/protocol/jingle_session.cc b/remoting/protocol/jingle_session.cc
|
| index 7b868c7be1b9dbf00680d40b5aae7de4aea0d61a..2aecd4c25d6856d86a4f8f0ab1645219edad48a1 100644
|
| --- a/remoting/protocol/jingle_session.cc
|
| +++ b/remoting/protocol/jingle_session.cc
|
| @@ -226,6 +226,20 @@ void JingleSession::Close() {
|
| CloseInternal(OK);
|
| }
|
|
|
| +void JingleSession::AddPendingRemoteCandidates(Transport* channel,
|
| + const std::string& name) {
|
| + std::list<JingleMessage::NamedCandidate>::iterator it =
|
| + pending_remote_candidates_.begin();
|
| + while(it != pending_remote_candidates_.end()) {
|
| + if (it->name == name) {
|
| + channel->AddRemoteCandidate(it->candidate);
|
| + it = pending_remote_candidates_.erase(it);
|
| + } else {
|
| + ++it;
|
| + }
|
| + }
|
| +}
|
| +
|
| void JingleSession::CreateStreamChannel(
|
| const std::string& name,
|
| const StreamChannelCallback& callback) {
|
| @@ -237,6 +251,7 @@ void JingleSession::CreateStreamChannel(
|
| session_manager_->transport_factory_->CreateStreamTransport();
|
| channel->Initialize(name, this, channel_authenticator.Pass());
|
| channel->Connect(callback);
|
| + AddPendingRemoteCandidates(channel.get(), name);
|
| channels_[name] = channel.release();
|
| }
|
|
|
| @@ -251,6 +266,7 @@ void JingleSession::CreateDatagramChannel(
|
| session_manager_->transport_factory_->CreateDatagramTransport();
|
| channel->Initialize(name, this, channel_authenticator.Pass());
|
| channel->Connect(callback);
|
| + AddPendingRemoteCandidates(channel.get(), name);
|
| channels_[name] = channel.release();
|
| }
|
|
|
| @@ -489,11 +505,13 @@ void JingleSession::ProcessTransportInfo(const JingleMessage& message) {
|
| message.candidates.begin();
|
| it != message.candidates.end(); ++it) {
|
| ChannelsMap::iterator channel = channels_.find(it->name);
|
| - if (channel == channels_.end()) {
|
| - LOG(WARNING) << "Received candidate for unknown channel " << it->name;
|
| - continue;
|
| + 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);
|
| }
|
| - channel->second->AddRemoteCandidate(it->candidate);
|
| }
|
| }
|
|
|
|
|