|  | // Copyright 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "components/drive/local_file_reader.h" | 
|  |  | 
|  | #include "base/bind.h" | 
|  | #include "base/files/file_path.h" | 
|  | #include "base/sequenced_task_runner.h" | 
|  | #include "net/base/completion_callback.h" | 
|  | #include "net/base/io_buffer.h" | 
|  | #include "net/base/net_errors.h" | 
|  |  | 
|  | namespace drive { | 
|  | namespace util { | 
|  |  | 
|  | LocalFileReader::LocalFileReader( | 
|  | base::SequencedTaskRunner* sequenced_task_runner) | 
|  | : file_stream_(sequenced_task_runner), | 
|  | weak_ptr_factory_(this) { | 
|  | } | 
|  |  | 
|  | LocalFileReader::~LocalFileReader() { | 
|  | } | 
|  |  | 
|  | void LocalFileReader::Open(const base::FilePath& file_path, | 
|  | int64_t offset, | 
|  | const net::CompletionCallback& callback) { | 
|  | DCHECK(!callback.is_null()); | 
|  | int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | | 
|  | base::File::FLAG_ASYNC; | 
|  |  | 
|  | int rv = file_stream_.Open(file_path, flags, | 
|  | Bind(&LocalFileReader::DidOpen, | 
|  | weak_ptr_factory_.GetWeakPtr(), | 
|  | callback, offset)); | 
|  | DCHECK_EQ(rv, net::ERR_IO_PENDING); | 
|  | } | 
|  |  | 
|  | void LocalFileReader::Read(net::IOBuffer* in_buffer, | 
|  | int buffer_length, | 
|  | const net::CompletionCallback& callback) { | 
|  | DCHECK(!callback.is_null()); | 
|  | DCHECK(file_stream_.IsOpen()); | 
|  | int rv = file_stream_.Read(in_buffer, buffer_length, callback); | 
|  | DCHECK_EQ(rv, net::ERR_IO_PENDING); | 
|  | } | 
|  |  | 
|  | void LocalFileReader::DidOpen(const net::CompletionCallback& callback, | 
|  | int64_t offset, | 
|  | int error) { | 
|  | if (error != net::OK) | 
|  | return callback.Run(error); | 
|  |  | 
|  | int rv = file_stream_.Seek( | 
|  | offset, Bind(&LocalFileReader::DidSeek, weak_ptr_factory_.GetWeakPtr(), | 
|  | callback, offset)); | 
|  | DCHECK_EQ(rv, net::ERR_IO_PENDING); | 
|  | } | 
|  |  | 
|  | void LocalFileReader::DidSeek(const net::CompletionCallback& callback, | 
|  | int64_t offset, | 
|  | int64_t error) { | 
|  | callback.Run(error == offset ? net::OK : net::ERR_FAILED); | 
|  | } | 
|  |  | 
|  | }  // namespace util | 
|  | }  // namespace drive |