// 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_context.h" #include #include #include "base/bind.h" #include "base/bind_helpers.h" #include "base/callback.h" #include "base/files/file_path.h" #include "base/location.h" #include "base/logging.h" #include "base/posix/eintr_wrapper.h" #include "base/task_runner.h" #include "base/task_runner_util.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" namespace net { FileStream::Context::Context(const scoped_refptr& task_runner) : async_in_progress_(false), orphaned_(false), task_runner_(task_runner) { } FileStream::Context::Context(base::File file, const scoped_refptr& task_runner) : file_(std::move(file)), async_in_progress_(false), orphaned_(false), task_runner_(task_runner) {} FileStream::Context::~Context() = default; int FileStream::Context::Read(IOBuffer* in_buf, int buf_len, CompletionOnceCallback callback) { DCHECK(!async_in_progress_); scoped_refptr buf = in_buf; const bool posted = base::PostTaskAndReplyWithResult( task_runner_.get(), FROM_HERE, base::BindOnce(&Context::ReadFileImpl, base::Unretained(this), buf, buf_len), base::BindOnce(&Context::OnAsyncCompleted, base::Unretained(this), IntToInt64(std::move(callback)))); DCHECK(posted); async_in_progress_ = true; return ERR_IO_PENDING; } int FileStream::Context::Write(IOBuffer* in_buf, int buf_len, CompletionOnceCallback callback) { DCHECK(!async_in_progress_); scoped_refptr buf = in_buf; const bool posted = base::PostTaskAndReplyWithResult( task_runner_.get(), FROM_HERE, base::BindOnce(&Context::WriteFileImpl, base::Unretained(this), buf, buf_len), base::BindOnce(&Context::OnAsyncCompleted, base::Unretained(this), IntToInt64(std::move(callback)))); DCHECK(posted); async_in_progress_ = true; return ERR_IO_PENDING; } FileStream::Context::IOResult FileStream::Context::SeekFileImpl( int64_t offset) { int64_t res = file_.Seek(base::File::FROM_BEGIN, offset); if (res == -1) return IOResult::FromOSError(errno); return IOResult(res, 0); } void FileStream::Context::OnFileOpened() { } FileStream::Context::IOResult FileStream::Context::ReadFileImpl( scoped_refptr buf, int buf_len) { int res = file_.ReadAtCurrentPosNoBestEffort(buf->data(), buf_len); if (res == -1) return IOResult::FromOSError(errno); return IOResult(res, 0); } FileStream::Context::IOResult FileStream::Context::WriteFileImpl( scoped_refptr buf, int buf_len) { int res = file_.WriteAtCurrentPosNoBestEffort(buf->data(), buf_len); if (res == -1) return IOResult::FromOSError(errno); return IOResult(res, 0); } } // namespace net