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

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

Issue 180783005: MTP Streaming: Optimize block reading (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 9 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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_delegate_impl_linux.h" 5 #include "chrome/browser/media_galleries/linux/mtp_device_delegate_impl_linux.h"
6 6
7 #include <algorithm>
8
7 #include "base/bind.h" 9 #include "base/bind.h"
8 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
11 #include "base/numerics/safe_conversions.h"
9 #include "base/strings/string_util.h" 12 #include "base/strings/string_util.h"
10 #include "chrome/browser/media_galleries/linux/mtp_device_task_helper.h" 13 #include "chrome/browser/media_galleries/linux/mtp_device_task_helper.h"
11 #include "chrome/browser/media_galleries/linux/mtp_device_task_helper_map_servic e.h" 14 #include "chrome/browser/media_galleries/linux/mtp_device_task_helper_map_servic e.h"
12 #include "chrome/browser/media_galleries/linux/snapshot_file_details.h" 15 #include "chrome/browser/media_galleries/linux/snapshot_file_details.h"
13 #include "content/public/browser/browser_thread.h" 16 #include "content/public/browser/browser_thread.h"
14 #include "net/base/io_buffer.h" 17 #include "net/base/io_buffer.h"
15 18
16 namespace { 19 namespace {
17 20
18 // File path separator constant. 21 // File path separator constant.
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 288
286 void MTPDeviceDelegateImplLinux::ReadBytes( 289 void MTPDeviceDelegateImplLinux::ReadBytes(
287 const base::FilePath& device_file_path, 290 const base::FilePath& device_file_path,
288 net::IOBuffer* buf, int64 offset, int buf_len, 291 net::IOBuffer* buf, int64 offset, int buf_len,
289 const ReadBytesSuccessCallback& success_callback, 292 const ReadBytesSuccessCallback& success_callback,
290 const ErrorCallback& error_callback) { 293 const ErrorCallback& error_callback) {
291 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 294 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
292 DCHECK(!device_file_path.empty()); 295 DCHECK(!device_file_path.empty());
293 std::string device_file_relative_path = 296 std::string device_file_relative_path =
294 GetDeviceRelativePath(device_path_, device_file_path); 297 GetDeviceRelativePath(device_path_, device_file_path);
295 ReadBytesRequest request(device_file_relative_path, buf, offset, buf_len, 298
296 success_callback, error_callback); 299 ReadBytesRequest request(
300 device_file_relative_path, buf, offset, buf_len,
301 base::Bind(&MTPDeviceDelegateImplLinux::OnDidReadBytes,
302 weak_ptr_factory_.GetWeakPtr(), success_callback),
303 base::Bind(&MTPDeviceDelegateImplLinux::HandleDeviceFileError,
304 weak_ptr_factory_.GetWeakPtr(), error_callback));
305
297 base::Closure call_closure = 306 base::Closure call_closure =
298 base::Bind( 307 base::Bind(base::Bind(&ReadBytesOnUIThread, storage_name_, request));
299 &GetFileInfoOnUIThread, 308
300 storage_name_,
301 device_file_relative_path,
302 base::Bind(&MTPDeviceDelegateImplLinux::OnDidGetFileInfoToReadBytes,
303 weak_ptr_factory_.GetWeakPtr(), request),
304 base::Bind(&MTPDeviceDelegateImplLinux::HandleDeviceFileError,
305 weak_ptr_factory_.GetWeakPtr(), error_callback));
306 EnsureInitAndRunTask(PendingTaskInfo(FROM_HERE, call_closure)); 309 EnsureInitAndRunTask(PendingTaskInfo(FROM_HERE, call_closure));
307 } 310 }
308 311
309 void MTPDeviceDelegateImplLinux::CancelPendingTasksAndDeleteDelegate() { 312 void MTPDeviceDelegateImplLinux::CancelPendingTasksAndDeleteDelegate() {
310 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 313 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
311 // To cancel all the pending tasks, destroy the MTPDeviceTaskHelper object. 314 // To cancel all the pending tasks, destroy the MTPDeviceTaskHelper object.
312 content::BrowserThread::PostTask( 315 content::BrowserThread::PostTask(
313 content::BrowserThread::UI, 316 content::BrowserThread::UI,
314 FROM_HERE, 317 FROM_HERE,
315 base::Bind(&CloseStorageAndDestroyTaskHelperOnUIThread, storage_name_)); 318 base::Bind(&CloseStorageAndDestroyTaskHelperOnUIThread, storage_name_));
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 448
446 current_snapshot_request_info_.reset(snapshot_request_info.release()); 449 current_snapshot_request_info_.reset(snapshot_request_info.release());
447 if (file_info.size == 0) { 450 if (file_info.size == 0) {
448 // Empty snapshot file. 451 // Empty snapshot file.
449 return OnDidWriteDataIntoSnapshotFile( 452 return OnDidWriteDataIntoSnapshotFile(
450 snapshot_file_info, current_snapshot_request_info_->snapshot_file_path); 453 snapshot_file_info, current_snapshot_request_info_->snapshot_file_path);
451 } 454 }
452 WriteDataIntoSnapshotFile(snapshot_file_info); 455 WriteDataIntoSnapshotFile(snapshot_file_info);
453 } 456 }
454 457
455 void MTPDeviceDelegateImplLinux::OnDidGetFileInfoToReadBytes(
456 const ReadBytesRequest& request,
457 const base::File::Info& file_info) {
458 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
459 DCHECK(request.buf);
460 DCHECK(request.buf_len >= 0);
461 DCHECK(task_in_progress_);
462 base::File::Error error = base::File::FILE_OK;
463 if (file_info.is_directory)
464 error = base::File::FILE_ERROR_NOT_A_FILE;
465 else if (file_info.size < 0 || file_info.size > kuint32max)
466 error = base::File::FILE_ERROR_FAILED;
467
468 if (error != base::File::FILE_OK)
469 return HandleDeviceFileError(request.error_callback, error);
470
471 ReadBytesRequest new_request(
472 request.device_file_relative_path,
473 request.buf,
474 request.offset,
475 request.buf_len,
476 base::Bind(&MTPDeviceDelegateImplLinux::OnDidReadBytes,
477 weak_ptr_factory_.GetWeakPtr(), request.success_callback),
478 base::Bind(&MTPDeviceDelegateImplLinux::HandleDeviceFileError,
479 weak_ptr_factory_.GetWeakPtr(), request.error_callback));
480
481 content::BrowserThread::PostTask(
482 content::BrowserThread::UI,
483 FROM_HERE,
484 base::Bind(&ReadBytesOnUIThread, storage_name_, new_request));
485 }
486
487 void MTPDeviceDelegateImplLinux::OnDidReadDirectory( 458 void MTPDeviceDelegateImplLinux::OnDidReadDirectory(
488 const ReadDirectorySuccessCallback& success_callback, 459 const ReadDirectorySuccessCallback& success_callback,
489 const fileapi::AsyncFileUtil::EntryList& file_list) { 460 const fileapi::AsyncFileUtil::EntryList& file_list) {
490 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 461 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
491 success_callback.Run(file_list, false /*no more entries*/); 462 success_callback.Run(file_list, false /*no more entries*/);
492 task_in_progress_ = false; 463 task_in_progress_ = false;
493 ProcessNextPendingRequest(); 464 ProcessNextPendingRequest();
494 } 465 }
495 466
496 void MTPDeviceDelegateImplLinux::OnDidWriteDataIntoSnapshotFile( 467 void MTPDeviceDelegateImplLinux::OnDidWriteDataIntoSnapshotFile(
(...skipping 15 matching lines...) Expand all
512 DCHECK(current_snapshot_request_info_.get()); 483 DCHECK(current_snapshot_request_info_.get());
513 DCHECK(task_in_progress_); 484 DCHECK(task_in_progress_);
514 current_snapshot_request_info_->error_callback.Run(error); 485 current_snapshot_request_info_->error_callback.Run(error);
515 task_in_progress_ = false; 486 task_in_progress_ = false;
516 current_snapshot_request_info_.reset(); 487 current_snapshot_request_info_.reset();
517 ProcessNextPendingRequest(); 488 ProcessNextPendingRequest();
518 } 489 }
519 490
520 void MTPDeviceDelegateImplLinux::OnDidReadBytes( 491 void MTPDeviceDelegateImplLinux::OnDidReadBytes(
521 const ReadBytesSuccessCallback& success_callback, 492 const ReadBytesSuccessCallback& success_callback,
522 int bytes_read) { 493 const base::File::Info& file_info, int bytes_read) {
523 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 494 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
524 DCHECK(task_in_progress_); 495 DCHECK(task_in_progress_);
525 success_callback.Run(bytes_read); 496 success_callback.Run(file_info, bytes_read);
526 task_in_progress_ = false; 497 task_in_progress_ = false;
527 ProcessNextPendingRequest(); 498 ProcessNextPendingRequest();
528 } 499 }
529 500
530 void MTPDeviceDelegateImplLinux::HandleDeviceFileError( 501 void MTPDeviceDelegateImplLinux::HandleDeviceFileError(
531 const ErrorCallback& error_callback, 502 const ErrorCallback& error_callback,
532 base::File::Error error) { 503 base::File::Error error) {
533 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 504 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
534 DCHECK(task_in_progress_); 505 DCHECK(task_in_progress_);
535 error_callback.Run(error); 506 error_callback.Run(error);
536 task_in_progress_ = false; 507 task_in_progress_ = false;
537 ProcessNextPendingRequest(); 508 ProcessNextPendingRequest();
538 } 509 }
539 510
540 void CreateMTPDeviceAsyncDelegate( 511 void CreateMTPDeviceAsyncDelegate(
541 const std::string& device_location, 512 const std::string& device_location,
542 const CreateMTPDeviceAsyncDelegateCallback& callback) { 513 const CreateMTPDeviceAsyncDelegateCallback& callback) {
543 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); 514 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
544 callback.Run(new MTPDeviceDelegateImplLinux(device_location)); 515 callback.Run(new MTPDeviceDelegateImplLinux(device_location));
545 } 516 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698