15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#ifndef CHROME_UTILITY_IMPORTER_SAFARI_IMPORTER_H_
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define CHROME_UTILITY_IMPORTER_SAFARI_IMPORTER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/importer/importer_url_row.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/utility/importer/importer.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if __OBJC__
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class NSDictionary;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)@class NSString;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NSDictionary;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NSString;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
28a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)struct ImportedBookmarkEntry;
29a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)struct ImportedFaviconUsage;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace sql {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Connection;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Importer for Safari on OS X.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SafariImporter : public Importer {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |library_dir| is the full path to the ~/Library directory,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We pass it in as a parameter for testing purposes.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit SafariImporter(const base::FilePath& library_dir);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Importer:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void StartImport(const importer::SourceProfile& source_profile,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           uint16 items,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           ImporterBridge* bridge) OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SafariImporterTest, BookmarkImport);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SafariImporterTest, FaviconImport);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SafariImporterTest, HistoryImport);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~SafariImporter();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Multiple URLs can share the same favicon; this is a map
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of URLs -> IconIDs that we load as a temporary step before
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // actually loading the icons.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<int64, std::set<GURL> > FaviconMap;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ImportBookmarks();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ImportPasswords();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ImportHistory();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parse Safari's stored bookmarks.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ParseBookmarks(const string16& toolbar_name,
65a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                      std::vector<ImportedBookmarkEntry>* bookmarks);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Function to recursively read Bookmarks out of Safari plist.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |bookmark_folder| The dictionary containing a folder to parse.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |parent_path_elements| Path elements up to this point.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |is_in_toolbar| Is this folder in the toolbar.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |out_bookmarks| BookMark element array to write into.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RecursiveReadBookmarksFolder(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NSDictionary* bookmark_folder,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::vector<string16>& parent_path_elements,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool is_in_toolbar,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const string16& toolbar_name,
77a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      std::vector<ImportedBookmarkEntry>* out_bookmarks);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts history time stored by Safari as a double serialized as a string,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // to seconds-since-UNIX-Ephoch-format used by Chrome.
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  double HistoryTimeToEpochTime(NSString* history_time);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses Safari's history and loads it into the input array.
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void ParseHistoryItems(std::vector<ImporterURLRow>* history_items);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Opens the favicon database file.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool OpenDatabase(sql::Connection* db);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads the urls associated with the favicons into favicon_map;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ImportFaviconURLs(sql::Connection* db, FaviconMap* favicon_map);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads and reencodes the individual favicons.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadFaviconData(sql::Connection* db,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const FaviconMap& favicon_map,
95a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                       std::vector<ImportedFaviconUsage>* favicons);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath library_dir_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SafariImporter);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif  // CHROME_UTILITY_IMPORTER_SAFARI_IMPORTER_H_
103