toolbar_importer.h revision ddb351dbec246cf1fab5ec20d2d5520909041de1
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// The functionality provided here allows the user to import their bookmarks
6// (favorites) from Google Toolbar.
7
8#ifndef CHROME_BROWSER_IMPORTER_TOOLBAR_IMPORTER_H_
9#define CHROME_BROWSER_IMPORTER_TOOLBAR_IMPORTER_H_
10#pragma once
11
12#include <string>
13#include <vector>
14
15#include "base/basictypes.h"
16#include "base/compiler_specific.h"
17#include "base/gtest_prod_util.h"
18#include "base/string16.h"
19#include "chrome/browser/importer/importer.h"
20#include "chrome/browser/importer/profile_writer.h"
21#include "chrome/common/net/url_fetcher.h"
22
23class ImporterBridge;
24class XmlReader;
25
26// Toolbar5Importer is a class which exposes the functionality needed to
27// communicate with the Google Toolbar v5 front-end, negotiate the download of
28// Toolbar bookmarks, parse them, and install them on the client.
29// Toolbar5Importer should not have StartImport called more than once. Futher
30// if StartImport is called, then the class must not be destroyed until it has
31// either completed or Toolbar5Importer->Cancel() has been called.
32class Toolbar5Importer : public URLFetcher::Delegate, public Importer {
33 public:
34  Toolbar5Importer();
35
36  // Begin Importer implementation:
37
38  // This method is called to begin the import process. |items| should only
39  // either be NONE or FAVORITES, since as of right now these are the only
40  // items this importer supports.
41  virtual void StartImport(const importer::SourceProfile& source_profile,
42                           uint16 items,
43                           ImporterBridge* bridge) OVERRIDE;
44
45  // This method is called when the user clicks the cancel button on the UI
46  // dialog. We need to post a message to our loop to cancel network retrieval.
47  virtual void Cancel() OVERRIDE;
48
49  // End Importer implementation.
50
51  // URLFetcher::Delegate method called back from the URLFetcher object.
52  virtual void OnURLFetchComplete(const URLFetcher* source,
53                                  const GURL& url,
54                                  const net::URLRequestStatus& status,
55                                  int response_code,
56                                  const ResponseCookies& cookies,
57                                  const std::string& data);
58
59 private:
60  FRIEND_TEST_ALL_PREFIXES(Toolbar5ImporterTest, BookmarkParse);
61
62  virtual ~Toolbar5Importer();
63
64  // Internal states of the toolbar importer.
65  enum InternalStateEnum {
66    NOT_USED = -1,
67    INITIALIZED,
68    GET_AUTHORIZATION_TOKEN,
69    GET_BOOKMARKS,
70    PARSE_BOOKMARKS,
71    DONE
72  };
73
74  typedef std::vector<string16> BookmarkFolderType;
75
76  // URLs for connecting to the toolbar front end are defined below.
77  static const char kT5AuthorizationTokenUrl[];
78  static const char kT5FrontEndUrlTemplate[];
79
80  // Token replacement tags are defined below.
81  static const char kRandomNumberToken[];
82  static const char kAuthorizationToken[];
83  static const char kAuthorizationTokenPrefix[];
84  static const char kAuthorizationTokenSuffix[];
85  static const char kMaxNumToken[];
86  static const char kMaxTimestampToken[];
87
88  // XML tag names are defined below.
89  static const char kXmlApiReplyXmlTag[];
90  static const char kBookmarksXmlTag[];
91  static const char kBookmarkXmlTag[];
92  static const char kTitleXmlTag[];
93  static const char kUrlXmlTag[];
94  static const char kTimestampXmlTag[];
95  static const char kLabelsXmlTag[];
96  static const char kLabelsXmlCloseTag[];
97  static const char kLabelXmlTag[];
98  static const char kAttributesXmlTag[];
99
100  // Flow control for asynchronous import is controlled by the methods below.
101  // ContinueImport is called back by each import action taken.  BeginXXX
102  // and EndXXX are responsible for updating the state of the asynchronous
103  // import.  EndImport is responsible for state cleanup and notifying the
104  // caller that import has completed.
105  void ContinueImport();
106  void EndImport();
107  void BeginImportBookmarks();
108  void EndImportBookmarks();
109
110  // Network I/O is done by the methods below.  These three methods are called
111  // in the order provided.  The last two are called back with the HTML
112  // response provided by the Toolbar server.
113  void GetAuthenticationFromServer();
114  void GetBookmarkDataFromServer(const std::string& response);
115  void GetBookmarksFromServerDataResponse(const std::string& response);
116
117  // XML Parsing is implemented with the methods below.
118  bool ParseAuthenticationTokenResponse(const std::string& response,
119                                        std::string* token);
120
121  static bool ParseBookmarksFromReader(
122      XmlReader* reader,
123      std::vector<ProfileWriter::BookmarkEntry>* bookmarks,
124      const string16& bookmark_group_string);
125
126  static bool LocateNextOpenTag(XmlReader* reader);
127  static bool LocateNextTagByName(XmlReader* reader, const std::string& tag);
128  static bool LocateNextTagWithStopByName(
129      XmlReader* reader,
130      const std::string& tag,
131      const std::string& stop);
132
133  static bool ExtractBookmarkInformation(
134      XmlReader* reader,
135      ProfileWriter::BookmarkEntry* bookmark_entry,
136      std::vector<BookmarkFolderType>* bookmark_folders,
137      const string16& bookmark_group_string);
138  static bool ExtractNamedValueFromXmlReader(XmlReader* reader,
139                                             const std::string& name,
140                                             std::string* buffer);
141  static bool ExtractTitleFromXmlReader(XmlReader* reader,
142                                        ProfileWriter::BookmarkEntry* entry);
143  static bool ExtractUrlFromXmlReader(XmlReader* reader,
144                                      ProfileWriter::BookmarkEntry* entry);
145  static bool ExtractTimeFromXmlReader(XmlReader* reader,
146                                       ProfileWriter::BookmarkEntry* entry);
147  static bool ExtractFoldersFromXmlReader(
148      XmlReader* reader,
149      std::vector<BookmarkFolderType>* bookmark_folders,
150      const string16& bookmark_group_string);
151
152  // Bookmark creation is done by the method below.
153  void AddBookmarksToChrome(
154      const std::vector<ProfileWriter::BookmarkEntry>& bookmarks);
155
156  InternalStateEnum state_;
157
158  // Bitmask of Importer::ImportItem.
159  uint16 items_to_import_;
160
161  // The fetchers need to be available to cancel the network call on user cancel
162  // hence they are stored as member variables.
163  URLFetcher* token_fetcher_;
164  URLFetcher* data_fetcher_;
165
166  DISALLOW_COPY_AND_ASSIGN(Toolbar5Importer);
167};
168
169#endif  // CHROME_BROWSER_IMPORTER_TOOLBAR_IMPORTER_H_
170