• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
DistilledContentStore()35   DistilledContentStore() {};
~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