| // 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_H_ | |
| #define LIBWEAVE_SRC_STATES_STATE_CHANGE_QUEUE_H_ | |
| #include <map> | |
| #include <memory> | |
| #include <vector> | |
| #include <base/macros.h> | |
| #include <base/time/time.h> | |
| #include <base/values.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, | |
| std::unique_ptr<base::DictionaryValue> properties) | |
| : timestamp{time}, changed_properties{std::move(properties)} {} | |
| base::Time timestamp; | |
| std::unique_ptr<base::DictionaryValue> changed_properties; | |
| }; | |
| // An object to record and retrieve device state change notification events. | |
| class StateChangeQueue { | |
| public: | |
| explicit StateChangeQueue(size_t max_queue_size); | |
| bool NotifyPropertiesUpdated( | |
| base::Time timestamp, | |
| const base::DictionaryValue& changed_properties); | |
| std::vector<StateChange> GetAndClearRecordedStateChanges(); | |
| private: | |
| // Maximum queue size. If it is full, the oldest state update records are | |
| // merged together until the queue size is within the size limit. | |
| const size_t max_queue_size_; | |
| // Accumulated list of device state change notifications. | |
| std::map<base::Time, std::unique_ptr<base::DictionaryValue>> state_changes_; | |
| DISALLOW_COPY_AND_ASSIGN(StateChangeQueue); | |
| }; | |
| } // namespace weave | |
| #endif // LIBWEAVE_SRC_STATES_STATE_CHANGE_QUEUE_H_ |