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