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