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

Side by Side Diff: chrome/browser/chromeos/file_system_provider/fileapi/buffering_file_stream_reader.cc

Issue 318563002: [fsp] Introduce BufferingFileStreamReader to read files in bigger chunks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed a test. Created 6 years, 6 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
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/file_system_provider/fileapi/buffering_file_st ream_reader.h"
6
7 #include "net/base/net_errors.h"
8
9 namespace chromeos {
10 namespace file_system_provider {
11
12 BufferingFileStreamReader::BufferingFileStreamReader(
13 scoped_ptr<webkit_blob::FileStreamReader> file_stream_reader,
14 int buffer_size)
15 : file_stream_reader_(file_stream_reader.Pass()),
16 buffer_size_(buffer_size),
17 preloading_buffer_(new net::IOBuffer(buffer_size_)),
18 preloading_buffer_offset_(0),
19 buffered_bytes_(0),
20 weak_ptr_factory_(this) {
21 }
22
23 BufferingFileStreamReader::~BufferingFileStreamReader() {
24 }
25
26 int BufferingFileStreamReader::Read(net::IOBuffer* buffer,
27 int buffer_length,
28 const net::CompletionCallback& callback) {
29 // Return as much as available in the internal buffer. It may be less than
30 // |buffer_length|, what is valid.
31 const int bytes_read =
32 CopyFromBuffer(make_scoped_refptr(buffer), buffer_length);
33 if (bytes_read)
34 return bytes_read;
35
36 // Nothing copied, so contents have to be preloaded.
37 Preload(base::Bind(&BufferingFileStreamReader::OnPreloadCompleted,
38 weak_ptr_factory_.GetWeakPtr(),
39 make_scoped_refptr(buffer),
40 buffer_length,
41 callback));
42
43 return net::ERR_IO_PENDING;
44 }
45
46 int64 BufferingFileStreamReader::GetLength(
47 const net::Int64CompletionCallback& callback) {
48 return file_stream_reader_->GetLength(callback);
49 }
50
51 int BufferingFileStreamReader::CopyFromBuffer(
52 scoped_refptr<net::IOBuffer> buffer,
53 int buffer_length) {
54 const int read_bytes =
55 buffer_length <= buffered_bytes_ ? buffer_length : buffered_bytes_;
hashimoto 2014/06/05 03:18:36 nit: std::min(buffer_length, buffered_bytes_)?
mtomasz 2014/06/05 09:22:27 Done.
56
57 memcpy(buffer->data(),
58 preloading_buffer_->data() + preloading_buffer_offset_,
59 read_bytes);
60 preloading_buffer_offset_ += read_bytes;
61 buffered_bytes_ -= read_bytes;
62
63 return read_bytes;
64 }
65
66 void BufferingFileStreamReader::Preload(
67 const net::CompletionCallback& callback) {
68 // TODO(mtomasz): Dynamically calculate the chunk size. Start from a small
69 // one, then increase for consecutive requests. That would improve performance
70 // when reading just small chunks, instead of the entire file.
71 const int preload_bytes = buffer_size_;
72
73 const int result =
74 file_stream_reader_->Read(preloading_buffer_, preload_bytes, callback);
75
76 if (result != net::ERR_IO_PENDING)
77 callback.Run(result);
hashimoto 2014/06/05 03:18:36 Return the result as a return value, or post a tas
mtomasz 2014/06/05 09:22:27 Done.
78 }
79
80 void BufferingFileStreamReader::OnPreloadCompleted(
81 scoped_refptr<net::IOBuffer> buffer,
82 int buffer_length,
83 const net::CompletionCallback& callback,
84 int result) {
85 if (result < 0) {
86 callback.Run(result);
87 return;
88 }
89
90 preloading_buffer_offset_ = 0;
91 buffered_bytes_ = result;
92
93 callback.Run(CopyFromBuffer(buffer, buffer_length));
94 }
95
96 } // namespace file_system_provider
97 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698