• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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