12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_DEVICE_MEDIA_ASYNC_FILE_UTIL_H_ 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_DEVICE_MEDIA_ASYNC_FILE_UTIL_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/ref_counted.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/weak_ptr.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/async_file_util.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/blob/shareable_file_reference.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FileSystemOperationContext; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FileSystemURL; 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)namespace storage { 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class FileStreamReader; 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuenum MediaFileValidationType { 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu NO_MEDIA_FILE_VALIDATION, 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu APPLY_MEDIA_FILE_VALIDATION, 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}; 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 3003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class DeviceMediaAsyncFileUtil : public storage::AsyncFileUtil { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DeviceMediaAsyncFileUtil(); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Returns an instance of DeviceMediaAsyncFileUtil. 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static scoped_ptr<DeviceMediaAsyncFileUtil> Create( 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const base::FilePath& profile_path, 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MediaFileValidationType validation_type); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) bool SupportsStreaming(const storage::FileSystemURL& url); 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // AsyncFileUtil overrides. 427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void CreateOrOpen( 4303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int file_flags, 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CreateOrOpenCallback& callback) OVERRIDE; 477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void EnsureFileExists( 4803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 4903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const EnsureFileExistsCallback& callback) OVERRIDE; 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void CreateDirectory( 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 5303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool exclusive, 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool recursive, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) OVERRIDE; 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void GetFileInfo( 5803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 5903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GetFileInfoCallback& callback) OVERRIDE; 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void ReadDirectory( 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 6303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ReadDirectoryCallback& callback) OVERRIDE; 6503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void Touch(scoped_ptr<storage::FileSystemOperationContext> context, 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 6703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::Time& last_access_time, 6803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const base::Time& last_modified_time, 6903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const StatusCallback& callback) OVERRIDE; 7003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void Truncate(scoped_ptr<storage::FileSystemOperationContext> context, 7103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 7203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) int64 length, 7303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const StatusCallback& callback) OVERRIDE; 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void CopyFileLocal( 7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& src_url, 7703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& dest_url, 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CopyOrMoveOption option, 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const CopyFileProgressCallback& progress_callback, 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) OVERRIDE; 817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void MoveFileLocal( 8203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 8303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& src_url, 8403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& dest_url, 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CopyOrMoveOption option, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) OVERRIDE; 877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void CopyInForeignFile( 8803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& src_file_path, 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& dest_url, 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) OVERRIDE; 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DeleteFile( 9303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 9403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) OVERRIDE; 967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DeleteDirectory( 9703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 9803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const StatusCallback& callback) OVERRIDE; 1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void DeleteRecursively( 10103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 10203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const StatusCallback& callback) OVERRIDE; 1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void CreateSnapshotFile( 10503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<storage::FileSystemOperationContext> context, 10603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const CreateSnapshotFileCallback& callback) OVERRIDE; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This method is called when existing Blobs are read. 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // |expected_modification_time| indicates the expected snapshot state of the 1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // underlying storage. The returned FileStreamReader must return an error 1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // when the state of the underlying storage changes. Any errors associated 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // with reading this file are returned by the FileStreamReader itself. 11403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual scoped_ptr<storage::FileStreamReader> GetFileStreamReader( 11503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemURL& url, 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int64 offset, 1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::Time& expected_modification_time, 11803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemContext* context); 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) class MediaPathFilterWrapper; 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Use Create() to get an instance of DeviceMediaAsyncFileUtil. 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DeviceMediaAsyncFileUtil(const base::FilePath& profile_path, 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu MediaFileValidationType validation_type); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 127bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Called when GetFileInfo method call succeeds. |file_info| contains the 128bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // file details of the requested url. |callback| is invoked to complete the 129bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // GetFileInfo request. 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnDidGetFileInfo( 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::SequencedTaskRunner* task_runner, 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& path, 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GetFileInfoCallback& callback, 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::File::Info& file_info); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when ReadDirectory method call succeeds. |callback| is invoked to 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // complete the ReadDirectory request. 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the contents of the given directory are reported in one batch, then 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |file_list| will have the list of all files/directories in the given 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // directory and |has_more| will be false. 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If the contents of the given directory are reported in multiple chunks, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |file_list| will have only a subset of all contents (the subsets reported 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // in any two calls are disjoint), and |has_more| will be true, except for 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // the last chunk. 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnDidReadDirectory( 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::SequencedTaskRunner* task_runner, 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ReadDirectoryCallback& callback, 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const EntryList& file_list, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_more); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool validate_media_files() const; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Profile path. 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath profile_path_; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<MediaPathFilterWrapper> media_path_filter_wrapper_; 1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For callbacks that may run after destruction. 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtrFactory<DeviceMediaAsyncFileUtil> weak_ptr_factory_; 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DeviceMediaAsyncFileUtil); 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_DEVICE_MEDIA_ASYNC_FILE_UTIL_H_ 167