Index: net/base/network_change_notifier_linux.cc |
diff --git a/net/base/network_change_notifier_linux.cc b/net/base/network_change_notifier_linux.cc |
index 95f54e24e5070e32ec0e06ef24fc2292c18e1c32..99167dc93610247b38ac3c6f33f3b0d3e523c896 100644 |
--- a/net/base/network_change_notifier_linux.cc |
+++ b/net/base/network_change_notifier_linux.cc |
@@ -88,16 +88,12 @@ class NetworkManagerApi { |
private: |
// Callbacks for D-Bus API. |
- void OnStateChanged(dbus::Message* message); |
- |
- void OnResponse(dbus::Response* response) { |
- OnStateChanged(response); |
+ void OnInitialResponse(dbus::Response* response) { |
+ HandleResponse(response); |
offline_state_initialized_.Signal(); |
} |
- void OnSignaled(dbus::Signal* signal) { |
- OnStateChanged(signal); |
- } |
+ void OnSignaled(dbus::Signal* signal); |
void OnConnected(const std::string&, const std::string&, bool success) { |
if (!success) { |
@@ -106,6 +102,9 @@ class NetworkManagerApi { |
} |
} |
+ // Helper for OnInitialResponse. |
+ void HandleResponse(dbus::Response* response); |
+ |
// Converts a NetworkManager state uint to a bool. |
static bool StateIsOffline(uint32 state); |
@@ -147,7 +146,8 @@ void NetworkManagerApi::Init() { |
builder.AppendString("State"); |
proxy->CallMethod( |
&method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, |
- base::Bind(&NetworkManagerApi::OnResponse, ptr_factory_.GetWeakPtr())); |
+ base::Bind(&NetworkManagerApi::OnInitialResponse, |
+ ptr_factory_.GetWeakPtr())); |
// And sign up for notifications. |
proxy->ConnectToSignal( |
@@ -162,17 +162,32 @@ void NetworkManagerApi::CleanUp() { |
ptr_factory_.InvalidateWeakPtrs(); |
} |
-void NetworkManagerApi::OnStateChanged(dbus::Message* message) { |
+void NetworkManagerApi::HandleResponse(dbus::Response* response) { |
DCHECK_EQ(helper_thread_id_, base::PlatformThread::CurrentId()); |
- if (!message) { |
+ if (!response) { |
DLOG(WARNING) << "No response received for initial state request"; |
return; |
} |
- dbus::MessageReader reader(message); |
+ dbus::MessageReader reader(response); |
uint32 state = 0; |
- if (!reader.HasMoreData() || !reader.PopUint32(&state)) { |
+ if (!reader.PopVariantOfUint32(&state)) { |
DLOG(WARNING) << "Unexpected response for NetworkManager State request: " |
- << message->ToString(); |
+ << response->ToString(); |
+ return; |
+ } |
+ { |
+ base::AutoLock lock(is_offline_lock_); |
+ is_offline_ = StateIsOffline(state); |
+ } |
+} |
+ |
+void NetworkManagerApi::OnSignaled(dbus::Signal* signal) { |
+ DCHECK_EQ(helper_thread_id_, base::PlatformThread::CurrentId()); |
+ dbus::MessageReader reader(signal); |
+ uint32 state = 0; |
+ if (!reader.PopUint32(&state)) { |
+ DLOG(WARNING) << "Unexpected signal for NetworkManager StateChanged: " |
+ << signal->ToString(); |
return; |
} |
bool new_is_offline = StateIsOffline(state); |
@@ -183,8 +198,7 @@ void NetworkManagerApi::OnStateChanged(dbus::Message* message) { |
else |
return; |
} |
- if (offline_state_initialized_.IsSignaled()) |
- notification_callback_.Run(); |
+ notification_callback_.Run(); |
} |
bool NetworkManagerApi::StateIsOffline(uint32 state) { |