1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_PROFILES_PROFILE_DOWNLOADER_H_ 6 #define CHROME_BROWSER_PROFILES_PROFILE_DOWNLOADER_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/gtest_prod_util.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "base/strings/string16.h" 14 #include "chrome/browser/image_decoder.h" 15 #include "google_apis/gaia/oauth2_token_service.h" 16 #include "net/url_request/url_fetcher_delegate.h" 17 #include "third_party/skia/include/core/SkBitmap.h" 18 #include "url/gurl.h" 19 20 class ProfileDownloaderDelegate; 21 class OAuth2AccessTokenFetcher; 22 23 namespace net { 24 class URLFetcher; 25 } // namespace net 26 27 // Downloads user profile information. The profile picture is decoded in a 28 // sandboxed process. 29 class ProfileDownloader : public net::URLFetcherDelegate, 30 public ImageDecoder::Delegate, 31 public OAuth2TokenService::Observer, 32 public OAuth2TokenService::Consumer { 33 public: 34 enum PictureStatus { 35 PICTURE_SUCCESS, 36 PICTURE_FAILED, 37 PICTURE_DEFAULT, 38 PICTURE_CACHED, 39 }; 40 41 explicit ProfileDownloader(ProfileDownloaderDelegate* delegate); 42 virtual ~ProfileDownloader(); 43 44 // Starts downloading profile information if the necessary authorization token 45 // is ready. If not, subscribes to token service and starts fetching if the 46 // token is available. Should not be called more than once. 47 virtual void Start(); 48 49 // Starts downloading profile information if the necessary authorization token 50 // is ready. If not, subscribes to token service and starts fetching if the 51 // token is available. Should not be called more than once. 52 virtual void StartForAccount(const std::string& account_id); 53 54 // On successful download this returns the full name of the user. For example 55 // "Pat Smith". 56 virtual base::string16 GetProfileFullName() const; 57 58 // On successful download this returns the given name of the user. For example 59 // if the name is "Pat Smith", the given name is "Pat". 60 virtual base::string16 GetProfileGivenName() const; 61 62 // On successful download this returns G+ locale preference of the user. 63 virtual std::string GetProfileLocale() const; 64 65 // On successful download this returns the profile picture of the user. 66 // For users with no profile picture set (that is, they have the default 67 // profile picture) this will return an Null bitmap. 68 virtual SkBitmap GetProfilePicture() const; 69 70 // Gets the profile picture status. 71 virtual PictureStatus GetProfilePictureStatus() const; 72 73 // Gets the URL for the profile picture. This can be cached so that the same 74 // picture is not downloaded multiple times. This value should only be used 75 // when the picture status is PICTURE_SUCCESS. 76 virtual std::string GetProfilePictureURL() const; 77 78 private: 79 friend class ProfileDownloaderTest; 80 FRIEND_TEST_ALL_PREFIXES(ProfileDownloaderTest, ParseData); 81 FRIEND_TEST_ALL_PREFIXES(ProfileDownloaderTest, DefaultURL); 82 83 // Overriden from net::URLFetcherDelegate: 84 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 85 86 // Overriden from ImageDecoder::Delegate: 87 virtual void OnImageDecoded(const ImageDecoder* decoder, 88 const SkBitmap& decoded_image) OVERRIDE; 89 virtual void OnDecodeImageFailed(const ImageDecoder* decoder) OVERRIDE; 90 91 // Overriden from OAuth2TokenService::Observer: 92 virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE; 93 94 // Overriden from OAuth2TokenService::Consumer: 95 virtual void OnGetTokenSuccess(const OAuth2TokenService::Request* request, 96 const std::string& access_token, 97 const base::Time& expiration_time) OVERRIDE; 98 virtual void OnGetTokenFailure(const OAuth2TokenService::Request* request, 99 const GoogleServiceAuthError& error) OVERRIDE; 100 101 // Parses the entry response and gets the name, profile image URL and locale. 102 // |data| should be the JSON formatted data return by the response. 103 // Returns false to indicate a parsing error. 104 static bool ParseProfileJSON(const std::string& data, 105 base::string16* full_name, 106 base::string16* given_name, 107 std::string* url, 108 int image_size, 109 std::string* profile_locale); 110 // Returns true if the image url is url of the default profile picture. 111 static bool IsDefaultProfileImageURL(const std::string& url); 112 113 // Issues the first request to get user profile image. 114 void StartFetchingImage(); 115 116 // Gets the authorization header. 117 const char* GetAuthorizationHeader() const; 118 119 // Starts fetching OAuth2 access token. This is needed before the GAIA info 120 // can be downloaded. 121 void StartFetchingOAuth2AccessToken(); 122 123 ProfileDownloaderDelegate* delegate_; 124 std::string account_id_; 125 std::string auth_token_; 126 scoped_ptr<net::URLFetcher> user_entry_fetcher_; 127 scoped_ptr<net::URLFetcher> profile_image_fetcher_; 128 scoped_ptr<OAuth2TokenService::Request> oauth2_access_token_request_; 129 base::string16 profile_full_name_; 130 base::string16 profile_given_name_; 131 std::string profile_locale_; 132 SkBitmap profile_picture_; 133 PictureStatus picture_status_; 134 std::string picture_url_; 135 136 DISALLOW_COPY_AND_ASSIGN(ProfileDownloader); 137 }; 138 139 #endif // CHROME_BROWSER_PROFILES_PROFILE_DOWNLOADER_H_ 140