fake_attachment_store.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "sync/api/attachments/fake_attachment_store.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/location.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted_memory.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/sequenced_task_runner.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/single_thread_task_runner.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "sync/api/attachments/attachment.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace syncer {
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Backend is where all the work happens.
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FakeAttachmentStore::Backend
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public base::RefCountedThreadSafe<FakeAttachmentStore::Backend> {
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Construct a Backend that posts its results to |frontend_task_runner|.
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Backend(
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const scoped_refptr<base::SingleThreadTaskRunner>& frontend_task_runner);
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  void Read(const AttachmentId& id, const ReadCallback& callback);
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Write(const scoped_refptr<base::RefCountedMemory>& bytes,
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             const WriteCallback& callback);
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  void Drop(const AttachmentId& id, const DropCallback& callback);
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend class base::RefCountedThreadSafe<Backend>;
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~Backend();
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<base::SingleThreadTaskRunner> frontend_task_runner_;
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AttachmentMap attachments_;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FakeAttachmentStore::Backend::Backend(
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const scoped_refptr<base::SingleThreadTaskRunner>& frontend_task_runner)
41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    : frontend_task_runner_(frontend_task_runner) {}
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FakeAttachmentStore::Backend::~Backend() {}
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void FakeAttachmentStore::Backend::Read(const AttachmentId& id,
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const ReadCallback& callback) {
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  AttachmentMap::iterator iter = attachments_.find(id);
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<Attachment> attachment;
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Result result = NOT_FOUND;
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (iter != attachments_.end()) {
51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    attachment.reset(new Attachment(iter->second));
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result = SUCCESS;
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frontend_task_runner_->PostTask(
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FROM_HERE, base::Bind(callback, result, base::Passed(&attachment)));
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FakeAttachmentStore::Backend::Write(
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const scoped_refptr<base::RefCountedMemory>& bytes,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const WriteCallback& callback) {
61e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  Attachment attachment = Attachment::Create(bytes);
62e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  AttachmentId attachment_id(attachment.GetId());
63e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  attachments_.insert(AttachmentMap::value_type(attachment_id, attachment));
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  frontend_task_runner_->PostTask(FROM_HERE,
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                  base::Bind(callback, SUCCESS, attachment_id));
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void FakeAttachmentStore::Backend::Drop(const AttachmentId& id,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const DropCallback& callback) {
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Result result = NOT_FOUND;
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  AttachmentMap::iterator iter = attachments_.find(id);
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (iter != attachments_.end()) {
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    attachments_.erase(iter);
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    result = SUCCESS;
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
76e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  frontend_task_runner_->PostTask(FROM_HERE, base::Bind(callback, result));
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FakeAttachmentStore::FakeAttachmentStore(
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const scoped_refptr<base::SequencedTaskRunner>& backend_task_runner)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : backend_(new Backend(base::MessageLoopProxy::current())),
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      backend_task_runner_(backend_task_runner) {}
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)FakeAttachmentStore::~FakeAttachmentStore() {}
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void FakeAttachmentStore::Read(const AttachmentId& id,
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const ReadCallback& callback) {
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  backend_task_runner_->PostTask(
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FROM_HERE,
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&FakeAttachmentStore::Backend::Read, backend_, id, callback));
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FakeAttachmentStore::Write(
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const scoped_refptr<base::RefCountedMemory>& bytes,
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const WriteCallback& callback) {
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  backend_task_runner_->PostTask(
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FROM_HERE,
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)          &FakeAttachmentStore::Backend::Write, backend_, bytes, callback));
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void FakeAttachmentStore::Drop(const AttachmentId& id,
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                               const DropCallback& callback) {
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  backend_task_runner_->PostTask(
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      FROM_HERE,
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::Bind(&FakeAttachmentStore::Backend::Drop, backend_, id, callback));
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace syncer
110