// 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 "chrome/browser/extensions/updater/extension_cache.h"

#include "base/memory/singleton.h"

#if defined(OS_CHROMEOS)
#include "chrome/browser/extensions/updater/extension_cache_impl.h"
#endif  // OS_CHROMEOS

namespace extensions {
namespace {

#if !defined(OS_CHROMEOS)

// Implementation of ExtensionCache that doesn't cache anything.
// Real cache is used only on Chrome OS other OSes use this null implementation.
class ExtensionCacheNullImpl : public ExtensionCache {
 public:
  static ExtensionCacheNullImpl* GetInstance() {
    return Singleton<ExtensionCacheNullImpl>::get();
  }

  // Implementation of ExtensionCache.
  virtual void Start(const base::Closure& callback) OVERRIDE {
    callback.Run();
  }

  virtual void Shutdown(const base::Closure& callback) OVERRIDE {
    callback.Run();
  }

  virtual void AllowCaching(const std::string& id) OVERRIDE {
  }

  virtual bool GetExtension(const std::string& id,
                            base::FilePath* file_path,
                            std::string* version) OVERRIDE {
    return false;
  }

  virtual void PutExtension(const std::string& id,
                            const base::FilePath& file_path,
                            const std::string& version,
                            const PutExtensionCallback& callback) OVERRIDE {
    callback.Run(file_path, true);
  }

 private:
  friend struct DefaultSingletonTraits<ExtensionCacheNullImpl>;

  ExtensionCacheNullImpl() {}
  virtual ~ExtensionCacheNullImpl() {}
};

#endif  // !OS_CHROMEOS

static ExtensionCache* g_extension_cache_override = NULL;

}  // namespace

// static
ExtensionCache* ExtensionCache::GetInstance() {
  if (g_extension_cache_override) {
    return g_extension_cache_override;
  } else {
#if defined(OS_CHROMEOS)
    return ExtensionCacheImpl::GetInstance();
#else
    return ExtensionCacheNullImpl::GetInstance();
#endif
  }
}

// static
ExtensionCache* ExtensionCache::SetForTesting(ExtensionCache* cache) {
  ExtensionCache* temp = g_extension_cache_override;
  g_extension_cache_override = cache;
  return temp;
}

}  // namespace extensions