// 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
