1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file.
4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/wifi/fake_wifi_service.h"
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/bind.h"
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/json/json_reader.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/message_loop/message_loop.h"
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/onc/onc_constants.h"
11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace wifi {
13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)FakeWiFiService::FakeWiFiService() {
15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Populate data expected by unit test.
16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    NetworkProperties network_properties;
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.connection_state = onc::connection_state::kConnected;
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    network_properties.guid = "stub_wifi1_guid";
20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.name = "wifi1";
21010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.type = onc::network_type::kWiFi;
22010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.frequency = 0;
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.ssid = "wifi1";
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.security = onc::wifi::kWEP_PSK;
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.signal_strength = 40;
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.json_extra =
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "{"
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "  \"MacAddress\": \"00:11:22:AA:BB:CC\","
29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "  \"IPConfigs\": [{"
30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "     \"Gateway\": \"0.0.0.1\","
31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "     \"IPAddress\": \"0.0.0.0\","
32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "     \"RoutingPrefix\": 0,"
33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "     \"Type\": \"IPv4\""
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "  }],"
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "  \"WiFi\": {"
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "    \"Frequency\": 2400,"
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "    \"FrequencyList\": [2400]"
38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "  }"
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      "}";
40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    networks_.push_back(network_properties);
41010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  {
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    NetworkProperties network_properties;
44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.connection_state = onc::connection_state::kNotConnected;
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    network_properties.guid = "stub_wifi2_guid";
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.name = "wifi2_PSK";
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.type = onc::network_type::kWiFi;
48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.frequency = 5000;
49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.frequency_set.insert(2400);
50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.frequency_set.insert(5000);
51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.ssid = "wifi2_PSK";
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.security = onc::wifi::kWPA_PSK;
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.signal_strength = 80;
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    networks_.push_back(network_properties);
55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)FakeWiFiService::~FakeWiFiService() {
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::Initialize(
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_refptr<base::SequencedTaskRunner> task_runner) {
63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::UnInitialize() {
66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::GetProperties(const std::string& network_guid,
69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    base::DictionaryValue* properties,
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                    std::string* error) {
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NetworkList::iterator network_properties = FindNetwork(network_guid);
72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (network_properties == networks_.end()) {
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    *error = "Error.InvalidNetworkGuid";
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  properties->Swap(network_properties->ToValue(false).get());
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::GetManagedProperties(
80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& network_guid,
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    base::DictionaryValue* managed_properties,
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    std::string* error) {
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Not implemented
84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  *error = kErrorWiFiService;
85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
86010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
87010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::GetState(const std::string& network_guid,
88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               base::DictionaryValue* properties,
89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                               std::string* error) {
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NetworkList::iterator network_properties = FindNetwork(network_guid);
91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (network_properties == networks_.end()) {
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    *error = "Error.InvalidNetworkGuid";
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return;
94010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
95010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  properties->Swap(network_properties->ToValue(true).get());
96010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
97010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
98010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::SetProperties(
99010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& network_guid,
100010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> properties,
101010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    std::string* error) {
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NetworkList::iterator network_properties = FindNetwork(network_guid);
103010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (network_properties == networks_.end() ||
104010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      !network_properties->UpdateFromValue(*properties)) {
105010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    *error = "Error.DBusFailed";
106010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
107010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
108010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
109010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::CreateNetwork(
110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    bool shared,
111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_ptr<base::DictionaryValue> properties,
112010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    std::string* network_guid,
113010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    std::string* error) {
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NetworkProperties network_properties;
115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if (network_properties.UpdateFromValue(*properties)) {
116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    network_properties.guid = network_properties.ssid;
117010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    networks_.push_back(network_properties);
118010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    *network_guid = network_properties.guid;
119010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  } else {
120010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    *error = "Error.DBusFailed";
121010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
122010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
123010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
124010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::GetVisibleNetworks(const std::string& network_type,
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                         base::ListValue* network_list,
12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                         bool include_details) {
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (NetworkList::const_iterator it = networks_.begin();
128010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       it != networks_.end();
129010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       ++it) {
130010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (network_type.empty() || network_type == onc::network_type::kAllTypes ||
131010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        it->type == network_type) {
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      scoped_ptr<base::DictionaryValue> network(it->ToValue(!include_details));
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      network_list->Append(network.release());
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    }
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::RequestNetworkScan() {
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NotifyNetworkListChanged(networks_);
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::StartConnect(const std::string& network_guid,
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                   std::string* error) {
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  NetworkList::iterator network_properties = FindNetwork(network_guid);
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (network_properties == networks_.end()) {
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    *error = "Error.InvalidNetworkGuid";
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DisconnectAllNetworksOfType(network_properties->type);
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  network_properties->connection_state = onc::connection_state::kConnected;
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SortNetworks();
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NotifyNetworkListChanged(networks_);
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NotifyNetworkChanged(network_guid);
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::StartDisconnect(const std::string& network_guid,
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                      std::string* error) {
15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  NetworkList::iterator network_properties = FindNetwork(network_guid);
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (network_properties == networks_.end()) {
160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    *error = "Error.InvalidNetworkGuid";
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return;
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  network_properties->connection_state = onc::connection_state::kNotConnected;
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SortNetworks();
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NotifyNetworkListChanged(networks_);
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NotifyNetworkChanged(network_guid);
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::GetKeyFromSystem(const std::string& network_guid,
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       std::string* key_data,
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)                                       std::string* error) {
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  *error = "not-found";
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::SetEventObservers(
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    scoped_refptr<base::MessageLoopProxy> message_loop_proxy,
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const NetworkGuidListCallback& networks_changed_observer,
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const NetworkGuidListCallback& network_list_changed_observer) {
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  message_loop_proxy_.swap(message_loop_proxy);
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  networks_changed_observer_ = networks_changed_observer;
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  network_list_changed_observer_ = network_list_changed_observer;
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::RequestConnectedNetworkUpdate() {
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)NetworkList::iterator FakeWiFiService::FindNetwork(
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const std::string& network_guid) {
18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (NetworkList::iterator it = networks_.begin(); it != networks_.end();
190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       ++it) {
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (it->guid == network_guid)
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      return it;
193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  return networks_.end();
195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::DisconnectAllNetworksOfType(const std::string& type) {
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (NetworkList::iterator it = networks_.begin(); it != networks_.end();
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       ++it) {
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    if (it->type == type)
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      it->connection_state = onc::connection_state::kNotConnected;
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::SortNetworks() {
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Sort networks, so connected/connecting is up front, then by type:
207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  // Ethernet, WiFi, Cellular, VPN
20846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  networks_.sort(NetworkProperties::OrderByType);
209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
21146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void FakeWiFiService::NotifyNetworkListChanged(const NetworkList& networks) {
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  WiFiService::NetworkGuidList current_networks;
21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (NetworkList::const_iterator it = networks.begin(); it != networks.end();
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       ++it) {
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    current_networks.push_back(it->guid);
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  message_loop_proxy_->PostTask(
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      FROM_HERE, base::Bind(network_list_changed_observer_, current_networks));
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void FakeWiFiService::NotifyNetworkChanged(const std::string& network_guid) {
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  WiFiService::NetworkGuidList changed_networks(1, network_guid);
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  message_loop_proxy_->PostTask(
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      FROM_HERE, base::Bind(networks_changed_observer_, changed_networks));
226010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}  // namespace wifi
229