blob: 7dcbb7668c2618f8a504d5b970f770628c7f7b4b [file] [log] [blame]
// Copyright 2016 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 "services/catalog/instance.h"
#include <memory>
#include "base/bind.h"
#include "base/values.h"
#include "services/catalog/entry.h"
#include "services/catalog/entry_cache.h"
#include "services/catalog/manifest_provider.h"
namespace catalog {
namespace {
void AddEntry(const Entry& entry, std::vector<mojom::EntryPtr>* ary) {
mojom::EntryPtr entry_ptr(mojom::Entry::New());
entry_ptr->name = entry.name();
entry_ptr->display_name = entry.display_name();
ary->push_back(std::move(entry_ptr));
}
} // namespace
Instance::Instance(EntryCache* system_cache,
ManifestProvider* service_manifest_provider)
: system_cache_(system_cache),
service_manifest_provider_(service_manifest_provider) {}
Instance::~Instance() {}
void Instance::BindCatalog(mojom::CatalogRequest request) {
catalog_bindings_.AddBinding(this, std::move(request));
}
const Entry* Instance::Resolve(const std::string& service_name) {
DCHECK(system_cache_);
const Entry* cached_entry = system_cache_->GetEntry(service_name);
if (cached_entry)
return cached_entry;
std::unique_ptr<base::Value> new_manifest;
if (service_manifest_provider_)
new_manifest = service_manifest_provider_->GetManifest(service_name);
if (!new_manifest) {
LOG(ERROR) << "Unable to locate service manifest for " << service_name;
return nullptr;
}
auto new_entry = Entry::Deserialize(*new_manifest);
if (!new_entry) {
LOG(ERROR) << "Malformed manifest for " << service_name;
return nullptr;
}
cached_entry = const_cast<const Entry*>(new_entry.get());
bool added = system_cache_->AddRootEntry(std::move(new_entry));
DCHECK(added);
return cached_entry;
}
void Instance::GetEntries(const base::Optional<std::vector<std::string>>& names,
GetEntriesCallback callback) {
DCHECK(system_cache_);
std::vector<mojom::EntryPtr> entries;
if (!names.has_value()) {
// TODO(beng): user catalog.
for (const auto& entry : system_cache_->entries())
AddEntry(*entry.second, &entries);
} else {
for (const std::string& name : names.value()) {
const Entry* entry = system_cache_->GetEntry(name);
// TODO(beng): user catalog.
if (entry)
AddEntry(*entry, &entries);
}
}
std::move(callback).Run(std::move(entries));
}
void Instance::GetEntriesProvidingCapability(
const std::string& capability,
GetEntriesProvidingCapabilityCallback callback) {
std::vector<mojom::EntryPtr> entries;
for (const auto& entry : system_cache_->entries())
if (entry.second->ProvidesCapability(capability))
entries.push_back(mojom::Entry::From(*entry.second));
std::move(callback).Run(std::move(entries));
}
} // namespace catalog