blob: 40224bd5738e8439bddaf592ced4e65735c46b56 [file] [log] [blame]
// Copyright 2014 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 "sync/internal_api/public/attachments/fake_attachment_store.h"
#include "base/bind.h"
#include "base/location.h"
#include "base/memory/ref_counted_memory.h"
#include "base/message_loop/message_loop_proxy.h"
#include "base/sequenced_task_runner.h"
#include "base/single_thread_task_runner.h"
#include "sync/api/attachments/attachment.h"
namespace syncer {
// Backend is where all the work happens.
class FakeAttachmentStore::Backend
: public base::RefCountedThreadSafe<FakeAttachmentStore::Backend> {
public:
// Construct a Backend that posts its results to |frontend_task_runner|.
Backend(
const scoped_refptr<base::SingleThreadTaskRunner>& frontend_task_runner);
void Read(const AttachmentIdList& ids, const ReadCallback& callback);
void Write(const AttachmentList& attachments, const WriteCallback& callback);
void Drop(const AttachmentIdList& ids, const DropCallback& callback);
private:
friend class base::RefCountedThreadSafe<Backend>;
~Backend();
scoped_refptr<base::SingleThreadTaskRunner> frontend_task_runner_;
AttachmentMap attachments_;
};
FakeAttachmentStore::Backend::Backend(
const scoped_refptr<base::SingleThreadTaskRunner>& frontend_task_runner)
: frontend_task_runner_(frontend_task_runner) {}
FakeAttachmentStore::Backend::~Backend() {}
void FakeAttachmentStore::Backend::Read(const AttachmentIdList& ids,
const ReadCallback& callback) {
Result result_code = SUCCESS;
AttachmentIdList::const_iterator id_iter = ids.begin();
AttachmentIdList::const_iterator id_end = ids.end();
scoped_ptr<AttachmentMap> result_map(new AttachmentMap);
for (; id_iter != id_end; ++id_iter) {
const AttachmentId& id = *id_iter;
syncer::AttachmentMap::iterator attachment_iter =
attachments_.find(*id_iter);
if (attachment_iter != attachments_.end()) {
const Attachment& attachment = attachment_iter->second;
result_map->insert(std::make_pair(id, attachment));
} else {
result_code = UNSPECIFIED_ERROR;
break;
}
}
frontend_task_runner_->PostTask(
FROM_HERE, base::Bind(callback, result_code, base::Passed(&result_map)));
}
void FakeAttachmentStore::Backend::Write(const AttachmentList& attachments,
const WriteCallback& callback) {
AttachmentList::const_iterator iter = attachments.begin();
AttachmentList::const_iterator end = attachments.end();
for (; iter != end; ++iter) {
attachments_.insert(std::make_pair(iter->GetId(), *iter));
}
frontend_task_runner_->PostTask(FROM_HERE, base::Bind(callback, SUCCESS));
}
void FakeAttachmentStore::Backend::Drop(const AttachmentIdList& ids,
const DropCallback& callback) {
Result result = SUCCESS;
AttachmentIdList::const_iterator ids_iter = ids.begin();
AttachmentIdList::const_iterator ids_end = ids.end();
for (; ids_iter != ids_end; ++ids_iter) {
AttachmentMap::iterator attachments_iter = attachments_.find(*ids_iter);
if (attachments_iter != attachments_.end()) {
attachments_.erase(attachments_iter);
}
}
frontend_task_runner_->PostTask(FROM_HERE, base::Bind(callback, result));
}
FakeAttachmentStore::FakeAttachmentStore(
const scoped_refptr<base::SequencedTaskRunner>& backend_task_runner)
: backend_(new Backend(base::MessageLoopProxy::current())),
backend_task_runner_(backend_task_runner) {}
FakeAttachmentStore::~FakeAttachmentStore() {}
void FakeAttachmentStore::Read(const AttachmentIdList& ids,
const ReadCallback& callback) {
backend_task_runner_->PostTask(
FROM_HERE,
base::Bind(&FakeAttachmentStore::Backend::Read, backend_, ids, callback));
}
void FakeAttachmentStore::Write(const AttachmentList& attachments,
const WriteCallback& callback) {
backend_task_runner_->PostTask(
FROM_HERE,
base::Bind(&FakeAttachmentStore::Backend::Write,
backend_,
attachments,
callback));
}
void FakeAttachmentStore::Drop(const AttachmentIdList& ids,
const DropCallback& callback) {
backend_task_runner_->PostTask(
FROM_HERE,
base::Bind(&FakeAttachmentStore::Backend::Drop, backend_, ids, callback));
}
} // namespace syncer