diff options
author | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-29 03:44:39 +0000 |
---|---|---|
committer | hashimoto@chromium.org <hashimoto@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-29 03:44:39 +0000 |
commit | feacffb42dd257d527dbb92809da0ae6b185e11b (patch) | |
tree | d6d6a7c8c6b78792e3b60279b3febdf0bdb8e9f4 /chrome/browser/chromeos/dbus | |
parent | b1682ff4c507d4de710d3e3e510c27162a763533 (diff) | |
download | chromium_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')
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_ |