summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/contacts/fake_contact_database.cc
blob: 00b30b8658a468bee1764d2d749002fe24c0ffcc (plain)
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
// Copyright (c) 2012 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 "chrome/browser/chromeos/contacts/fake_contact_database.h"

#include "chrome/browser/chromeos/contacts/contact.pb.h"
#include "content/public/browser/browser_thread.h"

using content::BrowserThread;

namespace contacts {

FakeContactDatabase::FakeContactDatabase()
    : init_success_(true),
      save_success_(true),
      load_success_(true),
      num_saved_contacts_(0) {
  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
}

void FakeContactDatabase::Init(const base::FilePath& database_dir,
                               InitCallback callback) {
  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
  callback.Run(init_success_);
}

void FakeContactDatabase::SetContacts(const ContactPointers& contacts,
                                      const UpdateMetadata& metadata) {
  contacts_.Clear();
  MergeContacts(contacts, ContactIds());
  metadata_ = metadata;
}

void FakeContactDatabase::DestroyOnUIThread() {
  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
  delete this;
}

void FakeContactDatabase::SaveContacts(
    scoped_ptr<ContactPointers> contacts_to_save,
    scoped_ptr<ContactIds> contact_ids_to_delete,
    scoped_ptr<UpdateMetadata> metadata,
    bool is_full_update,
    SaveCallback callback) {
  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
  if (save_success_) {
    num_saved_contacts_ += contacts_to_save->size();
    if (is_full_update)
      contacts_.Clear();
    MergeContacts(*contacts_to_save, *contact_ids_to_delete);
    metadata_ = *metadata;
  }
  callback.Run(save_success_);
}

void FakeContactDatabase::LoadContacts(LoadCallback callback) {
  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
  scoped_ptr<ScopedVector<Contact> > contacts(new ScopedVector<Contact>());
  scoped_ptr<UpdateMetadata> metadata(new UpdateMetadata);
  if (load_success_) {
    for (ContactMap::const_iterator it = contacts_.begin();
         it != contacts_.end(); ++it) {
      contacts->push_back(new Contact(*it->second));
    }
    *metadata = metadata_;
  }
  callback.Run(load_success_, contacts.Pass(), metadata.Pass());
}

FakeContactDatabase::~FakeContactDatabase() {
}

void FakeContactDatabase::MergeContacts(
    const ContactPointers& updated_contacts,
    const ContactIds& contact_ids_to_delete) {
  scoped_ptr<ScopedVector<Contact> > copied_contacts(new ScopedVector<Contact>);
  for (size_t i = 0; i < updated_contacts.size(); ++i)
    copied_contacts->push_back(new Contact(*updated_contacts[i]));
  contacts_.Merge(copied_contacts.Pass(), ContactMap::KEEP_DELETED_CONTACTS);
  for (ContactIds::const_iterator it = contact_ids_to_delete.begin();
       it != contact_ids_to_delete.end(); ++it) {
    contacts_.Erase(*it);
  }
}

}  // namespace contacts