Home | History | Annotate | Download | only in bookmarks
      1 // Copyright (c) 2011 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 CHROME_BROWSER_BOOKMARKS_BOOKMARK_HTML_WRITER_H_
      6 #define CHROME_BROWSER_BOOKMARKS_BOOKMARK_HTML_WRITER_H_
      7 #pragma once
      8 
      9 #include <list>
     10 #include <map>
     11 #include <string>
     12 
     13 #include "base/memory/ref_counted.h"
     14 #include "chrome/browser/history/history.h"
     15 #include "content/common/notification_registrar.h"
     16 #include "net/base/file_stream.h"
     17 
     18 class BookmarkNode;
     19 class FilePath;
     20 class GURL;
     21 class Profile;
     22 
     23 // Observer for bookmark html output. Used only in tests.
     24 class BookmarksExportObserver {
     25  public:
     26   // Is invoked on the IO thread.
     27   virtual void OnExportFinished() = 0;
     28 
     29  protected:
     30   virtual ~BookmarksExportObserver() {}
     31 };
     32 
     33 // Class that fetches favicons for list of bookmarks and
     34 // then starts Writer which outputs bookmarks and favicons to html file.
     35 // Should be used only by WriteBookmarks function.
     36 class BookmarkFaviconFetcher: public NotificationObserver {
     37  public:
     38   // Map of URL and corresponding favicons.
     39   typedef std::map<std::string, scoped_refptr<RefCountedMemory> > URLFaviconMap;
     40 
     41   BookmarkFaviconFetcher(Profile* profile,
     42                          const FilePath& path,
     43                          BookmarksExportObserver* observer);
     44   ~BookmarkFaviconFetcher();
     45 
     46   // Executes bookmark export process.
     47   void ExportBookmarks();
     48 
     49   // NotificationObserver implementation.
     50   virtual void Observe(NotificationType type,
     51                        const NotificationSource& source,
     52                        const NotificationDetails& details);
     53 
     54  private:
     55   // Recursively extracts URLs from bookmarks.
     56   void ExtractUrls(const BookmarkNode* node);
     57 
     58   // Executes Writer task that writes bookmarks data to html file.
     59   void ExecuteWriter();
     60 
     61   // Starts async fetch for the next bookmark favicon.
     62   // Takes single url from bookmark_urls_ and removes it from the list.
     63   // Returns true if there are more favicons to extract.
     64   bool FetchNextFavicon();
     65 
     66   // Favicon fetch callback. After all favicons are fetched executes
     67   // html output on the file thread.
     68   void OnFaviconDataAvailable(FaviconService::Handle handle,
     69                               history::FaviconData favicon);
     70 
     71   // The Profile object used for accessing FaviconService, bookmarks model.
     72   Profile* profile_;
     73 
     74   // All URLs that are extracted from bookmarks. Used to fetch favicons
     75   // for each of them. After favicon is fetched top url is removed from list.
     76   std::list<std::string> bookmark_urls_;
     77 
     78   // Consumer for requesting favicons.
     79   CancelableRequestConsumer favicon_consumer_;
     80 
     81   // Map that stores favicon per URL.
     82   scoped_ptr<URLFaviconMap> favicons_map_;
     83 
     84   // Path where html output is stored.
     85   FilePath path_;
     86 
     87   BookmarksExportObserver* observer_;
     88 
     89   NotificationRegistrar registrar_;
     90 
     91   DISALLOW_COPY_AND_ASSIGN(BookmarkFaviconFetcher);
     92 };
     93 
     94 namespace bookmark_html_writer {
     95 
     96 // Writes the bookmarks out in the 'bookmarks.html' format understood by
     97 // Firefox and IE. The results are written to the file at |path|.  The file
     98 // thread is used.
     99 // Before writing to the file favicons are fetched on the main thread.
    100 // TODO(sky): need a callback on failure.
    101 void WriteBookmarks(Profile* profile,
    102                     const FilePath& path,
    103                     BookmarksExportObserver* observer);
    104 
    105 }  // namespace bookmark_html_writer
    106 
    107 #endif  // CHROME_BROWSER_BOOKMARKS_BOOKMARK_HTML_WRITER_H_
    108