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