// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // The functionality provided here allows the user to import their bookmarks // (favorites) from Google Toolbar. #ifndef CHROME_BROWSER_IMPORTER_TOOLBAR_IMPORTER_H_ #define CHROME_BROWSER_IMPORTER_TOOLBAR_IMPORTER_H_ #pragma once #include #include #include "base/basictypes.h" #include "base/compiler_specific.h" #include "base/gtest_prod_util.h" #include "base/memory/ref_counted.h" #include "base/string16.h" #include "chrome/browser/importer/importer.h" #include "chrome/browser/importer/profile_writer.h" #include "net/url_request/url_fetcher_delegate.h" #include "net/url_request/url_request_context_getter.h" class ImporterBridge; class XmlReader; namespace net { class URLFetcher; } // namespace net // Toolbar5Importer is a class which exposes the functionality needed to // communicate with the Google Toolbar v5 front-end, negotiate the download of // Toolbar bookmarks, parse them, and install them on the client. // Toolbar5Importer should not have StartImport called more than once. Futher // if StartImport is called, then the class must not be destroyed until it has // either completed or Toolbar5Importer->Cancel() has been called. class Toolbar5Importer : public net::URLFetcherDelegate, public Importer { public: Toolbar5Importer(); // Importer: // The importer view calls this method to begin the process. |items| should // only either be NONE or FAVORITES, since as of right now these are the only // items this importer supports. virtual void StartImport(const importer::SourceProfile& source_profile, uint16 items, ImporterBridge* bridge) OVERRIDE; // Importer view call this method when the user clicks the cancel button // in the tabbed options UI. We need to post a message to our loop // to cancel network retrieval. virtual void Cancel() OVERRIDE; // net::URLFetcherDelegate method called back from the URLFetcher object. virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; private: FRIEND_TEST_ALL_PREFIXES(Toolbar5ImporterTest, BookmarkParse); virtual ~Toolbar5Importer(); // Internal states of the toolbar importer. enum InternalStateEnum { NOT_USED = -1, INITIALIZED, GET_AUTHORIZATION_TOKEN, GET_BOOKMARKS, PARSE_BOOKMARKS, DONE }; typedef std::vector BookmarkFolderType; // URLs for connecting to the toolbar front end are defined below. static const char kT5AuthorizationTokenUrl[]; static const char kT5FrontEndUrlTemplate[]; // Token replacement tags are defined below. static const char kRandomNumberToken[]; static const char kAuthorizationToken[]; static const char kAuthorizationTokenPrefix[]; static const char kAuthorizationTokenSuffix[]; static const char kMaxNumToken[]; static const char kMaxTimestampToken[]; // XML tag names are defined below. static const char kXmlApiReplyXmlTag[]; static const char kBookmarksXmlTag[]; static const char kBookmarkXmlTag[]; static const char kTitleXmlTag[]; static const char kUrlXmlTag[]; static const char kTimestampXmlTag[]; static const char kLabelsXmlTag[]; static const char kLabelsXmlCloseTag[]; static const char kLabelXmlTag[]; static const char kAttributesXmlTag[]; // Flow control for asynchronous import is controlled by the methods below. // ContinueImport is called back by each import action taken. BeginXXX // and EndXXX are responsible for updating the state of the asynchronous // import. EndImport is responsible for state cleanup and notifying the // caller that import has completed. void ContinueImport(); void EndImport(); void BeginImportBookmarks(); void EndImportBookmarks(); // Network I/O is done by the methods below. These three methods are called // in the order provided. The last two are called back with the HTML // response provided by the Toolbar server. void GetAuthenticationFromServer(); void GetBookmarkDataFromServer(const std::string& response); void GetBookmarksFromServerDataResponse(const std::string& response); // XML Parsing is implemented with the methods below. bool ParseAuthenticationTokenResponse(const std::string& response, std::string* token); static bool ParseBookmarksFromReader( XmlReader* reader, std::vector* bookmarks, const string16& bookmark_group_string); static bool LocateNextOpenTag(XmlReader* reader); static bool LocateNextTagByName(XmlReader* reader, const std::string& tag); static bool LocateNextTagWithStopByName( XmlReader* reader, const std::string& tag, const std::string& stop); static bool ExtractBookmarkInformation( XmlReader* reader, ProfileWriter::BookmarkEntry* bookmark_entry, std::vector* bookmark_folders, const string16& bookmark_group_string); static bool ExtractNamedValueFromXmlReader(XmlReader* reader, const std::string& name, std::string* buffer); static bool ExtractTitleFromXmlReader(XmlReader* reader, ProfileWriter::BookmarkEntry* entry); static bool ExtractUrlFromXmlReader(XmlReader* reader, ProfileWriter::BookmarkEntry* entry); static bool ExtractTimeFromXmlReader(XmlReader* reader, ProfileWriter::BookmarkEntry* entry); static bool ExtractFoldersFromXmlReader( XmlReader* reader, std::vector* bookmark_folders, const string16& bookmark_group_string); // Bookmark creation is done by the method below. void AddBookmarksToChrome( const std::vector& bookmarks); InternalStateEnum state_; // Bitmask of Importer::ImportItem. uint16 items_to_import_; // The fetchers need to be available to cancel the network call on user cancel // hence they are stored as member variables. net::URLFetcher* token_fetcher_; net::URLFetcher* data_fetcher_; // Used to get correct login data for the toolbar server. scoped_refptr request_context_getter_; DISALLOW_COPY_AND_ASSIGN(Toolbar5Importer); }; #endif // CHROME_BROWSER_IMPORTER_TOOLBAR_IMPORTER_H_