| Index: chrome/browser/extensions/app_notification_storage.cc | 
| diff --git a/chrome/browser/extensions/app_notification_storage.cc b/chrome/browser/extensions/app_notification_storage.cc | 
| deleted file mode 100644 | 
| index 30d7977cc0efb47eac2f1515b941e05a4287d208..0000000000000000000000000000000000000000 | 
| --- a/chrome/browser/extensions/app_notification_storage.cc | 
| +++ /dev/null | 
| @@ -1,232 +0,0 @@ | 
| -// 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/extensions/app_notification_storage.h" | 
| - | 
| -#include "base/file_util.h" | 
| -#include "base/files/file_path.h" | 
| -#include "base/json/json_reader.h" | 
| -#include "base/json/json_writer.h" | 
| -#include "base/location.h" | 
| -#include "base/sys_string_conversions.h" | 
| -#include "base/values.h" | 
| -#include "base/version.h" | 
| -#include "chrome/common/extensions/extension.h" | 
| -#include "content/public/browser/browser_thread.h" | 
| -#include "third_party/leveldatabase/src/include/leveldb/db.h" | 
| - | 
| -using base::JSONReader; | 
| -using base::JSONWriter; | 
| -using content::BrowserThread; | 
| - | 
| -namespace extensions { | 
| - | 
| -// A concrete implementation of the AppNotificationStorage interface, using | 
| -// LevelDb for backing storage. | 
| -class LevelDbAppNotificationStorage : public AppNotificationStorage { | 
| - public: | 
| -  explicit LevelDbAppNotificationStorage(const base::FilePath& path); | 
| -  virtual ~LevelDbAppNotificationStorage(); | 
| - | 
| -  // Implementing the AppNotificationStorage interface. | 
| -  virtual bool GetExtensionIds(std::set<std::string>* result) OVERRIDE; | 
| -  virtual bool Get(const std::string& extension_id, | 
| -                   AppNotificationList* result) OVERRIDE; | 
| -  virtual bool Set(const std::string& extension_id, | 
| -                   const AppNotificationList& list) OVERRIDE; | 
| -  virtual bool Delete(const std::string& extension_id) OVERRIDE; | 
| - | 
| - private: | 
| -  // If |db_| is NULL, attempt to open it. You should pass true for | 
| -  // |create_if_missing| if you need to write data into the database and want to | 
| -  // ensure it has been created after this call. | 
| -  bool OpenDbIfNeeded(bool create_if_missing); | 
| - | 
| -  // The path where the database will reside. | 
| -  base::FilePath path_; | 
| - | 
| -  // This should be used for all read operations on the db. | 
| -  leveldb::ReadOptions read_options_; | 
| - | 
| -  // The leveldb database object - might be NULL if there was nothing found on | 
| -  // disk at |path_| and OpenDbIfNeeded hasn't been called with | 
| -  // create_if_missing=true yet. | 
| -  scoped_ptr<leveldb::DB> db_; | 
| - | 
| -  DISALLOW_COPY_AND_ASSIGN(LevelDbAppNotificationStorage); | 
| -}; | 
| - | 
| -// static | 
| -AppNotificationStorage* AppNotificationStorage::Create( | 
| -    const base::FilePath& path) { | 
| -  return new LevelDbAppNotificationStorage(path); | 
| -} | 
| - | 
| -AppNotificationStorage::~AppNotificationStorage() {} | 
| - | 
| -namespace { | 
| - | 
| -void AppNotificationListToJSON(const AppNotificationList& list, | 
| -                               std::string* result) { | 
| -  ListValue list_value; | 
| -  AppNotificationList::const_iterator i; | 
| -  for (i = list.begin(); i != list.end(); ++i) { | 
| -    DictionaryValue* dictionary = new DictionaryValue(); | 
| -    (*i)->ToDictionaryValue(dictionary); | 
| -    list_value.Append(dictionary); | 
| -  } | 
| -  JSONWriter::Write(&list_value, result); | 
| -} | 
| - | 
| -bool JSONToAppNotificationList(const std::string& json, | 
| -                               AppNotificationList* list) { | 
| -  CHECK(list); | 
| -  scoped_ptr<Value> value(JSONReader::Read(json)); | 
| -  if (!value.get() || value->GetType() != Value::TYPE_LIST) | 
| -    return false; | 
| - | 
| -  ListValue* list_value = static_cast<ListValue*>(value.get()); | 
| -  for (size_t i = 0; i < list_value->GetSize(); i++) { | 
| -    Value* item = NULL; | 
| -    if (!list_value->Get(i, &item) || !item || | 
| -        item->GetType() != Value::TYPE_DICTIONARY) | 
| -      return false; | 
| -    DictionaryValue* dictionary = static_cast<DictionaryValue*>(item); | 
| -    AppNotification* notification = | 
| -        AppNotification::FromDictionaryValue(*dictionary); | 
| -    if (!notification) | 
| -      return false; | 
| -    list->push_back(linked_ptr<AppNotification>(notification)); | 
| -  } | 
| -  return true; | 
| -} | 
| - | 
| -void LogLevelDbError(const tracked_objects::Location& location, | 
| -                     const leveldb::Status& status) { | 
| -  LOG(ERROR) << "AppNotificationStorage database error at " | 
| -             << location.ToString() << " status:" << status.ToString(); | 
| -} | 
| - | 
| -}  // namespace | 
| - | 
| - | 
| -LevelDbAppNotificationStorage::LevelDbAppNotificationStorage( | 
| -    const base::FilePath& path) : path_(path) { | 
| -  CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| -  read_options_.verify_checksums = true; | 
| -} | 
| - | 
| -LevelDbAppNotificationStorage::~LevelDbAppNotificationStorage() { | 
| -  CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| -} | 
| - | 
| -bool LevelDbAppNotificationStorage::GetExtensionIds( | 
| -    std::set<std::string>* result) { | 
| -  CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| -  CHECK(result); | 
| -  if (!OpenDbIfNeeded(false)) | 
| -    return false; | 
| -  if (!db_.get()) | 
| -    return true; | 
| - | 
| -  scoped_ptr<leveldb::Iterator> iter(db_->NewIterator(read_options_)); | 
| -  for (iter->SeekToFirst(); iter->Valid(); iter->Next()) { | 
| -    std::string key = iter->key().ToString(); | 
| -    if (Extension::IdIsValid(key)) | 
| -      result->insert(key); | 
| -  } | 
| - | 
| -  return true; | 
| -} | 
| - | 
| -bool LevelDbAppNotificationStorage::Get(const std::string& extension_id, | 
| -                                        AppNotificationList* result) { | 
| -  CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| -  CHECK(result); | 
| -  if (!OpenDbIfNeeded(false)) | 
| -    return false; | 
| -  if (!db_.get()) | 
| -    return true; | 
| - | 
| -  std::string json; | 
| -  leveldb::Status status = db_->Get(read_options_, extension_id, &json); | 
| -  if (status.IsNotFound()) { | 
| -    return true; | 
| -  } else if (!status.ok()) { | 
| -    LogLevelDbError(FROM_HERE, status); | 
| -    return false; | 
| -  } | 
| - | 
| -  return JSONToAppNotificationList(json, result); | 
| -} | 
| - | 
| -bool LevelDbAppNotificationStorage::Set(const std::string& extension_id, | 
| -                                        const AppNotificationList& list) { | 
| -  CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| -  if (!OpenDbIfNeeded(true)) | 
| -    return false; | 
| -  CHECK(db_.get()); | 
| - | 
| -  std::string json; | 
| -  AppNotificationListToJSON(list, &json); | 
| -  leveldb::Status status = db_->Put(leveldb::WriteOptions(), | 
| -                                    extension_id, | 
| -                                    json); | 
| -  if (!status.ok()) { | 
| -    LogLevelDbError(FROM_HERE, status); | 
| -    return false; | 
| -  } | 
| -  return true; | 
| -} | 
| - | 
| -bool LevelDbAppNotificationStorage::Delete(const std::string& extension_id) { | 
| -  CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| - | 
| -  if (!OpenDbIfNeeded(false)) | 
| -    return false; | 
| - | 
| -  if (!db_.get()) | 
| -    return true; // The database doesn't exist on disk. | 
| - | 
| -  // Leveldb does not consider it an error if the key to delete isn't present, | 
| -  // so we don't bother checking that first. | 
| -  leveldb::Status status = db_->Delete(leveldb::WriteOptions(), extension_id); | 
| - | 
| -  if (!status.ok()) { | 
| -    LogLevelDbError(FROM_HERE, status); | 
| -    return false; | 
| -  } | 
| -  return true; | 
| -} | 
| - | 
| -bool LevelDbAppNotificationStorage::OpenDbIfNeeded(bool create_if_missing) { | 
| -  CHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| - | 
| -  if (db_.get()) | 
| -    return true; | 
| - | 
| -  // If the file doesn't exist and the caller doesn't want it created, just | 
| -  // return early. | 
| -  if (!create_if_missing && !file_util::PathExists(path_)) | 
| -    return true; | 
| - | 
| -#if defined(OS_POSIX) | 
| -  std::string os_path = path_.value(); | 
| -#elif defined(OS_WIN) | 
| -  std::string os_path = base::SysWideToUTF8(path_.value()); | 
| -#endif | 
| - | 
| -  leveldb::Options options; | 
| -  options.create_if_missing = true; | 
| -  leveldb::DB* db = NULL; | 
| -  leveldb::Status status = leveldb::DB::Open(options, os_path, &db); | 
| -  if (!status.ok()) { | 
| -    LogLevelDbError(FROM_HERE, status); | 
| -    return false; | 
| -  } | 
| -  db_.reset(db); | 
| -  return true; | 
| -} | 
| - | 
| -}  // namespace extensions | 
|  |