| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <memory> | |
| 6 | |
| 7 #include "base/callback.h" | |
| 8 #include "base/message_loop/message_loop.h" | |
| 9 #include "components/safe_browsing_db/v4_database.h" | 5 #include "components/safe_browsing_db/v4_database.h" |
| 10 #include "content/public/browser/browser_thread.h" | |
| 11 | |
| 12 using content::BrowserThread; | |
| 13 | 6 |
| 14 namespace safe_browsing { | 7 namespace safe_browsing { |
| 15 | 8 |
| 16 namespace { | |
| 17 | |
| 18 V4Store* CreateStore( | |
| 19 const scoped_refptr<base::SequencedTaskRunner>& task_runner, | |
| 20 const base::FilePath& store_path) { | |
| 21 return new V4Store(task_runner, store_path); | |
| 22 } | |
| 23 | |
| 24 } // namespace | |
| 25 | |
| 26 // static | 9 // static |
| 27 V4DatabaseFactory* V4Database::factory_ = NULL; | 10 V4DatabaseFactory* V4Database::factory_ = NULL; |
| 28 | 11 |
| 29 // static | 12 // static |
| 30 void V4Database::Create( | 13 // Factory method, should be called on the Safe Browsing sequenced task runner, |
| 14 // which is also passed to the function as |db_task_runner|. |
| 15 V4Database* V4Database::Create( |
| 31 const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, | 16 const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, |
| 32 const base::FilePath& base_path, | 17 const base::FilePath& base_path, |
| 33 ListInfoMap list_info_map, | 18 ListInfoMap list_info_map) { |
| 34 NewDatabaseReadyCallback callback) { | |
| 35 const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner = | |
| 36 base::MessageLoop::current()->task_runner(); | |
| 37 db_task_runner->PostTask( | |
| 38 FROM_HERE, | |
| 39 base::Bind(&V4Database::CreateOnTaskRunner, db_task_runner, base_path, | |
| 40 list_info_map, callback_task_runner, callback)); | |
| 41 } | |
| 42 | |
| 43 // static | |
| 44 void V4Database::CreateOnTaskRunner( | |
| 45 const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, | |
| 46 const base::FilePath& base_path, | |
| 47 ListInfoMap list_info_map, | |
| 48 const scoped_refptr<base::SingleThreadTaskRunner>& callback_task_runner, | |
| 49 NewDatabaseReadyCallback callback) { | |
| 50 DCHECK(db_task_runner->RunsTasksOnCurrentThread()); | 19 DCHECK(db_task_runner->RunsTasksOnCurrentThread()); |
| 51 DCHECK(!base_path.empty()); | |
| 52 | |
| 53 std::unique_ptr<V4Database> v4_database; | |
| 54 if (!factory_) { | 20 if (!factory_) { |
| 55 StoreMap store_map; | 21 StoreMap store_map; |
| 56 | 22 // TODO(vakh): Populate the store_map using list_suffix_map. |
| 57 for (const auto& list_info : list_info_map) { | 23 return new V4Database(db_task_runner, std::move(store_map)); |
| 58 UpdateListIdentifier update_list_identifier = list_info.first; | |
| 59 const base::FilePath::CharType suffix = list_info.second; | |
| 60 | |
| 61 const base::FilePath store_path = | |
| 62 base::FilePath(base_path.value() + suffix); | |
| 63 (*store_map)[update_list_identifier].reset( | |
| 64 CreateStore(db_task_runner, store_path)); | |
| 65 } | |
| 66 | |
| 67 v4_database.reset(new V4Database(db_task_runner, std::move(store_map))); | |
| 68 } else { | 24 } else { |
| 69 v4_database.reset( | 25 return factory_->CreateV4Database(db_task_runner, base_path, list_info_map); |
| 70 factory_->CreateV4Database(db_task_runner, base_path, list_info_map)); | |
| 71 } | 26 } |
| 72 callback_task_runner->PostTask( | |
| 73 FROM_HERE, base::Bind(callback, base::Passed(&v4_database))); | |
| 74 } | 27 } |
| 75 | 28 |
| 76 V4Database::V4Database( | 29 V4Database::V4Database( |
| 77 const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, | 30 const scoped_refptr<base::SequencedTaskRunner>& db_task_runner, |
| 78 StoreMap store_map) | 31 StoreMap store_map) { |
| 79 : db_task_runner_(db_task_runner), store_map_(std::move(store_map)) { | |
| 80 DCHECK(db_task_runner->RunsTasksOnCurrentThread()); | |
| 81 // TODO(vakh): Implement skeleton | 32 // TODO(vakh): Implement skeleton |
| 82 } | 33 } |
| 83 | 34 |
| 84 // static | |
| 85 void V4Database::Destroy(std::unique_ptr<V4Database> v4_database) { | |
| 86 if (v4_database.get()) { | |
| 87 v4_database->db_task_runner_->DeleteSoon(FROM_HERE, v4_database.release()); | |
| 88 } | |
| 89 } | |
| 90 | |
| 91 V4Database::~V4Database() {} | 35 V4Database::~V4Database() {} |
| 92 | 36 |
| 93 bool V4Database::ResetDatabase() { | 37 bool V4Database::ResetDatabase() { |
| 94 DCHECK(db_task_runner_->RunsTasksOnCurrentThread()); | 38 // TODO(vakh): Delete the stores. Delete the backing files. |
| 95 bool reset_success = true; | 39 return true; |
| 96 for (const auto& store_id_and_store : *store_map_) { | |
| 97 if (!store_id_and_store.second->Reset()) { | |
| 98 reset_success = false; | |
| 99 } | |
| 100 } | |
| 101 return reset_success; | |
| 102 } | 40 } |
| 103 | 41 |
| 104 } // namespace safe_browsing | 42 } // namespace safe_browsing |
| OLD | NEW |