| Index: chromeos/dbus/system_clock_client.cc
|
| diff --git a/chromeos/dbus/system_clock_client.cc b/chromeos/dbus/system_clock_client.cc
|
| index 7d5f4a4598b2aec174f9aabfadf39e682b40c3d2..199a6acaccf522b5d40a9e1f19ac1d861c3118b6 100644
|
| --- a/chromeos/dbus/system_clock_client.cc
|
| +++ b/chromeos/dbus/system_clock_client.cc
|
| @@ -5,6 +5,8 @@
|
| #include "chromeos/dbus/system_clock_client.h"
|
|
|
| #include "base/bind.h"
|
| +#include "base/callback.h"
|
| +#include "base/observer_list.h"
|
| #include "dbus/bus.h"
|
| #include "dbus/message.h"
|
| #include "dbus/object_path.h"
|
| @@ -17,7 +19,10 @@ namespace chromeos {
|
| class SystemClockClientImpl : public SystemClockClient {
|
| public:
|
| SystemClockClientImpl()
|
| - : system_clock_proxy_(NULL), weak_ptr_factory_(this) {}
|
| + : can_set_time_(false),
|
| + can_set_time_initialized_(false),
|
| + system_clock_proxy_(NULL),
|
| + weak_ptr_factory_(this) {}
|
|
|
| virtual ~SystemClockClientImpl() {
|
| }
|
| @@ -34,12 +39,28 @@ class SystemClockClientImpl : public SystemClockClient {
|
| return observers_.HasObserver(observer);
|
| }
|
|
|
| + virtual void SetTime(int64 time_in_seconds) OVERRIDE {
|
| + // Always try to set the time, because |can_set_time_| may be stale.
|
| + dbus::MethodCall method_call(system_clock::kSystemClockInterface,
|
| + system_clock::kSystemClockSet);
|
| + dbus::MessageWriter writer(&method_call);
|
| + writer.AppendInt64(time_in_seconds);
|
| + system_clock_proxy_->CallMethod(&method_call,
|
| + dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| + dbus::ObjectProxy::EmptyResponseCallback());
|
| + }
|
| +
|
| + virtual bool CanSetTime() OVERRIDE { return can_set_time_; }
|
| +
|
| protected:
|
| virtual void Init(dbus::Bus* bus) OVERRIDE {
|
| system_clock_proxy_ = bus->GetObjectProxy(
|
| system_clock::kSystemClockServiceName,
|
| dbus::ObjectPath(system_clock::kSystemClockServicePath));
|
|
|
| + // Check whether the system clock can be set.
|
| + GetCanSet();
|
| +
|
| // Monitor the D-Bus signal for TimeUpdated changes.
|
| system_clock_proxy_->ConnectToSignal(
|
| system_clock::kSystemClockInterface,
|
| @@ -56,6 +77,9 @@ class SystemClockClientImpl : public SystemClockClient {
|
| VLOG(1) << "TimeUpdated signal received: " << signal->ToString();
|
| dbus::MessageReader reader(signal);
|
| FOR_EACH_OBSERVER(Observer, observers_, SystemClockUpdated());
|
| +
|
| + // Check if the system clock can be changed now.
|
| + GetCanSet();
|
| }
|
|
|
| // Called when the TimeUpdated signal is initially connected.
|
| @@ -66,16 +90,62 @@ class SystemClockClientImpl : public SystemClockClient {
|
| << "Failed to connect to TimeUpdated signal.";
|
| }
|
|
|
| + // Callback for CanSetTime method.
|
| + void OnGetCanSet(dbus::Response* response) {
|
| + if (!response) {
|
| + LOG(WARNING) << "CanSetTime request failed.";
|
| + return;
|
| + }
|
| +
|
| + dbus::MessageReader reader(response);
|
| + bool can_set_time;
|
| + if (!reader.PopBool(&can_set_time)) {
|
| + LOG(ERROR) << "CanSetTime response invalid: " << response->ToString();
|
| + return;
|
| + }
|
| +
|
| + // Nothing to do if the CanSetTime response hasn't changed.
|
| + if (can_set_time_initialized_ && can_set_time_ == can_set_time)
|
| + return;
|
| +
|
| + can_set_time_initialized_ = true;
|
| + can_set_time_ = can_set_time;
|
| +
|
| + FOR_EACH_OBSERVER(
|
| + Observer, observers_, SystemClockCanSetTimeChanged(can_set_time));
|
| + }
|
| +
|
| + // Check whether the time can be set.
|
| + void GetCanSet() {
|
| + dbus::MethodCall method_call(system_clock::kSystemClockInterface,
|
| + system_clock::kSystemClockCanSet);
|
| + dbus::MessageWriter writer(&method_call);
|
| + system_clock_proxy_->CallMethod(
|
| + &method_call,
|
| + dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
|
| + base::Bind(&SystemClockClientImpl::OnGetCanSet,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| + }
|
| +
|
| + // Whether the time can be set. Value is false until the first
|
| + // CanSetTime response is received.
|
| + bool can_set_time_;
|
| + bool can_set_time_initialized_;
|
| 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);
|
| };
|
|
|
| +void SystemClockClient::Observer::SystemClockUpdated() {
|
| +}
|
| +
|
| +void SystemClockClient::Observer::SystemClockCanSetTimeChanged(
|
| + bool can_set_time) {
|
| +}
|
| +
|
| SystemClockClient::SystemClockClient() {
|
| }
|
|
|
|
|