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_MEDIA_FILE_SYSTEM_BACKEND_H_
6#define CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_MEDIA_FILE_SYSTEM_BACKEND_H_
7
8#include <string>
9
10#include "base/callback.h"
11#include "base/files/file_path.h"
12#include "base/memory/ref_counted.h"
13#include "base/memory/scoped_ptr.h"
14#include "chrome/browser/media_galleries/media_galleries_preferences.h"
15#include "storage/browser/fileapi/file_system_backend.h"
16#include "storage/browser/fileapi/task_runner_bound_observer_list.h"
17
18namespace base {
19class SequencedTaskRunner;
20}
21
22namespace storage {
23class FileSystemURL;
24}
25
26namespace net {
27class URLRequest;
28}
29
30class MediaPathFilter;
31class DeviceMediaAsyncFileUtil;
32
33class MediaFileSystemBackend : public storage::FileSystemBackend {
34 public:
35  static const char kMediaTaskRunnerName[];
36
37  MediaFileSystemBackend(
38      const base::FilePath& profile_path,
39      base::SequencedTaskRunner* media_task_runner);
40  virtual ~MediaFileSystemBackend();
41
42  static bool CurrentlyOnMediaTaskRunnerThread();
43  static scoped_refptr<base::SequencedTaskRunner> MediaTaskRunner();
44
45  // Construct the mount point for the gallery specified by |pref_id| in
46  // the profile located in |profile_path|.
47  static std::string ConstructMountName(const base::FilePath& profile_path,
48                                        const std::string& extension_id,
49                                        MediaGalleryPrefId pref_id);
50
51  static bool AttemptAutoMountForURLRequest(
52      const net::URLRequest* url_request,
53      const storage::FileSystemURL& filesystem_url,
54      const std::string& storage_domain,
55      const base::Callback<void(base::File::Error result)>& callback);
56
57  // FileSystemBackend implementation.
58  virtual bool CanHandleType(storage::FileSystemType type) const OVERRIDE;
59  virtual void Initialize(storage::FileSystemContext* context) OVERRIDE;
60  virtual void ResolveURL(const storage::FileSystemURL& url,
61                          storage::OpenFileSystemMode mode,
62                          const OpenFileSystemCallback& callback) OVERRIDE;
63  virtual storage::AsyncFileUtil* GetAsyncFileUtil(
64      storage::FileSystemType type) OVERRIDE;
65  virtual storage::WatcherManager* GetWatcherManager(
66      storage::FileSystemType type) OVERRIDE;
67  virtual storage::CopyOrMoveFileValidatorFactory*
68      GetCopyOrMoveFileValidatorFactory(storage::FileSystemType type,
69                                        base::File::Error* error_code) OVERRIDE;
70  virtual storage::FileSystemOperation* CreateFileSystemOperation(
71      const storage::FileSystemURL& url,
72      storage::FileSystemContext* context,
73      base::File::Error* error_code) const OVERRIDE;
74  virtual bool SupportsStreaming(
75      const storage::FileSystemURL& url) const OVERRIDE;
76  virtual bool HasInplaceCopyImplementation(
77      storage::FileSystemType type) const OVERRIDE;
78  virtual scoped_ptr<storage::FileStreamReader> CreateFileStreamReader(
79      const storage::FileSystemURL& url,
80      int64 offset,
81      int64 max_bytes_to_read,
82      const base::Time& expected_modification_time,
83      storage::FileSystemContext* context) const OVERRIDE;
84  virtual scoped_ptr<storage::FileStreamWriter> CreateFileStreamWriter(
85      const storage::FileSystemURL& url,
86      int64 offset,
87      storage::FileSystemContext* context) const OVERRIDE;
88  virtual storage::FileSystemQuotaUtil* GetQuotaUtil() OVERRIDE;
89  virtual const storage::UpdateObserverList* GetUpdateObservers(
90      storage::FileSystemType type) const OVERRIDE;
91  virtual const storage::ChangeObserverList* GetChangeObservers(
92      storage::FileSystemType type) const OVERRIDE;
93  virtual const storage::AccessObserverList* GetAccessObservers(
94      storage::FileSystemType type) const OVERRIDE;
95
96 private:
97  // Store the profile path. We need this to create temporary snapshot files.
98  const base::FilePath profile_path_;
99
100  scoped_refptr<base::SequencedTaskRunner> media_task_runner_;
101
102  scoped_ptr<MediaPathFilter> media_path_filter_;
103  scoped_ptr<storage::CopyOrMoveFileValidatorFactory>
104      media_copy_or_move_file_validator_factory_;
105
106  scoped_ptr<storage::AsyncFileUtil> native_media_file_util_;
107  scoped_ptr<DeviceMediaAsyncFileUtil> device_media_async_file_util_;
108#if defined(OS_WIN) || defined(OS_MACOSX)
109  scoped_ptr<storage::AsyncFileUtil> picasa_file_util_;
110  scoped_ptr<storage::AsyncFileUtil> itunes_file_util_;
111#endif  // defined(OS_WIN) || defined(OS_MACOSX)
112#if defined(OS_MACOSX)
113  scoped_ptr<storage::AsyncFileUtil> iphoto_file_util_;
114#endif  // defined(OS_MACOSX)
115
116  DISALLOW_COPY_AND_ASSIGN(MediaFileSystemBackend);
117};
118
119#endif  // CHROME_BROWSER_MEDIA_GALLERIES_FILEAPI_MEDIA_FILE_SYSTEM_BACKEND_H_
120