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

Side by Side Diff: chrome/browser/chromeos/drive/drive_url_request_job.cc

Issue 13078005: Remove retrial of reading from a cached file. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address comment. Created 7 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
« no previous file with comments | « chrome/browser/chromeos/drive/drive_url_request_job.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/chromeos/drive/drive_url_request_job.h" 5 #include "chrome/browser/chromeos/drive/drive_url_request_job.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cstring> 8 #include <cstring>
9 #include <string> 9 #include <string>
10 10
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 // Keep track of the buffer. 409 // Keep track of the buffer.
410 DCHECK(!read_buf_); 410 DCHECK(!read_buf_);
411 read_buf_ = dest; 411 read_buf_ = dest;
412 read_buf_remaining_.set(dest->data(), dest_size); 412 read_buf_remaining_.set(dest->data(), dest_size);
413 413
414 bool rc = false; 414 bool rc = false;
415 if (streaming_download_) 415 if (streaming_download_)
416 rc = ContinueReadFromDownloadData(bytes_read); 416 rc = ContinueReadFromDownloadData(bytes_read);
417 else 417 else
418 rc = ContinueReadFromFile(bytes_read); 418 rc = ContinueReadFromFile(bytes_read);
419
419 DVLOG(1) << "ReadRawData: out with " 420 DVLOG(1) << "ReadRawData: out with "
420 << (rc ? "has" : "no") 421 << (rc ? "has" : "no")
421 << "_data, bytes_read=" << *bytes_read 422 << "_data, bytes_read=" << *bytes_read
422 << ", buf_remaining=" 423 << ", buf_remaining="
423 << (read_buf_ ? read_buf_remaining_.size() : 0) 424 << (read_buf_ ? read_buf_remaining_.size() : 0)
424 << ", " << (streaming_download_ ? "download" : "file") 425 << ", " << (streaming_download_ ? "download" : "file")
425 << "_remaining=" << remaining_bytes_; 426 << "_remaining=" << remaining_bytes_;
426 return rc; 427 return rc;
427 } 428 }
428 429
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 612
612 // Otherwise, we have data in read buffer, return true with number of bytes 613 // Otherwise, we have data in read buffer, return true with number of bytes
613 // read. 614 // read.
614 *bytes_read = BytesReadCompleted(); 615 *bytes_read = BytesReadCompleted();
615 DVLOG(1) << "Has data: bytes_read=" << *bytes_read 616 DVLOG(1) << "Has data: bytes_read=" << *bytes_read
616 << ", buf_remaining=0, file_remaining=" << remaining_bytes_; 617 << ", buf_remaining=0, file_remaining=" << remaining_bytes_;
617 return true; 618 return true;
618 } 619 }
619 620
620 void DriveURLRequestJob::ReadFromFile() { 621 void DriveURLRequestJob::ReadFromFile() {
621 int bytes_to_read = std::min(read_buf_remaining_.size(),
622 static_cast<size_t>(remaining_bytes_));
623
624 // If the stream already exists, keep reading from it. 622 // If the stream already exists, keep reading from it.
625 if (stream_.get()) { 623 if (stream_.get()) {
626 ReadFileStream(bytes_to_read); 624 ReadFileStream();
627 return; 625 return;
628 } 626 }
629 627
630 // Otherwise, open the stream for file. 628 // Otherwise, open the stream for file.
631 stream_.reset(new net::FileStream(NULL)); 629 stream_.reset(new net::FileStream(NULL));
632 int result = stream_->Open( 630 int result = stream_->Open(
633 local_file_path_, 631 local_file_path_,
634 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ | 632 base::PLATFORM_FILE_OPEN | base::PLATFORM_FILE_READ |
635 base::PLATFORM_FILE_ASYNC, 633 base::PLATFORM_FILE_ASYNC,
636 base::Bind(&DriveURLRequestJob::OnFileOpen, 634 base::Bind(&DriveURLRequestJob::OnFileOpen,
637 weak_ptr_factory_.GetWeakPtr(), 635 weak_ptr_factory_.GetWeakPtr()));
638 bytes_to_read));
639 636
640 if (result == net::ERR_IO_PENDING) { 637 if (result == net::ERR_IO_PENDING) {
641 DVLOG(1) << "IO is pending for opening " 638 DVLOG(1) << "IO is pending for opening "
642 << local_file_path_.BaseName().RemoveExtension().value(); 639 << local_file_path_.BaseName().RemoveExtension().value();
643 SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0)); 640 SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
644 } else { 641 } else {
645 DCHECK_NE(result, net::OK); 642 DCHECK_NE(result, net::OK);
646 LOG(WARNING) << "Failed to open " << local_file_path_.value(); 643 LOG(WARNING) << "Failed to open " << local_file_path_.value();
647 NotifyFailure(net::ERR_FILE_NOT_FOUND); 644 NotifyFailure(net::ERR_FILE_NOT_FOUND);
648 } 645 }
649 } 646 }
650 647
651 void DriveURLRequestJob::OnFileOpen(int bytes_to_read, int open_result) { 648 void DriveURLRequestJob::OnFileOpen(int open_result) {
652 if (open_result != net::OK) { 649 if (open_result != net::OK) {
653 LOG(WARNING) << "Failed to open " << local_file_path_.value(); 650 LOG(WARNING) << "Failed to open " << local_file_path_.value();
654 NotifyFailure(net::ERR_FILE_NOT_FOUND); 651 NotifyFailure(net::ERR_FILE_NOT_FOUND);
655 return; 652 return;
656 } 653 }
657 654
658 DVLOG(1) << "Successfully opened " << local_file_path_.value(); 655 DVLOG(1) << "Successfully opened " << local_file_path_.value();
659 656
660 // Read from opened file stream. 657 // Read from opened file stream.
661 DCHECK(stream_.get()); 658 DCHECK(stream_.get());
662 ReadFileStream(bytes_to_read); 659 ReadFileStream();
663 } 660 }
664 661
665 void DriveURLRequestJob::ReadFileStream(int bytes_to_read) { 662 void DriveURLRequestJob::ReadFileStream() {
666 DCHECK(stream_.get()); 663 DCHECK(stream_.get());
667 DCHECK(stream_->IsOpen()); 664 DCHECK(stream_->IsOpen());
668 DCHECK_GE(static_cast<int>(read_buf_remaining_.size()), bytes_to_read);
669 665
666 int bytes_to_read = std::min(
667 read_buf_remaining_.size(), static_cast<size_t>(remaining_bytes_));
670 int result = stream_->Read(read_buf_, bytes_to_read, 668 int result = stream_->Read(read_buf_, bytes_to_read,
671 base::Bind(&DriveURLRequestJob::OnReadFileStream, 669 base::Bind(&DriveURLRequestJob::OnReadFileStream,
672 weak_ptr_factory_.GetWeakPtr())); 670 weak_ptr_factory_.GetWeakPtr()));
673 671
674 // If IO is pending, we just need to wait. 672 // If IO is pending, we just need to wait.
675 if (result == net::ERR_IO_PENDING) { 673 if (result == net::ERR_IO_PENDING) {
676 DVLOG(1) << "IO pending: bytes_to_read=" << bytes_to_read 674 DVLOG(1) << "IO pending: bytes_to_read=" << bytes_to_read
677 << ", buf_remaining=" << read_buf_remaining_.size() 675 << ", buf_remaining=" << read_buf_remaining_.size()
678 << ", file_remaining=" << remaining_bytes_; 676 << ", file_remaining=" << remaining_bytes_;
679 SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0)); 677 SetStatus(net::URLRequestStatus(net::URLRequestStatus::IO_PENDING, 0));
680 } else { // For all other errors, bail out. 678 } else { // For all other errors, bail out.
681 // Asynchronous read should not return result >= 0; 679 // Asynchronous read should not return result >= 0;
682 // refer to net/base/file_stream_posix.cc. 680 // refer to net/base/file_stream_posix.cc.
683 DCHECK(result < 0); 681 DCHECK(result < 0);
684 LOG(WARNING) << "Failed to read " << local_file_path_.value(); 682 LOG(WARNING) << "Failed to read " << local_file_path_.value();
685 NotifyFailure(net::ERR_FAILED); 683 NotifyFailure(net::ERR_FAILED);
686 } 684 }
687 } 685 }
688 686
689 void DriveURLRequestJob::OnReadFileStream(int bytes_read) { 687 void DriveURLRequestJob::OnReadFileStream(int bytes_read) {
690 if (bytes_read <= 0) { 688 if (bytes_read <= 0) {
691 LOG(WARNING) << "Failed to read " << local_file_path_.value(); 689 LOG(WARNING) << "Failed to read " << local_file_path_.value();
692 NotifyFailure(net::ERR_FAILED); 690 NotifyFailure(net::ERR_FAILED);
693 return; 691 return;
694 } 692 }
695 693
696 SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status. 694 SetStatus(net::URLRequestStatus()); // Clear the IO_PENDING status.
697
698 RecordBytesRead(bytes_read); 695 RecordBytesRead(bytes_read);
699
700 DVLOG(1) << "Cleared IO pending: bytes_read=" << bytes_read 696 DVLOG(1) << "Cleared IO pending: bytes_read=" << bytes_read
701 << ", buf_remaining=" << read_buf_remaining_.size() 697 << ", buf_remaining=" << read_buf_remaining_.size()
702 << ", file_remaining=" << remaining_bytes_; 698 << ", file_remaining=" << remaining_bytes_;
703 699
704 // If the read buffer is completely filled, we're done. 700 // Regardless of whether the buffer is still remaining or not,
705 if (read_buf_remaining_.empty()) { 701 // notify the client that some data is available in the buffer.
706 int bytes_read = BytesReadCompleted(); 702 BytesReadCompleted(); // Release |read_buf_|.
707 DVLOG(1) << "Completed read: bytes_read=" << bytes_read 703 DVLOG(1) << "Completed read: bytes_read=" << bytes_read
708 << ", file_remaining=" << remaining_bytes_; 704 << ", file_remaining=" << remaining_bytes_;
709 NotifyReadComplete(bytes_read); 705 NotifyReadComplete(bytes_read);
710 return;
711 }
712
713 // Otherwise, continue the reading.
714 int new_bytes_read = 0;
715 if (ContinueReadFromFile(&new_bytes_read)) {
716 DVLOG(1) << "Completed read: bytes_read=" << bytes_read
717 << ", file_remaining=" << remaining_bytes_;
718 NotifyReadComplete(new_bytes_read);
719 }
720 } 706 }
721 707
722 int DriveURLRequestJob::BytesReadCompleted() { 708 int DriveURLRequestJob::BytesReadCompleted() {
723 int bytes_read = read_buf_remaining_.data() - read_buf_->data(); 709 int bytes_read = read_buf_remaining_.data() - read_buf_->data();
724 read_buf_ = NULL; 710 read_buf_ = NULL;
725 read_buf_remaining_.clear(); 711 read_buf_remaining_.clear();
726 return bytes_read; 712 return bytes_read;
727 } 713 }
728 714
729 void DriveURLRequestJob::RecordBytesRead(int bytes_read) { 715 void DriveURLRequestJob::RecordBytesRead(int bytes_read) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 response_info_.reset(new net::HttpResponseInfo()); 793 response_info_.reset(new net::HttpResponseInfo());
808 response_info_->headers = headers; 794 response_info_->headers = headers;
809 795
810 set_expected_content_size(remaining_bytes_); 796 set_expected_content_size(remaining_bytes_);
811 headers_set_ = true; 797 headers_set_ = true;
812 798
813 NotifyHeadersComplete(); 799 NotifyHeadersComplete();
814 } 800 }
815 801
816 } // namespace drive 802 } // namespace drive
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/drive/drive_url_request_job.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698