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