// 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_