Index: webrtc/p2p/base/transport.cc |
diff --git a/webrtc/p2p/base/transport.cc b/webrtc/p2p/base/transport.cc |
index 0184af3dab977bf150e836a0999d3368b0b10986..f9b7fd4a04379db2f0a124ef591bee4e010772c0 100644 |
--- a/webrtc/p2p/base/transport.cc |
+++ b/webrtc/p2p/base/transport.cc |
@@ -35,6 +35,7 @@ enum { |
MSG_ROLECONFLICT, |
MSG_COMPLETED, |
MSG_FAILED, |
+ MSG_RECEIVINGSTATE, |
}; |
struct ChannelParams : public rtc::MessageData { |
@@ -128,6 +129,7 @@ Transport::Transport(rtc::Thread* signaling_thread, |
destroyed_(false), |
readable_(TRANSPORT_STATE_NONE), |
writable_(TRANSPORT_STATE_NONE), |
+ receiving_(TRANSPORT_STATE_NONE), |
was_writable_(false), |
connect_requested_(false), |
ice_role_(ICEROLE_UNKNOWN), |
@@ -242,6 +244,7 @@ TransportChannelImpl* Transport::CreateChannel_w(int component) { |
impl->SignalReadableState.connect(this, &Transport::OnChannelReadableState); |
impl->SignalWritableState.connect(this, &Transport::OnChannelWritableState); |
+ impl->SignalReceivingState.connect(this, &Transport::OnChannelReceivingState); |
impl->SignalRequestSignaling.connect( |
this, &Transport::OnChannelRequestSignaling); |
impl->SignalCandidateReady.connect(this, &Transport::OnChannelCandidateReady); |
@@ -501,7 +504,7 @@ void Transport::OnChannelReadableState(TransportChannel* channel) { |
void Transport::OnChannelReadableState_s() { |
ASSERT(signaling_thread()->IsCurrent()); |
- TransportState readable = GetTransportState_s(true); |
+ TransportState readable = GetTransportState_s(TRANSPORT_READABLE_STATE); |
if (readable_ != readable) { |
readable_ = readable; |
SignalReadableState(this); |
@@ -517,7 +520,7 @@ void Transport::OnChannelWritableState(TransportChannel* channel) { |
void Transport::OnChannelWritableState_s() { |
ASSERT(signaling_thread()->IsCurrent()); |
- TransportState writable = GetTransportState_s(false); |
+ TransportState writable = GetTransportState_s(TRANSPORT_WRITABLE_STATE); |
if (writable_ != writable) { |
was_writable_ = (writable_ == TRANSPORT_STATE_ALL); |
writable_ = writable; |
@@ -525,15 +528,41 @@ void Transport::OnChannelWritableState_s() { |
} |
} |
-TransportState Transport::GetTransportState_s(bool read) { |
+void Transport::OnChannelReceivingState(TransportChannel* channel) { |
+ ASSERT(worker_thread()->IsCurrent()); |
+ signaling_thread()->Post(this, MSG_RECEIVINGSTATE); |
+} |
+ |
+void Transport::OnChannelReceivingState_s() { |
+ ASSERT(signaling_thread()->IsCurrent()); |
+ TransportState receiving = GetTransportState_s(TRANSPORT_RECEIVING_STATE); |
+ if (receiving_ != receiving) { |
+ receiving_ = receiving; |
+ SignalReceivingState(this); |
+ } |
+} |
+ |
+TransportState Transport::GetTransportState_s(TransportStateType state_type) { |
ASSERT(signaling_thread()->IsCurrent()); |
rtc::CritScope cs(&crit_); |
bool any = false; |
bool all = !channels_.empty(); |
for (const auto iter : channels_) { |
- bool b = (read ? iter.second->readable() : |
- iter.second->writable()); |
+ bool b = false; |
+ switch (state_type) { |
+ case TRANSPORT_READABLE_STATE: |
+ b = iter.second->readable(); |
+ break; |
+ case TRANSPORT_WRITABLE_STATE: |
+ b = iter.second->writable(); |
+ break; |
+ case TRANSPORT_RECEIVING_STATE: |
+ b = iter.second->receiving(); |
+ break; |
+ default: |
+ ASSERT(false); |
+ } |
any |= b; |
all &= b; |
} |
@@ -900,6 +929,9 @@ void Transport::OnMessage(rtc::Message* msg) { |
case MSG_WRITESTATE: |
OnChannelWritableState_s(); |
break; |
+ case MSG_RECEIVINGSTATE: |
+ OnChannelReceivingState_s(); |
+ break; |
case MSG_REQUESTSIGNALING: |
OnChannelRequestSignaling_s(); |
break; |