• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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