15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/contacts/fake_contact_database.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/contacts/contact.pb.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace contacts {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeContactDatabase::FakeContactDatabase()
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : init_success_(true),
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      save_success_(true),
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      load_success_(true),
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      num_saved_contacts_(0) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FakeContactDatabase::Init(const base::FilePath& database_dir,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               InitCallback callback) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(init_success_);
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeContactDatabase::SetContacts(const ContactPointers& contacts,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const UpdateMetadata& metadata) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  contacts_.Clear();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MergeContacts(contacts, ContactIds());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  metadata_ = metadata;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeContactDatabase::DestroyOnUIThread() {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  delete this;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeContactDatabase::SaveContacts(
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<ContactPointers> contacts_to_save,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<ContactIds> contact_ids_to_delete,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<UpdateMetadata> metadata,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool is_full_update,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SaveCallback callback) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (save_success_) {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    num_saved_contacts_ += contacts_to_save->size();
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (is_full_update)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      contacts_.Clear();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MergeContacts(*contacts_to_save, *contact_ids_to_delete);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    metadata_ = *metadata;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(save_success_);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeContactDatabase::LoadContacts(LoadCallback callback) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ScopedVector<Contact> > contacts(new ScopedVector<Contact>());
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<UpdateMetadata> metadata(new UpdateMetadata);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (load_success_) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (ContactMap::const_iterator it = contacts_.begin();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != contacts_.end(); ++it) {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      contacts->push_back(new Contact(*it->second));
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *metadata = metadata_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  callback.Run(load_success_, contacts.Pass(), metadata.Pass());
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FakeContactDatabase::~FakeContactDatabase() {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FakeContactDatabase::MergeContacts(
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContactPointers& updated_contacts,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContactIds& contact_ids_to_delete) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ScopedVector<Contact> > copied_contacts(new ScopedVector<Contact>);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < updated_contacts.size(); ++i)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    copied_contacts->push_back(new Contact(*updated_contacts[i]));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  contacts_.Merge(copied_contacts.Pass(), ContactMap::KEEP_DELETED_CONTACTS);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (ContactIds::const_iterator it = contact_ids_to_delete.begin();
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       it != contact_ids_to_delete.end(); ++it) {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    contacts_.Erase(*it);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace contacts
88