blob: b4bcd3b4a650a428b6d923f008b00bcd0b1ab884 [file] [log] [blame]
// 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() = default;
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