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