| OLD | NEW |
| 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 #include <limits> |
| 8 | 9 |
| 9 #include "base/logging.h" | 10 #include "base/logging.h" |
| 10 #include "chrome/browser/media_galleries/linux/mtp_device_object_enumerator.h" | 11 #include "chrome/browser/media_galleries/linux/mtp_device_object_enumerator.h" |
| 11 #include "chrome/browser/media_galleries/linux/mtp_read_file_worker.h" | 12 #include "chrome/browser/media_galleries/linux/mtp_read_file_worker.h" |
| 12 #include "chrome/browser/media_galleries/linux/snapshot_file_details.h" | 13 #include "chrome/browser/media_galleries/linux/snapshot_file_details.h" |
| 13 #include "components/storage_monitor/storage_monitor.h" | 14 #include "components/storage_monitor/storage_monitor.h" |
| 14 #include "content/public/browser/browser_thread.h" | 15 #include "content/public/browser/browser_thread.h" |
| 15 #include "device/media_transfer_protocol/media_transfer_protocol_manager.h" | 16 #include "device/media_transfer_protocol/media_transfer_protocol_manager.h" |
| 16 #include "net/base/io_buffer.h" | 17 #include "net/base/io_buffer.h" |
| 17 #include "storage/browser/fileapi/async_file_util.h" | 18 #include "storage/browser/fileapi/async_file_util.h" |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 } | 70 } |
| 70 | 71 |
| 71 const std::string mode = | 72 const std::string mode = |
| 72 read_only ? mtpd::kReadOnlyMode : mtpd::kReadWriteMode; | 73 read_only ? mtpd::kReadOnlyMode : mtpd::kReadWriteMode; |
| 73 GetMediaTransferProtocolManager()->OpenStorage( | 74 GetMediaTransferProtocolManager()->OpenStorage( |
| 74 storage_name, mode, base::Bind(&MTPDeviceTaskHelper::OnDidOpenStorage, | 75 storage_name, mode, base::Bind(&MTPDeviceTaskHelper::OnDidOpenStorage, |
| 75 weak_ptr_factory_.GetWeakPtr(), callback)); | 76 weak_ptr_factory_.GetWeakPtr(), callback)); |
| 76 } | 77 } |
| 77 | 78 |
| 78 void MTPDeviceTaskHelper::GetFileInfo( | 79 void MTPDeviceTaskHelper::GetFileInfo( |
| 79 uint32 file_id, | 80 uint32_t file_id, |
| 80 const GetFileInfoSuccessCallback& success_callback, | 81 const GetFileInfoSuccessCallback& success_callback, |
| 81 const ErrorCallback& error_callback) { | 82 const ErrorCallback& error_callback) { |
| 82 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 83 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 83 if (device_handle_.empty()) | 84 if (device_handle_.empty()) |
| 84 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED); | 85 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED); |
| 85 | 86 |
| 86 GetMediaTransferProtocolManager()->GetFileInfo( | 87 GetMediaTransferProtocolManager()->GetFileInfo( |
| 87 device_handle_, file_id, | 88 device_handle_, file_id, |
| 88 base::Bind(&MTPDeviceTaskHelper::OnGetFileInfo, | 89 base::Bind(&MTPDeviceTaskHelper::OnGetFileInfo, |
| 89 weak_ptr_factory_.GetWeakPtr(), | 90 weak_ptr_factory_.GetWeakPtr(), |
| 90 success_callback, | 91 success_callback, |
| 91 error_callback)); | 92 error_callback)); |
| 92 } | 93 } |
| 93 | 94 |
| 94 void MTPDeviceTaskHelper::CreateDirectory( | 95 void MTPDeviceTaskHelper::CreateDirectory( |
| 95 const uint32 parent_id, | 96 const uint32_t parent_id, |
| 96 const std::string& directory_name, | 97 const std::string& directory_name, |
| 97 const CreateDirectorySuccessCallback& success_callback, | 98 const CreateDirectorySuccessCallback& success_callback, |
| 98 const ErrorCallback& error_callback) { | 99 const ErrorCallback& error_callback) { |
| 99 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 100 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 100 if (device_handle_.empty()) | 101 if (device_handle_.empty()) |
| 101 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED); | 102 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED); |
| 102 | 103 |
| 103 GetMediaTransferProtocolManager()->CreateDirectory( | 104 GetMediaTransferProtocolManager()->CreateDirectory( |
| 104 device_handle_, parent_id, directory_name, | 105 device_handle_, parent_id, directory_name, |
| 105 base::Bind(&MTPDeviceTaskHelper::OnCreateDirectory, | 106 base::Bind(&MTPDeviceTaskHelper::OnCreateDirectory, |
| 106 weak_ptr_factory_.GetWeakPtr(), success_callback, | 107 weak_ptr_factory_.GetWeakPtr(), success_callback, |
| 107 error_callback)); | 108 error_callback)); |
| 108 } | 109 } |
| 109 | 110 |
| 110 void MTPDeviceTaskHelper::ReadDirectory( | 111 void MTPDeviceTaskHelper::ReadDirectory( |
| 111 const uint32 directory_id, | 112 const uint32_t directory_id, |
| 112 const size_t max_size, | 113 const size_t max_size, |
| 113 const ReadDirectorySuccessCallback& success_callback, | 114 const ReadDirectorySuccessCallback& success_callback, |
| 114 const ErrorCallback& error_callback) { | 115 const ErrorCallback& error_callback) { |
| 115 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 116 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 116 if (device_handle_.empty()) | 117 if (device_handle_.empty()) |
| 117 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED); | 118 return HandleDeviceError(error_callback, base::File::FILE_ERROR_FAILED); |
| 118 | 119 |
| 119 GetMediaTransferProtocolManager()->ReadDirectory( | 120 GetMediaTransferProtocolManager()->ReadDirectory( |
| 120 device_handle_, directory_id, max_size, | 121 device_handle_, directory_id, max_size, |
| 121 base::Bind(&MTPDeviceTaskHelper::OnDidReadDirectory, | 122 base::Bind(&MTPDeviceTaskHelper::OnDidReadDirectory, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 146 base::File::FILE_ERROR_FAILED); | 147 base::File::FILE_ERROR_FAILED); |
| 147 } | 148 } |
| 148 | 149 |
| 149 GetMediaTransferProtocolManager()->GetFileInfo( | 150 GetMediaTransferProtocolManager()->GetFileInfo( |
| 150 device_handle_, request.file_id, | 151 device_handle_, request.file_id, |
| 151 base::Bind(&MTPDeviceTaskHelper::OnGetFileInfoToReadBytes, | 152 base::Bind(&MTPDeviceTaskHelper::OnGetFileInfoToReadBytes, |
| 152 weak_ptr_factory_.GetWeakPtr(), request)); | 153 weak_ptr_factory_.GetWeakPtr(), request)); |
| 153 } | 154 } |
| 154 | 155 |
| 155 void MTPDeviceTaskHelper::RenameObject( | 156 void MTPDeviceTaskHelper::RenameObject( |
| 156 const uint32 object_id, | 157 const uint32_t object_id, |
| 157 const std::string& new_name, | 158 const std::string& new_name, |
| 158 const RenameObjectSuccessCallback& success_callback, | 159 const RenameObjectSuccessCallback& success_callback, |
| 159 const ErrorCallback& error_callback) { | 160 const ErrorCallback& error_callback) { |
| 160 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 161 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 161 | 162 |
| 162 GetMediaTransferProtocolManager()->RenameObject( | 163 GetMediaTransferProtocolManager()->RenameObject( |
| 163 device_handle_, object_id, new_name, | 164 device_handle_, object_id, new_name, |
| 164 base::Bind(&MTPDeviceTaskHelper::OnRenameObject, | 165 base::Bind(&MTPDeviceTaskHelper::OnRenameObject, |
| 165 weak_ptr_factory_.GetWeakPtr(), success_callback, | 166 weak_ptr_factory_.GetWeakPtr(), success_callback, |
| 166 error_callback)); | 167 error_callback)); |
| 167 } | 168 } |
| 168 | 169 |
| 169 MTPDeviceTaskHelper::MTPEntry::MTPEntry() : file_id(0) {} | 170 MTPDeviceTaskHelper::MTPEntry::MTPEntry() : file_id(0) {} |
| 170 | 171 |
| 171 // TODO(yawano) storage_name is not used, delete it. | 172 // TODO(yawano) storage_name is not used, delete it. |
| 172 void MTPDeviceTaskHelper::CopyFileFromLocal( | 173 void MTPDeviceTaskHelper::CopyFileFromLocal( |
| 173 const std::string& storage_name, | 174 const std::string& storage_name, |
| 174 const int source_file_descriptor, | 175 const int source_file_descriptor, |
| 175 const uint32 parent_id, | 176 const uint32_t parent_id, |
| 176 const std::string& file_name, | 177 const std::string& file_name, |
| 177 const CopyFileFromLocalSuccessCallback& success_callback, | 178 const CopyFileFromLocalSuccessCallback& success_callback, |
| 178 const ErrorCallback& error_callback) { | 179 const ErrorCallback& error_callback) { |
| 179 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 180 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 180 | 181 |
| 181 GetMediaTransferProtocolManager()->CopyFileFromLocal( | 182 GetMediaTransferProtocolManager()->CopyFileFromLocal( |
| 182 device_handle_, source_file_descriptor, parent_id, file_name, | 183 device_handle_, source_file_descriptor, parent_id, file_name, |
| 183 base::Bind(&MTPDeviceTaskHelper::OnCopyFileFromLocal, | 184 base::Bind(&MTPDeviceTaskHelper::OnCopyFileFromLocal, |
| 184 weak_ptr_factory_.GetWeakPtr(), success_callback, | 185 weak_ptr_factory_.GetWeakPtr(), success_callback, |
| 185 error_callback)); | 186 error_callback)); |
| 186 } | 187 } |
| 187 | 188 |
| 188 void MTPDeviceTaskHelper::DeleteObject( | 189 void MTPDeviceTaskHelper::DeleteObject( |
| 189 const uint32 object_id, | 190 const uint32_t object_id, |
| 190 const DeleteObjectSuccessCallback& success_callback, | 191 const DeleteObjectSuccessCallback& success_callback, |
| 191 const ErrorCallback& error_callback) { | 192 const ErrorCallback& error_callback) { |
| 192 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 193 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 193 | 194 |
| 194 GetMediaTransferProtocolManager()->DeleteObject( | 195 GetMediaTransferProtocolManager()->DeleteObject( |
| 195 device_handle_, object_id, | 196 device_handle_, object_id, |
| 196 base::Bind(&MTPDeviceTaskHelper::OnDeleteObject, | 197 base::Bind(&MTPDeviceTaskHelper::OnDeleteObject, |
| 197 weak_ptr_factory_.GetWeakPtr(), success_callback, | 198 weak_ptr_factory_.GetWeakPtr(), success_callback, |
| 198 error_callback)); | 199 error_callback)); |
| 199 } | 200 } |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 DCHECK_GE(request.offset, 0); | 290 DCHECK_GE(request.offset, 0); |
| 290 if (error) { | 291 if (error) { |
| 291 return HandleDeviceError(request.error_callback, | 292 return HandleDeviceError(request.error_callback, |
| 292 base::File::FILE_ERROR_FAILED); | 293 base::File::FILE_ERROR_FAILED); |
| 293 } | 294 } |
| 294 | 295 |
| 295 base::File::Info file_info = FileInfoFromMTPFileEntry(file_entry); | 296 base::File::Info file_info = FileInfoFromMTPFileEntry(file_entry); |
| 296 if (file_info.is_directory) { | 297 if (file_info.is_directory) { |
| 297 return HandleDeviceError(request.error_callback, | 298 return HandleDeviceError(request.error_callback, |
| 298 base::File::FILE_ERROR_NOT_A_FILE); | 299 base::File::FILE_ERROR_NOT_A_FILE); |
| 299 } else if (file_info.size < 0 || file_info.size > kuint32max || | 300 } else if (file_info.size < 0 || |
| 301 file_info.size > std::numeric_limits<uint32_t>::max() || |
| 300 request.offset > file_info.size) { | 302 request.offset > file_info.size) { |
| 301 return HandleDeviceError(request.error_callback, | 303 return HandleDeviceError(request.error_callback, |
| 302 base::File::FILE_ERROR_FAILED); | 304 base::File::FILE_ERROR_FAILED); |
| 303 } else if (request.offset == file_info.size) { | 305 } else if (request.offset == file_info.size) { |
| 304 content::BrowserThread::PostTask(content::BrowserThread::IO, | 306 content::BrowserThread::PostTask(content::BrowserThread::IO, |
| 305 FROM_HERE, | 307 FROM_HERE, |
| 306 base::Bind(request.success_callback, | 308 base::Bind(request.success_callback, |
| 307 file_info, 0u)); | 309 file_info, 0u)); |
| 308 return; | 310 return; |
| 309 } | 311 } |
| 310 | 312 |
| 311 uint32 bytes_to_read = std::min( | 313 uint32_t bytes_to_read = |
| 312 base::checked_cast<uint32>(request.buf_len), | 314 std::min(base::checked_cast<uint32_t>(request.buf_len), |
| 313 base::saturated_cast<uint32>(file_info.size - request.offset)); | 315 base::saturated_cast<uint32_t>(file_info.size - request.offset)); |
| 314 | 316 |
| 315 GetMediaTransferProtocolManager()->ReadFileChunk( | 317 GetMediaTransferProtocolManager()->ReadFileChunk( |
| 316 device_handle_, | 318 device_handle_, request.file_id, |
| 317 request.file_id, | 319 base::checked_cast<uint32_t>(request.offset), bytes_to_read, |
| 318 base::checked_cast<uint32>(request.offset), | |
| 319 bytes_to_read, | |
| 320 base::Bind(&MTPDeviceTaskHelper::OnDidReadBytes, | 320 base::Bind(&MTPDeviceTaskHelper::OnDidReadBytes, |
| 321 weak_ptr_factory_.GetWeakPtr(), request, file_info)); | 321 weak_ptr_factory_.GetWeakPtr(), request, file_info)); |
| 322 } | 322 } |
| 323 | 323 |
| 324 void MTPDeviceTaskHelper::OnDidReadBytes( | 324 void MTPDeviceTaskHelper::OnDidReadBytes( |
| 325 const MTPDeviceAsyncDelegate::ReadBytesRequest& request, | 325 const MTPDeviceAsyncDelegate::ReadBytesRequest& request, |
| 326 const base::File::Info& file_info, | 326 const base::File::Info& file_info, |
| 327 const std::string& data, | 327 const std::string& data, |
| 328 bool error) const { | 328 bool error) const { |
| 329 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 329 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 } | 390 } |
| 391 | 391 |
| 392 void MTPDeviceTaskHelper::HandleDeviceError( | 392 void MTPDeviceTaskHelper::HandleDeviceError( |
| 393 const ErrorCallback& error_callback, | 393 const ErrorCallback& error_callback, |
| 394 base::File::Error error) const { | 394 base::File::Error error) const { |
| 395 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 395 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 396 content::BrowserThread::PostTask(content::BrowserThread::IO, | 396 content::BrowserThread::PostTask(content::BrowserThread::IO, |
| 397 FROM_HERE, | 397 FROM_HERE, |
| 398 base::Bind(error_callback, error)); | 398 base::Bind(error_callback, error)); |
| 399 } | 399 } |
| OLD | NEW |