Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / drive / local_file_reader.cc
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