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 |