| Index: components/download/internal/download_store.cc
|
| diff --git a/components/download/internal/download_store.cc b/components/download/internal/download_store.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..98196b95b9da7a30594ff53cc43ca878a6f4010e
|
| --- /dev/null
|
| +++ b/components/download/internal/download_store.cc
|
| @@ -0,0 +1,95 @@
|
| +// Copyright 2017 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 "components/download/internal/download_store.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/callback_helpers.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "components/download/internal/entry.h"
|
| +#include "components/download/internal/proto/entry.pb.h"
|
| +#include "components/download/internal/proto_conversions.h"
|
| +#include "components/leveldb_proto/proto_database_impl.h"
|
| +
|
| +namespace download {
|
| +
|
| +namespace {
|
| +
|
| +const char kDatabaseClientName[] = "DownloadService";
|
| +using KeyVector = std::vector<std::string>;
|
| +using ProtoEntryVector = std::vector<protodb::Entry>;
|
| +using KeyProtoEntryVector = std::vector<std::pair<std::string, protodb::Entry>>;
|
| +
|
| +} // namespace
|
| +
|
| +DownloadStore::DownloadStore(
|
| + const base::FilePath& database_dir,
|
| + std::unique_ptr<leveldb_proto::ProtoDatabase<protodb::Entry>> db)
|
| + : db_(std::move(db)),
|
| + database_dir_(database_dir),
|
| + is_initialized_(false),
|
| + weak_factory_(this) {}
|
| +
|
| +DownloadStore::~DownloadStore() = default;
|
| +
|
| +bool DownloadStore::IsInitialized() {
|
| + return is_initialized_;
|
| +}
|
| +
|
| +void DownloadStore::Initialize(const InitCallback& callback) {
|
| + DCHECK(!IsInitialized());
|
| + db_->InitWithOptions(kDatabaseClientName,
|
| + leveldb_proto::Options(database_dir_),
|
| + base::Bind(&DownloadStore::OnDatabaseInited,
|
| + weak_factory_.GetWeakPtr(), callback));
|
| +}
|
| +
|
| +void DownloadStore::OnDatabaseInited(const InitCallback& callback,
|
| + bool success) {
|
| + if (!success) {
|
| + callback.Run(success, base::MakeUnique<std::vector<Entry>>());
|
| + return;
|
| + }
|
| +
|
| + db_->LoadEntries(base::Bind(&DownloadStore::OnDatabaseLoaded,
|
| + weak_factory_.GetWeakPtr(), callback));
|
| +}
|
| +
|
| +void DownloadStore::OnDatabaseLoaded(const InitCallback& callback,
|
| + bool success,
|
| + std::unique_ptr<ProtoEntryVector> protos) {
|
| + if (!success) {
|
| + callback.Run(success, base::MakeUnique<std::vector<Entry>>());
|
| + return;
|
| + }
|
| +
|
| + auto entries = ProtoConversions::EntryVectorFromProto(std::move(protos));
|
| + is_initialized_ = true;
|
| + callback.Run(success, std::move(entries));
|
| +}
|
| +
|
| +void DownloadStore::Destroy(const StoreCallback& callback) {
|
| + is_initialized_ = false;
|
| + db_->Destroy(callback);
|
| +}
|
| +
|
| +void DownloadStore::Update(const Entry& entry, const StoreCallback& callback) {
|
| + DCHECK(IsInitialized());
|
| + auto entries_to_save = base::MakeUnique<KeyProtoEntryVector>();
|
| + protodb::Entry proto = ProtoConversions::EntryToProto(entry);
|
| + entries_to_save->emplace_back(entry.guid, std::move(proto));
|
| + db_->UpdateEntries(std::move(entries_to_save), base::MakeUnique<KeyVector>(),
|
| + callback);
|
| +}
|
| +
|
| +void DownloadStore::Remove(const std::string& guid,
|
| + const StoreCallback& callback) {
|
| + DCHECK(IsInitialized());
|
| + auto keys_to_remove = base::MakeUnique<KeyVector>();
|
| + keys_to_remove->push_back(guid);
|
| + db_->UpdateEntries(base::MakeUnique<KeyProtoEntryVector>(),
|
| + std::move(keys_to_remove), callback);
|
| +}
|
| +
|
| +} // namespace download
|
|
|