// Copyright 2013 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 "base/prefs/pref_service_factory.h"

#include "base/bind.h"
#include "base/prefs/default_pref_store.h"
#include "base/prefs/json_pref_store.h"
#include "base/prefs/pref_filter.h"
#include "base/prefs/pref_notifier_impl.h"
#include "base/prefs/pref_service.h"

#include "base/prefs/pref_value_store.h"

namespace base {

namespace {

// Do-nothing default implementation.
void DoNothingHandleReadError(PersistentPrefStore::PrefReadError error) {
}

}  // namespace

PrefServiceFactory::PrefServiceFactory()
    : managed_prefs_(NULL),
      supervised_user_prefs_(NULL),
      extension_prefs_(NULL),
      command_line_prefs_(NULL),
      user_prefs_(NULL),
      recommended_prefs_(NULL),
      read_error_callback_(base::Bind(&DoNothingHandleReadError)),
      async_(false) {}

PrefServiceFactory::~PrefServiceFactory() {}

void PrefServiceFactory::SetUserPrefsFile(
    const base::FilePath& prefs_file,
    base::SequencedTaskRunner* task_runner) {
  user_prefs_ = new JsonPrefStore(
      prefs_file, task_runner, scoped_ptr<PrefFilter>());
}

scoped_ptr<PrefService> PrefServiceFactory::Create(
    PrefRegistry* pref_registry) {
  PrefNotifierImpl* pref_notifier = new PrefNotifierImpl();
  scoped_ptr<PrefService> pref_service(
      new PrefService(pref_notifier,
                      new PrefValueStore(managed_prefs_.get(),
                                         supervised_user_prefs_.get(),
                                         extension_prefs_.get(),
                                         command_line_prefs_.get(),
                                         user_prefs_.get(),
                                         recommended_prefs_.get(),
                                         pref_registry->defaults().get(),
                                         pref_notifier),
                      user_prefs_.get(),
                      pref_registry,
                      read_error_callback_,
                      async_));
  return pref_service.Pass();
}

}  // namespace base
