| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "components/dom_distiller/core/dom_distiller_store.h" | 5 #include "components/dom_distiller/core/dom_distiller_store.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 // Statistics are logged to UMA with this string as part of histogram name. They | 32 // Statistics are logged to UMA with this string as part of histogram name. They |
| 33 // can all be found under LevelDB.*.DomDistillerStore. Changing this needs to | 33 // can all be found under LevelDB.*.DomDistillerStore. Changing this needs to |
| 34 // synchronize with histograms.xml, AND will also become incompatible with older | 34 // synchronize with histograms.xml, AND will also become incompatible with older |
| 35 // browsers still reporting the previous values. | 35 // browsers still reporting the previous values. |
| 36 const char kDatabaseUMAClientName[] = "DomDistillerStore"; | 36 const char kDatabaseUMAClientName[] = "DomDistillerStore"; |
| 37 } | 37 } |
| 38 | 38 |
| 39 namespace dom_distiller { | 39 namespace dom_distiller { |
| 40 | 40 |
| 41 DomDistillerStore::DomDistillerStore( | 41 DomDistillerStore::DomDistillerStore( |
| 42 scoped_ptr<ProtoDatabase<ArticleEntry>> database, | 42 std::unique_ptr<ProtoDatabase<ArticleEntry>> database, |
| 43 const base::FilePath& database_dir) | 43 const base::FilePath& database_dir) |
| 44 : database_(std::move(database)), | 44 : database_(std::move(database)), |
| 45 database_loaded_(false), | 45 database_loaded_(false), |
| 46 attachment_store_(syncer::AttachmentStore::CreateInMemoryStore()), | 46 attachment_store_(syncer::AttachmentStore::CreateInMemoryStore()), |
| 47 weak_ptr_factory_(this) { | 47 weak_ptr_factory_(this) { |
| 48 database_->Init(kDatabaseUMAClientName, database_dir, | 48 database_->Init(kDatabaseUMAClientName, database_dir, |
| 49 base::Bind(&DomDistillerStore::OnDatabaseInit, | 49 base::Bind(&DomDistillerStore::OnDatabaseInit, |
| 50 weak_ptr_factory_.GetWeakPtr())); | 50 weak_ptr_factory_.GetWeakPtr())); |
| 51 } | 51 } |
| 52 | 52 |
| 53 DomDistillerStore::DomDistillerStore( | 53 DomDistillerStore::DomDistillerStore( |
| 54 scoped_ptr<ProtoDatabase<ArticleEntry>> database, | 54 std::unique_ptr<ProtoDatabase<ArticleEntry>> database, |
| 55 const std::vector<ArticleEntry>& initial_data, | 55 const std::vector<ArticleEntry>& initial_data, |
| 56 const base::FilePath& database_dir) | 56 const base::FilePath& database_dir) |
| 57 : database_(std::move(database)), | 57 : database_(std::move(database)), |
| 58 database_loaded_(false), | 58 database_loaded_(false), |
| 59 attachment_store_(syncer::AttachmentStore::CreateInMemoryStore()), | 59 attachment_store_(syncer::AttachmentStore::CreateInMemoryStore()), |
| 60 model_(initial_data), | 60 model_(initial_data), |
| 61 weak_ptr_factory_(this) { | 61 weak_ptr_factory_(this) { |
| 62 database_->Init(kDatabaseUMAClientName, database_dir, | 62 database_->Init(kDatabaseUMAClientName, database_dir, |
| 63 base::Bind(&DomDistillerStore::OnDatabaseInit, | 63 base::Bind(&DomDistillerStore::OnDatabaseInit, |
| 64 weak_ptr_factory_.GetWeakPtr())); | 64 weak_ptr_factory_.GetWeakPtr())); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 75 ArticleEntry* entry) { | 75 ArticleEntry* entry) { |
| 76 return model_.GetEntryById(entry_id, entry); | 76 return model_.GetEntryById(entry_id, entry); |
| 77 } | 77 } |
| 78 | 78 |
| 79 bool DomDistillerStore::GetEntryByUrl(const GURL& url, ArticleEntry* entry) { | 79 bool DomDistillerStore::GetEntryByUrl(const GURL& url, ArticleEntry* entry) { |
| 80 return model_.GetEntryByUrl(url, entry); | 80 return model_.GetEntryByUrl(url, entry); |
| 81 } | 81 } |
| 82 | 82 |
| 83 void DomDistillerStore::UpdateAttachments( | 83 void DomDistillerStore::UpdateAttachments( |
| 84 const std::string& entry_id, | 84 const std::string& entry_id, |
| 85 scoped_ptr<ArticleAttachmentsData> attachments_data, | 85 std::unique_ptr<ArticleAttachmentsData> attachments_data, |
| 86 const UpdateAttachmentsCallback& callback) { | 86 const UpdateAttachmentsCallback& callback) { |
| 87 if (!GetEntryById(entry_id, nullptr)) { | 87 if (!GetEntryById(entry_id, nullptr)) { |
| 88 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, | 88 base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, |
| 89 base::Bind(callback, false)); | 89 base::Bind(callback, false)); |
| 90 } | 90 } |
| 91 | 91 |
| 92 scoped_ptr<sync_pb::ArticleAttachments> article_attachments( | 92 std::unique_ptr<sync_pb::ArticleAttachments> article_attachments( |
| 93 new sync_pb::ArticleAttachments()); | 93 new sync_pb::ArticleAttachments()); |
| 94 syncer::AttachmentList attachment_list; | 94 syncer::AttachmentList attachment_list; |
| 95 attachments_data->CreateSyncAttachments(&attachment_list, | 95 attachments_data->CreateSyncAttachments(&attachment_list, |
| 96 article_attachments.get()); | 96 article_attachments.get()); |
| 97 | 97 |
| 98 attachment_store_->Write( | 98 attachment_store_->Write( |
| 99 attachment_list, | 99 attachment_list, |
| 100 base::Bind(&DomDistillerStore::OnAttachmentsWrite, | 100 base::Bind(&DomDistillerStore::OnAttachmentsWrite, |
| 101 weak_ptr_factory_.GetWeakPtr(), entry_id, | 101 weak_ptr_factory_.GetWeakPtr(), entry_id, |
| 102 base::Passed(&article_attachments), callback)); | 102 base::Passed(&article_attachments), callback)); |
| 103 } | 103 } |
| 104 | 104 |
| 105 void DomDistillerStore::OnAttachmentsWrite( | 105 void DomDistillerStore::OnAttachmentsWrite( |
| 106 const std::string& entry_id, | 106 const std::string& entry_id, |
| 107 scoped_ptr<sync_pb::ArticleAttachments> article_attachments, | 107 std::unique_ptr<sync_pb::ArticleAttachments> article_attachments, |
| 108 const UpdateAttachmentsCallback& callback, | 108 const UpdateAttachmentsCallback& callback, |
| 109 const syncer::AttachmentStore::Result& result) { | 109 const syncer::AttachmentStore::Result& result) { |
| 110 bool success = false; | 110 bool success = false; |
| 111 switch (result) { | 111 switch (result) { |
| 112 case syncer::AttachmentStore::UNSPECIFIED_ERROR: | 112 case syncer::AttachmentStore::UNSPECIFIED_ERROR: |
| 113 case syncer::AttachmentStore::STORE_INITIALIZATION_FAILED: | 113 case syncer::AttachmentStore::STORE_INITIALIZATION_FAILED: |
| 114 break; | 114 break; |
| 115 case syncer::AttachmentStore::SUCCESS: | 115 case syncer::AttachmentStore::SUCCESS: |
| 116 success = true; | 116 success = true; |
| 117 break; | 117 break; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 attachment_store_->Read(GetAttachmentIds(entry.attachments()), | 167 attachment_store_->Read(GetAttachmentIds(entry.attachments()), |
| 168 base::Bind(&DomDistillerStore::OnAttachmentsRead, | 168 base::Bind(&DomDistillerStore::OnAttachmentsRead, |
| 169 weak_ptr_factory_.GetWeakPtr(), | 169 weak_ptr_factory_.GetWeakPtr(), |
| 170 entry.attachments(), callback)); | 170 entry.attachments(), callback)); |
| 171 } | 171 } |
| 172 | 172 |
| 173 void DomDistillerStore::OnAttachmentsRead( | 173 void DomDistillerStore::OnAttachmentsRead( |
| 174 const sync_pb::ArticleAttachments& attachments_proto, | 174 const sync_pb::ArticleAttachments& attachments_proto, |
| 175 const GetAttachmentsCallback& callback, | 175 const GetAttachmentsCallback& callback, |
| 176 const syncer::AttachmentStore::Result& result, | 176 const syncer::AttachmentStore::Result& result, |
| 177 scoped_ptr<syncer::AttachmentMap> attachments, | 177 std::unique_ptr<syncer::AttachmentMap> attachments, |
| 178 scoped_ptr<syncer::AttachmentIdList> missing) { | 178 std::unique_ptr<syncer::AttachmentIdList> missing) { |
| 179 bool success = false; | 179 bool success = false; |
| 180 switch (result) { | 180 switch (result) { |
| 181 case syncer::AttachmentStore::UNSPECIFIED_ERROR: | 181 case syncer::AttachmentStore::UNSPECIFIED_ERROR: |
| 182 case syncer::AttachmentStore::STORE_INITIALIZATION_FAILED: | 182 case syncer::AttachmentStore::STORE_INITIALIZATION_FAILED: |
| 183 break; | 183 break; |
| 184 case syncer::AttachmentStore::SUCCESS: | 184 case syncer::AttachmentStore::SUCCESS: |
| 185 DCHECK(missing->empty()); | 185 DCHECK(missing->empty()); |
| 186 success = true; | 186 success = true; |
| 187 break; | 187 break; |
| 188 } | 188 } |
| 189 scoped_ptr<ArticleAttachmentsData> attachments_data; | 189 std::unique_ptr<ArticleAttachmentsData> attachments_data; |
| 190 if (success) { | 190 if (success) { |
| 191 attachments_data = ArticleAttachmentsData::GetFromAttachmentMap( | 191 attachments_data = ArticleAttachmentsData::GetFromAttachmentMap( |
| 192 attachments_proto, *attachments); | 192 attachments_proto, *attachments); |
| 193 } | 193 } |
| 194 base::ThreadTaskRunnerHandle::Get()->PostTask( | 194 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 195 FROM_HERE, | 195 FROM_HERE, |
| 196 base::Bind(callback, success, base::Passed(&attachments_data))); | 196 base::Bind(callback, success, base::Passed(&attachments_data))); |
| 197 } | 197 } |
| 198 | 198 |
| 199 bool DomDistillerStore::AddEntry(const ArticleEntry& entry) { | 199 bool DomDistillerStore::AddEntry(const ArticleEntry& entry) { |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 void DomDistillerStore::RemoveObserver(DomDistillerObserver* observer) { | 272 void DomDistillerStore::RemoveObserver(DomDistillerObserver* observer) { |
| 273 observers_.RemoveObserver(observer); | 273 observers_.RemoveObserver(observer); |
| 274 } | 274 } |
| 275 | 275 |
| 276 std::vector<ArticleEntry> DomDistillerStore::GetEntries() const { | 276 std::vector<ArticleEntry> DomDistillerStore::GetEntries() const { |
| 277 return model_.GetEntries(); | 277 return model_.GetEntries(); |
| 278 } | 278 } |
| 279 | 279 |
| 280 // syncer::SyncableService implementation. | 280 // syncer::SyncableService implementation. |
| 281 SyncMergeResult DomDistillerStore::MergeDataAndStartSyncing( | 281 SyncMergeResult DomDistillerStore::MergeDataAndStartSyncing( |
| 282 ModelType type, const SyncDataList& initial_sync_data, | 282 ModelType type, |
| 283 scoped_ptr<syncer::SyncChangeProcessor> sync_processor, | 283 const SyncDataList& initial_sync_data, |
| 284 scoped_ptr<syncer::SyncErrorFactory> error_handler) { | 284 std::unique_ptr<syncer::SyncChangeProcessor> sync_processor, |
| 285 std::unique_ptr<syncer::SyncErrorFactory> error_handler) { |
| 285 DCHECK_EQ(syncer::ARTICLES, type); | 286 DCHECK_EQ(syncer::ARTICLES, type); |
| 286 DCHECK(!sync_processor_); | 287 DCHECK(!sync_processor_); |
| 287 DCHECK(!error_factory_); | 288 DCHECK(!error_factory_); |
| 288 sync_processor_.reset(sync_processor.release()); | 289 sync_processor_.reset(sync_processor.release()); |
| 289 error_factory_.reset(error_handler.release()); | 290 error_factory_.reset(error_handler.release()); |
| 290 | 291 |
| 291 SyncChangeList database_changes; | 292 SyncChangeList database_changes; |
| 292 SyncChangeList sync_changes; | 293 SyncChangeList sync_changes; |
| 293 SyncMergeResult result = | 294 SyncMergeResult result = |
| 294 MergeDataWithModel(initial_sync_data, &database_changes, &sync_changes); | 295 MergeDataWithModel(initial_sync_data, &database_changes, &sync_changes); |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 if (!success) { | 362 if (!success) { |
| 362 DVLOG(1) << "DOM Distiller database init failed."; | 363 DVLOG(1) << "DOM Distiller database init failed."; |
| 363 database_.reset(); | 364 database_.reset(); |
| 364 return; | 365 return; |
| 365 } | 366 } |
| 366 database_->LoadEntries(base::Bind(&DomDistillerStore::OnDatabaseLoad, | 367 database_->LoadEntries(base::Bind(&DomDistillerStore::OnDatabaseLoad, |
| 367 weak_ptr_factory_.GetWeakPtr())); | 368 weak_ptr_factory_.GetWeakPtr())); |
| 368 } | 369 } |
| 369 | 370 |
| 370 void DomDistillerStore::OnDatabaseLoad(bool success, | 371 void DomDistillerStore::OnDatabaseLoad(bool success, |
| 371 scoped_ptr<EntryVector> entries) { | 372 std::unique_ptr<EntryVector> entries) { |
| 372 if (!success) { | 373 if (!success) { |
| 373 DVLOG(1) << "DOM Distiller database load failed."; | 374 DVLOG(1) << "DOM Distiller database load failed."; |
| 374 database_.reset(); | 375 database_.reset(); |
| 375 return; | 376 return; |
| 376 } | 377 } |
| 377 database_loaded_ = true; | 378 database_loaded_ = true; |
| 378 | 379 |
| 379 SyncDataList data; | 380 SyncDataList data; |
| 380 for (EntryVector::iterator it = entries->begin(); it != entries->end(); | 381 for (EntryVector::iterator it = entries->begin(); it != entries->end(); |
| 381 ++it) { | 382 ++it) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 417 } | 418 } |
| 418 | 419 |
| 419 bool DomDistillerStore::ApplyChangesToDatabase( | 420 bool DomDistillerStore::ApplyChangesToDatabase( |
| 420 const SyncChangeList& change_list) { | 421 const SyncChangeList& change_list) { |
| 421 if (!database_loaded_) { | 422 if (!database_loaded_) { |
| 422 return false; | 423 return false; |
| 423 } | 424 } |
| 424 if (change_list.empty()) { | 425 if (change_list.empty()) { |
| 425 return true; | 426 return true; |
| 426 } | 427 } |
| 427 scoped_ptr<ProtoDatabase<ArticleEntry>::KeyEntryVector> entries_to_save( | 428 std::unique_ptr<ProtoDatabase<ArticleEntry>::KeyEntryVector> entries_to_save( |
| 428 new ProtoDatabase<ArticleEntry>::KeyEntryVector()); | 429 new ProtoDatabase<ArticleEntry>::KeyEntryVector()); |
| 429 scoped_ptr<std::vector<std::string> > keys_to_remove( | 430 std::unique_ptr<std::vector<std::string>> keys_to_remove( |
| 430 new std::vector<std::string>()); | 431 new std::vector<std::string>()); |
| 431 | 432 |
| 432 for (SyncChangeList::const_iterator it = change_list.begin(); | 433 for (SyncChangeList::const_iterator it = change_list.begin(); |
| 433 it != change_list.end(); ++it) { | 434 it != change_list.end(); ++it) { |
| 434 if (it->change_type() == SyncChange::ACTION_DELETE) { | 435 if (it->change_type() == SyncChange::ACTION_DELETE) { |
| 435 ArticleEntry entry = GetEntryFromChange(*it); | 436 ArticleEntry entry = GetEntryFromChange(*it); |
| 436 keys_to_remove->push_back(entry.entry_id()); | 437 keys_to_remove->push_back(entry.entry_id()); |
| 437 } else { | 438 } else { |
| 438 ArticleEntry entry = GetEntryFromChange(*it); | 439 ArticleEntry entry = GetEntryFromChange(*it); |
| 439 entries_to_save->push_back(std::make_pair(entry.entry_id(), entry)); | 440 entries_to_save->push_back(std::make_pair(entry.entry_id(), entry)); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 483 result.set_num_items_deleted(0); | 484 result.set_num_items_deleted(0); |
| 484 | 485 |
| 485 result.set_pre_association_version(0); | 486 result.set_pre_association_version(0); |
| 486 result.set_num_items_after_association(model_.GetNumEntries()); | 487 result.set_num_items_after_association(model_.GetNumEntries()); |
| 487 result.set_error(error); | 488 result.set_error(error); |
| 488 | 489 |
| 489 return result; | 490 return result; |
| 490 } | 491 } |
| 491 | 492 |
| 492 } // namespace dom_distiller | 493 } // namespace dom_distiller |
| OLD | NEW |