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