1// Copyright 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_MEDIA_GALLERIES_FILEAPI_SAFE_AUDIO_VIDEO_CHECKER_H_
6#define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_SAFE_AUDIO_VIDEO_CHECKER_H_
7
8#include "base/basictypes.h"
9#include "base/callback_forward.h"
10#include "base/files/file.h"
11#include "base/memory/weak_ptr.h"
12#include "content/public/browser/utility_process_host_client.h"
13#include "storage/browser/fileapi/copy_or_move_file_validator.h"
14
15namespace content {
16class UtilityProcessHost;
17}
18
19// Uses a utility process to validate a media file.  If the callback returns
20// File::FILE_OK, then the file appears to be a valid media file. This does
21// not attempt to decode the entire file, which may take a considerable amount
22// of time.  This class may be constructed on any thread, but should run on the
23// IO thread.
24class SafeAudioVideoChecker : public content::UtilityProcessHostClient {
25 public:
26  // Takes responsibility for closing |file|.
27  SafeAudioVideoChecker(
28      base::File file,
29      const storage::CopyOrMoveFileValidator::ResultCallback& callback);
30
31  // Must be called on the IO thread.
32  void Start();
33
34 private:
35  enum State {
36    INITIAL_STATE,
37    PINGED_STATE,
38    STARTED_STATE,
39    FINISHED_STATE
40  };
41
42  virtual ~SafeAudioVideoChecker();
43
44  // Starts validation once the utility process has been started.
45  virtual void OnProcessStarted();
46
47  // Notification of the result from the utility process.
48  void OnCheckingFinished(bool valid);
49
50  // UtilityProcessHostClient implementation.
51  virtual void OnProcessCrashed(int exit_code) OVERRIDE;
52  virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
53
54  State state_;
55
56  base::File file_;
57
58  const storage::CopyOrMoveFileValidator::ResultCallback callback_;
59
60  base::WeakPtr<content::UtilityProcessHost> utility_process_host_;
61
62  DISALLOW_COPY_AND_ASSIGN(SafeAudioVideoChecker);
63};
64
65#endif  // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_SAFE_AUDIO_VIDEO_CHECKER_H_
66