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
51ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbase::PlatformFile OpenOnFileThread(const base::FilePath& path) {
52ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
53ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return base::CreatePlatformFile(
54ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      path, base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ,
55ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      NULL /*created*/, NULL /*error_code*/);
56ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
57ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace
59ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
60ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSupportedAudioVideoChecker::~SupportedAudioVideoChecker() {}
61ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
62ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// static
63ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochbool SupportedAudioVideoChecker::SupportsFileType(const base::FilePath& path) {
64ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  return g_audio_video_extensions.Get().HasSupportedAudioVideoExtension(path);
65ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
66ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
67ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid SupportedAudioVideoChecker::StartPreWriteValidation(
68ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const fileapi::CopyOrMoveFileValidator::ResultCallback& result_callback) {
69ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
70ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(callback_.is_null());
71ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  callback_ = result_callback;
72ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
73ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::BrowserThread::PostTaskAndReplyWithResult(
74ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      content::BrowserThread::FILE,
75ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      FROM_HERE,
76ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&OpenOnFileThread, path_),
77ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      base::Bind(&SupportedAudioVideoChecker::OnFileOpen,
78ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch                 weak_factory_.GetWeakPtr()));
79ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
80ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
81ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochSupportedAudioVideoChecker::SupportedAudioVideoChecker(
82ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    const base::FilePath& path)
83ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    : path_(path),
84ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      weak_factory_(this) {
85ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
86ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
87ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochvoid SupportedAudioVideoChecker::OnFileOpen(const base::PlatformFile& file) {
88ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
89ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  if (file == base::kInvalidPlatformFileValue) {
90ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    callback_.Run(base::PLATFORM_FILE_ERROR_SECURITY);
91ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch    return;
92ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  }
93ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
94ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  safe_checker_ = new SafeAudioVideoChecker(file, callback_);
95ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  safe_checker_->Start();
96ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
97