Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: sync/internal_api/attachments/in_memory_attachment_store.cc

Issue 2130453004: [Sync] Move //sync to //components/sync. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "sync/internal_api/public/attachments/in_memory_attachment_store.h"
6
7 #include <memory>
8
9 #include "base/bind.h"
10 #include "base/callback.h"
11 #include "base/location.h"
12 #include "base/sequenced_task_runner.h"
13
14 namespace syncer {
15
16 namespace {
17
18 void AppendMetadata(AttachmentMetadataList* list,
19 const Attachment& attachment) {
20 list->push_back(
21 AttachmentMetadata(attachment.GetId(), attachment.GetData()->size()));
22 }
23
24 } // namespace
25
26 InMemoryAttachmentStore::InMemoryAttachmentStore(
27 const scoped_refptr<base::SequencedTaskRunner>& callback_task_runner)
28 : AttachmentStoreBackend(callback_task_runner) {
29 // Object is created on one thread but used on another.
30 DetachFromThread();
31 }
32
33 InMemoryAttachmentStore::~InMemoryAttachmentStore() {
34 }
35
36 void InMemoryAttachmentStore::Init(
37 const AttachmentStore::InitCallback& callback) {
38 DCHECK(CalledOnValidThread());
39 PostCallback(base::Bind(callback, AttachmentStore::SUCCESS));
40 }
41
42 void InMemoryAttachmentStore::Read(
43 AttachmentStore::Component component,
44 const AttachmentIdList& ids,
45 const AttachmentStore::ReadCallback& callback) {
46 DCHECK(CalledOnValidThread());
47 AttachmentStore::Result result_code = AttachmentStore::SUCCESS;
48 std::unique_ptr<AttachmentMap> result_map(new AttachmentMap);
49 std::unique_ptr<AttachmentIdList> unavailable_attachments(
50 new AttachmentIdList);
51
52 for (const auto& id : ids) {
53 AttachmentEntryMap::iterator iter = attachments_.find(id);
54 if (iter != attachments_.end() &&
55 iter->second.components.count(component) > 0) {
56 const Attachment& attachment = iter->second.attachment;
57 result_map->insert(std::make_pair(id, attachment));
58 } else {
59 unavailable_attachments->push_back(id);
60 }
61 }
62 if (!unavailable_attachments->empty()) {
63 result_code = AttachmentStore::UNSPECIFIED_ERROR;
64 }
65 PostCallback(base::Bind(callback, result_code, base::Passed(&result_map),
66 base::Passed(&unavailable_attachments)));
67 }
68
69 void InMemoryAttachmentStore::Write(
70 AttachmentStore::Component component,
71 const AttachmentList& attachments,
72 const AttachmentStore::WriteCallback& callback) {
73 DCHECK(CalledOnValidThread());
74 for (const auto& attachment : attachments) {
75 attachments_.insert(std::make_pair(attachment.GetId(),
76 AttachmentEntry(attachment, component)));
77 }
78 PostCallback(base::Bind(callback, AttachmentStore::SUCCESS));
79 }
80
81 void InMemoryAttachmentStore::SetReference(AttachmentStore::Component component,
82 const AttachmentIdList& ids) {
83 DCHECK(CalledOnValidThread());
84 for (const auto& id : ids) {
85 AttachmentEntryMap::iterator attachments_iter = attachments_.find(id);
86 if (attachments_iter != attachments_.end()) {
87 attachments_iter->second.components.insert(component);
88 }
89 }
90 }
91
92 void InMemoryAttachmentStore::DropReference(
93 AttachmentStore::Component component,
94 const AttachmentIdList& ids,
95 const AttachmentStore::DropCallback& callback) {
96 DCHECK(CalledOnValidThread());
97 AttachmentStore::Result result = AttachmentStore::SUCCESS;
98 for (const auto& id : ids) {
99 AttachmentEntryMap::iterator attachments_iter = attachments_.find(id);
100 if (attachments_iter == attachments_.end()) {
101 continue;
102 }
103 attachments_iter->second.components.erase(component);
104 if (attachments_iter->second.components.empty()) {
105 attachments_.erase(attachments_iter);
106 }
107 }
108 PostCallback(base::Bind(callback, result));
109 }
110
111 void InMemoryAttachmentStore::ReadMetadataById(
112 AttachmentStore::Component component,
113 const AttachmentIdList& ids,
114 const AttachmentStore::ReadMetadataCallback& callback) {
115 DCHECK(CalledOnValidThread());
116 AttachmentStore::Result result_code = AttachmentStore::SUCCESS;
117 std::unique_ptr<AttachmentMetadataList> metadata_list(
118 new AttachmentMetadataList());
119
120 for (const auto& id : ids) {
121 AttachmentEntryMap::iterator iter = attachments_.find(id);
122 if (iter == attachments_.end()) {
123 result_code = AttachmentStore::UNSPECIFIED_ERROR;
124 continue;
125 }
126 DCHECK_GT(iter->second.components.size(), 0u);
127 if (iter->second.components.count(component) == 0) {
128 result_code = AttachmentStore::UNSPECIFIED_ERROR;
129 continue;
130 }
131 AppendMetadata(metadata_list.get(), iter->second.attachment);
132 }
133 PostCallback(base::Bind(callback, result_code, base::Passed(&metadata_list)));
134 }
135
136 void InMemoryAttachmentStore::ReadMetadata(
137 AttachmentStore::Component component,
138 const AttachmentStore::ReadMetadataCallback& callback) {
139 DCHECK(CalledOnValidThread());
140 AttachmentStore::Result result_code = AttachmentStore::SUCCESS;
141 std::unique_ptr<AttachmentMetadataList> metadata_list(
142 new AttachmentMetadataList());
143
144 for (AttachmentEntryMap::const_iterator iter = attachments_.begin();
145 iter != attachments_.end(); ++iter) {
146 DCHECK_GT(iter->second.components.size(), 0u);
147 if (iter->second.components.count(component) > 0) {
148 AppendMetadata(metadata_list.get(), iter->second.attachment);
149 }
150 }
151 PostCallback(base::Bind(callback, result_code, base::Passed(&metadata_list)));
152 }
153
154 InMemoryAttachmentStore::AttachmentEntry::AttachmentEntry(
155 const Attachment& attachment,
156 AttachmentStore::Component initial_reference_component)
157 : attachment(attachment) {
158 components.insert(initial_reference_component);
159 }
160
161 InMemoryAttachmentStore::AttachmentEntry::AttachmentEntry(
162 const AttachmentEntry& other) = default;
163
164 InMemoryAttachmentStore::AttachmentEntry::~AttachmentEntry() {
165 }
166
167 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698