| Index: chrome/browser/media_galleries/linux/mtp_device_task_helper.cc
|
| diff --git a/chrome/browser/media_galleries/linux/mtp_device_task_helper.cc b/chrome/browser/media_galleries/linux/mtp_device_task_helper.cc
|
| index a1546c747c32e48671d8b9c5d656744ca45ab27d..7e18714e54e9024d038da2db55c97d85c7347c20 100644
|
| --- a/chrome/browser/media_galleries/linux/mtp_device_task_helper.cc
|
| +++ b/chrome/browser/media_galleries/linux/mtp_device_task_helper.cc
|
| @@ -33,6 +33,19 @@ device::MediaTransferProtocolManager* GetMediaTransferProtocolManager() {
|
| return StorageMonitor::GetInstance()->media_transfer_protocol_manager();
|
| }
|
|
|
| +base::File::Info FileInfoFromMTPFileEntry(const MtpFileEntry& file_entry) {
|
| + base::File::Info file_entry_info;
|
| + file_entry_info.size = file_entry.file_size();
|
| + file_entry_info.is_directory =
|
| + file_entry.file_type() == MtpFileEntry::FILE_TYPE_FOLDER;
|
| + file_entry_info.is_symbolic_link = false;
|
| + file_entry_info.last_modified =
|
| + base::Time::FromTimeT(file_entry.modification_time());
|
| + file_entry_info.last_accessed = file_entry_info.last_modified;
|
| + file_entry_info.creation_time = base::Time();
|
| + return file_entry_info;
|
| +}
|
| +
|
| } // namespace
|
|
|
| MTPDeviceTaskHelper::MTPDeviceTaskHelper()
|
| @@ -116,12 +129,9 @@ void MTPDeviceTaskHelper::ReadBytes(
|
| base::File::FILE_ERROR_FAILED);
|
| }
|
|
|
| - GetMediaTransferProtocolManager()->ReadFileChunkByPath(
|
| - device_handle_,
|
| - request.device_file_relative_path,
|
| - base::checked_cast<uint32>(request.offset),
|
| - base::checked_cast<uint32>(request.buf_len),
|
| - base::Bind(&MTPDeviceTaskHelper::OnDidReadBytes,
|
| + GetMediaTransferProtocolManager()->GetFileInfoByPath(
|
| + device_handle_, request.device_file_relative_path,
|
| + base::Bind(&MTPDeviceTaskHelper::OnGetFileInfoToReadBytes,
|
| weak_ptr_factory_.GetWeakPtr(), request));
|
| }
|
|
|
| @@ -155,19 +165,10 @@ void MTPDeviceTaskHelper::OnGetFileInfo(
|
| base::File::FILE_ERROR_NOT_FOUND);
|
| }
|
|
|
| - base::File::Info file_entry_info;
|
| - file_entry_info.size = file_entry.file_size();
|
| - file_entry_info.is_directory =
|
| - file_entry.file_type() == MtpFileEntry::FILE_TYPE_FOLDER;
|
| - file_entry_info.is_symbolic_link = false;
|
| - file_entry_info.last_modified =
|
| - base::Time::FromTimeT(file_entry.modification_time());
|
| - file_entry_info.last_accessed = file_entry_info.last_modified;
|
| - file_entry_info.creation_time = base::Time();
|
| - content::BrowserThread::PostTask(content::BrowserThread::IO,
|
| - FROM_HERE,
|
| - base::Bind(success_callback,
|
| - file_entry_info));
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::IO,
|
| + FROM_HERE,
|
| + base::Bind(success_callback, FileInfoFromMTPFileEntry(file_entry)));
|
| }
|
|
|
| void MTPDeviceTaskHelper::OnDidReadDirectoryByPath(
|
| @@ -195,8 +196,45 @@ void MTPDeviceTaskHelper::OnDidReadDirectoryByPath(
|
| base::Bind(success_callback, entries));
|
| }
|
|
|
| +void MTPDeviceTaskHelper::OnGetFileInfoToReadBytes(
|
| + const MTPDeviceAsyncDelegate::ReadBytesRequest& request,
|
| + const MtpFileEntry& file_entry,
|
| + bool error) {
|
| + DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| + DCHECK(request.buf);
|
| + DCHECK(request.buf_len >= 0);
|
| + DCHECK_GE(request.offset, 0);
|
| + if (error) {
|
| + return HandleDeviceError(request.error_callback,
|
| + base::File::FILE_ERROR_FAILED);
|
| + }
|
| +
|
| + base::File::Info file_info = FileInfoFromMTPFileEntry(file_entry);
|
| + if (file_info.is_directory) {
|
| + return HandleDeviceError(request.error_callback,
|
| + base::File::FILE_ERROR_NOT_A_FILE);
|
| + } else if (file_info.size < 0 || file_info.size > kuint32max ||
|
| + request.offset >= file_info.size) {
|
| + return HandleDeviceError(request.error_callback,
|
| + base::File::FILE_ERROR_FAILED);
|
| + }
|
| +
|
| + uint32 bytes_to_read = std::min(
|
| + base::checked_cast<uint32>(request.buf_len),
|
| + base::saturated_cast<uint32>(file_info.size - request.offset));
|
| +
|
| + GetMediaTransferProtocolManager()->ReadFileChunkByPath(
|
| + device_handle_,
|
| + request.device_file_relative_path,
|
| + base::checked_cast<uint32>(request.offset),
|
| + bytes_to_read,
|
| + base::Bind(&MTPDeviceTaskHelper::OnDidReadBytes,
|
| + weak_ptr_factory_.GetWeakPtr(), request, file_info));
|
| +}
|
| +
|
| void MTPDeviceTaskHelper::OnDidReadBytes(
|
| const MTPDeviceAsyncDelegate::ReadBytesRequest& request,
|
| + const base::File::Info& file_info,
|
| const std::string& data,
|
| bool error) const {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
| @@ -211,7 +249,7 @@ void MTPDeviceTaskHelper::OnDidReadBytes(
|
| content::BrowserThread::PostTask(content::BrowserThread::IO,
|
| FROM_HERE,
|
| base::Bind(request.success_callback,
|
| - data.length()));
|
| + file_info, data.length()));
|
| }
|
|
|
| void MTPDeviceTaskHelper::HandleDeviceError(
|
|
|