Home | History | Annotate | Download | only in importer
      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_IMPORTER_SAFARI_IMPORTER_H_
      6 #define CHROME_BROWSER_IMPORTER_SAFARI_IMPORTER_H_
      7 #pragma once
      8 
      9 #include <map>
     10 #include <set>
     11 #include <vector>
     12 
     13 #include "base/basictypes.h"
     14 #include "base/compiler_specific.h"
     15 #include "base/file_path.h"
     16 #include "base/gtest_prod_util.h"
     17 #include "chrome/browser/importer/importer.h"
     18 #include "chrome/browser/importer/profile_writer.h"
     19 
     20 #if __OBJC__
     21 @class NSDictionary;
     22 @class NSString;
     23 #else
     24 class NSDictionary;
     25 class NSString;
     26 #endif
     27 
     28 class GURL;
     29 
     30 namespace history {
     31 class URLRow;
     32 struct ImportedFaviconUsage;
     33 }
     34 
     35 namespace sql {
     36 class Connection;
     37 }
     38 
     39 // Importer for Safari on OS X.
     40 class SafariImporter : public Importer {
     41  public:
     42   // |library_dir| is the full path to the ~/Library directory,
     43   // We pass it in as a parameter for testing purposes.
     44   explicit SafariImporter(const FilePath& library_dir);
     45 
     46   // Importer:
     47   virtual void StartImport(const importer::SourceProfile& source_profile,
     48                            uint16 items,
     49                            ImporterBridge* bridge) OVERRIDE;
     50 
     51  // Does this user account have a Safari Profile and if so, what items
     52  // are supported?
     53  // in: library_dir - ~/Library or a standin for testing purposes.
     54  // out: services_supported - the service supported for import.
     55  // Returns true if we can import the Safari profile.
     56  static bool CanImport(const FilePath& library_dir, uint16* services_supported);
     57 
     58  private:
     59   FRIEND_TEST_ALL_PREFIXES(SafariImporterTest, BookmarkImport);
     60   FRIEND_TEST_ALL_PREFIXES(SafariImporterTest, FaviconImport);
     61   FRIEND_TEST_ALL_PREFIXES(SafariImporterTest, HistoryImport);
     62 
     63   virtual ~SafariImporter();
     64 
     65   // Multiple URLs can share the same favicon; this is a map
     66   // of URLs -> IconIDs that we load as a temporary step before
     67   // actually loading the icons.
     68   typedef std::map<int64, std::set<GURL> > FaviconMap;
     69 
     70   void ImportBookmarks();
     71   void ImportPasswords();
     72   void ImportHistory();
     73 
     74   // Parse Safari's stored bookmarks.
     75   void ParseBookmarks(std::vector<ProfileWriter::BookmarkEntry>* bookmarks);
     76 
     77   // Function to recursively read Bookmarks out of Safari plist.
     78   // |bookmark_folder| The dictionary containing a folder to parse.
     79   // |parent_path_elements| Path elements up to this point.
     80   // |is_in_toolbar| Is this folder in the toolbar.
     81   // |out_bookmarks| BookMark element array to write into.
     82   void RecursiveReadBookmarksFolder(
     83       NSDictionary* bookmark_folder,
     84       const std::vector<string16>& parent_path_elements,
     85       bool is_in_toolbar,
     86       std::vector<ProfileWriter::BookmarkEntry>* out_bookmarks);
     87 
     88   // Converts history time stored by Safari as a double serialized as a string,
     89   // to seconds-since-UNIX-Ephoch-format used by Chrome.
     90   double HistoryTimeToEpochTime(NSString* history_time);
     91 
     92   // Parses Safari's history and loads it into the input array.
     93   void ParseHistoryItems(std::vector<history::URLRow>* history_items);
     94 
     95   // Opens the favicon database file.
     96   bool OpenDatabase(sql::Connection* db);
     97 
     98   // Loads the urls associated with the favicons into favicon_map;
     99   void ImportFaviconURLs(sql::Connection* db, FaviconMap* favicon_map);
    100 
    101   // Loads and reencodes the individual favicons.
    102   void LoadFaviconData(sql::Connection* db,
    103                        const FaviconMap& favicon_map,
    104                        std::vector<history::ImportedFaviconUsage>* favicons);
    105 
    106   FilePath library_dir_;
    107 
    108   DISALLOW_COPY_AND_ASSIGN(SafariImporter);
    109 };
    110 
    111 #endif  // CHROME_BROWSER_IMPORTER_SAFARI_IMPORTER_H_
    112