1// Copyright (c) 2013 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
8#include <map>
9#include <string>
10
11#include "base/callback.h"
12#include "base/compiler_specific.h"
13#include "base/memory/ref_counted.h"
14#include "base/synchronization/lock.h"
15#include "base/threading/sequenced_worker_pool.h"
16#include "chrome/browser/image_decoder.h"
17
18class SkBitmap;
19
20namespace base {
21class MessageLoop;
22}
23
24namespace chromeos {
25
26typedef base::SequencedWorkerPool::SequenceToken SequenceToken;
27
28class UserImage;
29
30// A facility to read a file containing user image asynchronously in the IO
31// thread. Returns the image in the form of an SkBitmap.
32class UserImageLoader : public base::RefCountedThreadSafe<UserImageLoader>,
33                        public ImageDecoder::Delegate {
34 public:
35  // Callback used to indicate that image has been loaded.
36  typedef base::Callback<void(const UserImage& user_image)> LoadedCallback;
37
38  explicit UserImageLoader(ImageDecoder::ImageCodec image_codec);
39
40  // Start reading the image from |filepath| on a worker thread pool. Calls
41  // |loaded_cb| when image has been successfully loaded.
42  // If |size| is positive, image is cropped and (if needed) downsized to
43  // |size|x|size| pixels.
44  void Start(const std::string& filepath, int size,
45             const LoadedCallback& loaded_cb);
46
47  // Start reading the image from |filepath| on a worker thread associated with
48  // |token|. Calls |loaded_cb| when image has been successfully loaded.
49  // If |size| is positive, image is cropped and (if needed) downsized to
50  // |size|x|size| pixels.
51  void Start(const std::string& filepath, int size,
52             const SequenceToken& token,
53             const LoadedCallback& loaded_cb);
54
55 private:
56  friend class base::RefCountedThreadSafe<UserImageLoader>;
57
58  // Contains attributes we need to know about each image we decode.
59  struct ImageInfo {
60    ImageInfo(int size, const LoadedCallback& loaded_cb);
61    ~ImageInfo();
62
63    const int size;
64    const LoadedCallback loaded_cb;
65  };
66
67  typedef std::map<const ImageDecoder*, ImageInfo> ImageInfoMap;
68
69  virtual ~UserImageLoader();
70
71  // Method that reads the file on the worker thread pool and starts decoding it
72  // in a sandboxed process.
73  void LoadImage(const std::string& filepath,
74                 const ImageInfo& image_info,
75                 scoped_refptr<base::SequencedTaskRunner> task_runner);
76
77  // ImageDecoder::Delegate implementation.
78  virtual void OnImageDecoded(const ImageDecoder* decoder,
79                              const SkBitmap& decoded_image) OVERRIDE;
80  virtual void OnDecodeImageFailed(const ImageDecoder* decoder) OVERRIDE;
81
82  // The message loop object of the thread in which we notify the delegate.
83  base::MessageLoop* target_message_loop_;
84
85  // Specify how the file should be decoded in the utility process.
86  const ImageDecoder::ImageCodec image_codec_;
87
88  // Proctect image_info_map_
89  base::Lock lock_;
90
91  // Holds info structures about all images we're trying to decode.
92  // Accessed on multiple worker threads.
93  ImageInfoMap image_info_map_;
94
95  DISALLOW_COPY_AND_ASSIGN(UserImageLoader);
96};
97
98}  // namespace chromeos
99
100#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_USER_IMAGE_LOADER_H_
101