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