OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/file_manager/snapshot_manager.h" | 5 #include "chrome/browser/chromeos/file_manager/snapshot_manager.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/sys_info.h" | 8 #include "base/sys_info.h" |
9 #include "chrome/browser/chromeos/file_manager/app_id.h" | 9 #include "chrome/browser/chromeos/file_manager/app_id.h" |
10 #include "chrome/browser/chromeos/file_manager/fileapi_util.h" | 10 #include "chrome/browser/chromeos/file_manager/fileapi_util.h" |
11 #include "chrome/browser/profiles/profile.h" | 11 #include "chrome/browser/profiles/profile.h" |
12 #include "content/public/browser/browser_thread.h" | 12 #include "content/public/browser/browser_thread.h" |
13 #include "google_apis/drive/task_util.h" | 13 #include "google_apis/drive/task_util.h" |
14 #include "third_party/cros_system_api/constants/cryptohome.h" | 14 #include "third_party/cros_system_api/constants/cryptohome.h" |
15 #include "webkit/browser/fileapi/file_system_context.h" | 15 #include "storage/browser/fileapi/file_system_context.h" |
16 #include "webkit/common/blob/shareable_file_reference.h" | 16 #include "storage/common/blob/shareable_file_reference.h" |
17 | 17 |
18 namespace file_manager { | 18 namespace file_manager { |
19 namespace { | 19 namespace { |
20 | 20 |
21 typedef base::Callback<void(int64)> GetNecessaryFreeSpaceCallback; | 21 typedef base::Callback<void(int64)> GetNecessaryFreeSpaceCallback; |
22 | 22 |
23 // Part of ComputeSpaceNeedToBeFreed. | 23 // Part of ComputeSpaceNeedToBeFreed. |
24 int64 ComputeSpaceNeedToBeFreedAfterGetMetadataOnBlockingPool( | 24 int64 ComputeSpaceNeedToBeFreedAfterGetMetadataOnBlockingPool( |
25 const base::FilePath& path, | 25 const base::FilePath& path, |
26 int64 snapshot_size) { | 26 int64 snapshot_size) { |
(...skipping 22 matching lines...) Expand all Loading... |
49 base::PostTaskAndReplyWithResult( | 49 base::PostTaskAndReplyWithResult( |
50 content::BrowserThread::GetBlockingPool(), | 50 content::BrowserThread::GetBlockingPool(), |
51 FROM_HERE, | 51 FROM_HERE, |
52 base::Bind(&ComputeSpaceNeedToBeFreedAfterGetMetadataOnBlockingPool, | 52 base::Bind(&ComputeSpaceNeedToBeFreedAfterGetMetadataOnBlockingPool, |
53 path, file_info.size), | 53 path, file_info.size), |
54 callback); | 54 callback); |
55 } | 55 } |
56 | 56 |
57 // Part of ComputeSpaceNeedToBeFreed. | 57 // Part of ComputeSpaceNeedToBeFreed. |
58 void GetMetadataOnIOThread(const base::FilePath& path, | 58 void GetMetadataOnIOThread(const base::FilePath& path, |
59 scoped_refptr<fileapi::FileSystemContext> context, | 59 scoped_refptr<storage::FileSystemContext> context, |
60 const fileapi::FileSystemURL& url, | 60 const storage::FileSystemURL& url, |
61 const GetNecessaryFreeSpaceCallback& callback) { | 61 const GetNecessaryFreeSpaceCallback& callback) { |
62 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 62 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
63 context->operation_runner()->GetMetadata( | 63 context->operation_runner()->GetMetadata( |
64 url, | 64 url, |
65 base::Bind(&ComputeSpaceNeedToBeFreedAfterGetMetadata, path, callback)); | 65 base::Bind(&ComputeSpaceNeedToBeFreedAfterGetMetadata, path, callback)); |
66 } | 66 } |
67 | 67 |
68 // Computes the size of space that need to be __additionally__ made available | 68 // Computes the size of space that need to be __additionally__ made available |
69 // in the |profile|'s data directory for taking the snapshot of |url|. | 69 // in the |profile|'s data directory for taking the snapshot of |url|. |
70 // Returns 0 if no additional space is required, or -1 in the case of an error. | 70 // Returns 0 if no additional space is required, or -1 in the case of an error. |
71 void ComputeSpaceNeedToBeFreed( | 71 void ComputeSpaceNeedToBeFreed( |
72 Profile* profile, | 72 Profile* profile, |
73 scoped_refptr<fileapi::FileSystemContext> context, | 73 scoped_refptr<storage::FileSystemContext> context, |
74 const fileapi::FileSystemURL& url, | 74 const storage::FileSystemURL& url, |
75 const GetNecessaryFreeSpaceCallback& callback) { | 75 const GetNecessaryFreeSpaceCallback& callback) { |
76 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 76 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
77 content::BrowserThread::PostTask( | 77 content::BrowserThread::PostTask( |
78 content::BrowserThread::IO, | 78 content::BrowserThread::IO, |
79 FROM_HERE, | 79 FROM_HERE, |
80 base::Bind(&GetMetadataOnIOThread, profile->GetPath(), context, url, | 80 base::Bind(&GetMetadataOnIOThread, profile->GetPath(), context, url, |
81 google_apis::CreateRelayCallback(callback))); | 81 google_apis::CreateRelayCallback(callback))); |
82 } | 82 } |
83 | 83 |
84 // Part of CreateManagedSnapshot. Runs CreateSnapshotFile method of fileapi. | 84 // Part of CreateManagedSnapshot. Runs CreateSnapshotFile method of fileapi. |
85 void CreateSnapshotFileOnIOThread( | 85 void CreateSnapshotFileOnIOThread( |
86 scoped_refptr<fileapi::FileSystemContext> context, | 86 scoped_refptr<storage::FileSystemContext> context, |
87 const fileapi::FileSystemURL& url, | 87 const storage::FileSystemURL& url, |
88 const fileapi::FileSystemOperation::SnapshotFileCallback& callback) { | 88 const storage::FileSystemOperation::SnapshotFileCallback& callback) { |
89 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 89 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
90 context->operation_runner()->CreateSnapshotFile(url, callback); | 90 context->operation_runner()->CreateSnapshotFile(url, callback); |
91 } | 91 } |
92 | 92 |
93 // Utility for destructing the bound |file_refs| on IO thread. This is meant | 93 // Utility for destructing the bound |file_refs| on IO thread. This is meant |
94 // to be used together with base::Bind. After this function finishes, the | 94 // to be used together with base::Bind. After this function finishes, the |
95 // Bind callback should destruct the bound argument. | 95 // Bind callback should destruct the bound argument. |
96 void FreeReferenceOnIOThread( | 96 void FreeReferenceOnIOThread( |
97 const std::deque<SnapshotManager::FileReferenceWithSizeInfo>& file_refs) { | 97 const std::deque<SnapshotManager::FileReferenceWithSizeInfo>& file_refs) { |
98 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); | 98 DCHECK_CURRENTLY_ON(content::BrowserThread::IO); |
99 } | 99 } |
100 | 100 |
101 } // namespace | 101 } // namespace |
102 | 102 |
103 SnapshotManager::FileReferenceWithSizeInfo::FileReferenceWithSizeInfo( | 103 SnapshotManager::FileReferenceWithSizeInfo::FileReferenceWithSizeInfo( |
104 scoped_refptr<webkit_blob::ShareableFileReference> ref, | 104 scoped_refptr<storage::ShareableFileReference> ref, |
105 int64 size) : file_ref(ref), file_size(size) { | 105 int64 size) |
| 106 : file_ref(ref), file_size(size) { |
106 } | 107 } |
107 | 108 |
108 SnapshotManager::FileReferenceWithSizeInfo::~FileReferenceWithSizeInfo() { | 109 SnapshotManager::FileReferenceWithSizeInfo::~FileReferenceWithSizeInfo() { |
109 } | 110 } |
110 | 111 |
111 SnapshotManager::SnapshotManager(Profile* profile) | 112 SnapshotManager::SnapshotManager(Profile* profile) |
112 : profile_(profile), weak_ptr_factory_(this) { | 113 : profile_(profile), weak_ptr_factory_(this) { |
113 } | 114 } |
114 | 115 |
115 SnapshotManager::~SnapshotManager() { | 116 SnapshotManager::~SnapshotManager() { |
116 if (!file_refs_.empty()) { | 117 if (!file_refs_.empty()) { |
117 bool posted = content::BrowserThread::PostTask( | 118 bool posted = content::BrowserThread::PostTask( |
118 content::BrowserThread::IO, | 119 content::BrowserThread::IO, |
119 FROM_HERE, | 120 FROM_HERE, |
120 base::Bind(&FreeReferenceOnIOThread, file_refs_)); | 121 base::Bind(&FreeReferenceOnIOThread, file_refs_)); |
121 DCHECK(posted); | 122 DCHECK(posted); |
122 } | 123 } |
123 } | 124 } |
124 | 125 |
125 void SnapshotManager::CreateManagedSnapshot( | 126 void SnapshotManager::CreateManagedSnapshot( |
126 const base::FilePath& absolute_file_path, | 127 const base::FilePath& absolute_file_path, |
127 const LocalPathCallback& callback) { | 128 const LocalPathCallback& callback) { |
128 scoped_refptr<fileapi::FileSystemContext> context( | 129 scoped_refptr<storage::FileSystemContext> context( |
129 util::GetFileSystemContextForExtensionId(profile_, kFileManagerAppId)); | 130 util::GetFileSystemContextForExtensionId(profile_, kFileManagerAppId)); |
130 DCHECK(context); | 131 DCHECK(context); |
131 | 132 |
132 GURL url; | 133 GURL url; |
133 if (!util::ConvertAbsoluteFilePathToFileSystemUrl( | 134 if (!util::ConvertAbsoluteFilePathToFileSystemUrl( |
134 profile_, absolute_file_path, kFileManagerAppId, &url)) { | 135 profile_, absolute_file_path, kFileManagerAppId, &url)) { |
135 callback.Run(base::FilePath()); | 136 callback.Run(base::FilePath()); |
136 return; | 137 return; |
137 } | 138 } |
138 fileapi::FileSystemURL filesystem_url = context->CrackURL(url); | 139 storage::FileSystemURL filesystem_url = context->CrackURL(url); |
139 | 140 |
140 ComputeSpaceNeedToBeFreed(profile_, context, filesystem_url, | 141 ComputeSpaceNeedToBeFreed(profile_, context, filesystem_url, |
141 base::Bind(&SnapshotManager::CreateManagedSnapshotAfterSpaceComputed, | 142 base::Bind(&SnapshotManager::CreateManagedSnapshotAfterSpaceComputed, |
142 weak_ptr_factory_.GetWeakPtr(), | 143 weak_ptr_factory_.GetWeakPtr(), |
143 filesystem_url, | 144 filesystem_url, |
144 callback)); | 145 callback)); |
145 } | 146 } |
146 | 147 |
147 void SnapshotManager::CreateManagedSnapshotAfterSpaceComputed( | 148 void SnapshotManager::CreateManagedSnapshotAfterSpaceComputed( |
148 const fileapi::FileSystemURL& filesystem_url, | 149 const storage::FileSystemURL& filesystem_url, |
149 const LocalPathCallback& callback, | 150 const LocalPathCallback& callback, |
150 int64 needed_space) { | 151 int64 needed_space) { |
151 scoped_refptr<fileapi::FileSystemContext> context( | 152 scoped_refptr<storage::FileSystemContext> context( |
152 util::GetFileSystemContextForExtensionId(profile_, kFileManagerAppId)); | 153 util::GetFileSystemContextForExtensionId(profile_, kFileManagerAppId)); |
153 DCHECK(context); | 154 DCHECK(context); |
154 | 155 |
155 if (needed_space < 0) { | 156 if (needed_space < 0) { |
156 callback.Run(base::FilePath()); | 157 callback.Run(base::FilePath()); |
157 return; | 158 return; |
158 } | 159 } |
159 | 160 |
160 // Free up to the required size. | 161 // Free up to the required size. |
161 std::deque<FileReferenceWithSizeInfo> to_free; | 162 std::deque<FileReferenceWithSizeInfo> to_free; |
(...skipping 27 matching lines...) Expand all Loading... |
189 base::Bind(&SnapshotManager::OnCreateSnapshotFile, | 190 base::Bind(&SnapshotManager::OnCreateSnapshotFile, |
190 weak_ptr_factory_.GetWeakPtr(), | 191 weak_ptr_factory_.GetWeakPtr(), |
191 callback)))); | 192 callback)))); |
192 } | 193 } |
193 | 194 |
194 void SnapshotManager::OnCreateSnapshotFile( | 195 void SnapshotManager::OnCreateSnapshotFile( |
195 const LocalPathCallback& callback, | 196 const LocalPathCallback& callback, |
196 base::File::Error result, | 197 base::File::Error result, |
197 const base::File::Info& file_info, | 198 const base::File::Info& file_info, |
198 const base::FilePath& platform_path, | 199 const base::FilePath& platform_path, |
199 const scoped_refptr<webkit_blob::ShareableFileReference>& file_ref) { | 200 const scoped_refptr<storage::ShareableFileReference>& file_ref) { |
200 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 201 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
201 | 202 |
202 if (result != base::File::FILE_OK) { | 203 if (result != base::File::FILE_OK) { |
203 callback.Run(base::FilePath()); | 204 callback.Run(base::FilePath()); |
204 return; | 205 return; |
205 } | 206 } |
206 | 207 |
207 file_refs_.push_back(FileReferenceWithSizeInfo(file_ref, file_info.size)); | 208 file_refs_.push_back(FileReferenceWithSizeInfo(file_ref, file_info.size)); |
208 callback.Run(platform_path); | 209 callback.Run(platform_path); |
209 } | 210 } |
210 | 211 |
211 } // namespace file_manager | 212 } // namespace file_manager |
OLD | NEW |