buffet: Add state change queue
When device state properties are updated, compile the change
notifications in StateChangeQueue object so they can be pulled
by Cloud Server adaptor and batch-update the device state on
the server.
When StateManager receives property updates, it notifies the
StateChangeQueue object of the changes via StateChangeQueueInterface.
The changes are kept in the queue along with the their time stamps
until they are pulled by Cloud Server adaper (using StateChangeQueue
method). At this point, the adapter would notify the server of
recorded device state changes and the StateChangeQueue is cleared,
ready to record new state updates.
BUG=chromium:415364
TEST=FEATURES=test emerge-link buffet
Change-Id: Ie99e2ada39aaf0164e08699d65153abfc5235a2f
Reviewed-on: https://chromium-review.googlesource.com/226014
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Reviewed-by: Christopher Wiley <wiley@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/states/state_change_queue_interface.h b/buffet/states/state_change_queue_interface.h
new file mode 100644
index 0000000..5810bff
--- /dev/null
+++ b/buffet/states/state_change_queue_interface.h
@@ -0,0 +1,45 @@
+// Copyright 2014 The Chromium OS 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 BUFFET_STATES_STATE_CHANGE_QUEUE_INTERFACE_H_
+#define BUFFET_STATES_STATE_CHANGE_QUEUE_INTERFACE_H_
+
+#include <vector>
+
+#include <base/time/time.h>
+#include <chromeos/variant_dictionary.h>
+
+namespace buffet {
+
+// A simple notification record event to track device state changes.
+// The |timestamp| records the time of the state change.
+// |property_set| contains a property set with the new property values.
+// The property set contains only the properties updated at the time the event
+// was recorded.
+struct StateChange {
+ base::Time timestamp;
+ chromeos::VariantDictionary property_set;
+};
+
+// An abstract interface to StateChangeQueue to record and retrieve state
+// change notification events.
+class StateChangeQueueInterface {
+ public:
+ // Returns true if the state change notification queue is empty.
+ virtual bool IsEmpty() const = 0;
+
+ // Called by StateManager when device state properties are updated.
+ virtual bool NotifyPropertiesUpdated(const StateChange& change) = 0;
+
+ // Returns the recorded state changes since last time this method was called.
+ virtual std::vector<StateChange> GetAndClearRecordedStateChanges() = 0;
+
+ protected:
+ // No one should attempt do destroy the queue through the interface.
+ ~StateChangeQueueInterface() {}
+};
+
+} // namespace buffet
+
+#endif // BUFFET_STATES_STATE_CHANGE_QUEUE_INTERFACE_H_