Index: components/arc/net/arc_net_host_impl.cc |
diff --git a/components/arc/net/arc_net_host_impl.cc b/components/arc/net/arc_net_host_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7c37224dbd83fbd19fed9d87c9c8fff4d615c8a3 |
--- /dev/null |
+++ b/components/arc/net/arc_net_host_impl.cc |
@@ -0,0 +1,94 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "components/arc/net/arc_net_host_impl.h" |
+ |
+#include <string> |
+#include <vector> |
+ |
+#include "base/logging.h" |
+#include "base/posix/eintr_wrapper.h" |
+#include "base/thread_task_runner_handle.h" |
+#include "base/time/time.h" |
+#include "chromeos/network/network_util.h" |
+#include "chromeos/network/onc/onc_utils.h" |
+#include "components/arc/arc_bridge_service.h" |
+#include "components/onc/onc_constants.h" |
+#include "third_party/mojo/src/mojo/edk/embedder/embedder.h" |
+ |
+namespace { |
+ |
+const int kGetNetworksListLimit = 100; |
+ |
+} // namespace |
+ |
+namespace arc { |
+ |
+ArcNetHostImpl::ArcNetHostImpl(ArcBridgeService* arc_bridge_service) |
+ : arc_bridge_service_(arc_bridge_service), |
+ binding_(this), |
+ weak_factory_(this) { |
+ arc_bridge_service->AddObserver(this); |
+ if (arc_bridge_service->net_instance()) |
+ OnNetInstanceReady(); |
+} |
+ |
+ArcNetHostImpl::~ArcNetHostImpl() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ arc_bridge_service_->RemoveObserver(this); |
+} |
+ |
+void ArcNetHostImpl::OnNetInstanceReady() { |
+ DCHECK(thread_checker_.CalledOnValidThread()); |
+ |
+ NetHostPtr host; |
+ binding_.Bind(GetProxy(&host)); |
+ arc_bridge_service_->net_instance()->Init(std::move(host)); |
+} |
+ |
+void ArcNetHostImpl::GetNetworks(bool configured_only, |
+ bool visible_only, |
+ const GetNetworksCallback& callback) { |
+ NetworkDataPtr data = NetworkData::New(); |
+ data->status = NETWORK_RESULT_SUCCESS; |
+ |
+ // Retrieve list of nearby wifi networks |
+ chromeos::NetworkTypePattern network_pattern = |
+ chromeos::onc::NetworkTypePatternFromOncType(onc::network_type::kWiFi); |
+ scoped_ptr<base::ListValue> network_properties_list = |
+ chromeos::network_util::TranslateNetworkListToONC( |
+ network_pattern, configured_only, visible_only, |
+ kGetNetworksListLimit); |
+ |
+ // Extract info for each network and add it to the list. |
+ for (base::Value* value : *network_properties_list) { |
+ WifiConfigurationPtr wc = WifiConfiguration::New(); |
+ |
+ base::DictionaryValue* network_dict = nullptr; |
+ value->GetAsDictionary(&network_dict); |
+ DCHECK(network_dict); |
+ |
+ // kName is a post-processed version of kHexSSID. |
+ std::string tmp; |
+ network_dict->GetString(onc::network_config::kName, &tmp); |
+ wc->ssid = tmp; |
+ |
+ base::DictionaryValue* wifi_dict = nullptr; |
+ network_dict->GetDictionary(onc::network_config::kWiFi, &wifi_dict); |
+ DCHECK(wifi_dict); |
+ |
+ wifi_dict->GetInteger(onc::wifi::kFrequency, &wc->frequency); |
+ wifi_dict->GetInteger(onc::wifi::kSignalStrength, &wc->signal_strength); |
+ wifi_dict->GetString(onc::wifi::kSecurity, &tmp); |
+ wc->security = tmp; |
+ wifi_dict->GetString(onc::wifi::kBSSID, &tmp); |
+ wc->bssid = tmp; |
+ |
+ data->networks.push_back(std::move(wc)); |
+ } |
+ |
+ callback.Run(std::move(data)); |
+} |
+ |
+} // namespace arc |