// 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 "ppapi/shared_impl/file_io_state_manager.h"

#include "base/logging.h"
#include "ppapi/c/pp_errors.h"

namespace ppapi {

FileIOStateManager::FileIOStateManager()
    : num_pending_ops_(0), pending_op_(OPERATION_NONE), file_open_(false) {}

FileIOStateManager::~FileIOStateManager() {}

void FileIOStateManager::SetOpenSucceed() { file_open_ = true; }

int32_t FileIOStateManager::CheckOperationState(OperationType new_op,
                                                bool should_be_open) {
  if (should_be_open) {
    if (!file_open_)
      return PP_ERROR_FAILED;
  } else {
    if (file_open_)
      return PP_ERROR_FAILED;
  }

  if (pending_op_ != OPERATION_NONE &&
      (pending_op_ != new_op || pending_op_ == OPERATION_EXCLUSIVE))
    return PP_ERROR_INPROGRESS;

  return PP_OK;
}

void FileIOStateManager::SetPendingOperation(OperationType new_op) {
  DCHECK(pending_op_ == OPERATION_NONE ||
         (pending_op_ != OPERATION_EXCLUSIVE && pending_op_ == new_op));
  pending_op_ = new_op;
  num_pending_ops_++;
}

void FileIOStateManager::SetOperationFinished() {
  DCHECK_GT(num_pending_ops_, 0);
  if (--num_pending_ops_ == 0)
    pending_op_ = OPERATION_NONE;
}

}  // namespace ppapi
