Home | History | Annotate | Download | only in drive
      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