Index: remoting/protocol/libjingle_transport_factory.cc |
diff --git a/remoting/protocol/libjingle_transport_factory.cc b/remoting/protocol/libjingle_transport_factory.cc |
index 61ed3eafeba591bd021adca6412aff14a7b80db1..404415058fdd170f8dddb5225a30173cfe9f5b11 100644 |
--- a/remoting/protocol/libjingle_transport_factory.cc |
+++ b/remoting/protocol/libjingle_transport_factory.cc |
@@ -55,6 +55,7 @@ class LibjingleTransport |
private: |
void DoStart(); |
+ void NotifyConnected(); |
// Signal handlers for cricket::TransportChannel. |
void OnRequestSignaling(cricket::TransportChannelImpl* channel); |
@@ -88,12 +89,13 @@ class LibjingleTransport |
int connect_attempts_left_; |
base::RepeatingTimer<LibjingleTransport> reconnect_timer_; |
+ base::WeakPtrFactory<LibjingleTransport> weak_factory_; |
+ |
DISALLOW_COPY_AND_ASSIGN(LibjingleTransport); |
}; |
-LibjingleTransport::LibjingleTransport( |
- cricket::PortAllocator* port_allocator, |
- const NetworkSettings& network_settings) |
+LibjingleTransport::LibjingleTransport(cricket::PortAllocator* port_allocator, |
+ const NetworkSettings& network_settings) |
: port_allocator_(port_allocator), |
network_settings_(network_settings), |
event_handler_(NULL), |
@@ -102,7 +104,8 @@ LibjingleTransport::LibjingleTransport( |
ice_password_(rtc::CreateRandomString(cricket::ICE_PWD_LENGTH)), |
can_start_(false), |
channel_was_writable_(false), |
- connect_attempts_left_(kMaxReconnectAttempts) { |
+ connect_attempts_left_(kMaxReconnectAttempts), |
+ weak_factory_(this) { |
DCHECK(!ice_username_fragment_.empty()); |
DCHECK(!ice_password_.empty()); |
} |
@@ -180,7 +183,9 @@ void LibjingleTransport::DoStart() { |
reconnect_timer_.Start( |
FROM_HERE, base::TimeDelta::FromSeconds(kReconnectDelaySeconds), |
this, &LibjingleTransport::TryReconnect); |
+} |
+void LibjingleTransport::NotifyConnected() { |
// Create net::Socket adapter for the P2PTransportChannel. |
scoped_ptr<jingle_glue::TransportChannelSocketAdapter> socket( |
new jingle_glue::TransportChannelSocketAdapter(channel_.get())); |
@@ -269,7 +274,13 @@ void LibjingleTransport::OnWritableState( |
DCHECK_EQ(channel, channel_.get()); |
if (channel->writable()) { |
- channel_was_writable_ = true; |
+ if (!channel_was_writable_) { |
+ channel_was_writable_ = true; |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&LibjingleTransport::NotifyConnected, |
+ weak_factory_.GetWeakPtr())); |
+ } |
connect_attempts_left_ = kMaxReconnectAttempts; |
reconnect_timer_.Stop(); |
} else if (!channel->writable() && channel_was_writable_) { |