Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/logging.h" | |
| 17 #include "base/memory/ptr_util.h" | 16 #include "base/memory/ptr_util.h" |
| 18 #include "base/metrics/histogram_macros.h" | 17 #include "base/metrics/histogram_macros.h" |
| 19 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
| 20 #include "base/strings/string_util.h" | 19 #include "base/strings/string_util.h" |
| 21 #include "base/strings/stringprintf.h" | 20 #include "base/strings/stringprintf.h" |
| 22 #include "base/values.h" | 21 #include "base/values.h" |
| 23 #include "chromeos/chromeos_switches.h" | 22 #include "chromeos/chromeos_switches.h" |
| 24 #include "chromeos/network/device_state.h" | 23 #include "chromeos/network/device_state.h" |
| 25 #include "chromeos/network/network_event_log.h" | 24 #include "chromeos/network/network_event_log.h" |
| 26 #include "chromeos/network/network_state.h" | 25 #include "chromeos/network/network_state.h" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 216 } | 215 } |
| 217 | 216 |
| 218 const NetworkState* NetworkStateHandler::DefaultNetwork() const { | 217 const NetworkState* NetworkStateHandler::DefaultNetwork() const { |
| 219 if (default_network_path_.empty()) | 218 if (default_network_path_.empty()) |
| 220 return nullptr; | 219 return nullptr; |
| 221 return GetNetworkState(default_network_path_); | 220 return GetNetworkState(default_network_path_); |
| 222 } | 221 } |
| 223 | 222 |
| 224 const NetworkState* NetworkStateHandler::ConnectedNetworkByType( | 223 const NetworkState* NetworkStateHandler::ConnectedNetworkByType( |
| 225 const NetworkTypePattern& type) const { | 224 const NetworkTypePattern& type) const { |
| 225 // If a tether network is connected, return that network before checking other | |
| 226 // network types. | |
| 227 if (type.MatchesPattern(NetworkTypePattern::Tether())) { | |
| 228 for (auto iter = tether_network_list_.begin(); | |
| 229 iter != tether_network_list_.end(); ++iter) { | |
| 230 const NetworkState* network = (*iter)->AsNetworkState(); | |
| 231 DCHECK(network); | |
| 232 if (network->IsConnectedState()) | |
| 233 return network; | |
| 234 } | |
| 235 } | |
| 236 | |
| 226 // Active networks are always listed first by Shill so no need to sort. | 237 // Active networks are always listed first by Shill so no need to sort. |
| 227 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) { | 238 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) { |
| 228 const NetworkState* network = (*iter)->AsNetworkState(); | 239 const NetworkState* network = (*iter)->AsNetworkState(); |
| 229 DCHECK(network); | 240 DCHECK(network); |
| 230 if (!network->update_received()) | 241 if (!network->update_received()) |
| 231 continue; | 242 continue; |
| 232 if (!network->IsConnectedState()) | 243 if (!network->IsConnectedState()) |
| 233 break; // Connected networks are listed first. | 244 break; // Connected networks are listed first. |
| 234 if (network->Matches(type)) | 245 if (network->Matches(type)) |
| 235 return network; | 246 return network; |
| 236 } | 247 } |
| 237 return nullptr; | 248 return nullptr; |
| 238 } | 249 } |
| 239 | 250 |
| 240 const NetworkState* NetworkStateHandler::ConnectingNetworkByType( | 251 const NetworkState* NetworkStateHandler::ConnectingNetworkByType( |
| 241 const NetworkTypePattern& type) const { | 252 const NetworkTypePattern& type) const { |
| 253 // If a tether network is connecting, return that network before checking | |
| 254 // other network types. | |
| 255 if (type.MatchesPattern(NetworkTypePattern::Tether())) { | |
| 256 for (auto iter = tether_network_list_.begin(); | |
| 257 iter != tether_network_list_.end(); ++iter) { | |
| 258 const NetworkState* network = (*iter)->AsNetworkState(); | |
| 259 DCHECK(network); | |
| 260 if (network->IsConnectingState()) | |
| 261 return network; | |
| 262 } | |
| 263 } | |
| 264 | |
| 242 // Active networks are always listed first by Shill so no need to sort. | 265 // Active networks are always listed first by Shill so no need to sort. |
| 243 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) { | 266 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) { |
| 244 const NetworkState* network = (*iter)->AsNetworkState(); | 267 const NetworkState* network = (*iter)->AsNetworkState(); |
| 245 DCHECK(network); | 268 DCHECK(network); |
| 246 if (!network->update_received() || network->IsConnectedState()) | 269 if (!network->update_received() || network->IsConnectedState()) |
| 247 continue; | 270 continue; |
| 248 if (!network->IsConnectingState()) | 271 if (!network->IsConnectingState()) |
| 249 break; // Connected and connecting networks are listed first. | 272 break; // Connected and connecting networks are listed first. |
| 250 if (network->Matches(type)) | 273 if (network->Matches(type)) |
| 251 return network; | 274 return network; |
| 252 } | 275 } |
| 253 return nullptr; | 276 return nullptr; |
| 254 } | 277 } |
| 255 | 278 |
| 256 const NetworkState* NetworkStateHandler::FirstNetworkByType( | 279 const NetworkState* NetworkStateHandler::FirstNetworkByType( |
| 257 const NetworkTypePattern& type) { | 280 const NetworkTypePattern& type) { |
| 258 if (!network_list_sorted_) | 281 if (!network_list_sorted_) |
| 259 SortNetworkList(); // Sort to ensure visible networks are listed first. | 282 SortNetworkList(); // Sort to ensure visible networks are listed first. |
| 283 | |
| 284 // If |type| matches tether networks and at least one tether network is | |
| 285 // present, return the first network (since it has been sorted already). | |
| 286 if (type.MatchesPattern(NetworkTypePattern::Tether()) && | |
| 287 !tether_network_list_.empty()) { | |
| 288 return tether_network_list_[0]->AsNetworkState(); | |
| 289 } | |
| 290 | |
| 260 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) { | 291 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) { |
| 261 const NetworkState* network = (*iter)->AsNetworkState(); | 292 const NetworkState* network = (*iter)->AsNetworkState(); |
| 262 DCHECK(network); | 293 DCHECK(network); |
| 263 if (!network->update_received()) | 294 if (!network->update_received()) |
| 264 continue; | 295 continue; |
| 265 if (!network->visible()) | 296 if (!network->visible()) |
| 266 break; | 297 break; |
| 267 if (network->Matches(type)) | 298 if (network->Matches(type)) |
| 268 return network; | 299 return network; |
| 269 } | 300 } |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 284 const NetworkTypePattern& type, | 315 const NetworkTypePattern& type, |
| 285 NetworkStateList* list) { | 316 NetworkStateList* list) { |
| 286 GetNetworkListByType(type, false /* configured_only */, | 317 GetNetworkListByType(type, false /* configured_only */, |
| 287 true /* visible_only */, 0 /* no limit */, list); | 318 true /* visible_only */, 0 /* no limit */, list); |
| 288 } | 319 } |
| 289 | 320 |
| 290 void NetworkStateHandler::GetVisibleNetworkList(NetworkStateList* list) { | 321 void NetworkStateHandler::GetVisibleNetworkList(NetworkStateList* list) { |
| 291 GetVisibleNetworkListByType(NetworkTypePattern::Default(), list); | 322 GetVisibleNetworkListByType(NetworkTypePattern::Default(), list); |
| 292 } | 323 } |
| 293 | 324 |
| 294 void NetworkStateHandler::GetNetworkListByType(const NetworkTypePattern& type, | 325 void NetworkStateHandler::GetNetworkListByType(const NetworkTypePattern& type, |
|
Ryan Hansberry
2017/04/18 16:08:55
This now makes GetTetherNetworkList pointless. Is
Kyle Horimoto
2017/04/18 17:15:23
The implementation of the chrome.networkingPrivate
Ryan Hansberry
2017/04/18 23:56:17
I would prefer if GetTetherNetworkList() were priv
Kyle Horimoto
2017/04/19 00:28:17
Done.
Kyle Horimoto
2017/04/19 02:05:46
Actually, this function is still called by ash. Ch
Ryan Hansberry
2017/04/19 17:49:07
Do you mean that GetTetherNetworkList() is called
Kyle Horimoto
2017/04/19 19:23:28
Done.
| |
| 295 bool configured_only, | 326 bool configured_only, |
| 296 bool visible_only, | 327 bool visible_only, |
| 297 int limit, | 328 int limit, |
| 298 NetworkStateList* list) { | 329 NetworkStateList* list) { |
| 299 DCHECK(list); | 330 DCHECK(list); |
| 300 list->clear(); | 331 list->clear(); |
| 301 int count = 0; | 332 |
| 302 // Sort the network list if necessary. | 333 // Sort the network list if necessary. |
| 303 if (!network_list_sorted_) | 334 if (!network_list_sorted_) |
| 304 SortNetworkList(); | 335 SortNetworkList(); |
| 336 | |
| 337 if (type.MatchesPattern(NetworkTypePattern::Tether())) { | |
| 338 GetTetherNetworkList(limit, list); | |
| 339 } | |
| 340 | |
| 341 int count = list->size(); | |
| 342 | |
| 343 if (type.Equals(NetworkTypePattern::Tether()) || | |
| 344 (limit != 0 && count >= limit)) { | |
| 345 // If only searching for tether networks, there is no need to continue | |
| 346 // searching through other network types; likewise, if the limit has already | |
| 347 // been reached, there is no need to continue searching. | |
| 348 return; | |
| 349 } | |
| 350 | |
| 305 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) { | 351 for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) { |
| 306 const NetworkState* network = (*iter)->AsNetworkState(); | 352 const NetworkState* network = (*iter)->AsNetworkState(); |
| 307 DCHECK(network); | 353 DCHECK(network); |
| 308 if (!network->update_received() || !network->Matches(type)) | 354 if (!network->update_received() || !network->Matches(type)) |
| 309 continue; | 355 continue; |
| 310 if (configured_only && !network->IsInProfile()) | 356 if (configured_only && !network->IsInProfile()) |
| 311 continue; | 357 continue; |
| 312 if (visible_only && !network->visible()) | 358 if (visible_only && !network->visible()) |
| 313 continue; | 359 continue; |
| 314 list->push_back(network); | 360 list->push_back(network); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 347 return network; | 393 return network; |
| 348 } | 394 } |
| 349 | 395 |
| 350 const NetworkState* NetworkStateHandler::GetNetworkStateFromGuid( | 396 const NetworkState* NetworkStateHandler::GetNetworkStateFromGuid( |
| 351 const std::string& guid) const { | 397 const std::string& guid) const { |
| 352 DCHECK(!guid.empty()); | 398 DCHECK(!guid.empty()); |
| 353 return GetModifiableNetworkStateFromGuid(guid); | 399 return GetModifiableNetworkStateFromGuid(guid); |
| 354 } | 400 } |
| 355 | 401 |
| 356 void NetworkStateHandler::AddTetherNetworkState(const std::string& guid, | 402 void NetworkStateHandler::AddTetherNetworkState(const std::string& guid, |
| 357 const std::string& name) { | 403 const std::string& name, |
| 404 const std::string& carrier, | |
| 405 int battery_percentage, | |
| 406 int signal_strength) { | |
| 358 DCHECK(!guid.empty()); | 407 DCHECK(!guid.empty()); |
| 408 DCHECK(battery_percentage >= 0 && battery_percentage <= 100); | |
| 409 DCHECK(signal_strength >= 0 && signal_strength <= 100); | |
|
Ryan Hansberry
2017/04/18 16:08:55
Signal strength can be between 0 and 4 inclusive.
Kyle Horimoto
2017/04/18 17:15:23
Not on Chrome OS.
| |
| 359 | 410 |
| 360 // If the network already exists, do nothing. | 411 // If the network already exists, do nothing. |
| 361 if (GetNetworkStateFromGuid(guid)) { | 412 if (GetNetworkStateFromGuid(guid)) { |
| 362 NET_LOG(ERROR) << "AddTetherNetworkState: " << name | 413 NET_LOG(ERROR) << "AddTetherNetworkState: " << name |
| 363 << " called with existing guid:" << guid; | 414 << " called with existing guid:" << guid; |
| 364 return; | 415 return; |
| 365 } | 416 } |
| 366 | 417 |
| 418 // Use the GUID as the network's service path. | |
| 367 std::unique_ptr<NetworkState> tether_network_state = | 419 std::unique_ptr<NetworkState> tether_network_state = |
| 368 base::MakeUnique<NetworkState>(guid); | 420 base::MakeUnique<NetworkState>(guid /* path */); |
| 369 | 421 |
| 422 // Tether networks are always connectable | |
| 423 tether_network_state->connectable_ = true; | |
|
Ryan Hansberry
2017/04/18 16:08:55
Should probably create a set_connectable().
Kyle Horimoto
2017/04/18 17:15:23
Done.
| |
| 370 tether_network_state->set_name(name); | 424 tether_network_state->set_name(name); |
| 371 tether_network_state->set_type(kTypeTether); | 425 tether_network_state->set_type(kTypeTether); |
| 372 tether_network_state->SetGuid(guid); | 426 tether_network_state->SetGuid(guid); |
| 373 tether_network_state->set_visible(true); | 427 tether_network_state->set_visible(true); |
| 374 tether_network_state->set_update_received(); | 428 tether_network_state->set_update_received(); |
| 429 tether_network_state->set_update_requested(false); | |
| 430 tether_network_state->SetCarrier(carrier); | |
| 431 tether_network_state->SetBatteryPercentage(battery_percentage); | |
| 432 tether_network_state->SetTetherSignalStrength(signal_strength); | |
| 375 | 433 |
| 376 tether_network_list_.push_back(std::move(tether_network_state)); | 434 tether_network_list_.push_back(std::move(tether_network_state)); |
| 377 NotifyNetworkListChanged(); | 435 NotifyNetworkListChanged(); |
| 378 } | 436 } |
| 379 | 437 |
| 438 bool NetworkStateHandler::UpdateTetherNetworkProperties( | |
| 439 const std::string& guid, | |
| 440 const std::string& carrier, | |
| 441 int battery_percentage, | |
| 442 int signal_strength) { | |
| 443 NetworkState* tether_network_state = GetModifiableNetworkStateFromGuid(guid); | |
| 444 if (!tether_network_state) | |
| 445 return false; | |
| 446 | |
| 447 tether_network_state->SetCarrier(carrier); | |
| 448 tether_network_state->SetBatteryPercentage(battery_percentage); | |
| 449 tether_network_state->SetTetherSignalStrength(signal_strength); | |
| 450 | |
| 451 NotifyNetworkListChanged(); | |
| 452 return true; | |
| 453 } | |
| 454 | |
| 380 void NetworkStateHandler::RemoveTetherNetworkState(const std::string& guid) { | 455 void NetworkStateHandler::RemoveTetherNetworkState(const std::string& guid) { |
| 381 for (auto iter = tether_network_list_.begin(); | 456 for (auto iter = tether_network_list_.begin(); |
| 382 iter != tether_network_list_.end(); ++iter) { | 457 iter != tether_network_list_.end(); ++iter) { |
| 383 if (iter->get()->AsNetworkState()->guid() == guid) { | 458 if (iter->get()->AsNetworkState()->guid() == guid) { |
| 384 NetworkState* wifi_network = GetModifiableNetworkStateFromGuid( | 459 NetworkState* wifi_network = GetModifiableNetworkStateFromGuid( |
| 385 iter->get()->AsNetworkState()->tether_guid()); | 460 iter->get()->AsNetworkState()->tether_guid()); |
| 386 if (wifi_network) | 461 if (wifi_network) |
| 387 wifi_network->set_tether_guid(std::string()); | 462 wifi_network->set_tether_guid(std::string()); |
| 388 | 463 |
| 389 tether_network_list_.erase(iter); | 464 tether_network_list_.erase(iter); |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 420 } | 495 } |
| 421 | 496 |
| 422 tether_network->set_tether_guid(wifi_network_guid); | 497 tether_network->set_tether_guid(wifi_network_guid); |
| 423 wifi_network->set_tether_guid(tether_network_guid); | 498 wifi_network->set_tether_guid(tether_network_guid); |
| 424 NotifyNetworkListChanged(); | 499 NotifyNetworkListChanged(); |
| 425 return true; | 500 return true; |
| 426 } | 501 } |
| 427 | 502 |
| 428 void NetworkStateHandler::SetTetherNetworkStateDisconnected( | 503 void NetworkStateHandler::SetTetherNetworkStateDisconnected( |
| 429 const std::string& guid) { | 504 const std::string& guid) { |
| 505 // TODO(khorimoto): Change default network? Notify of connection change? | |
|
Ryan Hansberry
2017/04/18 16:08:55
Will the Tether component be the only caller of th
Kyle Horimoto
2017/04/18 17:15:23
That's not true. There's no public method for chan
Ryan Hansberry
2017/04/18 23:56:17
Do we need to change default_network_path_? In any
Kyle Horimoto
2017/04/19 00:28:17
Yes, we want to change the default network path so
| |
| 430 SetTetherNetworkStateConnectionState(guid, shill::kStateDisconnect); | 506 SetTetherNetworkStateConnectionState(guid, shill::kStateDisconnect); |
| 431 } | 507 } |
| 432 | 508 |
| 433 void NetworkStateHandler::SetTetherNetworkStateConnecting( | 509 void NetworkStateHandler::SetTetherNetworkStateConnecting( |
| 434 const std::string& guid) { | 510 const std::string& guid) { |
| 511 // TODO(khorimoto): Change default network? Notify of connection change? | |
| 435 SetTetherNetworkStateConnectionState(guid, shill::kStateConfiguration); | 512 SetTetherNetworkStateConnectionState(guid, shill::kStateConfiguration); |
| 436 } | 513 } |
| 437 | 514 |
| 438 void NetworkStateHandler::SetTetherNetworkStateConnected( | 515 void NetworkStateHandler::SetTetherNetworkStateConnected( |
| 439 const std::string& guid) { | 516 const std::string& guid) { |
| 517 // Being connected implies that AssociateTetherNetworkStateWithWifiNetwork() | |
| 518 // was already called, so ensure that the association is still intact. | |
| 519 DCHECK(GetNetworkStateFromGuid(GetNetworkStateFromGuid(guid)->tether_guid()) | |
| 520 ->tether_guid() == guid); | |
| 521 | |
| 522 // TODO(khorimoto): Change default network? Notify of connection change? | |
| 440 SetTetherNetworkStateConnectionState(guid, shill::kStateOnline); | 523 SetTetherNetworkStateConnectionState(guid, shill::kStateOnline); |
| 441 } | 524 } |
| 442 | 525 |
| 443 void NetworkStateHandler::SetTetherNetworkStateConnectionState( | 526 void NetworkStateHandler::SetTetherNetworkStateConnectionState( |
| 444 const std::string& guid, | 527 const std::string& guid, |
| 445 const std::string& connection_state) { | 528 const std::string& connection_state) { |
| 446 NetworkState* tether_network = GetModifiableNetworkStateFromGuid(guid); | 529 NetworkState* tether_network = GetModifiableNetworkStateFromGuid(guid); |
| 447 if (!tether_network) { | 530 if (!tether_network) { |
| 448 NET_LOG(ERROR) << "SetTetherNetworkStateConnectionState: Tether network " | 531 NET_LOG(ERROR) << "SetTetherNetworkStateConnectionState: Tether network " |
| 449 << "not found: " << guid; | 532 << "not found: " << guid; |
| 450 return; | 533 return; |
| 451 } | 534 } |
| 452 | 535 |
| 453 if (!NetworkTypePattern::Tether().MatchesType(tether_network->type())) { | 536 DCHECK(NetworkTypePattern::Tether().MatchesType(tether_network->type())); |
| 454 NET_LOG(ERROR) << "SetTetherNetworkStateConnectionState: network " | |
| 455 << "is not a Tether network: " << guid; | |
| 456 return; | |
| 457 } | |
| 458 | 537 |
| 459 tether_network->set_connection_state(connection_state); | 538 tether_network->set_connection_state(connection_state); |
| 460 NotifyNetworkListChanged(); | 539 NotifyNetworkListChanged(); |
| 461 } | 540 } |
| 462 | 541 |
| 463 void NetworkStateHandler::GetDeviceList(DeviceStateList* list) const { | 542 void NetworkStateHandler::GetDeviceList(DeviceStateList* list) const { |
| 464 GetDeviceListByType(NetworkTypePattern::Default(), list); | 543 GetDeviceListByType(NetworkTypePattern::Default(), list); |
| 465 } | 544 } |
| 466 | 545 |
| 467 void NetworkStateHandler::GetDeviceListByType(const NetworkTypePattern& type, | 546 void NetworkStateHandler::GetDeviceListByType(const NetworkTypePattern& type, |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 568 service_path.c_str())); | 647 service_path.c_str())); |
| 569 return nullptr; | 648 return nullptr; |
| 570 } | 649 } |
| 571 return list.front(); | 650 return list.front(); |
| 572 } | 651 } |
| 573 | 652 |
| 574 void NetworkStateHandler::SetLastErrorForTest(const std::string& service_path, | 653 void NetworkStateHandler::SetLastErrorForTest(const std::string& service_path, |
| 575 const std::string& error) { | 654 const std::string& error) { |
| 576 NetworkState* network_state = GetModifiableNetworkState(service_path); | 655 NetworkState* network_state = GetModifiableNetworkState(service_path); |
| 577 if (!network_state) { | 656 if (!network_state) { |
| 578 LOG(ERROR) << "No matching NetworkState for: " << service_path; | 657 NET_LOG(ERROR) << "No matching NetworkState for: " << service_path; |
| 579 return; | 658 return; |
| 580 } | 659 } |
| 581 network_state->last_error_ = error; | 660 network_state->last_error_ = error; |
| 582 } | 661 } |
| 583 | 662 |
| 584 //------------------------------------------------------------------------------ | 663 //------------------------------------------------------------------------------ |
| 585 // ShillPropertyHandler::Delegate overrides | 664 // ShillPropertyHandler::Delegate overrides |
| 586 | 665 |
| 587 void NetworkStateHandler::UpdateManagedList(ManagedState::ManagedType type, | 666 void NetworkStateHandler::UpdateManagedList(ManagedState::ManagedType type, |
| 588 const base::ListValue& entries) { | 667 const base::ListValue& entries) { |
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 860 devices += ", "; | 939 devices += ", "; |
| 861 devices += (*iter)->name(); | 940 devices += (*iter)->name(); |
| 862 } | 941 } |
| 863 NET_LOG_EVENT("DeviceList", devices); | 942 NET_LOG_EVENT("DeviceList", devices); |
| 864 NotifyDeviceListChanged(); | 943 NotifyDeviceListChanged(); |
| 865 } else { | 944 } else { |
| 866 NOTREACHED(); | 945 NOTREACHED(); |
| 867 } | 946 } |
| 868 } | 947 } |
| 869 | 948 |
| 949 // TODO(khorimoto): Add sorting for the tether network list as well. | |
| 870 void NetworkStateHandler::SortNetworkList() { | 950 void NetworkStateHandler::SortNetworkList() { |
| 871 // Note: usually active networks will precede inactive networks, however | 951 // Note: usually active networks will precede inactive networks, however |
| 872 // this may briefly be untrue during state transitions (e.g. a network may | 952 // this may briefly be untrue during state transitions (e.g. a network may |
| 873 // transition to idle before the list is updated). | 953 // transition to idle before the list is updated). |
| 874 ManagedStateList active, non_wifi_visible, wifi_visible, hidden, new_networks; | 954 ManagedStateList active, non_wifi_visible, wifi_visible, hidden, new_networks; |
| 875 for (ManagedStateList::iterator iter = network_list_.begin(); | 955 for (ManagedStateList::iterator iter = network_list_.begin(); |
| 876 iter != network_list_.end(); ++iter) { | 956 iter != network_list_.end(); ++iter) { |
| 877 NetworkState* network = (*iter)->AsNetworkState(); | 957 NetworkState* network = (*iter)->AsNetworkState(); |
| 878 if (!network->update_received()) { | 958 if (!network->update_received()) { |
| 879 new_networks.push_back(std::move(*iter)); | 959 new_networks.push_back(std::move(*iter)); |
| (...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1169 if (type.MatchesType(shill::kTypeBluetooth)) | 1249 if (type.MatchesType(shill::kTypeBluetooth)) |
| 1170 technologies.emplace_back(shill::kTypeBluetooth); | 1250 technologies.emplace_back(shill::kTypeBluetooth); |
| 1171 if (type.MatchesType(shill::kTypeVPN)) | 1251 if (type.MatchesType(shill::kTypeVPN)) |
| 1172 technologies.emplace_back(shill::kTypeVPN); | 1252 technologies.emplace_back(shill::kTypeVPN); |
| 1173 | 1253 |
| 1174 CHECK_GT(technologies.size(), 0ul); | 1254 CHECK_GT(technologies.size(), 0ul); |
| 1175 return technologies; | 1255 return technologies; |
| 1176 } | 1256 } |
| 1177 | 1257 |
| 1178 } // namespace chromeos | 1258 } // namespace chromeos |
| OLD | NEW |