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_IMAGE_DECODER_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_CHROMEOS_LOGIN_IMAGE_DECODER_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/utility_process_host.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Decodes an image in a sandboxed process.
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ImageDecoder : public UtilityProcessHost::Client {
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class Delegate {
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Called when image is decoded.
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // |decoder| is used to identify the image in case of decoding several
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // images simultaneously.
24ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual void OnImageDecoded(const ImageDecoder* decoder,
25ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                const SkBitmap& decoded_image) = 0;
26ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Called when decoding image failed. Delegate can do some cleanup in
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // this handler.
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    virtual void OnDecodeImageFailed(const ImageDecoder* decoder) {}
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   protected:
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~Delegate() {}
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ImageDecoder(Delegate* delegate,
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen               const std::string& image_data);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Starts image decoding.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Start();
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // It's a reference counted object, so destructor is private.
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~ImageDecoder() {}
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Overidden from UtilityProcessHost::Client:
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnDecodeImageSucceeded(const SkBitmap& decoded_image);
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual void OnDecodeImageFailed();
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Launches sandboxed process that will decode the image.
50ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void DecodeImageInSandbox(const std::vector<unsigned char>& image_data);
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Delegate* delegate_;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<unsigned char> image_data_;
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  BrowserThread::ID target_thread_id_;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ImageDecoder);
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_CHROMEOS_LOGIN_IMAGE_DECODER_H_
62