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

Unified Diff: chromeos/network/geolocation_handler.cc

Issue 11887008: Deprecate ShillNetworkClient and add GeolocationHandler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 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 side-by-side diff with in-line comments
Download patch
Index: chromeos/network/geolocation_handler.cc
diff --git a/chromeos/network/geolocation_handler.cc b/chromeos/network/geolocation_handler.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a42164d6d2fd4308dd70d94e685f965163227196
--- /dev/null
+++ b/chromeos/network/geolocation_handler.cc
@@ -0,0 +1,116 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
Greg Spencer (Chromium) 2013/01/12 00:52:37 2013
stevenjb 2013/01/12 01:55:59 Done.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/network/geolocation_handler.h"
+
+#include "base/bind.h"
+#include "base/string_number_conversions.h"
+#include "base/values.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/shill_manager_client.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+// Time until geolocation data becomes invalid. This is intentionally large;
+// the geolocation code itself should do periodic polling for more accuracy.
+const int64 kGeolocationValidSeconds = 10 * 60;
+
+namespace chromeos {
+
+static GeolocationHandler* g_geolocation_handler = NULL;
+
+GeolocationHandler::GeolocationHandler()
+ : weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
+}
+
+GeolocationHandler::~GeolocationHandler() {
+}
+
+// static
+void GeolocationHandler::Initialize() {
+ CHECK(!g_geolocation_handler);
+ g_geolocation_handler = new GeolocationHandler();
+}
+
+// static
+void GeolocationHandler::Shutdown() {
+ CHECK(g_geolocation_handler);
+ delete g_geolocation_handler;
+ g_geolocation_handler = NULL;
+}
+
+// static
+GeolocationHandler* GeolocationHandler::Get() {
+ CHECK(g_geolocation_handler)
+ << "GeolocationHandler::Get() called before Initialize()";
+ return g_geolocation_handler;
+}
+
+bool GeolocationHandler::GetWifiAccessPoints(
+ WifiAccessPointVector* access_points) {
+ // Always request updated access points.
+ DBusThreadManager::Get()->GetShillManagerClient()->GetNetworksForGeolocation(
+ base::Bind(&GeolocationHandler::GeolocationCallback,
+ weak_ptr_factory_.GetWeakPtr()));
+ // Return latest access point data if valid.
+ base::TimeDelta dtime = base::Time::Now() - geolocation_received_time_;
+ if (dtime.InSeconds() < kGeolocationValidSeconds) {
+ *access_points = wifi_access_points_;
+ return true;
+ }
+ return false;
+}
+
+void GeolocationHandler::GeolocationCallback(
+ DBusMethodCallStatus call_status,
+ const base::DictionaryValue& properties) {
+ if (call_status != DBUS_METHOD_CALL_SUCCESS) {
+ LOG(ERROR) << "Failed to get Geolocation data: " << call_status;
+ return;
+ }
+ wifi_access_points_.clear();
+ if (properties.empty())
+ return; // No enabled devices, don't update received time.
+
+ // Dictionary<device_type, entry_list>
+ for (base::DictionaryValue::Iterator iter(properties);
+ iter.HasNext(); iter.Advance()) {
+ const base::ListValue* entry_list = NULL;
+ if (!iter.value().GetAsList(&entry_list)) {
+ LOG(WARNING) << "Geolocation dictionary value not a List: " << iter.key();
Greg Spencer (Chromium) 2013/01/12 00:52:37 Shouldn't this be a DCHECK and log an error? Afte
+ continue;
+ }
+ // List[Dictionary<key, value_str>]
+ for (size_t i = 0; i< entry_list->GetSize(); ++i) {
+ const base::DictionaryValue* entry = NULL;
+ if (!entry_list->GetDictionary(i, &entry) || !entry) {
+ LOG(WARNING) << "Geolocation list value not a Dictionary: " << i;
+ continue;
+ }
+ // Docs: developers.google.com/maps/documentation/business/geolocation
+ WifiAccessPoint wap;
+ entry->GetString(shill::kGeoMacAddressProperty, &wap.mac_address);
+ std::string age_str;
+ if (entry->GetString(shill::kGeoAgeProperty, &age_str)) {
+ int64 age_ms;
+ if (base::StringToInt64(age_str, &age_ms)) {
+ wap.timestamp =
+ base::Time::Now() - base::TimeDelta::FromMilliseconds(age_ms);
+ }
+ }
+ std::string strength_str;
+ if (entry->GetString(shill::kGeoSignalStrengthProperty, &strength_str))
+ base::StringToInt(strength_str, &wap.signal_strength);
+ std::string signal_str;
+ if (entry->GetString(shill::kGeoSignalToNoiseRatioProperty, &signal_str))
+ base::StringToInt(signal_str, &wap.signal_to_noise);
+ std::string channel_str;
+ if (entry->GetString(shill::kGeoChannelProperty, &channel_str))
+ base::StringToInt(channel_str, &wap.channel);
+ wifi_access_points_.push_back(wap);
+ }
+ }
+ geolocation_received_time_ = base::Time::Now();
+}
+
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698