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_LOADER_H_
6#define CHROME_BROWSER_CHROMEOS_LOGIN_USER_IMAGE_LOADER_H_
7#pragma once
8
9#include <map>
10#include <string>
11
12#include "base/basictypes.h"
13#include "base/memory/ref_counted.h"
14#include "chrome/browser/chromeos/login/image_decoder.h"
15
16class MessageLoop;
17class SkBitmap;
18
19namespace chromeos {
20
21// A facility to read a file containing user image asynchronously in the IO
22// thread. Returns the image in the form of an SkBitmap.
23class UserImageLoader : public base::RefCountedThreadSafe<UserImageLoader>,
24                        public ImageDecoder::Delegate {
25 public:
26  class Delegate {
27   public:
28    // Invoked when user image has been read.
29    // |should_save_image| indicates if user image should be saved somewhere
30    // for later use.
31    virtual void OnImageLoaded(const std::string& username,
32                               const SkBitmap& image,
33                               bool should_save_image) = 0;
34
35   protected:
36    virtual ~Delegate() {}
37  };
38
39  explicit UserImageLoader(Delegate* delegate);
40
41  // Start reading the image for |username| from |filepath| on the file thread.
42  // |should_save_image| is passed to OnImageLoaded handler.
43  void Start(const std::string& username,
44             const std::string& filepath,
45             bool should_save_image);
46
47  void set_delegate(Delegate* delegate) { delegate_ = delegate; }
48
49 private:
50  friend class base::RefCountedThreadSafe<UserImageLoader>;
51
52  // Contains attributes we need to know about each image we decode.
53  struct ImageInfo {
54    ImageInfo(const std::string& username, bool should_save)
55        : username(username),
56          should_save_image(should_save) {
57    }
58
59    std::string username;
60    bool should_save_image;
61  };
62
63  typedef std::map<const ImageDecoder*, ImageInfo> ImageInfoMap;
64
65  virtual ~UserImageLoader();
66
67  // Method that reads the file on the file thread and starts decoding it in
68  // sandboxed process.
69  void LoadImage(const std::string& filepath, const ImageInfo& image_info);
70
71  // ImageDecoder::Delegate implementation.
72  virtual void OnImageDecoded(const ImageDecoder* decoder,
73                              const SkBitmap& decoded_image);
74  virtual void OnDecodeImageFailed(const ImageDecoder* decoder);
75
76  // Notifies the delegate that image was loaded, on delegate's thread.
77  void NotifyDelegate(const SkBitmap& image, const ImageInfo& image_info);
78
79  // The message loop object of the thread in which we notify the delegate.
80  MessageLoop* target_message_loop_;
81
82  // Delegate to notify about finishing the load of the image.
83  Delegate* delegate_;
84
85  // Holds info structures about all images we're trying to decode.
86  // Accessed only on FILE thread.
87  ImageInfoMap image_info_map_;
88
89  DISALLOW_COPY_AND_ASSIGN(UserImageLoader);
90};
91
92}  // namespace chromeos
93
94#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_USER_IMAGE_LOADER_H_
95