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