diff options
author | jennyz@chromium.org <jennyz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-14 14:54:19 +0000 |
---|---|---|
committer | jennyz@chromium.org <jennyz@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-14 14:54:19 +0000 |
commit | ce3b13abc2404989ad6f31959a60881f700dd26d (patch) | |
tree | ef7730fcd6cbae8f0577826b532bd66101f8868e /chromeos | |
parent | d35992788a69b2ec9ae2ac8f00ca95285a2612d4 (diff) | |
download | chromium_src-ce3b13abc2404989ad6f31959a60881f700dd26d.zip chromium_src-ce3b13abc2404989ad6f31959a60881f700dd26d.tar.gz chromium_src-ce3b13abc2404989ad6f31959a60881f700dd26d.tar.bz2 |
Hook up system clock update dbus signal to chrome and ash tray ui. cros will send tlsdate.TimeUpdated dbus signal when system clock is updated from server, chrome will listen to the signal and update ash tray ui for time.
BUG=177970
Review URL: https://chromiumcodereview.appspot.com/12564007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@188070 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chromeos')
-rw-r--r-- | chromeos/chromeos.gyp | 4 | ||||
-rw-r--r-- | chromeos/dbus/dbus_thread_manager.cc | 10 | ||||
-rw-r--r-- | chromeos/dbus/dbus_thread_manager.h | 2 | ||||
-rw-r--r-- | chromeos/dbus/mock_dbus_thread_manager.cc | 10 | ||||
-rw-r--r-- | chromeos/dbus/mock_dbus_thread_manager.h | 6 | ||||
-rw-r--r-- | chromeos/dbus/mock_dbus_thread_manager_without_gmock.cc | 5 | ||||
-rw-r--r-- | chromeos/dbus/mock_dbus_thread_manager_without_gmock.h | 1 | ||||
-rw-r--r-- | chromeos/dbus/mock_system_clock_client.cc | 13 | ||||
-rw-r--r-- | chromeos/dbus/mock_system_clock_client.h | 29 | ||||
-rw-r--r-- | chromeos/dbus/system_clock_client.cc | 111 | ||||
-rw-r--r-- | chromeos/dbus/system_clock_client.h | 52 |
11 files changed, 242 insertions, 1 deletions
diff --git a/chromeos/chromeos.gyp b/chromeos/chromeos.gyp index 7fe11e8..7255fe2 100644 --- a/chromeos/chromeos.gyp +++ b/chromeos/chromeos.gyp @@ -131,6 +131,8 @@ 'dbus/session_manager_client.h', 'dbus/sms_client.cc', 'dbus/sms_client.h', + 'dbus/system_clock_client.cc', + 'dbus/system_clock_client.h', 'dbus/update_engine_client.cc', 'dbus/update_engine_client.h', 'disks/disk_mount_manager.cc', @@ -285,6 +287,8 @@ 'dbus/mock_session_manager_client.h', 'dbus/mock_sms_client.cc', 'dbus/mock_sms_client.h', + 'dbus/mock_system_clock_client.cc', + 'dbus/mock_system_clock_client.h', 'dbus/mock_update_engine_client.cc', 'dbus/mock_update_engine_client.h', 'disks/mock_disk_mount_manager.cc', diff --git a/chromeos/dbus/dbus_thread_manager.cc b/chromeos/dbus/dbus_thread_manager.cc index 79de3d0..4c30323 100644 --- a/chromeos/dbus/dbus_thread_manager.cc +++ b/chromeos/dbus/dbus_thread_manager.cc @@ -22,12 +22,13 @@ #include "chromeos/dbus/dbus_client_implementation_type.h" #include "chromeos/dbus/dbus_thread_manager_observer.h" #include "chromeos/dbus/debug_daemon_client.h" +#include "chromeos/dbus/gsm_sms_client.h" #include "chromeos/dbus/shill_device_client.h" #include "chromeos/dbus/shill_ipconfig_client.h" #include "chromeos/dbus/shill_manager_client.h" #include "chromeos/dbus/shill_profile_client.h" #include "chromeos/dbus/shill_service_client.h" -#include "chromeos/dbus/gsm_sms_client.h" +#include "chromeos/dbus/system_clock_client.h" #include "chromeos/dbus/ibus/ibus_client.h" #include "chromeos/dbus/ibus/ibus_config_client.h" #include "chromeos/dbus/ibus/ibus_engine_factory_service.h" @@ -128,6 +129,8 @@ class DBusThreadManagerImpl : public DBusThreadManager { SessionManagerClient::Create(client_type_, system_bus_.get())); sms_client_.reset( SMSClient::Create(client_type_, system_bus_.get())); + system_clock_client_.reset( + SystemClockClient::Create(client_type_, system_bus_.get())); update_engine_client_.reset( UpdateEngineClient::Create(client_type_, system_bus_.get())); @@ -306,6 +309,10 @@ class DBusThreadManagerImpl : public DBusThreadManager { return sms_client_.get(); } + virtual SystemClockClient* GetSystemClockClient() OVERRIDE { + return system_clock_client_.get(); + } + virtual UpdateEngineClient* GetUpdateEngineClient() OVERRIDE { return update_engine_client_.get(); } @@ -384,6 +391,7 @@ class DBusThreadManagerImpl : public DBusThreadManager { scoped_ptr<IntrospectableClient> introspectable_client_; scoped_ptr<ModemMessagingClient> modem_messaging_client_; scoped_ptr<PermissionBrokerClient> permission_broker_client_; + scoped_ptr<SystemClockClient> system_clock_client_; scoped_ptr<PowerManagerClient> power_manager_client_; scoped_ptr<SessionManagerClient> session_manager_client_; scoped_ptr<SMSClient> sms_client_; diff --git a/chromeos/dbus/dbus_thread_manager.h b/chromeos/dbus/dbus_thread_manager.h index 8ae4fab..94509dc 100644 --- a/chromeos/dbus/dbus_thread_manager.h +++ b/chromeos/dbus/dbus_thread_manager.h @@ -55,6 +55,7 @@ class ShillIPConfigClient; class ShillManagerClient; class ShillProfileClient; class ShillServiceClient; +class SystemClockClient; class UpdateEngineClient; // DBusThreadManager manages the D-Bus thread, the thread dedicated to @@ -149,6 +150,7 @@ class CHROMEOS_EXPORT DBusThreadManager { virtual ShillProfileClient* GetShillProfileClient() = 0; virtual ShillServiceClient* GetShillServiceClient() = 0; virtual SMSClient* GetSMSClient() = 0; + virtual SystemClockClient* GetSystemClockClient() = 0; virtual UpdateEngineClient* GetUpdateEngineClient() = 0; // Removes the ibus engine services for |object_path|. diff --git a/chromeos/dbus/mock_dbus_thread_manager.cc b/chromeos/dbus/mock_dbus_thread_manager.cc index e269fd5..59f90ed 100644 --- a/chromeos/dbus/mock_dbus_thread_manager.cc +++ b/chromeos/dbus/mock_dbus_thread_manager.cc @@ -27,6 +27,7 @@ #include "chromeos/dbus/mock_power_manager_client.h" #include "chromeos/dbus/mock_session_manager_client.h" #include "chromeos/dbus/mock_sms_client.h" +#include "chromeos/dbus/mock_system_clock_client.h" #include "chromeos/dbus/mock_update_engine_client.h" #include "chromeos/dbus/power_policy_controller.h" @@ -60,6 +61,7 @@ MockDBusThreadManager::MockDBusThreadManager() mock_power_manager_client_(new MockPowerManagerClient), mock_session_manager_client_(new MockSessionManagerClient), mock_sms_client_(new MockSMSClient), + mock_system_clock_client_(new MockSystemClockClient), mock_update_engine_client_(new MockUpdateEngineClient) { EXPECT_CALL(*this, GetBluetoothAdapterClient()) .WillRepeatedly(Return(mock_bluetooth_adapter_client_.get())); @@ -103,6 +105,8 @@ MockDBusThreadManager::MockDBusThreadManager() .WillRepeatedly(Return(mock_session_manager_client_.get())); EXPECT_CALL(*this, GetSMSClient()) .WillRepeatedly(Return(mock_sms_client_.get())); + EXPECT_CALL(*this, GetSystemClockClient()) + .WillRepeatedly(Return(mock_system_clock_client())); EXPECT_CALL(*this, GetUpdateEngineClient()) .WillRepeatedly(Return(mock_update_engine_client_.get())); EXPECT_CALL(*this, GetIBusInputContextClient()) @@ -141,6 +145,12 @@ MockDBusThreadManager::MockDBusThreadManager() .Times(AnyNumber()); EXPECT_CALL(*mock_update_engine_client_.get(), AddObserver(_)) .Times(AnyNumber()); + EXPECT_CALL(*mock_system_clock_client_.get(), AddObserver(_)) + .Times(AnyNumber()); + EXPECT_CALL(*mock_system_clock_client_.get(), RemoveObserver(_)) + .Times(AnyNumber()); + EXPECT_CALL(*mock_system_clock_client_.get(), HasObserver(_)) + .Times(AnyNumber()); EXPECT_CALL(*mock_update_engine_client_.get(), RemoveObserver(_)) .Times(AnyNumber()); EXPECT_CALL(*mock_bluetooth_manager_client_.get(), AddObserver(_)) diff --git a/chromeos/dbus/mock_dbus_thread_manager.h b/chromeos/dbus/mock_dbus_thread_manager.h index ee6aeb5..85d752f 100644 --- a/chromeos/dbus/mock_dbus_thread_manager.h +++ b/chromeos/dbus/mock_dbus_thread_manager.h @@ -42,6 +42,7 @@ class MockPermissionBrokerClient; class MockPowerManagerClient; class MockSessionManagerClient; class MockSMSClient; +class MockSystemClockClient; class MockUpdateEngineClient; class PowerPolicyController; @@ -82,6 +83,7 @@ class MockDBusThreadManager : public DBusThreadManager { MOCK_METHOD0(GetPowerPolicyController, PowerPolicyController*(void)); MOCK_METHOD0(GetSessionManagerClient, SessionManagerClient*(void)); MOCK_METHOD0(GetSMSClient, SMSClient*(void)); + MOCK_METHOD0(GetSystemClockClient, SystemClockClient*(void)); MOCK_METHOD0(GetUpdateEngineClient, UpdateEngineClient*(void)); MOCK_METHOD0(GetIBusClient, IBusClient*(void)); MOCK_METHOD0(GetIBusConfigClient, IBusConfigClient*(void)); @@ -159,6 +161,9 @@ class MockDBusThreadManager : public DBusThreadManager { MockSMSClient* mock_sms_client() { return mock_sms_client_.get(); } + MockSystemClockClient* mock_system_clock_client() { + return mock_system_clock_client_.get(); + } MockUpdateEngineClient* mock_update_engine_client() { return mock_update_engine_client_.get(); } @@ -190,6 +195,7 @@ class MockDBusThreadManager : public DBusThreadManager { scoped_ptr<MockPowerManagerClient> mock_power_manager_client_; scoped_ptr<MockSessionManagerClient> mock_session_manager_client_; scoped_ptr<MockSMSClient> mock_sms_client_; + scoped_ptr<MockSystemClockClient> mock_system_clock_client_; scoped_ptr<MockUpdateEngineClient> mock_update_engine_client_; scoped_ptr<PowerPolicyController> power_policy_controller_; diff --git a/chromeos/dbus/mock_dbus_thread_manager_without_gmock.cc b/chromeos/dbus/mock_dbus_thread_manager_without_gmock.cc index 3e0234e..692d703 100644 --- a/chromeos/dbus/mock_dbus_thread_manager_without_gmock.cc +++ b/chromeos/dbus/mock_dbus_thread_manager_without_gmock.cc @@ -177,6 +177,11 @@ SMSClient* MockDBusThreadManagerWithoutGMock::GetSMSClient() { return NULL; } +SystemClockClient* MockDBusThreadManagerWithoutGMock::GetSystemClockClient() { + NOTIMPLEMENTED(); + return NULL; +} + UpdateEngineClient* MockDBusThreadManagerWithoutGMock::GetUpdateEngineClient() { NOTIMPLEMENTED(); return NULL; diff --git a/chromeos/dbus/mock_dbus_thread_manager_without_gmock.h b/chromeos/dbus/mock_dbus_thread_manager_without_gmock.h index 6fe4551..dc69937 100644 --- a/chromeos/dbus/mock_dbus_thread_manager_without_gmock.h +++ b/chromeos/dbus/mock_dbus_thread_manager_without_gmock.h @@ -63,6 +63,7 @@ class MockDBusThreadManagerWithoutGMock : public DBusThreadManager { virtual PowerPolicyController* GetPowerPolicyController() OVERRIDE; virtual SessionManagerClient* GetSessionManagerClient() OVERRIDE; virtual SMSClient* GetSMSClient() OVERRIDE; + virtual SystemClockClient* GetSystemClockClient() OVERRIDE; virtual UpdateEngineClient* GetUpdateEngineClient() OVERRIDE; virtual BluetoothOutOfBandClient* GetBluetoothOutOfBandClient() OVERRIDE; virtual IBusClient* GetIBusClient() OVERRIDE; diff --git a/chromeos/dbus/mock_system_clock_client.cc b/chromeos/dbus/mock_system_clock_client.cc new file mode 100644 index 0000000..5269719 --- /dev/null +++ b/chromeos/dbus/mock_system_clock_client.cc @@ -0,0 +1,13 @@ +// Copyright (c) 2013 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 "chromeos/dbus/mock_system_clock_client.h" + + +namespace chromeos { + +MockSystemClockClient::MockSystemClockClient() {} +MockSystemClockClient::~MockSystemClockClient() {} + +} // namespace chromeos diff --git a/chromeos/dbus/mock_system_clock_client.h b/chromeos/dbus/mock_system_clock_client.h new file mode 100644 index 0000000..547c385 --- /dev/null +++ b/chromeos/dbus/mock_system_clock_client.h @@ -0,0 +1,29 @@ +// Copyright (c) 2013 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 CHROMEOS_DBUS_MOCK_SYSTEM_CLOCK_CLIENT_H_ +#define CHROMEOS_DBUS_MOCK_SYSTEM_CLOCK_CLIENT_H_ + +#include "chromeos/dbus/system_clock_client.h" +#include "testing/gmock/include/gmock/gmock.h" + +namespace chromeos { + +// SystemClockClient is used to communicate with the system clock. +class MockSystemClockClient : public SystemClockClient { + public: + MockSystemClockClient(); + virtual ~MockSystemClockClient(); + + MOCK_METHOD1(AddObserver, void(Observer*)); + MOCK_METHOD1(RemoveObserver, void(Observer*)); + MOCK_METHOD1(HasObserver, bool(Observer*)); + + private: + DISALLOW_COPY_AND_ASSIGN(MockSystemClockClient); +}; + +} // namespace chromeos + +#endif // CHROMEOS_DBUS_MOCK_SYSTEM_CLOCK_CLIENT_H_ diff --git a/chromeos/dbus/system_clock_client.cc b/chromeos/dbus/system_clock_client.cc new file mode 100644 index 0000000..a9daa2f --- /dev/null +++ b/chromeos/dbus/system_clock_client.cc @@ -0,0 +1,111 @@ +// Copyright (c) 2013 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 "chromeos/dbus/system_clock_client.h" + +#include "base/bind.h" +#include "dbus/bus.h" +#include "dbus/message.h" +#include "dbus/object_path.h" +#include "dbus/object_proxy.h" +#include "third_party/cros_system_api/dbus/service_constants.h" + +namespace chromeos { + +// The SystemClockClient implementation used in production. +class SystemClockClientImpl : public SystemClockClient { + public: + explicit SystemClockClientImpl(dbus::Bus* bus) + : system_clock_proxy_(NULL), + weak_ptr_factory_(this) { + system_clock_proxy_ = bus->GetObjectProxy( + system_clock::kSystemClockServiceName, + dbus::ObjectPath(system_clock::kSystemClockServicePath)); + + // Monitor the D-Bus signal for TimeUpdated changes. + system_clock_proxy_->ConnectToSignal( + system_clock::kSystemClockInterface, + system_clock::kSystemClockUpdated, + base::Bind(&SystemClockClientImpl::TimeUpdatedReceived, + weak_ptr_factory_.GetWeakPtr()), + base::Bind(&SystemClockClientImpl::TimeUpdatedConnected, + weak_ptr_factory_.GetWeakPtr())); + } + + virtual ~SystemClockClientImpl() { + } + + // SystemClockClient overrides: + virtual void AddObserver(Observer* observer) OVERRIDE { + observers_.AddObserver(observer); + } + + virtual void RemoveObserver(Observer* observer) OVERRIDE { + observers_.RemoveObserver(observer); + } + + virtual bool HasObserver(Observer* observer) OVERRIDE { + return observers_.HasObserver(observer); + } + + private: + // Called when a TimeUpdated signal is received. + void TimeUpdatedReceived(dbus::Signal* signal) { + VLOG(1) << "TimeUpdated signal received: " << signal->ToString(); + dbus::MessageReader reader(signal); + FOR_EACH_OBSERVER(Observer, observers_, SystemClockUpdated()); + } + + // Called when the TimeUpdated signal is initially connected. + void TimeUpdatedConnected(const std::string& interface_name, + const std::string& signal_name, + bool success) { + LOG_IF(ERROR, !success) + << "Failed to connect to TimeUpdated signal."; + } + + dbus::ObjectProxy* system_clock_proxy_; + ObserverList<Observer> observers_; + + // Note: This should remain the last member so it'll be destroyed and + // invalidate its weak pointers before any other members are destroyed. + base::WeakPtrFactory<SystemClockClientImpl> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(SystemClockClientImpl); +}; + +// The SystemClockClient implementation used on Linux desktop, +// which does nothing. +class SystemClockClientStubImpl : public SystemClockClient { + public: + SystemClockClientStubImpl() {} + ~SystemClockClientStubImpl() {} + + // SystemClockClient overrides: + virtual void AddObserver(Observer* observer) OVERRIDE {} + virtual void RemoveObserver(Observer* observer) OVERRIDE {} + virtual bool HasObserver(Observer* observer) OVERRIDE { return false; } + + private: + DISALLOW_COPY_AND_ASSIGN(SystemClockClientStubImpl); +}; + +SystemClockClient::SystemClockClient() { +} + +SystemClockClient::~SystemClockClient() { +} + +// static +SystemClockClient* SystemClockClient::Create( + DBusClientImplementationType type, + dbus::Bus* bus) { + if (type == REAL_DBUS_CLIENT_IMPLEMENTATION) { + return new SystemClockClientImpl(bus); + } + DCHECK_EQ(STUB_DBUS_CLIENT_IMPLEMENTATION, type); + return new SystemClockClientStubImpl(); +} + +} // namespace chromeos diff --git a/chromeos/dbus/system_clock_client.h b/chromeos/dbus/system_clock_client.h new file mode 100644 index 0000000..38158da --- /dev/null +++ b/chromeos/dbus/system_clock_client.h @@ -0,0 +1,52 @@ +// Copyright (c) 2013 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 CHROMEOS_DBUS_SYSTEM_CLOCK_CLIENT_H_ +#define CHROMEOS_DBUS_SYSTEM_CLOCK_CLIENT_H_ + +#include "base/observer_list.h" +#include "chromeos/chromeos_export.h" +#include "chromeos/dbus/dbus_client_implementation_type.h" + +namespace dbus { +class Bus; +} // namespace + +namespace chromeos { + +// SystemClockClient is used to communicate with the system clock. +class CHROMEOS_EXPORT SystemClockClient { + public: + // Interface for observing changes from the system clock. + class Observer { + public: + // Called when the status is updated. + virtual void SystemClockUpdated() {} + protected: + virtual ~Observer() {} + }; + + virtual ~SystemClockClient(); + + // Adds and removes the observer. + virtual void AddObserver(Observer* observer) = 0; + virtual void RemoveObserver(Observer* observer) = 0; + // Returns true if this object has the given observer. + virtual bool HasObserver(Observer* observer) = 0; + + // Creates the instance. + static SystemClockClient* Create(DBusClientImplementationType type, + dbus::Bus* bus); + + protected: + // Create() should be used instead. + SystemClockClient(); + + private: + DISALLOW_COPY_AND_ASSIGN(SystemClockClient); +}; + +} // namespace chromeos + +#endif // CHROMEOS_DBUS_SYSTEM_CLOCK_CLIENT_H_ |