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 14 namespace drive { 15 namespace util { 16 17 LocalFileReader::LocalFileReader( 18 base::SequencedTaskRunner* sequenced_task_runner) 19 : file_stream_(sequenced_task_runner), 20 weak_ptr_factory_(this) { 21 } 22 23 LocalFileReader::~LocalFileReader() { 24 } 25 26 void 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 40 void 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 49 void 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 62 void 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