11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#ifndef COMPONENTS_ENHANCED_BOOKMARKS_BOOKMARK_SERVER_SERVICE_H_ 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define COMPONENTS_ENHANCED_BOOKMARKS_BOOKMARK_SERVER_SERVICE_H_ 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <string> 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector> 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/enhanced_bookmarks/enhanced_bookmark_model_observer.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "google_apis/gaia/google_service_auth_error.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "google_apis/gaia/oauth2_token_service.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_fetcher.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_fetcher_delegate.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/url_request/url_request_context_getter.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ProfileOAuth2TokenService; 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SigninManagerBase; 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BookmarkNode; 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace enhanced_bookmarks { 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BookmarkServerService; 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass EnhancedBookmarkModel; 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BookmarkServerServiceObserver { 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnChange(BookmarkServerService* service) = 0; 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~BookmarkServerServiceObserver() {} 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// This abstract class manages the connection to the bookmark servers and 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// stores the maps necessary to translate the response from stars.id to 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// BookmarkNodes. Subclasses just have to provide the right query and the 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// parsing of the response. 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BookmarkServerService : protected net::URLFetcherDelegate, 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private OAuth2TokenService::Consumer, 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public EnhancedBookmarkModelObserver { 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BookmarkServerService( 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<net::URLRequestContextGetter> request_context_getter, 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProfileOAuth2TokenService* token_service, 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SigninManagerBase* signin_manager, 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EnhancedBookmarkModel* enhanced_bookmark_model); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~BookmarkServerService(); 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void AddObserver(BookmarkServerServiceObserver* observer); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void RemoveObserver(BookmarkServerServiceObserver* observer); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Retrieves a bookmark by using its remote id. Returns null if nothing 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // matches. 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual const BookmarkNode* BookmarkForRemoteId( 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& remote_id) const; 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string RemoteIDForBookmark(const BookmarkNode* bookmark) const; 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Notifies the observers that something changed. 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Notify(); 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Triggers a fetch. 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void TriggerTokenRequest(bool cancel_previous); 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Build the query to send to the server. Returns a newly created url_fetcher. 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual net::URLFetcher* CreateFetcher() = 0; 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Processes the response to the query. Returns true on successful parsing, 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // false on failure. The implementation can assume that |should_notify| is set 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // to true by default, if changed to false there will be no OnChange 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // notification send. 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool ProcessResponse(const std::string& response, 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool* should_notify) = 0; 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If the token can't be retrieved or the query fails this method is called. 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void CleanAfterFailure() = 0; 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // EnhancedBookmarkModelObserver: 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void EnhancedBookmarkModelShuttingDown() OVERRIDE; 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SigninManagerBase* GetSigninManager(); 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Cached pointer to the bookmarks model. 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EnhancedBookmarkModel* model_; // weak 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(BookmarkServerServiceTest, Cluster); 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FRIEND_TEST_ALL_PREFIXES(BookmarkServerServiceTest, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ClearClusterMapOnRemoveAllBookmarks); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // net::URLFetcherDelegate methods. Called when the query is finished. 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // OAuth2TokenService::Consumer methods. 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request, 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& access_token, 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Time& expiration_time) OVERRIDE; 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request, 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GoogleServiceAuthError& error) OVERRIDE; 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The observers. 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ObserverList<BookmarkServerServiceObserver> observers_; 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The Auth service is used to get a token for auth with the server. 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ProfileOAuth2TokenService* token_service_; // Weak 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The request to the token service. 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<OAuth2TokenService::Request> token_request_; 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // To get the currently signed in user. 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SigninManagerBase* signin_manager_; // Weak 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // To have access to the right context getter for the profile. 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_refptr<net::URLRequestContextGetter> request_context_getter_; 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The fetcher used to query the server. 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<net::URLFetcher> url_fetcher_; 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // A map from stars.id to bookmark nodes. With no null entries. 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::map<std::string, const BookmarkNode*> starsid_to_bookmark_; 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(BookmarkServerService); 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace enhanced_bookmarks 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif // COMPONENTS_ENHANCED_BOOKMARKS_BOOKMARK_SERVER_SERVICE_H_ 122