Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(106)

Side by Side Diff: net/base/network_change_notifier_linux.cc

Issue 8591021: Fix initial offline state response handling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | net/base/network_change_notifier_linux_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 // 4 //
5 // This implementation of NetworkChangeNotifier's offline state detection 5 // This implementation of NetworkChangeNotifier's offline state detection
6 // depends on D-Bus and NetworkManager, and is known to work on at least 6 // depends on D-Bus and NetworkManager, and is known to work on at least
7 // GNOME version 2.30. If D-Bus or NetworkManager are unavailable, this 7 // GNOME version 2.30. If D-Bus or NetworkManager are unavailable, this
8 // implementation will always behave as if it is online. 8 // implementation will always behave as if it is online.
9 9
10 #include "net/base/network_change_notifier_linux.h" 10 #include "net/base/network_change_notifier_linux.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 81
82 // Must be called by the helper thread's CleanUp() method. 82 // Must be called by the helper thread's CleanUp() method.
83 void CleanUp(); 83 void CleanUp();
84 84
85 // Implementation of NetworkChangeNotifierLinux::IsCurrentlyOffline(). 85 // Implementation of NetworkChangeNotifierLinux::IsCurrentlyOffline().
86 // Safe to call from any thread, but will block until Init() has completed. 86 // Safe to call from any thread, but will block until Init() has completed.
87 bool IsCurrentlyOffline(); 87 bool IsCurrentlyOffline();
88 88
89 private: 89 private:
90 // Callbacks for D-Bus API. 90 // Callbacks for D-Bus API.
91 void OnStateChanged(dbus::Message* message); 91 void OnResponse(dbus::Response* response);
92 92 void OnSignaled(dbus::Signal* signal);
93 void OnResponse(dbus::Response* response) {
94 OnStateChanged(response);
95 offline_state_initialized_.Signal();
96 }
97
98 void OnSignaled(dbus::Signal* signal) {
99 OnStateChanged(signal);
100 }
101 93
102 void OnConnected(const std::string&, const std::string&, bool success) { 94 void OnConnected(const std::string&, const std::string&, bool success) {
103 if (!success) { 95 if (!success) {
104 DLOG(WARNING) << "Failed to set up offline state detection"; 96 DLOG(WARNING) << "Failed to set up offline state detection";
105 offline_state_initialized_.Signal(); 97 offline_state_initialized_.Signal();
106 } 98 }
107 } 99 }
108 100
109 // Converts a NetworkManager state uint to a bool. 101 // Converts a NetworkManager state uint to a bool.
110 static bool StateIsOffline(uint32 state); 102 static bool StateIsOffline(uint32 state);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 "StateChanged", 147 "StateChanged",
156 base::Bind(&NetworkManagerApi::OnSignaled, ptr_factory_.GetWeakPtr()), 148 base::Bind(&NetworkManagerApi::OnSignaled, ptr_factory_.GetWeakPtr()),
157 base::Bind(&NetworkManagerApi::OnConnected, ptr_factory_.GetWeakPtr())); 149 base::Bind(&NetworkManagerApi::OnConnected, ptr_factory_.GetWeakPtr()));
158 } 150 }
159 151
160 void NetworkManagerApi::CleanUp() { 152 void NetworkManagerApi::CleanUp() {
161 DCHECK_EQ(helper_thread_id_, base::PlatformThread::CurrentId()); 153 DCHECK_EQ(helper_thread_id_, base::PlatformThread::CurrentId());
162 ptr_factory_.InvalidateWeakPtrs(); 154 ptr_factory_.InvalidateWeakPtrs();
163 } 155 }
164 156
165 void NetworkManagerApi::OnStateChanged(dbus::Message* message) { 157 void NetworkManagerApi::OnResponse(dbus::Response* response) {
166 DCHECK_EQ(helper_thread_id_, base::PlatformThread::CurrentId()); 158 DCHECK_EQ(helper_thread_id_, base::PlatformThread::CurrentId());
167 if (!message) { 159 if (!response) {
168 DLOG(WARNING) << "No response received for initial state request"; 160 DLOG(WARNING) << "No response received for initial state request";
161 offline_state_initialized_.Signal();
169 return; 162 return;
170 } 163 }
171 dbus::MessageReader reader(message); 164 dbus::MessageReader reader(response);
165 uint32 state = 0;
166 if (!reader.HasMoreData() || !reader.PopVariantOfUint32(&state)) {
satorux1 2011/11/17 17:40:15 You don't need !reader.HasMoreData(). PopVariantOf
adamk 2011/11/17 18:58:24 Good to know, done.
167 DLOG(WARNING) << "Unexpected response for NetworkManager State request: "
168 << response->ToString();
169 offline_state_initialized_.Signal();
170 return;
171 }
172 {
173 base::AutoLock lock(is_offline_lock_);
174 is_offline_ = StateIsOffline(state);
175 }
176 offline_state_initialized_.Signal();
satorux1 2011/11/17 17:40:15 Calling offline_state_initialized_.Signal() from t
adamk 2011/11/17 18:58:24 Yeah, I agree; this is covered by the unittests, b
177 }
178
179 void NetworkManagerApi::OnSignaled(dbus::Signal* signal) {
180 DCHECK_EQ(helper_thread_id_, base::PlatformThread::CurrentId());
181 dbus::MessageReader reader(signal);
172 uint32 state = 0; 182 uint32 state = 0;
173 if (!reader.HasMoreData() || !reader.PopUint32(&state)) { 183 if (!reader.HasMoreData() || !reader.PopUint32(&state)) {
satorux1 2011/11/17 17:40:15 You can remove !reader.HasMoreData() from here too
adamk 2011/11/17 18:58:24 Done.
174 DLOG(WARNING) << "Unexpected response for NetworkManager State request: " 184 DLOG(WARNING) << "Unexpected signal for NetworkManager StateChanged: "
175 << message->ToString(); 185 << signal->ToString();
176 return; 186 return;
177 } 187 }
178 bool new_is_offline = StateIsOffline(state); 188 bool new_is_offline = StateIsOffline(state);
179 { 189 {
180 base::AutoLock lock(is_offline_lock_); 190 base::AutoLock lock(is_offline_lock_);
181 if (is_offline_ != new_is_offline) 191 if (is_offline_ != new_is_offline)
182 is_offline_ = new_is_offline; 192 is_offline_ = new_is_offline;
183 else 193 else
184 return; 194 return;
185 } 195 }
186 if (offline_state_initialized_.IsSignaled()) 196 notification_callback_.Run();
187 notification_callback_.Run();
188 } 197 }
189 198
190 bool NetworkManagerApi::StateIsOffline(uint32 state) { 199 bool NetworkManagerApi::StateIsOffline(uint32 state) {
191 switch (state) { 200 switch (state) {
192 case NM_LEGACY_STATE_CONNECTED: 201 case NM_LEGACY_STATE_CONNECTED:
193 case NM_STATE_CONNECTED_SITE: 202 case NM_STATE_CONNECTED_SITE:
194 case NM_STATE_CONNECTED_GLOBAL: 203 case NM_STATE_CONNECTED_GLOBAL:
195 // Definitely connected 204 // Definitely connected
196 return false; 205 return false;
197 case NM_LEGACY_STATE_DISCONNECTED: 206 case NM_LEGACY_STATE_DISCONNECTED:
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
443 // Stopping from here allows us to sanity- check that the notifier 452 // Stopping from here allows us to sanity- check that the notifier
444 // thread shut down properly. 453 // thread shut down properly.
445 notifier_thread_->Stop(); 454 notifier_thread_->Stop();
446 } 455 }
447 456
448 bool NetworkChangeNotifierLinux::IsCurrentlyOffline() const { 457 bool NetworkChangeNotifierLinux::IsCurrentlyOffline() const {
449 return notifier_thread_->IsCurrentlyOffline(); 458 return notifier_thread_->IsCurrentlyOffline();
450 } 459 }
451 460
452 } // namespace net 461 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | net/base/network_change_notifier_linux_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698