1// Copyright (c) 2011 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_CHROMEOS_LOGIN_USER_IMAGE_DOWNLOADER_H_
6#define CHROME_BROWSER_CHROMEOS_LOGIN_USER_IMAGE_DOWNLOADER_H_
7#pragma once
8
9#include <string>
10
11#include "base/basictypes.h"
12#include "base/memory/scoped_ptr.h"
13#include "chrome/browser/chromeos/login/image_decoder.h"
14#include "chrome/common/net/url_fetcher.h"
15
16class ListValue;
17
18namespace chromeos {
19
20// Gets user image URL from user's Google Profile, downloads the image,
21// executes image decode and calls UserManager to store image in a file with
22// path to it stored in local state dictionary.
23class UserImageDownloader : public URLFetcher::Delegate,
24                            public ImageDecoder::Delegate {
25 public:
26  // |auth_token| is a authentication token received in ClientLogin
27  // response, used for requests sent to Contacts API.
28  // Starts downloading the picture. Object is deleted as reference counted
29  // object.
30  UserImageDownloader(const std::string& username,
31                      const std::string& auth_token);
32
33 private:
34  // It's a reference counted object, so destructor is private.
35  ~UserImageDownloader();
36
37  // Overriden from URLFetcher::Delegate:
38  virtual void OnURLFetchComplete(const URLFetcher* source,
39                                  const GURL& url,
40                                  const net::URLRequestStatus& status,
41                                  int response_code,
42                                  const ResponseCookies& cookies,
43                                  const std::string& data);
44
45  // Overriden from ImageDecoder::Delegate:
46  virtual void OnImageDecoded(const SkBitmap& decoded_image);
47
48  // Parses received JSON data looking for user image url.
49  // If succeeded, returns true and stores the url in |image_url| parameter.
50  // Otherwise, returns false.
51  bool GetImageURL(const std::string& json_data, GURL* image_url) const;
52
53  // Searches for image url in a list of contacts matching contact address
54  // with user email. Returns true and image url if succeeds, false
55  // otherwise.
56  bool GetImageURLFromEntries(ListValue* entry_list, GURL* image_url) const;
57
58  // Checks if email list contains user email. Returns true if match is
59  // found.
60  bool IsUserEntry(ListValue* email_list) const;
61
62  // Searches for image url in list of links for the found contact.
63  // Returns true and image url if succeeds, false otherwise.
64  bool GetImageURLFromLinks(ListValue* link_list, GURL* image_url) const;
65
66  // Encodes user image in PNG format and saves the result to the file
67  // specified. Should work on IO thread.
68  void SaveImageAsPNG(const std::string& filename, const SkBitmap& image);
69
70  // Fetcher for user's profile page.
71  scoped_ptr<URLFetcher> profile_fetcher_;
72
73  // Username saved to use as a key for user picture in preferences.
74  std::string username_;
75
76  // Authentication token to use for image download.
77  std::string auth_token_;
78
79  DISALLOW_COPY_AND_ASSIGN(UserImageDownloader);
80};
81
82}  // namespace chromeos
83
84#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_USER_IMAGE_DOWNLOADER_H_
85
86