Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(162)

Side by Side Diff: chrome/browser/media_galleries/linux/mtp_device_task_helper.cc

Issue 377383002: Media Galleries: Access MTP devices by file ids rather than file paths. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/media_galleries/linux/mtp_device_task_helper.h" 5 #include "chrome/browser/media_galleries/linux/mtp_device_task_helper.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/numerics/safe_conversions.h" 10 #include "base/numerics/safe_conversions.h"
11 #include "base/strings/string_number_conversions.h"
11 #include "chrome/browser/media_galleries/linux/mtp_device_object_enumerator.h" 12 #include "chrome/browser/media_galleries/linux/mtp_device_object_enumerator.h"
12 #include "chrome/browser/media_galleries/linux/mtp_read_file_worker.h" 13 #include "chrome/browser/media_galleries/linux/mtp_read_file_worker.h"
13 #include "chrome/browser/media_galleries/linux/snapshot_file_details.h" 14 #include "chrome/browser/media_galleries/linux/snapshot_file_details.h"
14 #include "components/storage_monitor/storage_monitor.h" 15 #include "components/storage_monitor/storage_monitor.h"
15 #include "content/public/browser/browser_thread.h" 16 #include "content/public/browser/browser_thread.h"
16 #include "device/media_transfer_protocol/media_transfer_protocol_manager.h" 17 #include "device/media_transfer_protocol/media_transfer_protocol_manager.h"
17 #include "net/base/io_buffer.h" 18 #include "net/base/io_buffer.h"
18 #include "third_party/cros_system_api/dbus/service_constants.h" 19 #include "third_party/cros_system_api/dbus/service_constants.h"
19 #include "webkit/browser/fileapi/async_file_util.h" 20 #include "webkit/browser/fileapi/async_file_util.h"
20 #include "webkit/common/fileapi/file_system_util.h" 21 #include "webkit/common/fileapi/file_system_util.h"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 base::Bind(callback, true)); 68 base::Bind(callback, true));
68 return; 69 return;
69 } 70 }
70 GetMediaTransferProtocolManager()->OpenStorage( 71 GetMediaTransferProtocolManager()->OpenStorage(
71 storage_name, mtpd::kReadOnlyMode, 72 storage_name, mtpd::kReadOnlyMode,
72 base::Bind(&MTPDeviceTaskHelper::OnDidOpenStorage, 73 base::Bind(&MTPDeviceTaskHelper::OnDidOpenStorage,
73 weak_ptr_factory_.GetWeakPtr(), 74 weak_ptr_factory_.GetWeakPtr(),
74 callback)); 75 callback));
75 } 76 }
76 77
77 void MTPDeviceTaskHelper::GetFileInfoByPath( 78 void MTPDeviceTaskHelper::GetFileInfoById(
78 const std::string& file_path, 79 uint32 file_id,
79 const GetFileInfoSuccessCallback& success_callback, 80 const GetFileInfoSuccessCallback& success_callback,
80 const ErrorCallback& error_callback) { 81 const ErrorCallback& error_callback) {
81 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 82 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
82 if (device_handle_.empty()) 83 if (device_handle_.empty())
83 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED); 84 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED);
84 85
85 GetMediaTransferProtocolManager()->GetFileInfoByPath( 86 GetMediaTransferProtocolManager()->GetFileInfoById(
86 device_handle_, file_path, 87 device_handle_, file_id,
87 base::Bind(&MTPDeviceTaskHelper::OnGetFileInfo, 88 base::Bind(&MTPDeviceTaskHelper::OnGetFileInfo,
88 weak_ptr_factory_.GetWeakPtr(), 89 weak_ptr_factory_.GetWeakPtr(),
89 success_callback, 90 success_callback,
90 error_callback)); 91 error_callback));
91 } 92 }
92 93
93 void MTPDeviceTaskHelper::ReadDirectoryByPath( 94 void MTPDeviceTaskHelper::ReadDirectoryById(
94 const std::string& dir_path, 95 uint32 dir_id,
95 const ReadDirectorySuccessCallback& success_callback, 96 const ReadDirectorySuccessCallback& success_callback,
96 const ErrorCallback& error_callback) { 97 const ErrorCallback& error_callback) {
97 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 98 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
98 if (device_handle_.empty()) 99 if (device_handle_.empty())
99 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED); 100 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED);
100 101
101 GetMediaTransferProtocolManager()->ReadDirectoryByPath( 102 GetMediaTransferProtocolManager()->ReadDirectoryById(
102 device_handle_, dir_path, 103 device_handle_, dir_id,
103 base::Bind(&MTPDeviceTaskHelper::OnDidReadDirectoryByPath, 104 base::Bind(&MTPDeviceTaskHelper::OnDidReadDirectoryById,
104 weak_ptr_factory_.GetWeakPtr(), 105 weak_ptr_factory_.GetWeakPtr(),
105 success_callback, 106 success_callback,
106 error_callback)); 107 error_callback));
107 } 108 }
108 109
109 void MTPDeviceTaskHelper::WriteDataIntoSnapshotFile( 110 void MTPDeviceTaskHelper::WriteDataIntoSnapshotFile(
110 const SnapshotRequestInfo& request_info, 111 const SnapshotRequestInfo& request_info,
111 const base::File::Info& snapshot_file_info) { 112 const base::File::Info& snapshot_file_info) {
112 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 113 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
113 if (device_handle_.empty()) { 114 if (device_handle_.empty()) {
114 return HandleDeviceError(request_info.error_callback, 115 return HandleDeviceError(request_info.error_callback,
115 base::File::FILE_ERROR_FAILED); 116 base::File::FILE_ERROR_FAILED);
116 } 117 }
117 118
118 if (!read_file_worker_) 119 if (!read_file_worker_)
119 read_file_worker_.reset(new MTPReadFileWorker(device_handle_)); 120 read_file_worker_.reset(new MTPReadFileWorker(device_handle_));
120 read_file_worker_->WriteDataIntoSnapshotFile(request_info, 121 read_file_worker_->WriteDataIntoSnapshotFile(request_info,
121 snapshot_file_info); 122 snapshot_file_info);
122 } 123 }
123 124
124 void MTPDeviceTaskHelper::ReadBytes( 125 void MTPDeviceTaskHelper::ReadBytes(
125 const MTPDeviceAsyncDelegate::ReadBytesRequest& request) { 126 const MTPDeviceAsyncDelegate::ReadBytesRequest& request) {
126 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 127 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
127 if (device_handle_.empty()) { 128 if (device_handle_.empty()) {
128 return HandleDeviceError(request.error_callback, 129 return HandleDeviceError(request.error_callback,
129 base::File::FILE_ERROR_FAILED); 130 base::File::FILE_ERROR_FAILED);
130 } 131 }
131 132
132 GetMediaTransferProtocolManager()->GetFileInfoByPath( 133 GetMediaTransferProtocolManager()->GetFileInfoById(
133 device_handle_, request.device_file_relative_path, 134 device_handle_, request.file_id,
134 base::Bind(&MTPDeviceTaskHelper::OnGetFileInfoToReadBytes, 135 base::Bind(&MTPDeviceTaskHelper::OnGetFileInfoToReadBytes,
135 weak_ptr_factory_.GetWeakPtr(), request)); 136 weak_ptr_factory_.GetWeakPtr(), request));
136 } 137 }
137 138
138 void MTPDeviceTaskHelper::CloseStorage() const { 139 void MTPDeviceTaskHelper::CloseStorage() const {
139 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 140 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
140 if (device_handle_.empty()) 141 if (device_handle_.empty())
141 return; 142 return;
142 GetMediaTransferProtocolManager()->CloseStorage(device_handle_, 143 GetMediaTransferProtocolManager()->CloseStorage(device_handle_,
143 base::Bind(&DoNothing)); 144 base::Bind(&DoNothing));
(...skipping 20 matching lines...) Expand all
164 return HandleDeviceError(error_callback, 165 return HandleDeviceError(error_callback,
165 base::File::FILE_ERROR_NOT_FOUND); 166 base::File::FILE_ERROR_NOT_FOUND);
166 } 167 }
167 168
168 content::BrowserThread::PostTask( 169 content::BrowserThread::PostTask(
169 content::BrowserThread::IO, 170 content::BrowserThread::IO,
170 FROM_HERE, 171 FROM_HERE,
171 base::Bind(success_callback, FileInfoFromMTPFileEntry(file_entry))); 172 base::Bind(success_callback, FileInfoFromMTPFileEntry(file_entry)));
172 } 173 }
173 174
174 void MTPDeviceTaskHelper::OnDidReadDirectoryByPath( 175 void MTPDeviceTaskHelper::OnDidReadDirectoryById(
175 const ReadDirectorySuccessCallback& success_callback, 176 const ReadDirectorySuccessCallback& success_callback,
176 const ErrorCallback& error_callback, 177 const ErrorCallback& error_callback,
177 const std::vector<MtpFileEntry>& file_entries, 178 const std::vector<MtpFileEntry>& file_entries,
178 bool error) const { 179 bool error) const {
179 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 180 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
180 if (error) 181 if (error)
181 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED); 182 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED);
182 183
183 fileapi::AsyncFileUtil::EntryList entries; 184 fileapi::AsyncFileUtil::EntryList entries;
184 base::FilePath current; 185 base::FilePath current;
185 MTPDeviceObjectEnumerator file_enum(file_entries); 186 MTPDeviceObjectEnumerator file_enum(file_entries);
186 while (!(current = file_enum.Next()).empty()) { 187 while (!(current = file_enum.Next()).empty()) {
187 fileapi::DirectoryEntry entry; 188 fileapi::DirectoryEntry entry;
188 entry.name = fileapi::VirtualPath::BaseName(current).value(); 189 entry.name = fileapi::VirtualPath::BaseName(current).value();
190 uint32 file_id = 0;
191 bool ret = file_enum.GetEntryId(&file_id);
192 DCHECK(ret);
193 entry.name.push_back(',');
194 entry.name += base::UintToString(file_id);
189 entry.is_directory = file_enum.IsDirectory(); 195 entry.is_directory = file_enum.IsDirectory();
190 entry.size = file_enum.Size(); 196 entry.size = file_enum.Size();
191 entry.last_modified_time = file_enum.LastModifiedTime(); 197 entry.last_modified_time = file_enum.LastModifiedTime();
192 entries.push_back(entry); 198 entries.push_back(entry);
193 } 199 }
194 content::BrowserThread::PostTask(content::BrowserThread::IO, 200 content::BrowserThread::PostTask(content::BrowserThread::IO,
195 FROM_HERE, 201 FROM_HERE,
196 base::Bind(success_callback, entries)); 202 base::Bind(success_callback, entries));
197 } 203 }
198 204
199 void MTPDeviceTaskHelper::OnGetFileInfoToReadBytes( 205 void MTPDeviceTaskHelper::OnGetFileInfoToReadBytes(
200 const MTPDeviceAsyncDelegate::ReadBytesRequest& request, 206 const MTPDeviceAsyncDelegate::ReadBytesRequest& request,
201 const MtpFileEntry& file_entry, 207 const MtpFileEntry& file_entry,
202 bool error) { 208 bool error) {
203 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 209 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
204 DCHECK(request.buf); 210 DCHECK(request.buf);
205 DCHECK(request.buf_len >= 0); 211 DCHECK_GE(request.buf_len, 0);
206 DCHECK_GE(request.offset, 0); 212 DCHECK_GE(request.offset, 0);
207 if (error) { 213 if (error) {
208 return HandleDeviceError(request.error_callback, 214 return HandleDeviceError(request.error_callback,
209 base::File::FILE_ERROR_FAILED); 215 base::File::FILE_ERROR_FAILED);
210 } 216 }
211 217
212 base::File::Info file_info = FileInfoFromMTPFileEntry(file_entry); 218 base::File::Info file_info = FileInfoFromMTPFileEntry(file_entry);
213 if (file_info.is_directory) { 219 if (file_info.is_directory) {
214 return HandleDeviceError(request.error_callback, 220 return HandleDeviceError(request.error_callback,
215 base::File::FILE_ERROR_NOT_A_FILE); 221 base::File::FILE_ERROR_NOT_A_FILE);
216 } else if (file_info.size < 0 || file_info.size > kuint32max || 222 } else if (file_info.size < 0 || file_info.size > kuint32max ||
217 request.offset > file_info.size) { 223 request.offset > file_info.size) {
218 return HandleDeviceError(request.error_callback, 224 return HandleDeviceError(request.error_callback,
219 base::File::FILE_ERROR_FAILED); 225 base::File::FILE_ERROR_FAILED);
220 } else if (request.offset == file_info.size) { 226 } else if (request.offset == file_info.size) {
221 content::BrowserThread::PostTask(content::BrowserThread::IO, 227 content::BrowserThread::PostTask(content::BrowserThread::IO,
222 FROM_HERE, 228 FROM_HERE,
223 base::Bind(request.success_callback, 229 base::Bind(request.success_callback,
224 file_info, 0u)); 230 file_info, 0u));
225 return; 231 return;
226 } 232 }
227 233
228 uint32 bytes_to_read = std::min( 234 uint32 bytes_to_read = std::min(
229 base::checked_cast<uint32>(request.buf_len), 235 base::checked_cast<uint32>(request.buf_len),
230 base::saturated_cast<uint32>(file_info.size - request.offset)); 236 base::saturated_cast<uint32>(file_info.size - request.offset));
231 237
232 GetMediaTransferProtocolManager()->ReadFileChunkByPath( 238 GetMediaTransferProtocolManager()->ReadFileChunkById(
233 device_handle_, 239 device_handle_,
234 request.device_file_relative_path, 240 request.file_id,
235 base::checked_cast<uint32>(request.offset), 241 base::checked_cast<uint32>(request.offset),
236 bytes_to_read, 242 bytes_to_read,
237 base::Bind(&MTPDeviceTaskHelper::OnDidReadBytes, 243 base::Bind(&MTPDeviceTaskHelper::OnDidReadBytes,
238 weak_ptr_factory_.GetWeakPtr(), request, file_info)); 244 weak_ptr_factory_.GetWeakPtr(), request, file_info));
239 } 245 }
240 246
241 void MTPDeviceTaskHelper::OnDidReadBytes( 247 void MTPDeviceTaskHelper::OnDidReadBytes(
242 const MTPDeviceAsyncDelegate::ReadBytesRequest& request, 248 const MTPDeviceAsyncDelegate::ReadBytesRequest& request,
243 const base::File::Info& file_info, 249 const base::File::Info& file_info,
244 const std::string& data, 250 const std::string& data,
(...skipping 14 matching lines...) Expand all
259 } 265 }
260 266
261 void MTPDeviceTaskHelper::HandleDeviceError( 267 void MTPDeviceTaskHelper::HandleDeviceError(
262 const ErrorCallback& error_callback, 268 const ErrorCallback& error_callback,
263 base::File::Error error) const { 269 base::File::Error error) const {
264 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); 270 DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
265 content::BrowserThread::PostTask(content::BrowserThread::IO, 271 content::BrowserThread::PostTask(content::BrowserThread::IO,
266 FROM_HERE, 272 FROM_HERE,
267 base::Bind(error_callback, error)); 273 base::Bind(error_callback, error));
268 } 274 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698