diff options
-rw-r--r-- | ash/system/date/clock_observer.h | 1 | ||||
-rw-r--r-- | ash/system/date/tray_date.cc | 5 | ||||
-rw-r--r-- | ash/system/date/tray_date.h | 1 | ||||
-rw-r--r-- | ash/system/tray/system_tray_notifier.cc | 6 | ||||
-rw-r--r-- | ash/system/tray/system_tray_notifier.h | 1 | ||||
-rw-r--r-- | chrome/browser/chromeos/system/ash_system_tray_delegate.cc | 9 | ||||
-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 |
17 files changed, 265 insertions, 1 deletions
diff --git a/ash/system/date/clock_observer.h b/ash/system/date/clock_observer.h index b82df02..3046528 100644 --- a/ash/system/date/clock_observer.h +++ b/ash/system/date/clock_observer.h @@ -12,6 +12,7 @@ class ClockObserver { virtual ~ClockObserver() {} virtual void OnDateFormatChanged() = 0; + virtual void OnSystemClockTimeUpdated() = 0; // Force a refresh (e.g. after the system is resumed). virtual void Refresh() = 0; diff --git a/ash/system/date/tray_date.cc b/ash/system/date/tray_date.cc index c603b26..4b25bbc 100644 --- a/ash/system/date/tray_date.cc +++ b/ash/system/date/tray_date.cc @@ -188,6 +188,11 @@ void TrayDate::OnDateFormatChanged() { time_tray_->UpdateTimeFormat(); } +void TrayDate::OnSystemClockTimeUpdated() { + if (time_tray_) + time_tray_->UpdateTimeFormat(); +} + void TrayDate::Refresh() { if (time_tray_) time_tray_->UpdateText(); diff --git a/ash/system/date/tray_date.h b/ash/system/date/tray_date.h index 6e11642..dc8988c 100644 --- a/ash/system/date/tray_date.h +++ b/ash/system/date/tray_date.h @@ -43,6 +43,7 @@ class TrayDate : public SystemTrayItem, // Overridden from ClockObserver. virtual void OnDateFormatChanged() OVERRIDE; + virtual void OnSystemClockTimeUpdated() OVERRIDE; virtual void Refresh() OVERRIDE; void SetupLabelForTimeTray(views::Label* label); diff --git a/ash/system/tray/system_tray_notifier.cc b/ash/system/tray/system_tray_notifier.cc index 8897917..e174e0d 100644 --- a/ash/system/tray/system_tray_notifier.cc +++ b/ash/system/tray/system_tray_notifier.cc @@ -228,6 +228,12 @@ void SystemTrayNotifier::NotifyDateFormatChanged() { OnDateFormatChanged()); } +void SystemTrayNotifier::NotifySystemClockTimeUpdated() { + FOR_EACH_OBSERVER(ClockObserver, + clock_observers_, + OnSystemClockTimeUpdated()); +} + void SystemTrayNotifier::NotifyRefreshDrive(DriveOperationStatusList& list) { FOR_EACH_OBSERVER(DriveObserver, drive_observers_, diff --git a/ash/system/tray/system_tray_notifier.h b/ash/system/tray/system_tray_notifier.h index 7437efc..8933687 100644 --- a/ash/system/tray/system_tray_notifier.h +++ b/ash/system/tray/system_tray_notifier.h @@ -107,6 +107,7 @@ public: void NotifyCapsLockChanged(bool enabled, bool search_mapped_to_caps_lock); void NotifyRefreshClock(); void NotifyDateFormatChanged(); + void NotifySystemClockTimeUpdated(); void NotifyRefreshDrive(DriveOperationStatusList& list); void NotifyRefreshIME(bool show_message); void NotifyShowLoginButtonChanged(bool show_login_button); diff --git a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc index a251ca2..684d31e 100644 --- a/chrome/browser/chromeos/system/ash_system_tray_delegate.cc +++ b/chrome/browser/chromeos/system/ash_system_tray_delegate.cc @@ -82,6 +82,7 @@ #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/power_manager_client.h" #include "chromeos/dbus/session_manager_client.h" +#include "chromeos/dbus/system_clock_client.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_service.h" @@ -197,6 +198,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, public content::NotificationObserver, public input_method::InputMethodManager::Observer, public system::TimezoneSettings::Observer, + public chromeos::SystemClockClient::Observer, public device::BluetoothAdapter::Observer, public SystemKeyEventListener::CapsLockObserver, public ash::NetworkTrayDelegate, @@ -265,6 +267,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, input_method::GetInputMethodManager()->AddObserver(this); system::TimezoneSettings::GetInstance()->AddObserver(this); + DBusThreadManager::Get()->GetSystemClockClient()->AddObserver(this); if (SystemKeyEventListener::GetInstance()) SystemKeyEventListener::GetInstance()->AddCapsLockObserver(this); @@ -313,6 +316,7 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, audiohandler->RemoveVolumeObserver(this); DBusThreadManager::Get()->GetSessionManagerClient()->RemoveObserver(this); DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(this); + DBusThreadManager::Get()->GetSystemClockClient()->RemoveObserver(this); NetworkLibrary* crosnet = CrosLibrary::Get()->GetNetworkLibrary(); if (crosnet) crosnet->RemoveNetworkManagerObserver(this); @@ -1307,6 +1311,11 @@ class SystemTrayDelegate : public ash::SystemTrayDelegate, GetSystemTrayNotifier()->NotifyRefreshClock(); } + // Overridden from SystemClockClient::Observer. + virtual void SystemClockUpdated() OVERRIDE { + GetSystemTrayNotifier()->NotifySystemClockTimeUpdated(); + } + // Overridden from BluetoothAdapter::Observer. virtual void AdapterPresentChanged(device::BluetoothAdapter* adapter, bool present) OVERRIDE { 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_ |