1 // Copyright 2014 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_CONTENT_STORE_H_ 6 #define COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_CONTENT_STORE_H_ 7 8 #include <string> 9 10 #include "base/bind.h" 11 #include "base/containers/hash_tables.h" 12 #include "base/containers/mru_cache.h" 13 #include "components/dom_distiller/core/article_entry.h" 14 #include "components/dom_distiller/core/proto/distilled_article.pb.h" 15 16 namespace dom_distiller { 17 18 // The maximum number of items to keep in the cache before deleting some. 19 const int kDefaultMaxNumCachedEntries = 32; 20 21 // This is a simple interface for saving and loading of distilled content for an 22 // ArticleEntry. 23 class DistilledContentStore { 24 public: 25 typedef base::Callback< 26 void(bool /* success */, scoped_ptr<DistilledArticleProto>)> LoadCallback; 27 typedef base::Callback<void(bool /* success */)> SaveCallback; 28 29 virtual void SaveContent(const ArticleEntry& entry, 30 const DistilledArticleProto& proto, 31 SaveCallback callback) = 0; 32 virtual void LoadContent(const ArticleEntry& entry, 33 LoadCallback callback) = 0; 34 35 DistilledContentStore() {}; 36 virtual ~DistilledContentStore() {}; 37 38 private: 39 DISALLOW_COPY_AND_ASSIGN(DistilledContentStore); 40 }; 41 42 // This content store keeps up to |max_num_entries| of the last accessed items 43 // in its cache. Both loading and saving content is counted as access. 44 // Lookup can be done based on entry ID or URL. 45 class InMemoryContentStore : public DistilledContentStore { 46 public: 47 explicit InMemoryContentStore(const int max_num_entries); 48 virtual ~InMemoryContentStore(); 49 50 // DistilledContentStore implementation 51 virtual void SaveContent(const ArticleEntry& entry, 52 const DistilledArticleProto& proto, 53 SaveCallback callback) OVERRIDE; 54 virtual void LoadContent(const ArticleEntry& entry, 55 LoadCallback callback) OVERRIDE; 56 57 // Synchronously saves the content. 58 void InjectContent(const ArticleEntry& entry, 59 const DistilledArticleProto& proto); 60 61 private: 62 // The CacheDeletor gets called when anything is removed from the ContentMap. 63 class CacheDeletor { 64 public: 65 explicit CacheDeletor(InMemoryContentStore* store); 66 ~CacheDeletor(); 67 void operator()(const DistilledArticleProto& proto); 68 69 private: 70 InMemoryContentStore* store_; 71 }; 72 73 void AddUrlToIdMapping(const ArticleEntry& entry, 74 const DistilledArticleProto& proto); 75 76 void EraseUrlToIdMapping(const DistilledArticleProto& proto); 77 78 typedef base::MRUCacheBase<std::string, 79 DistilledArticleProto, 80 InMemoryContentStore::CacheDeletor> ContentMap; 81 typedef base::hash_map<std::string, std::string> UrlMap; 82 83 ContentMap cache_; 84 UrlMap url_to_id_; 85 }; 86 87 } // dom_distiller 88 89 #endif // COMPONENTS_DOM_DISTILLER_CORE_DOM_DISTILLER_CONTENT_CACHE_H_ 90