Home | History | Annotate | Download | only in core
      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