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