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

Side by Side Diff: chromeos/network/network_state_handler.cc

Issue 2836543002: Revert of [CrOS Tether] Add the notion of a tether DeviceState. (Closed)
Patch Set: Created 3 years, 8 months 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "chromeos/network/network_state_handler.h" 5 #include "chromeos/network/network_state_handler.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/format_macros.h" 11 #include "base/format_macros.h"
12 #include "base/guid.h" 12 #include "base/guid.h"
13 #include "base/json/json_string_value_serializer.h" 13 #include "base/json/json_string_value_serializer.h"
14 #include "base/json/json_writer.h" 14 #include "base/json/json_writer.h"
15 #include "base/location.h" 15 #include "base/location.h"
16 #include "base/memory/ptr_util.h" 16 #include "base/memory/ptr_util.h"
17 #include "base/metrics/histogram_macros.h" 17 #include "base/metrics/histogram_macros.h"
18 #include "base/strings/string_number_conversions.h" 18 #include "base/strings/string_number_conversions.h"
19 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
20 #include "base/strings/stringprintf.h" 20 #include "base/strings/stringprintf.h"
21 #include "base/values.h" 21 #include "base/values.h"
22 #include "chromeos/chromeos_switches.h" 22 #include "chromeos/chromeos_switches.h"
23 #include "chromeos/network/device_state.h" 23 #include "chromeos/network/device_state.h"
24 #include "chromeos/network/network_connection_handler.h"
25 #include "chromeos/network/network_event_log.h" 24 #include "chromeos/network/network_event_log.h"
26 #include "chromeos/network/network_handler_callbacks.h"
27 #include "chromeos/network/network_state.h" 25 #include "chromeos/network/network_state.h"
28 #include "chromeos/network/network_state_handler_observer.h" 26 #include "chromeos/network/network_state_handler_observer.h"
29 #include "chromeos/network/tether_constants.h" 27 #include "chromeos/network/tether_constants.h"
30 #include "third_party/cros_system_api/dbus/service_constants.h" 28 #include "third_party/cros_system_api/dbus/service_constants.h"
31 29
32 namespace chromeos { 30 namespace chromeos {
33 31
34 namespace { 32 namespace {
35 33
36 bool ConnectionStateChanged(NetworkState* network, 34 bool ConnectionStateChanged(NetworkState* network,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 device_event_log::LOG_TYPE_NETWORK, device_event_log::LOG_LEVEL_DEBUG, 119 device_event_log::LOG_TYPE_NETWORK, device_event_log::LOG_LEVEL_DEBUG,
122 base::StringPrintf("NetworkStateHandler::RemoveObserver: 0x%p", 120 base::StringPrintf("NetworkStateHandler::RemoveObserver: 0x%p",
123 observer)); 121 observer));
124 } 122 }
125 123
126 NetworkStateHandler::TechnologyState NetworkStateHandler::GetTechnologyState( 124 NetworkStateHandler::TechnologyState NetworkStateHandler::GetTechnologyState(
127 const NetworkTypePattern& type) const { 125 const NetworkTypePattern& type) const {
128 std::string technology = GetTechnologyForType(type); 126 std::string technology = GetTechnologyForType(type);
129 127
130 if (technology == kTypeTether) { 128 if (technology == kTypeTether) {
131 return tether_technology_state_; 129 bool is_tether_enabled = base::CommandLine::ForCurrentProcess()->HasSwitch(
130 chromeos::switches::kEnableTether);
131 return is_tether_enabled ? TECHNOLOGY_ENABLED : TECHNOLOGY_UNAVAILABLE;
132 } 132 }
133 133
134 TechnologyState state; 134 TechnologyState state;
135 if (shill_property_handler_->IsTechnologyEnabled(technology)) 135 if (shill_property_handler_->IsTechnologyEnabled(technology))
136 state = TECHNOLOGY_ENABLED; 136 state = TECHNOLOGY_ENABLED;
137 else if (shill_property_handler_->IsTechnologyEnabling(technology)) 137 else if (shill_property_handler_->IsTechnologyEnabling(technology))
138 state = TECHNOLOGY_ENABLING; 138 state = TECHNOLOGY_ENABLING;
139 else if (shill_property_handler_->IsTechnologyProhibited(technology)) 139 else if (shill_property_handler_->IsTechnologyProhibited(technology))
140 state = TECHNOLOGY_PROHIBITED; 140 state = TECHNOLOGY_PROHIBITED;
141 else if (shill_property_handler_->IsTechnologyUninitialized(technology)) 141 else if (shill_property_handler_->IsTechnologyUninitialized(technology))
142 state = TECHNOLOGY_UNINITIALIZED; 142 state = TECHNOLOGY_UNINITIALIZED;
143 else if (shill_property_handler_->IsTechnologyAvailable(technology)) 143 else if (shill_property_handler_->IsTechnologyAvailable(technology))
144 state = TECHNOLOGY_AVAILABLE; 144 state = TECHNOLOGY_AVAILABLE;
145 else 145 else
146 state = TECHNOLOGY_UNAVAILABLE; 146 state = TECHNOLOGY_UNAVAILABLE;
147 VLOG(2) << "GetTechnologyState: " << type.ToDebugString() << " = " << state; 147 VLOG(2) << "GetTechnologyState: " << type.ToDebugString() << " = " << state;
148 return state; 148 return state;
149 } 149 }
150 150
151 void NetworkStateHandler::SetTechnologyEnabled( 151 void NetworkStateHandler::SetTechnologyEnabled(
152 const NetworkTypePattern& type, 152 const NetworkTypePattern& type,
153 bool enabled, 153 bool enabled,
154 const network_handler::ErrorCallback& error_callback) { 154 const network_handler::ErrorCallback& error_callback) {
155 std::vector<std::string> technologies = GetTechnologiesForType(type); 155 std::vector<std::string> technologies = GetTechnologiesForType(type);
156 for (const std::string& technology : technologies) { 156 for (const std::string& technology : technologies) {
157 if (technology == kTypeTether) {
158 if (tether_technology_state_ != TECHNOLOGY_ENABLED &&
159 tether_technology_state_ != TECHNOLOGY_AVAILABLE) {
160 NET_LOG(ERROR) << "SetTechnologyEnabled() called for the Tether "
161 << "DeviceState, but the current state was not "
162 << "TECHNOLOGY_ENABLED or TECHNOLOGY_AVAILABLE.";
163 network_handler::RunErrorCallback(
164 error_callback, kTetherDevicePath,
165 NetworkConnectionHandler::kEnabledOrDisabledWhenNotAvailable, "");
166 continue;
167 }
168
169 // Tether does not exist in Shill, so set |tether_technology_state_| and
170 // skip the below interactions with |shill_property_handler_|.
171 tether_technology_state_ =
172 enabled ? TECHNOLOGY_ENABLED : TECHNOLOGY_AVAILABLE;
173 continue;
174 }
175
176 if (!shill_property_handler_->IsTechnologyAvailable(technology)) 157 if (!shill_property_handler_->IsTechnologyAvailable(technology))
177 continue; 158 continue;
178 NET_LOG_USER("SetTechnologyEnabled", 159 NET_LOG_USER("SetTechnologyEnabled",
179 base::StringPrintf("%s:%d", technology.c_str(), enabled)); 160 base::StringPrintf("%s:%d", technology.c_str(), enabled));
180 shill_property_handler_->SetTechnologyEnabled(technology, enabled, 161 shill_property_handler_->SetTechnologyEnabled(technology, enabled,
181 error_callback); 162 error_callback);
182 } 163 }
183 // Signal Device/Technology state changed. 164 // Signal Device/Technology state changed.
184 NotifyDeviceListChanged(); 165 NotifyDeviceListChanged();
185 } 166 }
186 167
187 void NetworkStateHandler::SetTetherTechnologyState(
188 TechnologyState technology_state) {
189 if (tether_technology_state_ == technology_state)
190 return;
191
192 tether_technology_state_ = technology_state;
193 EnsureTetherDeviceState();
194
195 // Signal Device/Technology state changed.
196 NotifyDeviceListChanged();
197 }
198
199 void NetworkStateHandler::SetTetherScanState(bool is_scanning) {
200 DeviceState* tether_device_state =
201 GetModifiableDeviceState(kTetherDevicePath);
202 DCHECK(tether_device_state);
203
204 bool was_scanning = tether_device_state->scanning();
205 tether_device_state->set_scanning(is_scanning);
206
207 if (was_scanning && !is_scanning) {
208 // If a scan was in progress but has completed, notify observers.
209 NotifyScanCompleted(tether_device_state);
210 }
211 }
212
213 void NetworkStateHandler::SetProhibitedTechnologies( 168 void NetworkStateHandler::SetProhibitedTechnologies(
214 const std::vector<std::string>& prohibited_technologies, 169 const std::vector<std::string>& prohibited_technologies,
215 const network_handler::ErrorCallback& error_callback) { 170 const network_handler::ErrorCallback& error_callback) {
216 // Make a copy of |prohibited_technologies| since the list may be edited 171 shill_property_handler_->SetProhibitedTechnologies(prohibited_technologies,
217 // within this function. 172 error_callback);
218 std::vector<std::string> prohibited_technologies_copy =
219 prohibited_technologies;
220
221 for (auto it = prohibited_technologies_copy.begin();
222 it < prohibited_technologies_copy.end(); ++it) {
223 if (*it == kTypeTether) {
224 // If Tether networks are prohibited, set |tether_technology_state_| and
225 // remove |kTypeTether| from the list before passing it to
226 // |shill_property_handler_| below. Shill does not have a concept of
227 // Tether networks, so it cannot prohibit that technology type.
228 tether_technology_state_ = TECHNOLOGY_PROHIBITED;
229 it = prohibited_technologies_copy.erase(it);
230 }
231 }
232
233 shill_property_handler_->SetProhibitedTechnologies(
234 prohibited_technologies_copy, error_callback);
235 // Signal Device/Technology state changed. 173 // Signal Device/Technology state changed.
236 NotifyDeviceListChanged(); 174 NotifyDeviceListChanged();
237 } 175 }
238 176
239 const DeviceState* NetworkStateHandler::GetDeviceState( 177 const DeviceState* NetworkStateHandler::GetDeviceState(
240 const std::string& device_path) const { 178 const std::string& device_path) const {
241 const DeviceState* device = GetModifiableDeviceState(device_path); 179 const DeviceState* device = GetModifiableDeviceState(device_path);
242 if (device && !device->update_received()) 180 if (device && !device->update_received())
243 return nullptr; 181 return nullptr;
244 return device; 182 return device;
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 } 293 }
356 294
357 return connecting_network; 295 return connecting_network;
358 } 296 }
359 297
360 const NetworkState* NetworkStateHandler::FirstNetworkByType( 298 const NetworkState* NetworkStateHandler::FirstNetworkByType(
361 const NetworkTypePattern& type) { 299 const NetworkTypePattern& type) {
362 if (!network_list_sorted_) 300 if (!network_list_sorted_)
363 SortNetworkList(); // Sort to ensure visible networks are listed first. 301 SortNetworkList(); // Sort to ensure visible networks are listed first.
364 302
365 // If |type| matches Tether networks and at least one Tether network is 303 // If |type| matches tether networks and at least one tether network is
366 // present, return the first network (since it has been sorted already). 304 // present, return the first network (since it has been sorted already).
367 if (type.MatchesPattern(NetworkTypePattern::Tether()) && 305 if (type.MatchesPattern(NetworkTypePattern::Tether()) &&
368 !tether_network_list_.empty()) { 306 !tether_network_list_.empty()) {
369 return tether_network_list_[0]->AsNetworkState(); 307 return tether_network_list_[0]->AsNetworkState();
370 } 308 }
371 309
372 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) { 310 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) {
373 const NetworkState* network = (*iter)->AsNetworkState(); 311 const NetworkState* network = (*iter)->AsNetworkState();
374 DCHECK(network); 312 DCHECK(network);
375 if (!network->update_received()) 313 if (!network->update_received())
376 continue; 314 continue;
377 if (!network->visible()) 315 if (!network->visible())
378 break; 316 break;
379 if (network->Matches(type)) 317 if (network->Matches(type))
380 return network; 318 return network;
381 } 319 }
382 return nullptr; 320 return nullptr;
383 } 321 }
384 322
385 std::string NetworkStateHandler::FormattedHardwareAddressForType( 323 std::string NetworkStateHandler::FormattedHardwareAddressForType(
386 const NetworkTypePattern& type) const { 324 const NetworkTypePattern& type) const {
387 const NetworkState* network = ConnectedNetworkByType(type); 325 const NetworkState* network = ConnectedNetworkByType(type);
388 if (network && network->type() == kTypeTether) {
389 // If this is a Tether network, get the MAC address corresponding to that
390 // network instead.
391 network = GetNetworkStateFromGuid(network->tether_guid());
392 }
393 const DeviceState* device = network ? GetDeviceState(network->device_path()) 326 const DeviceState* device = network ? GetDeviceState(network->device_path())
394 : GetDeviceStateByType(type); 327 : GetDeviceStateByType(type);
395 if (!device || device->mac_address().empty()) 328 if (!device)
396 return std::string(); 329 return std::string();
397 return network_util::FormattedMacAddress(device->mac_address()); 330 return network_util::FormattedMacAddress(device->mac_address());
398 } 331 }
399 332
400 void NetworkStateHandler::GetVisibleNetworkListByType( 333 void NetworkStateHandler::GetVisibleNetworkListByType(
401 const NetworkTypePattern& type, 334 const NetworkTypePattern& type,
402 NetworkStateList* list) { 335 NetworkStateList* list) {
403 GetNetworkListByType(type, false /* configured_only */, 336 GetNetworkListByType(type, false /* configured_only */,
404 true /* visible_only */, 0 /* no limit */, list); 337 true /* visible_only */, 0 /* no limit */, list);
405 } 338 }
(...skipping 15 matching lines...) Expand all
421 SortNetworkList(); 354 SortNetworkList();
422 355
423 if (type.MatchesPattern(NetworkTypePattern::Tether())) { 356 if (type.MatchesPattern(NetworkTypePattern::Tether())) {
424 GetTetherNetworkList(limit, list); 357 GetTetherNetworkList(limit, list);
425 } 358 }
426 359
427 int count = list->size(); 360 int count = list->size();
428 361
429 if (type.Equals(NetworkTypePattern::Tether()) || 362 if (type.Equals(NetworkTypePattern::Tether()) ||
430 (limit != 0 && count >= limit)) { 363 (limit != 0 && count >= limit)) {
431 // If only searching for Tether networks, there is no need to continue 364 // If only searching for tether networks, there is no need to continue
432 // searching through other network types; likewise, if the limit has already 365 // searching through other network types; likewise, if the limit has already
433 // been reached, there is no need to continue searching. 366 // been reached, there is no need to continue searching.
434 return; 367 return;
435 } 368 }
436 369
437 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) { 370 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) {
438 const NetworkState* network = (*iter)->AsNetworkState(); 371 const NetworkState* network = (*iter)->AsNetworkState();
439 DCHECK(network); 372 DCHECK(network);
440 if (!network->update_received() || !network->Matches(type)) 373 if (!network->update_received() || !network->Matches(type))
441 continue; 374 continue;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 425
493 void NetworkStateHandler::AddTetherNetworkState(const std::string& guid, 426 void NetworkStateHandler::AddTetherNetworkState(const std::string& guid,
494 const std::string& name, 427 const std::string& name,
495 const std::string& carrier, 428 const std::string& carrier,
496 int battery_percentage, 429 int battery_percentage,
497 int signal_strength) { 430 int signal_strength) {
498 DCHECK(!guid.empty()); 431 DCHECK(!guid.empty());
499 DCHECK(battery_percentage >= 0 && battery_percentage <= 100); 432 DCHECK(battery_percentage >= 0 && battery_percentage <= 100);
500 DCHECK(signal_strength >= 0 && signal_strength <= 100); 433 DCHECK(signal_strength >= 0 && signal_strength <= 100);
501 434
502 if (tether_technology_state_ != TECHNOLOGY_ENABLED) {
503 NET_LOG(ERROR) << "AddTetherNetworkState() called when Tether networks "
504 << "are not enabled. Cannot add NetworkState.";
505 return;
506 }
507
508 // If the network already exists, do nothing. 435 // If the network already exists, do nothing.
509 if (GetNetworkStateFromGuid(guid)) { 436 if (GetNetworkStateFromGuid(guid)) {
510 NET_LOG(ERROR) << "AddTetherNetworkState: " << name 437 NET_LOG(ERROR) << "AddTetherNetworkState: " << name
511 << " called with existing guid:" << guid; 438 << " called with existing guid:" << guid;
512 return; 439 return;
513 } 440 }
514 441
515 // Use the GUID as the network's service path. 442 // Use the GUID as the network's service path.
516 std::unique_ptr<NetworkState> tether_network_state = 443 std::unique_ptr<NetworkState> tether_network_state =
517 base::MakeUnique<NetworkState>(guid /* path */); 444 base::MakeUnique<NetworkState>(guid /* path */);
(...skipping 11 matching lines...) Expand all
529 456
530 tether_network_list_.push_back(std::move(tether_network_state)); 457 tether_network_list_.push_back(std::move(tether_network_state));
531 NotifyNetworkListChanged(); 458 NotifyNetworkListChanged();
532 } 459 }
533 460
534 bool NetworkStateHandler::UpdateTetherNetworkProperties( 461 bool NetworkStateHandler::UpdateTetherNetworkProperties(
535 const std::string& guid, 462 const std::string& guid,
536 const std::string& carrier, 463 const std::string& carrier,
537 int battery_percentage, 464 int battery_percentage,
538 int signal_strength) { 465 int signal_strength) {
539 if (tether_technology_state_ != TECHNOLOGY_ENABLED) {
540 NET_LOG(ERROR) << "UpdateTetherNetworkProperties() called when Tether "
541 << "networks are not enabled. Cannot update.";
542 return false;
543 }
544
545 NetworkState* tether_network_state = GetModifiableNetworkStateFromGuid(guid); 466 NetworkState* tether_network_state = GetModifiableNetworkStateFromGuid(guid);
546 if (!tether_network_state) 467 if (!tether_network_state)
547 return false; 468 return false;
548 469
549 tether_network_state->set_carrier(carrier); 470 tether_network_state->set_carrier(carrier);
550 tether_network_state->set_battery_percentage(battery_percentage); 471 tether_network_state->set_battery_percentage(battery_percentage);
551 tether_network_state->set_signal_strength(signal_strength); 472 tether_network_state->set_signal_strength(signal_strength);
552 473
553 NotifyNetworkListChanged(); 474 NotifyNetworkListChanged();
554 return true; 475 return true;
(...skipping 11 matching lines...) Expand all
566 tether_network_list_.erase(iter); 487 tether_network_list_.erase(iter);
567 NotifyNetworkListChanged(); 488 NotifyNetworkListChanged();
568 return; 489 return;
569 } 490 }
570 } 491 }
571 } 492 }
572 493
573 bool NetworkStateHandler::AssociateTetherNetworkStateWithWifiNetwork( 494 bool NetworkStateHandler::AssociateTetherNetworkStateWithWifiNetwork(
574 const std::string& tether_network_guid, 495 const std::string& tether_network_guid,
575 const std::string& wifi_network_guid) { 496 const std::string& wifi_network_guid) {
576 if (tether_technology_state_ != TECHNOLOGY_ENABLED) {
577 NET_LOG(ERROR) << "AssociateTetherNetworkStateWithWifiNetwork() called "
578 << "when Tether networks are not enabled. Cannot "
579 << "associate.";
580 return false;
581 }
582
583 NetworkState* tether_network = 497 NetworkState* tether_network =
584 GetModifiableNetworkStateFromGuid(tether_network_guid); 498 GetModifiableNetworkStateFromGuid(tether_network_guid);
585 if (!tether_network) { 499 if (!tether_network) {
586 NET_LOG(ERROR) << "Tether network does not exist: " << tether_network_guid; 500 NET_LOG(ERROR) << "Tether network does not exist: " << tether_network_guid;
587 return false; 501 return false;
588 } 502 }
589 if (!NetworkTypePattern::Tether().MatchesType(tether_network->type())) { 503 if (!NetworkTypePattern::Tether().MatchesType(tether_network->type())) {
590 NET_LOG(ERROR) << "Network is not a Tether network: " 504 NET_LOG(ERROR) << "Network is not a Tether network: "
591 << tether_network_guid; 505 << tether_network_guid;
592 return false; 506 return false;
(...skipping 11 matching lines...) Expand all
604 } 518 }
605 519
606 tether_network->set_tether_guid(wifi_network_guid); 520 tether_network->set_tether_guid(wifi_network_guid);
607 wifi_network->set_tether_guid(tether_network_guid); 521 wifi_network->set_tether_guid(tether_network_guid);
608 NotifyNetworkListChanged(); 522 NotifyNetworkListChanged();
609 return true; 523 return true;
610 } 524 }
611 525
612 void NetworkStateHandler::SetTetherNetworkStateDisconnected( 526 void NetworkStateHandler::SetTetherNetworkStateDisconnected(
613 const std::string& guid) { 527 const std::string& guid) {
614 // TODO(khorimoto): Remove the Tether network as the default network, and 528 // TODO(khorimoto): Remove the tether network as the default network, and
615 // send a connection status change. 529 // send a connection status change.
616 SetTetherNetworkStateConnectionState(guid, shill::kStateDisconnect); 530 SetTetherNetworkStateConnectionState(guid, shill::kStateDisconnect);
617 } 531 }
618 532
619 void NetworkStateHandler::SetTetherNetworkStateConnecting( 533 void NetworkStateHandler::SetTetherNetworkStateConnecting(
620 const std::string& guid) { 534 const std::string& guid) {
621 // TODO(khorimoto): Set the Tether network as the default network, and send 535 // TODO(khorimoto): Set the tether network as the default network, and send
622 // a connection status change. 536 // a connection status change.
623 SetTetherNetworkStateConnectionState(guid, shill::kStateConfiguration); 537 SetTetherNetworkStateConnectionState(guid, shill::kStateConfiguration);
624 } 538 }
625 539
626 void NetworkStateHandler::SetTetherNetworkStateConnected( 540 void NetworkStateHandler::SetTetherNetworkStateConnected(
627 const std::string& guid) { 541 const std::string& guid) {
628 // Being connected implies that AssociateTetherNetworkStateWithWifiNetwork() 542 // Being connected implies that AssociateTetherNetworkStateWithWifiNetwork()
629 // was already called, so ensure that the association is still intact. 543 // was already called, so ensure that the association is still intact.
630 DCHECK(GetNetworkStateFromGuid(GetNetworkStateFromGuid(guid)->tether_guid()) 544 DCHECK(GetNetworkStateFromGuid(GetNetworkStateFromGuid(guid)->tether_guid())
631 ->tether_guid() == guid); 545 ->tether_guid() == guid);
(...skipping 11 matching lines...) Expand all
643 << "not found: " << guid; 557 << "not found: " << guid;
644 return; 558 return;
645 } 559 }
646 560
647 DCHECK(NetworkTypePattern::Tether().MatchesType(tether_network->type())); 561 DCHECK(NetworkTypePattern::Tether().MatchesType(tether_network->type()));
648 562
649 tether_network->set_connection_state(connection_state); 563 tether_network->set_connection_state(connection_state);
650 NotifyNetworkListChanged(); 564 NotifyNetworkListChanged();
651 } 565 }
652 566
653 void NetworkStateHandler::EnsureTetherDeviceState() {
654 bool should_be_present =
655 tether_technology_state_ != TechnologyState::TECHNOLOGY_UNAVAILABLE;
656
657 for (auto it = device_list_.begin(); it < device_list_.end(); ++it) {
658 std::string path = (*it)->path();
659 if (path == kTetherDevicePath) {
660 // If the Tether DeviceState is in the list and it should not be, remove
661 // it and return. If it is in the list and it should be, the list is
662 // already valid, so return without removing it.
663 if (!should_be_present)
664 device_list_.erase(it);
665 return;
666 }
667 }
668
669 if (!should_be_present) {
670 // If the Tether DeviceState was not in the list and it should not be, the
671 // list is already valid, so return.
672 return;
673 }
674
675 // The Tether DeviceState is not present in the list, but it should be. Since
676 // Tether networks are not recognized by Shill, they will never receive an
677 // update, so set properties on the state here.
678 std::unique_ptr<ManagedState> tether_device_state = ManagedState::Create(
679 ManagedState::ManagedType::MANAGED_TYPE_DEVICE, kTetherDevicePath);
680 tether_device_state->set_update_received();
681 tether_device_state->set_update_requested(false);
682 tether_device_state->set_name(kTetherDeviceName);
683 tether_device_state->set_type(kTypeTether);
684
685 device_list_.push_back(std::move(tether_device_state));
686 }
687
688 void NetworkStateHandler::GetDeviceList(DeviceStateList* list) const { 567 void NetworkStateHandler::GetDeviceList(DeviceStateList* list) const {
689 GetDeviceListByType(NetworkTypePattern::Default(), list); 568 GetDeviceListByType(NetworkTypePattern::Default(), list);
690 } 569 }
691 570
692 void NetworkStateHandler::GetDeviceListByType(const NetworkTypePattern& type, 571 void NetworkStateHandler::GetDeviceListByType(const NetworkTypePattern& type,
693 DeviceStateList* list) const { 572 DeviceStateList* list) const {
694 DCHECK(list); 573 DCHECK(list);
695 list->clear(); 574 list->clear();
696
697 for (auto iter = device_list_.begin(); iter != device_list_.end(); ++iter) { 575 for (auto iter = device_list_.begin(); iter != device_list_.end(); ++iter) {
698 const DeviceState* device = (*iter)->AsDeviceState(); 576 const DeviceState* device = (*iter)->AsDeviceState();
699 DCHECK(device); 577 DCHECK(device);
700 if (device->update_received() && device->Matches(type)) 578 if (device->update_received() && device->Matches(type))
701 list->push_back(device); 579 list->push_back(device);
702 } 580 }
703 } 581 }
704 582
705 void NetworkStateHandler::RequestScan() const { 583 void NetworkStateHandler::RequestScan() const {
706 NET_LOG_USER("RequestScan", ""); 584 NET_LOG_USER("RequestScan", "");
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
841 continue; 719 continue;
842 } 720 }
843 managed_list->push_back(ManagedState::Create(type, path)); 721 managed_list->push_back(ManagedState::Create(type, path));
844 } else { 722 } else {
845 managed_list->push_back(std::move(found->second)); 723 managed_list->push_back(std::move(found->second));
846 managed_map.erase(found); 724 managed_map.erase(found);
847 } 725 }
848 list_entries.insert(path); 726 list_entries.insert(path);
849 } 727 }
850 728
851 if (type == ManagedState::ManagedType::MANAGED_TYPE_DEVICE) {
852 // Also move the Tether DeviceState if it exists. This will not happen as
853 // part of the loop above since |entries| will never contain the Tether
854 // path.
855 auto iter = managed_map.find(kTetherDevicePath);
856 if (iter != managed_map.end()) {
857 managed_list->push_back(std::move(iter->second));
858 managed_map.erase(iter);
859 }
860 }
861
862 if (type != ManagedState::ManagedType::MANAGED_TYPE_NETWORK) 729 if (type != ManagedState::ManagedType::MANAGED_TYPE_NETWORK)
863 return; 730 return;
864 731
865 // Remove associations Tether NetworkStates had with now removed Wi-Fi 732 // Remove associations Tether NetworkStates had with now removed Wi-Fi
866 // NetworkStates. 733 // NetworkStates.
867 for (auto& iter : managed_map) { 734 for (auto& iter : managed_map) {
868 if (!iter.second->Matches(NetworkTypePattern::WiFi())) 735 if (!iter.second->Matches(NetworkTypePattern::WiFi()))
869 continue; 736 continue;
870 737
871 NetworkState* tether_network = GetModifiableNetworkStateFromGuid( 738 NetworkState* tether_network = GetModifiableNetworkStateFromGuid(
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1097 devices += ", "; 964 devices += ", ";
1098 devices += (*iter)->name(); 965 devices += (*iter)->name();
1099 } 966 }
1100 NET_LOG_EVENT("DeviceList", devices); 967 NET_LOG_EVENT("DeviceList", devices);
1101 NotifyDeviceListChanged(); 968 NotifyDeviceListChanged();
1102 } else { 969 } else {
1103 NOTREACHED(); 970 NOTREACHED();
1104 } 971 }
1105 } 972 }
1106 973
1107 // TODO(khorimoto): Add sorting for the Tether network list as well. 974 // TODO(khorimoto): Add sorting for the tether network list as well.
1108 void NetworkStateHandler::SortNetworkList() { 975 void NetworkStateHandler::SortNetworkList() {
1109 // Note: usually active networks will precede inactive networks, however 976 // Note: usually active networks will precede inactive networks, however
1110 // this may briefly be untrue during state transitions (e.g. a network may 977 // this may briefly be untrue during state transitions (e.g. a network may
1111 // transition to idle before the list is updated). 978 // transition to idle before the list is updated).
1112 ManagedStateList active, non_wifi_visible, wifi_visible, hidden, new_networks; 979 ManagedStateList active, non_wifi_visible, wifi_visible, hidden, new_networks;
1113 for (ManagedStateList::iterator iter = network_list_.begin(); 980 for (ManagedStateList::iterator iter = network_list_.begin();
1114 iter != network_list_.end(); ++iter) { 981 iter != network_list_.end(); ++iter) {
1115 NetworkState* network = (*iter)->AsNetworkState(); 982 NetworkState* network = (*iter)->AsNetworkState();
1116 if (!network->update_received()) { 983 if (!network->update_received()) {
1117 new_networks.push_back(std::move(*iter)); 984 new_networks.push_back(std::move(*iter));
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
1401 if (type.MatchesType(shill::kTypeWifi)) 1268 if (type.MatchesType(shill::kTypeWifi))
1402 technologies.emplace_back(shill::kTypeWifi); 1269 technologies.emplace_back(shill::kTypeWifi);
1403 if (type.MatchesType(shill::kTypeWimax)) 1270 if (type.MatchesType(shill::kTypeWimax))
1404 technologies.emplace_back(shill::kTypeWimax); 1271 technologies.emplace_back(shill::kTypeWimax);
1405 if (type.MatchesType(shill::kTypeCellular)) 1272 if (type.MatchesType(shill::kTypeCellular))
1406 technologies.emplace_back(shill::kTypeCellular); 1273 technologies.emplace_back(shill::kTypeCellular);
1407 if (type.MatchesType(shill::kTypeBluetooth)) 1274 if (type.MatchesType(shill::kTypeBluetooth))
1408 technologies.emplace_back(shill::kTypeBluetooth); 1275 technologies.emplace_back(shill::kTypeBluetooth);
1409 if (type.MatchesType(shill::kTypeVPN)) 1276 if (type.MatchesType(shill::kTypeVPN))
1410 technologies.emplace_back(shill::kTypeVPN); 1277 technologies.emplace_back(shill::kTypeVPN);
1411 if (type.MatchesType(kTypeTether))
1412 technologies.emplace_back(kTypeTether);
1413 1278
1414 CHECK_GT(technologies.size(), 0ul); 1279 CHECK_GT(technologies.size(), 0ul);
1415 return technologies; 1280 return technologies;
1416 } 1281 }
1417 1282
1418 } // namespace chromeos 1283 } // namespace chromeos
OLDNEW
« no previous file with comments | « chromeos/network/network_state_handler.h ('k') | chromeos/network/network_state_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698