(Auto)update libjingle 68203780-> 68206793

git-svn-id: http://webrtc.googlecode.com/svn/trunk@6277 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
buildbot@webrtc.org 2014-05-29 22:54:24 +00:00
parent 8dcd43c4f7
commit 1d66be22c8
10 changed files with 79 additions and 18 deletions

View File

@ -198,14 +198,8 @@ void MediaStreamSignaling::TearDown() {
bool MediaStreamSignaling::IsSctpSidAvailable(int sid) const {
if (sid < 0 || sid > static_cast<int>(cricket::kMaxSctpSid))
return false;
for (SctpDataChannels::const_iterator iter = sctp_data_channels_.begin();
iter != sctp_data_channels_.end();
++iter) {
if ((*iter)->id() == sid) {
return false;
}
}
return true;
return FindDataChannelBySid(sid) < 0;
}
// Gets the first unused odd/even id based on the DTLS role. If |role| is
@ -953,6 +947,17 @@ void MediaStreamSignaling::OnDtlsRoleReadyForSctp(talk_base::SSLRole role) {
}
}
void MediaStreamSignaling::OnRemoteSctpDataChannelClosed(uint32 sid) {
int index = FindDataChannelBySid(sid);
if (index < 0) {
LOG(LS_WARNING) << "Unexpected sid " << sid
<< " of the remotely closed DataChannel.";
return;
}
sctp_data_channels_[index]->Close();
}
const MediaStreamSignaling::TrackInfo*
MediaStreamSignaling::FindTrackInfo(
const MediaStreamSignaling::TrackInfos& infos,
@ -967,4 +972,13 @@ MediaStreamSignaling::FindTrackInfo(
return NULL;
}
int MediaStreamSignaling::FindDataChannelBySid(int sid) const {
for (size_t i = 0; i < sctp_data_channels_.size(); ++i) {
if (sctp_data_channels_[i]->id() == sid) {
return static_cast<int>(i);
}
}
return -1;
}
} // namespace webrtc

View File

@ -37,6 +37,7 @@
#include "talk/app/webrtc/peerconnectioninterface.h"
#include "talk/app/webrtc/streamcollection.h"
#include "talk/base/scoped_ref_ptr.h"
#include "talk/base/sigslot.h"
#include "talk/session/media/mediasession.h"
namespace talk_base {
@ -157,7 +158,7 @@ class MediaStreamSignalingObserver {
// DataChannel label or SSRC. The DataChannel SSRC is updated with SSRC=0.
// The DataChannel change state to kClosed.
class MediaStreamSignaling {
class MediaStreamSignaling : public sigslot::has_slots<> {
public:
MediaStreamSignaling(talk_base::Thread* signaling_thread,
MediaStreamSignalingObserver* stream_observer,
@ -248,6 +249,7 @@ class MediaStreamSignaling {
}
void OnDataTransportCreatedForSctp();
void OnDtlsRoleReadyForSctp(talk_base::SSLRole role);
void OnRemoteSctpDataChannelClosed(uint32 sid);
private:
struct RemotePeerInfo {
@ -368,6 +370,10 @@ class MediaStreamSignaling {
const std::string& stream_label,
const std::string track_id) const;
// Returns the index of the specified SCTP DataChannel in sctp_data_channels_,
// or -1 if not found.
int FindDataChannelBySid(int sid) const;
RemotePeerInfo remote_info_;
talk_base::Thread* signaling_thread_;
DataChannelFactory* data_channel_factory_;
@ -388,6 +394,7 @@ class MediaStreamSignaling {
typedef std::map<std::string, talk_base::scoped_refptr<DataChannel> >
RtpDataChannels;
typedef std::vector<talk_base::scoped_refptr<DataChannel> > SctpDataChannels;
RtpDataChannels rtp_data_channels_;
SctpDataChannels sctp_data_channels_;
};

View File

@ -1193,3 +1193,22 @@ TEST_F(MediaStreamSignalingTest, DuplicatedLabelFromOpenMessageAllowed) {
params.ssrc = config.id;
EXPECT_TRUE(signaling_->AddDataChannelFromOpenMessage(params, payload));
}
// Verifies that a DataChannel closed remotely is closed locally.
TEST_F(MediaStreamSignalingTest,
SctpDataChannelClosedLocallyWhenClosedRemotely) {
webrtc::InternalDataChannelInit config;
config.id = 0;
talk_base::scoped_refptr<webrtc::DataChannel> data_channel =
webrtc::DataChannel::Create(
data_channel_provider_.get(), cricket::DCT_SCTP, "a", config);
ASSERT_TRUE(data_channel.get() != NULL);
EXPECT_EQ(webrtc::DataChannelInterface::kConnecting,
data_channel->state());
EXPECT_TRUE(signaling_->AddDataChannel(data_channel.get()));
signaling_->OnRemoteSctpDataChannelClosed(config.id);
EXPECT_EQ(webrtc::DataChannelInterface::kClosed, data_channel->state());
}

View File

@ -1548,6 +1548,9 @@ bool WebRtcSession::CreateDataChannel(const cricket::ContentInfo* content) {
mediastream_signaling_->OnDataTransportCreatedForSctp();
data_channel_->SignalDataReceived.connect(
this, &WebRtcSession::OnDataChannelMessageReceived);
data_channel_->SignalStreamClosedRemotely.connect(
mediastream_signaling_,
&MediaStreamSignaling::OnRemoteSctpDataChannelClosed);
}
return true;
}

View File

@ -1277,6 +1277,8 @@ class DataMediaChannel : public MediaChannel {
// Signal when the media channel is ready to send the stream. Arguments are:
// writable(bool)
sigslot::signal1<bool> SignalReadyToSend;
// Signal for notifying that the remote side has closed the DataChannel.
sigslot::signal1<uint32> SignalStreamClosedRemotely;
};
} // namespace cricket

View File

@ -818,7 +818,7 @@ void SctpDataMediaChannel::OnStreamResetEvent(
LOG(LS_VERBOSE) << "SCTP_STREAM_RESET_EVENT(" << debug_name_
<< "): closing sid " << stream_id;
open_streams_.erase(it);
SignalStreamClosed(stream_id);
SignalStreamClosedRemotely(stream_id);
} else if ((it = queued_reset_streams_.find(stream_id))
!= queued_reset_streams_.end()) {

View File

@ -190,9 +190,6 @@ class SctpDataMediaChannel : public DataMediaChannel,
}
const std::string& debug_name() const { return debug_name_; }
// Called with the SSID of a remote stream that's been closed.
sigslot::signal1<int> SignalStreamClosed;
private:
sockaddr_conn GetSctpSockAddr(int port);

View File

@ -167,24 +167,24 @@ class SignalChannelClosedObserver : public sigslot::has_slots<> {
public:
SignalChannelClosedObserver() {}
void BindSelf(cricket::SctpDataMediaChannel* channel) {
channel->SignalStreamClosed.connect(
channel->SignalStreamClosedRemotely.connect(
this, &SignalChannelClosedObserver::OnStreamClosed);
}
void OnStreamClosed(int stream) {
void OnStreamClosed(uint32 stream) {
streams_.push_back(stream);
}
int StreamCloseCount(int stream) {
int StreamCloseCount(uint32 stream) {
return std::count(streams_.begin(), streams_.end(), stream);
}
bool WasStreamClosed(int stream) {
bool WasStreamClosed(uint32 stream) {
return std::find(streams_.begin(), streams_.end(), stream)
!= streams_.end();
}
private:
std::vector<int> streams_;
std::vector<uint32> streams_;
};
class SignalChannelClosedReopener : public sigslot::has_slots<> {

View File

@ -54,6 +54,7 @@ enum {
MSG_READYTOSENDDATA,
MSG_DATARECEIVED,
MSG_FIRSTPACKETRECEIVED,
MSG_STREAMCLOSEDREMOTELY,
};
// Value specified in RFC 5764.
@ -2148,6 +2149,8 @@ bool DataChannel::Init() {
this, &DataChannel::OnDataChannelError);
media_channel()->SignalReadyToSend.connect(
this, &DataChannel::OnDataChannelReadyToSend);
media_channel()->SignalStreamClosedRemotely.connect(
this, &DataChannel::OnStreamClosedRemotely);
srtp_filter()->SignalSrtpError.connect(
this, &DataChannel::OnSrtpError);
return true;
@ -2387,6 +2390,13 @@ void DataChannel::OnMessage(talk_base::Message *pmsg) {
delete data;
break;
}
case MSG_STREAMCLOSEDREMOTELY: {
talk_base::TypedMessageData<uint32>* data =
static_cast<talk_base::TypedMessageData<uint32>*>(pmsg->pdata);
SignalStreamClosedRemotely(data->data());
delete data;
break;
}
default:
BaseChannel::OnMessage(pmsg);
break;
@ -2473,4 +2483,10 @@ bool DataChannel::ShouldSetupDtlsSrtp() const {
return (data_channel_type_ == DCT_RTP);
}
void DataChannel::OnStreamClosedRemotely(uint32 sid) {
talk_base::TypedMessageData<uint32>* message =
new talk_base::TypedMessageData<uint32>(sid);
signaling_thread()->Post(this, MSG_STREAMCLOSEDREMOTELY, message);
}
} // namespace cricket

View File

@ -640,6 +640,8 @@ class DataChannel : public BaseChannel {
// That occurs when the channel is enabled, the transport is writable,
// both local and remote descriptions are set, and the channel is unblocked.
sigslot::signal1<bool> SignalReadyToSendData;
// Signal for notifying that the remote side has closed the DataChannel.
sigslot::signal1<uint32> SignalStreamClosedRemotely;
protected:
// downcasts a MediaChannel.
@ -711,6 +713,7 @@ class DataChannel : public BaseChannel {
void OnDataChannelError(uint32 ssrc, DataMediaChannel::Error error);
void OnDataChannelReadyToSend(bool writable);
void OnSrtpError(uint32 ssrc, SrtpFilter::Mode mode, SrtpFilter::Error error);
void OnStreamClosedRemotely(uint32 sid);
talk_base::scoped_ptr<DataMediaMonitor> media_monitor_;
// TODO(pthatcher): Make a separate SctpDataChannel and