| // Copyright (c) 2011 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 <string> |
| #include <vector> |
| |
| #include "base/basictypes.h" |
| #include "base/compiler_specific.h" |
| #include "base/gtest_prod_util.h" |
| #include "base/string16.h" |
| #include "chrome/browser/importer/importer.h" |
| #include "chrome/browser/importer/profile_writer.h" |
| #include "chrome/common/net/url_fetcher.h" |
| |
| class ImporterBridge; |
| class XmlReader; |
| |
| // 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 URLFetcher::Delegate, public Importer { |
| public: |
| Toolbar5Importer(); |
| |
| // Begin Importer implementation: |
| |
| // This method is called to begin the import 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; |
| |
| // This method is called when the user clicks the cancel button on the UI |
| // dialog. We need to post a message to our loop to cancel network retrieval. |
| virtual void Cancel() OVERRIDE; |
| |
| // End Importer implementation. |
| |
| // URLFetcher::Delegate method called back from the URLFetcher object. |
| virtual void OnURLFetchComplete(const URLFetcher* source, |
| const GURL& url, |
| const net::URLRequestStatus& status, |
| int response_code, |
| const ResponseCookies& cookies, |
| const std::string& data); |
| |
| 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<string16> 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<ProfileWriter::BookmarkEntry>* 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<BookmarkFolderType>* 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<BookmarkFolderType>* bookmark_folders, |
| const string16& bookmark_group_string); |
| |
| // Bookmark creation is done by the method below. |
| void AddBookmarksToChrome( |
| const std::vector<ProfileWriter::BookmarkEntry>& 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. |
| URLFetcher* token_fetcher_; |
| URLFetcher* data_fetcher_; |
| |
| DISALLOW_COPY_AND_ASSIGN(Toolbar5Importer); |
| }; |
| |
| #endif // CHROME_BROWSER_IMPORTER_TOOLBAR_IMPORTER_H_ |