// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/base/file_stream.h" #include #include "net/base/file_stream_context.h" #include "net/base/net_errors.h" namespace net { FileStream::FileStream(const scoped_refptr& task_runner) : context_(std::make_unique(task_runner)) {} FileStream::FileStream(base::File file, const scoped_refptr& task_runner) : context_(std::make_unique(std::move(file), task_runner)) {} FileStream::~FileStream() { context_.release()->Orphan(); } int FileStream::Open(const base::FilePath& path, int open_flags, CompletionOnceCallback callback) { if (IsOpen()) { DLOG(FATAL) << "File is already open!"; return ERR_UNEXPECTED; } DCHECK(open_flags & base::File::FLAG_ASYNC); context_->Open(path, open_flags, std::move(callback)); return ERR_IO_PENDING; } int FileStream::Close(CompletionOnceCallback callback) { context_->Close(std::move(callback)); return ERR_IO_PENDING; } bool FileStream::IsOpen() const { return context_->IsOpen(); } int FileStream::Seek(int64_t offset, Int64CompletionOnceCallback callback) { if (!IsOpen()) return ERR_UNEXPECTED; context_->Seek(offset, std::move(callback)); return ERR_IO_PENDING; } int FileStream::Read(IOBuffer* buf, int buf_len, CompletionOnceCallback callback) { if (!IsOpen()) return ERR_UNEXPECTED; // read(..., 0) will return 0, which indicates end-of-file. DCHECK_GT(buf_len, 0); return context_->Read(buf, buf_len, std::move(callback)); } int FileStream::Write(IOBuffer* buf, int buf_len, CompletionOnceCallback callback) { if (!IsOpen()) return ERR_UNEXPECTED; DCHECK_GE(buf_len, 0); return context_->Write(buf, buf_len, std::move(callback)); } int FileStream::GetFileInfo(base::File::Info* file_info, CompletionOnceCallback callback) { if (!IsOpen()) return ERR_UNEXPECTED; context_->GetFileInfo(file_info, std::move(callback)); return ERR_IO_PENDING; } int FileStream::Flush(CompletionOnceCallback callback) { if (!IsOpen()) return ERR_UNEXPECTED; context_->Flush(std::move(callback)); return ERR_IO_PENDING; } } // namespace net