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