|  | // 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 <utility> | 
|  |  | 
|  | #include "net/base/file_stream_context.h" | 
|  | #include "net/base/net_errors.h" | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | FileStream::FileStream(const scoped_refptr<base::TaskRunner>& task_runner) | 
|  | : context_(std::make_unique<Context>(task_runner)) {} | 
|  |  | 
|  | FileStream::FileStream(base::File file, | 
|  | const scoped_refptr<base::TaskRunner>& task_runner) | 
|  | : context_(std::make_unique<Context>(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 |