summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/dbus
diff options
context:
space:
mode:
authorhashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-29 03:44:39 +0000
committerhashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-29 03:44:39 +0000
commitfeacffb42dd257d527dbb92809da0ae6b185e11b (patch)
treed6d6a7c8c6b78792e3b60279b3febdf0bdb8e9f4 /chrome/browser/chromeos/dbus
parentb1682ff4c507d4de710d3e3e510c27162a763533 (diff)
downloadchromium_src-feacffb42dd257d527dbb92809da0ae6b185e11b.zip
chromium_src-feacffb42dd257d527dbb92809da0ae6b185e11b.tar.gz
chromium_src-feacffb42dd257d527dbb92809da0ae6b185e11b.tar.bz2
Add FlimflamNetworkClient
BUG=chromium-os:16557 TEST=build success Review URL: http://codereview.chromium.org/9791045 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@129572 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/chromeos/dbus')
-rw-r--r--chrome/browser/chromeos/dbus/dbus_thread_manager.cc10
-rw-r--r--chrome/browser/chromeos/dbus/dbus_thread_manager.h6
-rw-r--r--chrome/browser/chromeos/dbus/flimflam_network_client.cc146
-rw-r--r--chrome/browser/chromeos/dbus/flimflam_network_client.h75
-rw-r--r--chrome/browser/chromeos/dbus/mock_dbus_thread_manager.cc4
-rw-r--r--chrome/browser/chromeos/dbus/mock_dbus_thread_manager.h6
-rw-r--r--chrome/browser/chromeos/dbus/mock_flimflam_network_client.cc13
-rw-r--r--chrome/browser/chromeos/dbus/mock_flimflam_network_client.h26
8 files changed, 286 insertions, 0 deletions
diff --git a/chrome/browser/chromeos/dbus/dbus_thread_manager.cc b/chrome/browser/chromeos/dbus/dbus_thread_manager.cc
index e585ff7..4f4ea53 100644
--- a/chrome/browser/chromeos/dbus/dbus_thread_manager.cc
+++ b/chrome/browser/chromeos/dbus/dbus_thread_manager.cc
@@ -13,6 +13,7 @@
#include "chrome/browser/chromeos/dbus/cashew_client.h"
#include "chrome/browser/chromeos/dbus/cros_disks_client.h"
#include "chrome/browser/chromeos/dbus/cryptohome_client.h"
+#include "chrome/browser/chromeos/dbus/flimflam_network_client.h"
#include "chrome/browser/chromeos/dbus/image_burner_client.h"
#include "chrome/browser/chromeos/dbus/introspectable_client.h"
#include "chrome/browser/chromeos/dbus/power_manager_client.h"
@@ -62,6 +63,9 @@ class DBusThreadManagerImpl : public DBusThreadManager {
// Create the Cryptohome client.
cryptohome_client_.reset(
CryptohomeClient::Create(system_bus_.get()));
+ // Create the Flimflam Network client.
+ flimflam_network_client_.reset(
+ FlimflamNetworkClient::Create(system_bus_.get()));
// Create the image burner client.
image_burner_client_.reset(ImageBurnerClient::Create(system_bus_.get()));
// Create the introspectable object client.
@@ -135,6 +139,11 @@ class DBusThreadManagerImpl : public DBusThreadManager {
}
// DBusThreadManager override.
+ virtual FlimflamNetworkClient* GetFlimflamNetworkClient() OVERRIDE {
+ return flimflam_network_client_.get();
+ }
+
+ // DBusThreadManager override.
virtual ImageBurnerClient* GetImageBurnerClient() OVERRIDE {
return image_burner_client_.get();
}
@@ -174,6 +183,7 @@ class DBusThreadManagerImpl : public DBusThreadManager {
scoped_ptr<CashewClient> cashew_client_;
scoped_ptr<CrosDisksClient> cros_disks_client_;
scoped_ptr<CryptohomeClient> cryptohome_client_;
+ scoped_ptr<FlimflamNetworkClient> flimflam_network_client_;
scoped_ptr<ImageBurnerClient> image_burner_client_;
scoped_ptr<IntrospectableClient> introspectable_client_;
scoped_ptr<PowerManagerClient> power_manager_client_;
diff --git a/chrome/browser/chromeos/dbus/dbus_thread_manager.h b/chrome/browser/chromeos/dbus/dbus_thread_manager.h
index 515d9fe..5a391e8 100644
--- a/chrome/browser/chromeos/dbus/dbus_thread_manager.h
+++ b/chrome/browser/chromeos/dbus/dbus_thread_manager.h
@@ -28,6 +28,7 @@ class BluetoothNodeClient;
class CashewClient;
class CrosDisksClient;
class CryptohomeClient;
+class FlimflamNetworkClient;
class ImageBurnerClient;
class IntrospectableClient;
class PowerManagerClient;
@@ -115,6 +116,11 @@ class DBusThreadManager {
// down.
virtual CryptohomeClient* GetCryptohomeClient() = 0;
+ // Returns the Flimflam Network client, owned by DBusThreadManager.
+ // Do not cache this pointer and use it after DBusThreadManager is shut
+ // down.
+ virtual FlimflamNetworkClient* GetFlimflamNetworkClient() = 0;
+
// Returns the image burner client, owned by DBusThreadManager.
// Do not cache this pointer and use it after DBusThreadManger is shut
// down.
diff --git a/chrome/browser/chromeos/dbus/flimflam_network_client.cc b/chrome/browser/chromeos/dbus/flimflam_network_client.cc
new file mode 100644
index 0000000..efb0944
--- /dev/null
+++ b/chrome/browser/chromeos/dbus/flimflam_network_client.cc
@@ -0,0 +1,146 @@
+// Copyright (c) 2012 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 "chrome/browser/chromeos/dbus/flimflam_network_client.h"
+
+#include "base/bind.h"
+#include "base/chromeos/chromeos_version.h"
+#include "dbus/bus.h"
+#include "dbus/message.h"
+#include "dbus/object_path.h"
+#include "dbus/object_proxy.h"
+#include "dbus/values_util.h"
+#include "third_party/cros_system_api/dbus/service_constants.h"
+
+namespace chromeos {
+
+namespace {
+
+// The FlimflamNetworkClient implementation.
+class FlimflamNetworkClientImpl : public FlimflamNetworkClient {
+ public:
+ explicit FlimflamNetworkClientImpl(dbus::Bus* bus)
+ : proxy_(bus->GetObjectProxy(
+ flimflam::kFlimflamServiceName,
+ dbus::ObjectPath(flimflam::kFlimflamServicePath))),
+ weak_ptr_factory_(this) {
+ // We are not using dbus::PropertySet to monitor PropertyChanged signal
+ // because the interface is not "org.freedesktop.DBus.Properties".
+ proxy_->ConnectToSignal(
+ flimflam::kFlimflamNetworkInterface,
+ flimflam::kMonitorPropertyChanged,
+ base::Bind(&FlimflamNetworkClientImpl::OnPropertyChanged,
+ weak_ptr_factory_.GetWeakPtr()),
+ base::Bind(&FlimflamNetworkClientImpl::OnSignalConnected,
+ weak_ptr_factory_.GetWeakPtr()));
+ }
+
+ // FlimflamNetworkClient override.
+ virtual void SetPropertyChangedHandler(
+ const PropertyChangedHandler& handler) OVERRIDE {
+ property_changed_handler_ = handler;
+ }
+
+ // FlimflamNetworkClient override.
+ virtual void ResetPropertyChangedHandler() OVERRIDE {
+ property_changed_handler_.Reset();
+ }
+
+ // FlimflamNetworkClient override.
+ virtual void GetProperties(const DictionaryValueCallback& callback) OVERRIDE {
+ dbus::MethodCall method_call(flimflam::kFlimflamNetworkInterface,
+ flimflam::kGetPropertiesFunction);
+ proxy_->CallMethod(
+ &method_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
+ base::Bind(&FlimflamNetworkClientImpl::OnDictionaryValueMethod,
+ weak_ptr_factory_.GetWeakPtr(),
+ callback));
+ }
+
+ private:
+ // Handles the result of signal connection setup.
+ void OnSignalConnected(const std::string& interface,
+ const std::string& signal,
+ bool success) {
+ LOG_IF(ERROR, !success) << "Connect to " << interface << " "
+ << signal << " failed.";
+ }
+
+ // Handles PropertyChanged signal.
+ void OnPropertyChanged(dbus::Signal* signal) {
+ dbus::MessageReader reader(signal);
+ std::string name;
+ scoped_ptr<base::Value> value;
+ const bool name_popped = reader.PopString(&name);
+ value.reset(dbus::PopDataAsValue(&reader));
+ if (!name_popped || !value.get()) {
+ return;
+ }
+ if (!property_changed_handler_.is_null())
+ property_changed_handler_.Run(name, *value);
+ }
+
+ // Handles responses for methods with DictionaryValue results.
+ void OnDictionaryValueMethod(const DictionaryValueCallback& callback,
+ dbus::Response* response) {
+ if (!response) {
+ base::DictionaryValue result;
+ callback.Run(FAILURE, result);
+ return;
+ }
+ dbus::MessageReader reader(response);
+ scoped_ptr<base::Value> value(dbus::PopDataAsValue(&reader));
+ base::DictionaryValue* result = NULL;
+ if (!value.get() || !value->GetAsDictionary(&result)) {
+ base::DictionaryValue result;
+ callback.Run(FAILURE, result);
+ return;
+ }
+ callback.Run(SUCCESS, *result);
+ }
+
+ dbus::ObjectProxy* proxy_;
+ base::WeakPtrFactory<FlimflamNetworkClientImpl> weak_ptr_factory_;
+ PropertyChangedHandler property_changed_handler_;
+
+ DISALLOW_COPY_AND_ASSIGN(FlimflamNetworkClientImpl);
+};
+
+// A stub implementation of FlimflamNetworkClient.
+class FlimflamNetworkClientStubImpl : public FlimflamNetworkClient {
+ public:
+ FlimflamNetworkClientStubImpl() {}
+
+ virtual ~FlimflamNetworkClientStubImpl() {}
+
+ // FlimflamNetworkClient override.
+ virtual void SetPropertyChangedHandler(
+ const PropertyChangedHandler& handler) OVERRIDE {}
+
+ // FlimflamNetworkClient override.
+ virtual void ResetPropertyChangedHandler() OVERRIDE {}
+
+ // FlimflamNetworkClient override.
+ virtual void GetProperties(const DictionaryValueCallback& callback) OVERRIDE {
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FlimflamNetworkClientStubImpl);
+};
+
+} // namespace
+
+FlimflamNetworkClient::FlimflamNetworkClient() {}
+
+FlimflamNetworkClient::~FlimflamNetworkClient() {}
+
+// static
+FlimflamNetworkClient* FlimflamNetworkClient::Create(dbus::Bus* bus) {
+ if (base::chromeos::IsRunningOnChromeOS())
+ return new FlimflamNetworkClientImpl(bus);
+ else
+ return new FlimflamNetworkClientStubImpl();
+}
+
+} // namespace chromeos
diff --git a/chrome/browser/chromeos/dbus/flimflam_network_client.h b/chrome/browser/chromeos/dbus/flimflam_network_client.h
new file mode 100644
index 0000000..f557846
--- /dev/null
+++ b/chrome/browser/chromeos/dbus/flimflam_network_client.h
@@ -0,0 +1,75 @@
+// Copyright (c) 2012 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.
+
+#ifndef CHROME_BROWSER_CHROMEOS_DBUS_FLIMFLAM_NETWORK_CLIENT_H_
+#define CHROME_BROWSER_CHROMEOS_DBUS_FLIMFLAM_NETWORK_CLIENT_H_
+
+#include <string>
+
+#include "base/basictypes.h"
+#include "base/callback.h"
+
+namespace base {
+
+class Value;
+class DictionaryValue;
+
+} // namespace base
+
+namespace dbus {
+
+class Bus;
+
+} // namespace dbus
+
+namespace chromeos {
+
+// FlimflamNetworkClient is used to communicate with the Flimflam Network
+// service. All methods should be called from the origin thread which
+// initializes the DBusThreadManager instance.
+class FlimflamNetworkClient {
+ public:
+ // An enum to describe whether or not a DBus method call succeeded.
+ enum CallStatus {
+ FAILURE,
+ SUCCESS,
+ };
+
+ // A callback to handle PropertyChanged signals.
+ typedef base::Callback<void(const std::string& name,
+ const base::Value& value)> PropertyChangedHandler;
+
+ // A callback to handle responses of methods with DictionaryValue results.
+ typedef base::Callback<void(
+ CallStatus call_status,
+ const base::DictionaryValue& result)> DictionaryValueCallback;
+
+ virtual ~FlimflamNetworkClient();
+
+ // Factory function, creates a new instance which is owned by the caller.
+ // For normal usage, access the singleton via DBusThreadManager::Get().
+ static FlimflamNetworkClient* Create(dbus::Bus* bus);
+
+ // Sets PropertyChanged signal handler.
+ virtual void SetPropertyChangedHandler(
+ const PropertyChangedHandler& handler) = 0;
+
+ // Resets PropertyChanged signal handler.
+ virtual void ResetPropertyChangedHandler() = 0;
+
+ // Calls GetProperties method.
+ // |callback| is called after the method call succeeds.
+ virtual void GetProperties(const DictionaryValueCallback& callback) = 0;
+
+ protected:
+ // Create() should be used instead.
+ FlimflamNetworkClient();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FlimflamNetworkClient);
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_CHROMEOS_DBUS_FLIMFLAM_NETWORK_CLIENT_H_
diff --git a/chrome/browser/chromeos/dbus/mock_dbus_thread_manager.cc b/chrome/browser/chromeos/dbus/mock_dbus_thread_manager.cc
index 6fda917..b043181 100644
--- a/chrome/browser/chromeos/dbus/mock_dbus_thread_manager.cc
+++ b/chrome/browser/chromeos/dbus/mock_dbus_thread_manager.cc
@@ -12,6 +12,7 @@
#include "chrome/browser/chromeos/dbus/mock_cashew_client.h"
#include "chrome/browser/chromeos/dbus/mock_cros_disks_client.h"
#include "chrome/browser/chromeos/dbus/mock_cryptohome_client.h"
+#include "chrome/browser/chromeos/dbus/mock_flimflam_network_client.h"
#include "chrome/browser/chromeos/dbus/mock_image_burner_client.h"
#include "chrome/browser/chromeos/dbus/mock_introspectable_client.h"
#include "chrome/browser/chromeos/dbus/mock_power_manager_client.h"
@@ -34,6 +35,7 @@ MockDBusThreadManager::MockDBusThreadManager()
mock_cashew_client_(new MockCashewClient),
mock_cros_disks_client_(new MockCrosDisksClient),
mock_cryptohome_client_(new MockCryptohomeClient),
+ mock_flimflam_network_client_(new MockFlimflamNetworkClient),
mock_image_burner_client_(new MockImageBurnerClient),
mock_introspectable_client_(new MockIntrospectableClient),
mock_power_manager_client_(new MockPowerManagerClient),
@@ -56,6 +58,8 @@ MockDBusThreadManager::MockDBusThreadManager()
.WillRepeatedly(Return(mock_cros_disks_client()));
EXPECT_CALL(*this, GetCryptohomeClient())
.WillRepeatedly(Return(mock_cryptohome_client()));
+ EXPECT_CALL(*this, GetFlimflamNetworkClient())
+ .WillRepeatedly(Return(mock_flimflam_network_client()));
EXPECT_CALL(*this, GetImageBurnerClient())
.WillRepeatedly(Return(mock_image_burner_client()));
EXPECT_CALL(*this, GetIntrospectableClient())
diff --git a/chrome/browser/chromeos/dbus/mock_dbus_thread_manager.h b/chrome/browser/chromeos/dbus/mock_dbus_thread_manager.h
index 025527c..ac53b14 100644
--- a/chrome/browser/chromeos/dbus/mock_dbus_thread_manager.h
+++ b/chrome/browser/chromeos/dbus/mock_dbus_thread_manager.h
@@ -26,6 +26,7 @@ class MockBluetoothNodeClient;
class MockCashewClient;
class MockCrosDisksClient;
class MockCryptohomeClient;
+class MockFlimflamNetworkClient;
class MockImageBurnerClient;
class MockIntrospectableClient;
class MockPowerManagerClient;
@@ -50,6 +51,7 @@ class MockDBusThreadManager : public DBusThreadManager {
MOCK_METHOD0(GetCashewClient, CashewClient*(void));
MOCK_METHOD0(GetCrosDisksClient, CrosDisksClient*(void));
MOCK_METHOD0(GetCryptohomeClient, CryptohomeClient*(void));
+ MOCK_METHOD0(GetFlimflamNetworkClient, FlimflamNetworkClient*(void));
MOCK_METHOD0(GetImageBurnerClient, ImageBurnerClient*(void));
MOCK_METHOD0(GetIntrospectableClient, IntrospectableClient*(void));
MOCK_METHOD0(GetPowerManagerClient, PowerManagerClient*(void));
@@ -81,6 +83,9 @@ class MockDBusThreadManager : public DBusThreadManager {
MockCryptohomeClient* mock_cryptohome_client() {
return mock_cryptohome_client_.get();
}
+ MockFlimflamNetworkClient* mock_flimflam_network_client() {
+ return mock_flimflam_network_client_.get();
+ }
MockImageBurnerClient* mock_image_burner_client() {
return mock_image_burner_client_.get();
}
@@ -109,6 +114,7 @@ class MockDBusThreadManager : public DBusThreadManager {
scoped_ptr<MockCashewClient> mock_cashew_client_;
scoped_ptr<MockCrosDisksClient> mock_cros_disks_client_;
scoped_ptr<MockCryptohomeClient> mock_cryptohome_client_;
+ scoped_ptr<MockFlimflamNetworkClient> mock_flimflam_network_client_;
scoped_ptr<MockImageBurnerClient> mock_image_burner_client_;
scoped_ptr<MockIntrospectableClient> mock_introspectable_client_;
scoped_ptr<MockPowerManagerClient> mock_power_manager_client_;
diff --git a/chrome/browser/chromeos/dbus/mock_flimflam_network_client.cc b/chrome/browser/chromeos/dbus/mock_flimflam_network_client.cc
new file mode 100644
index 0000000..8af1ed3
--- /dev/null
+++ b/chrome/browser/chromeos/dbus/mock_flimflam_network_client.cc
@@ -0,0 +1,13 @@
+// Copyright (c) 2012 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 "chrome/browser/chromeos/dbus/mock_flimflam_network_client.h"
+
+namespace chromeos {
+
+MockFlimflamNetworkClient::MockFlimflamNetworkClient() {}
+
+MockFlimflamNetworkClient::~MockFlimflamNetworkClient() {}
+
+} // namespace chromeos
diff --git a/chrome/browser/chromeos/dbus/mock_flimflam_network_client.h b/chrome/browser/chromeos/dbus/mock_flimflam_network_client.h
new file mode 100644
index 0000000..6b51596
--- /dev/null
+++ b/chrome/browser/chromeos/dbus/mock_flimflam_network_client.h
@@ -0,0 +1,26 @@
+// Copyright (c) 2012 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.
+
+#ifndef CHROME_BROWSER_CHROMEOS_DBUS_MOCK_FLIMFLAM_NETWORK_CLIENT_H_
+#define CHROME_BROWSER_CHROMEOS_DBUS_MOCK_FLIMFLAM_NETWORK_CLIENT_H_
+
+#include "chrome/browser/chromeos/dbus/flimflam_network_client.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+namespace chromeos {
+
+class MockFlimflamNetworkClient : public FlimflamNetworkClient {
+ public:
+ MockFlimflamNetworkClient();
+ virtual ~MockFlimflamNetworkClient();
+
+ MOCK_METHOD1(SetPropertyChangedHandler,
+ void(const PropertyChangedHandler& handler));
+ MOCK_METHOD0(ResetPropertyChangedHandler, void());
+ MOCK_METHOD1(GetProperties, void(const DictionaryValueCallback& callback));
+};
+
+} // namespace chromeos
+
+#endif // CHROME_BROWSER_CHROMEOS_DBUS_MOCK_FLIMFLAM_NETWORK_CLIENT_H_