1 // Copyright (c) 2012 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 "net/base/file_stream.h"
6
7 #include <utility>
8
9 #include "net/base/file_stream_context.h"
10 #include "net/base/net_errors.h"
11
12 namespace net {
13
FileStream(const scoped_refptr<base::TaskRunner> & task_runner)14 FileStream::FileStream(const scoped_refptr<base::TaskRunner>& task_runner)
15 : context_(std::make_unique<Context>(task_runner)) {}
16
FileStream(base::File file,const scoped_refptr<base::TaskRunner> & task_runner)17 FileStream::FileStream(base::File file,
18 const scoped_refptr<base::TaskRunner>& task_runner)
19 : context_(std::make_unique<Context>(std::move(file), task_runner)) {}
20
~FileStream()21 FileStream::~FileStream() {
22 context_.release()->Orphan();
23 }
24
Open(const base::FilePath & path,int open_flags,CompletionOnceCallback callback)25 int FileStream::Open(const base::FilePath& path,
26 int open_flags,
27 CompletionOnceCallback callback) {
28 if (IsOpen()) {
29 DLOG(FATAL) << "File is already open!";
30 return ERR_UNEXPECTED;
31 }
32
33 DCHECK(open_flags & base::File::FLAG_ASYNC);
34 context_->Open(path, open_flags, std::move(callback));
35 return ERR_IO_PENDING;
36 }
37
Close(CompletionOnceCallback callback)38 int FileStream::Close(CompletionOnceCallback callback) {
39 context_->Close(std::move(callback));
40 return ERR_IO_PENDING;
41 }
42
IsOpen() const43 bool FileStream::IsOpen() const {
44 return context_->IsOpen();
45 }
46
Seek(int64_t offset,Int64CompletionOnceCallback callback)47 int FileStream::Seek(int64_t offset, Int64CompletionOnceCallback callback) {
48 if (!IsOpen())
49 return ERR_UNEXPECTED;
50
51 context_->Seek(offset, std::move(callback));
52 return ERR_IO_PENDING;
53 }
54
Read(IOBuffer * buf,int buf_len,CompletionOnceCallback callback)55 int FileStream::Read(IOBuffer* buf,
56 int buf_len,
57 CompletionOnceCallback callback) {
58 if (!IsOpen())
59 return ERR_UNEXPECTED;
60
61 // read(..., 0) will return 0, which indicates end-of-file.
62 DCHECK_GT(buf_len, 0);
63
64 return context_->Read(buf, buf_len, std::move(callback));
65 }
66
Write(IOBuffer * buf,int buf_len,CompletionOnceCallback callback)67 int FileStream::Write(IOBuffer* buf,
68 int buf_len,
69 CompletionOnceCallback callback) {
70 if (!IsOpen())
71 return ERR_UNEXPECTED;
72
73 DCHECK_GE(buf_len, 0);
74 return context_->Write(buf, buf_len, std::move(callback));
75 }
76
GetFileInfo(base::File::Info * file_info,CompletionOnceCallback callback)77 int FileStream::GetFileInfo(base::File::Info* file_info,
78 CompletionOnceCallback callback) {
79 if (!IsOpen())
80 return ERR_UNEXPECTED;
81
82 context_->GetFileInfo(file_info, std::move(callback));
83 return ERR_IO_PENDING;
84 }
85
Flush(CompletionOnceCallback callback)86 int FileStream::Flush(CompletionOnceCallback callback) {
87 if (!IsOpen())
88 return ERR_UNEXPECTED;
89
90 context_->Flush(std::move(callback));
91 return ERR_IO_PENDING;
92 }
93
94 } // namespace net
95