| // 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 <utility> |
| |
| #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() = default; |
| |
| void LocalFileReader::Open(const base::FilePath& file_path, |
| int64_t offset, |
| net::CompletionOnceCallback 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, |
| BindOnce(&LocalFileReader::DidOpen, weak_ptr_factory_.GetWeakPtr(), |
| std::move(callback), offset)); |
| DCHECK_EQ(rv, net::ERR_IO_PENDING); |
| } |
| |
| void LocalFileReader::Read(net::IOBuffer* in_buffer, |
| int buffer_length, |
| net::CompletionOnceCallback callback) { |
| DCHECK(!callback.is_null()); |
| DCHECK(file_stream_.IsOpen()); |
| int rv = file_stream_.Read(in_buffer, buffer_length, std::move(callback)); |
| DCHECK_EQ(rv, net::ERR_IO_PENDING); |
| } |
| |
| void LocalFileReader::DidOpen(net::CompletionOnceCallback callback, |
| int64_t offset, |
| int error) { |
| if (error != net::OK) |
| return std::move(callback).Run(error); |
| |
| int rv = file_stream_.Seek(offset, BindOnce(&LocalFileReader::DidSeek, |
| weak_ptr_factory_.GetWeakPtr(), |
| std::move(callback), offset)); |
| DCHECK_EQ(rv, net::ERR_IO_PENDING); |
| } |
| |
| void LocalFileReader::DidSeek(net::CompletionOnceCallback callback, |
| int64_t offset, |
| int64_t error) { |
| std::move(callback).Run(error == offset ? net::OK : net::ERR_FAILED); |
| } |
| |
| } // namespace util |
| } // namespace drive |