1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/notifications/scheduler/internal/notification_store.h"
#include "base/functional/bind.h"
#include "chrome/browser/notifications/scheduler/internal/proto_conversion.h"
namespace leveldb_proto {
void DataToProto(notifications::NotificationEntry* entry,
notifications::proto::NotificationEntry* proto) {
NotificationEntryToProto(entry, proto);
}
void ProtoToData(notifications::proto::NotificationEntry* proto,
notifications::NotificationEntry* entry) {
NotificationEntryFromProto(proto, entry);
}
} // namespace leveldb_proto
namespace notifications {
NotificationStore::NotificationStore(
std::unique_ptr<leveldb_proto::ProtoDatabase<proto::NotificationEntry,
NotificationEntry>> db)
: db_(std::move(db)) {}
NotificationStore::~NotificationStore() = default;
void NotificationStore::InitAndLoad(LoadCallback callback) {
db_->Init(base::BindOnce(&NotificationStore::OnDbInitialized,
weak_ptr_factory_.GetWeakPtr(),
std::move(callback)));
}
void NotificationStore::OnDbInitialized(
LoadCallback callback,
leveldb_proto::Enums::InitStatus status) {
if (status != leveldb_proto::Enums::InitStatus::kOK) {
std::move(callback).Run(false, Entries());
return;
}
// Load the data after a successful initialization.
db_->LoadEntries(base::BindOnce(&NotificationStore::OnDataLoaded,
weak_ptr_factory_.GetWeakPtr(),
std::move(callback)));
}
void NotificationStore::OnDataLoaded(
LoadCallback callback,
bool success,
std::unique_ptr<EntryVector> entry_vector) {
// The database failed to load.
if (!success) {
std::move(callback).Run(false, Entries());
return;
}
// Success to load but no data.
if (!entry_vector) {
std::move(callback).Run(true, Entries());
return;
}
// Load data.
Entries entries;
for (auto it = entry_vector->begin(); it != entry_vector->end(); ++it) {
std::unique_ptr<NotificationEntry> notification_entry =
std::make_unique<NotificationEntry>(std::move(*it));
entries.emplace_back(std::move(notification_entry));
}
std::move(callback).Run(true, std::move(entries));
}
void NotificationStore::Add(const std::string& key,
const NotificationEntry& entry,
UpdateCallback callback) {
Update(key, entry, std::move(callback));
}
void NotificationStore::Update(const std::string& key,
const NotificationEntry& entry,
UpdateCallback callback) {
auto entries_to_save = std::make_unique<KeyEntryVector>();
entries_to_save->emplace_back(std::make_pair(key, entry));
db_->UpdateEntries(std::move(entries_to_save),
std::make_unique<KeyVector>() /*keys_to_remove*/,
std::move(callback));
}
void NotificationStore::Delete(const std::string& key,
UpdateCallback callback) {
auto keys_to_delete = std::make_unique<KeyVector>();
keys_to_delete->emplace_back(key);
db_->UpdateEntries(std::make_unique<KeyEntryVector>() /*entries_to_save*/,
std::move(keys_to_delete), std::move(callback));
}
} // namespace notifications
|