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 3// found in the LICENSE file. 4 5#include "chrome/browser/chromeos/drive/local_file_reader.h" 6 7#include "base/bind.h" 8#include "base/files/file_path.h" 9#include "base/sequenced_task_runner.h" 10#include "net/base/completion_callback.h" 11#include "net/base/io_buffer.h" 12#include "net/base/net_errors.h" 13 14namespace drive { 15namespace util { 16 17LocalFileReader::LocalFileReader( 18 base::SequencedTaskRunner* sequenced_task_runner) 19 : file_stream_(sequenced_task_runner), 20 weak_ptr_factory_(this) { 21} 22 23LocalFileReader::~LocalFileReader() { 24} 25 26void LocalFileReader::Open(const base::FilePath& file_path, 27 int64 offset, 28 const net::CompletionCallback& callback) { 29 DCHECK(!callback.is_null()); 30 int flags = base::File::FLAG_OPEN | base::File::FLAG_READ | 31 base::File::FLAG_ASYNC; 32 33 int rv = file_stream_.Open(file_path, flags, 34 Bind(&LocalFileReader::DidOpen, 35 weak_ptr_factory_.GetWeakPtr(), 36 callback, offset)); 37 DCHECK_EQ(rv, net::ERR_IO_PENDING); 38} 39 40void LocalFileReader::Read(net::IOBuffer* in_buffer, 41 int buffer_length, 42 const net::CompletionCallback& callback) { 43 DCHECK(!callback.is_null()); 44 DCHECK(file_stream_.IsOpen()); 45 int rv = file_stream_.Read(in_buffer, buffer_length, callback); 46 DCHECK_EQ(rv, net::ERR_IO_PENDING); 47} 48 49void LocalFileReader::DidOpen(const net::CompletionCallback& callback, 50 int64 offset, 51 int error) { 52 if (error != net::OK) 53 return callback.Run(error); 54 55 int rv = file_stream_.Seek(net::FROM_BEGIN, offset, 56 Bind(&LocalFileReader::DidSeek, 57 weak_ptr_factory_.GetWeakPtr(), 58 callback, offset)); 59 DCHECK_EQ(rv, net::ERR_IO_PENDING); 60} 61 62void LocalFileReader::DidSeek(const net::CompletionCallback& callback, 63 int64 offset, 64 int64 error) { 65 callback.Run(error == offset ? net::OK : net::ERR_FAILED); 66} 67 68} // namespace util 69} // namespace drive 70