Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / media_galleries / fileapi / device_media_async_file_util.h
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_DEVICE_MEDIA_ASYNC_FILE_UTIL_H_
6 #define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_DEVICE_MEDIA_ASYNC_FILE_UTIL_H_
7
8 #include "base/files/file.h"
9 #include "base/files/file_path.h"
10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/weak_ptr.h"
13 #include "storage/browser/fileapi/async_file_util.h"
14 #include "storage/common/blob/shareable_file_reference.h"
15
16 namespace storage {
17 class FileSystemOperationContext;
18 class FileSystemURL;
19 }
20
21 namespace storage {
22 class FileStreamReader;
23 }
24
25 enum MediaFileValidationType {
26   NO_MEDIA_FILE_VALIDATION,
27   APPLY_MEDIA_FILE_VALIDATION,
28 };
29
30 class DeviceMediaAsyncFileUtil : public storage::AsyncFileUtil {
31  public:
32   virtual ~DeviceMediaAsyncFileUtil();
33
34   // Returns an instance of DeviceMediaAsyncFileUtil.
35   static scoped_ptr<DeviceMediaAsyncFileUtil> Create(
36       const base::FilePath& profile_path,
37       MediaFileValidationType validation_type);
38
39   bool SupportsStreaming(const storage::FileSystemURL& url);
40
41   // AsyncFileUtil overrides.
42   virtual void CreateOrOpen(
43       scoped_ptr<storage::FileSystemOperationContext> context,
44       const storage::FileSystemURL& url,
45       int file_flags,
46       const CreateOrOpenCallback& callback) OVERRIDE;
47   virtual void EnsureFileExists(
48       scoped_ptr<storage::FileSystemOperationContext> context,
49       const storage::FileSystemURL& url,
50       const EnsureFileExistsCallback& callback) OVERRIDE;
51   virtual void CreateDirectory(
52       scoped_ptr<storage::FileSystemOperationContext> context,
53       const storage::FileSystemURL& url,
54       bool exclusive,
55       bool recursive,
56       const StatusCallback& callback) OVERRIDE;
57   virtual void GetFileInfo(
58       scoped_ptr<storage::FileSystemOperationContext> context,
59       const storage::FileSystemURL& url,
60       const GetFileInfoCallback& callback) OVERRIDE;
61   virtual void ReadDirectory(
62       scoped_ptr<storage::FileSystemOperationContext> context,
63       const storage::FileSystemURL& url,
64       const ReadDirectoryCallback& callback) OVERRIDE;
65   virtual void Touch(scoped_ptr<storage::FileSystemOperationContext> context,
66                      const storage::FileSystemURL& url,
67                      const base::Time& last_access_time,
68                      const base::Time& last_modified_time,
69                      const StatusCallback& callback) OVERRIDE;
70   virtual void Truncate(scoped_ptr<storage::FileSystemOperationContext> context,
71                         const storage::FileSystemURL& url,
72                         int64 length,
73                         const StatusCallback& callback) OVERRIDE;
74   virtual void CopyFileLocal(
75       scoped_ptr<storage::FileSystemOperationContext> context,
76       const storage::FileSystemURL& src_url,
77       const storage::FileSystemURL& dest_url,
78       CopyOrMoveOption option,
79       const CopyFileProgressCallback& progress_callback,
80       const StatusCallback& callback) OVERRIDE;
81   virtual void MoveFileLocal(
82       scoped_ptr<storage::FileSystemOperationContext> context,
83       const storage::FileSystemURL& src_url,
84       const storage::FileSystemURL& dest_url,
85       CopyOrMoveOption option,
86       const StatusCallback& callback) OVERRIDE;
87   virtual void CopyInForeignFile(
88       scoped_ptr<storage::FileSystemOperationContext> context,
89       const base::FilePath& src_file_path,
90       const storage::FileSystemURL& dest_url,
91       const StatusCallback& callback) OVERRIDE;
92   virtual void DeleteFile(
93       scoped_ptr<storage::FileSystemOperationContext> context,
94       const storage::FileSystemURL& url,
95       const StatusCallback& callback) OVERRIDE;
96   virtual void DeleteDirectory(
97       scoped_ptr<storage::FileSystemOperationContext> context,
98       const storage::FileSystemURL& url,
99       const StatusCallback& callback) OVERRIDE;
100   virtual void DeleteRecursively(
101       scoped_ptr<storage::FileSystemOperationContext> context,
102       const storage::FileSystemURL& url,
103       const StatusCallback& callback) OVERRIDE;
104   virtual void CreateSnapshotFile(
105       scoped_ptr<storage::FileSystemOperationContext> context,
106       const storage::FileSystemURL& url,
107       const CreateSnapshotFileCallback& callback) OVERRIDE;
108
109   // This method is called when existing Blobs are read.
110   // |expected_modification_time| indicates the expected snapshot state of the
111   // underlying storage. The returned FileStreamReader must return an error
112   // when the state of the underlying storage changes. Any errors associated
113   // with reading this file are returned by the FileStreamReader itself.
114   virtual scoped_ptr<storage::FileStreamReader> GetFileStreamReader(
115       const storage::FileSystemURL& url,
116       int64 offset,
117       const base::Time& expected_modification_time,
118       storage::FileSystemContext* context);
119
120  private:
121   class MediaPathFilterWrapper;
122
123   // Use Create() to get an instance of DeviceMediaAsyncFileUtil.
124   DeviceMediaAsyncFileUtil(const base::FilePath& profile_path,
125                            MediaFileValidationType validation_type);
126
127   // Called when GetFileInfo method call succeeds. |file_info| contains the
128   // file details of the requested url. |callback| is invoked to complete the
129   // GetFileInfo request.
130   void OnDidGetFileInfo(
131       base::SequencedTaskRunner* task_runner,
132       const base::FilePath& path,
133       const GetFileInfoCallback& callback,
134       const base::File::Info& file_info);
135
136   // Called when ReadDirectory method call succeeds. |callback| is invoked to
137   // complete the ReadDirectory request.
138   //
139   // If the contents of the given directory are reported in one batch, then
140   // |file_list| will have the list of all files/directories in the given
141   // directory and |has_more| will be false.
142   //
143   // If the contents of the given directory are reported in multiple chunks,
144   // |file_list| will have only a subset of all contents (the subsets reported
145   // in any two calls are disjoint), and |has_more| will be true, except for
146   // the last chunk.
147   void OnDidReadDirectory(
148       base::SequencedTaskRunner* task_runner,
149       const ReadDirectoryCallback& callback,
150       const EntryList& file_list,
151       bool has_more);
152
153   bool validate_media_files() const;
154
155   // Profile path.
156   const base::FilePath profile_path_;
157
158   scoped_refptr<MediaPathFilterWrapper> media_path_filter_wrapper_;
159
160   // For callbacks that may run after destruction.
161   base::WeakPtrFactory<DeviceMediaAsyncFileUtil> weak_ptr_factory_;
162
163   DISALLOW_COPY_AND_ASSIGN(DeviceMediaAsyncFileUtil);
164 };
165
166 #endif  // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_DEVICE_MEDIA_ASYNC_FILE_UTIL_H_