1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// found in the LICENSE file.
4ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
5ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/media_galleries/fileapi/supported_audio_video_checker.h"
6ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
7ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <set>
8ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include <vector>
9ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
10ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/bind.h"
11ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/callback.h"
12ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/lazy_instance.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/location.h"
14ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/logging.h"
15ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/stl_util.h"
16ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/browser/media_galleries/fileapi/safe_audio_video_checker.h"
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/browser/browser_thread.h"
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "net/base/mime_util.h"
19ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
20ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace {
21ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
22ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochclass SupportedAudioVideoExtensions {
23ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public:
24ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  SupportedAudioVideoExtensions() {
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    std::vector<base::FilePath::StringType> extensions;
26ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    net::GetExtensionsForMimeType("audio/*", &extensions);
27ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    net::GetExtensionsForMimeType("video/*", &extensions);
28ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    for (size_t i = 0; i < extensions.size(); ++i) {
29ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      std::string mime_type;
30ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      if (net::GetWellKnownMimeTypeFromExtension(extensions[i], &mime_type) &&
31ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch          net::IsSupportedMimeType(mime_type)) {
32ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch        audio_video_extensions_.insert(
33ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch            base::FilePath::kExtensionSeparator + extensions[i]);
34ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      }
35ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    }
36ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  };
37ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
38ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  bool HasSupportedAudioVideoExtension(const base::FilePath& file) {
39ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return ContainsKey(audio_video_extensions_, file.Extension());
40ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
41ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
42ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch private:
43ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::set<base::FilePath::StringType> audio_video_extensions_;
44ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
45ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(SupportedAudioVideoExtensions);
46ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch};
47ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
48ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::LazyInstance<SupportedAudioVideoExtensions> g_audio_video_extensions =
49ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    LAZY_INSTANCE_INITIALIZER;
50ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochbase::File OpenOnFileThread(const base::FilePath& path) {
52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return base::File(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSupportedAudioVideoChecker::~SupportedAudioVideoChecker() {}
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool SupportedAudioVideoChecker::SupportsFileType(const base::FilePath& path) {
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return g_audio_video_extensions.Get().HasSupportedAudioVideoExtension(path);
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid SupportedAudioVideoChecker::StartPreWriteValidation(
6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const storage::CopyOrMoveFileValidator::ResultCallback& result_callback) {
67e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(callback_.is_null());
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  callback_ = result_callback;
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::BrowserThread::PostTaskAndReplyWithResult(
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::BrowserThread::FILE,
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      FROM_HERE,
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&OpenOnFileThread, path_),
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&SupportedAudioVideoChecker::OnFileOpen,
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 weak_factory_.GetWeakPtr()));
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSupportedAudioVideoChecker::SupportedAudioVideoChecker(
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::FilePath& path)
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : path_(path),
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      weak_factory_(this) {
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid SupportedAudioVideoChecker::OnFileOpen(base::File file) {
86e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (!file.IsValid()) {
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    callback_.Run(base::File::FILE_ERROR_SECURITY);
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  safe_checker_ = new SafeAudioVideoChecker(file.Pass(), callback_);
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  safe_checker_->Start();
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
95