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