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