| // Copyright 2015 The Weave 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 LIBWEAVE_SRC_STATES_STATE_CHANGE_QUEUE_INTERFACE_H_ | 
 | #define LIBWEAVE_SRC_STATES_STATE_CHANGE_QUEUE_INTERFACE_H_ | 
 |  | 
 | #include <vector> | 
 |  | 
 | #include <base/callback_list.h> | 
 | #include <base/time/time.h> | 
 |  | 
 | #include "src/commands/schema_utils.h" | 
 |  | 
 | namespace weave { | 
 |  | 
 | // A simple notification record event to track device state changes. | 
 | // The |timestamp| records the time of the state change. | 
 | // |changed_properties| contains a property set with the new property values | 
 | // which were updated at the time the event was recorded. | 
 | struct StateChange { | 
 |   StateChange(base::Time time, ValueMap properties) | 
 |       : timestamp{time}, changed_properties{std::move(properties)} {} | 
 |   base::Time timestamp; | 
 |   ValueMap changed_properties; | 
 | }; | 
 |  | 
 | // An abstract interface to StateChangeQueue to record and retrieve state | 
 | // change notification events. | 
 | class StateChangeQueueInterface { | 
 |  public: | 
 |   using UpdateID = uint64_t; | 
 |   using Token = | 
 |       std::unique_ptr<base::CallbackList<void(UpdateID)>::Subscription>; | 
 |  | 
 |   // 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(base::Time timestamp, | 
 |                                        ValueMap changed_properties) = 0; | 
 |  | 
 |   // Returns the recorded state changes since last time this method was called. | 
 |   virtual std::vector<StateChange> GetAndClearRecordedStateChanges() = 0; | 
 |  | 
 |   // Returns an ID of last state change update. Each NotifyPropertiesUpdated() | 
 |   // invocation increments this value by 1. | 
 |   virtual UpdateID GetLastStateChangeId() const = 0; | 
 |  | 
 |   // Subscribes for device state update notifications from cloud server. | 
 |   // The |callback| will be called every time a state patch with given ID is | 
 |   // successfully received and processed by GCD server. | 
 |   // Returns a subscription token. As soon as this token is destroyed, the | 
 |   // respective callback is removed from the callback list. | 
 |   virtual Token AddOnStateUpdatedCallback( | 
 |       const base::Callback<void(UpdateID)>& callback) WARN_UNUSED_RESULT = 0; | 
 |  | 
 |   virtual void NotifyStateUpdatedOnServer(UpdateID update_id) = 0; | 
 |  | 
 |  protected: | 
 |   // No one should attempt do destroy the queue through the interface. | 
 |   virtual ~StateChangeQueueInterface() {} | 
 | }; | 
 |  | 
 | }  // namespace weave | 
 |  | 
 | #endif  // LIBWEAVE_SRC_STATES_STATE_CHANGE_QUEUE_INTERFACE_H_ |