blob: 8a615c562a7741b2331fe3b9e927f293fdba47a7 [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "examples/recipes/recipe_handler/recipe_value_store_impl.h"
#include "examples/recipes/recipe_handler/value_store.h"
using ValueType = std::vector<uint8_t>;
namespace recipes {
namespace recipe_handler {
RecipeValueStoreImpl::RecipeValueStoreImpl(ValueStore* value_store)
: value_store_(value_store) {
value_store_->AddObserver(this);
}
RecipeValueStoreImpl::~RecipeValueStoreImpl() {
value_store_->RemoveObserver(this);
}
void RecipeValueStoreImpl::UpdateValues(RecipeUpdateMap values) {
if (!observer_.get())
return;
ValueStore::UpdateMap update_map;
for (RecipeUpdateMap::ConstMapIterator i = values.begin(); i != values.end();
++i) {
if (i.GetKey().is_null())
update_map.set(i.GetKey(), nullptr);
else
update_map.set(
i.GetKey(),
scoped_ptr<ValueType>(new ValueType(i.GetValue().To<ValueType>())));
}
value_store_->UpdateValues(update_map);
}
void RecipeValueStoreImpl::SetObserver(RecipeValueStoreObserverPtr observer) {
observer_ = observer.Pass();
mojo::Map<mojo::String, RecipeChangeValuePtr> initial_value_map;
for (const auto& value : value_store_->values()) {
RecipeChangeValuePtr recipe_value(RecipeChangeValue::New());
recipe_value->new_value = mojo::Array<uint8_t>::From(value.second);
initial_value_map[value.first] = recipe_value.Pass();
}
observer_->OnValuesChanged(initial_value_map.Pass());
}
void RecipeValueStoreImpl::OnValuesChanged(const ValueStoreUpdateMap& updates) {
if (!observer_.get())
return;
mojo::Map<mojo::String, RecipeChangeValuePtr> update_map;
for (const auto& update : updates) {
RecipeChangeValuePtr recipe_value(RecipeChangeValue::New());
if (update.second->old_value.get())
recipe_value->old_value =
mojo::Array<uint8_t>::From(*update.second->old_value);
if (update.second->new_value.get())
recipe_value->new_value =
mojo::Array<uint8_t>::From(*update.second->new_value);
update_map[update.first] = recipe_value.Pass();
}
observer_->OnValuesChanged(update_map.Pass());
}
} // namespace recipe_handler
} // namespace recipes