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() { |
} |