1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ppapi/shared_impl/file_io_state_manager.h"
6
7#include "base/logging.h"
8#include "ppapi/c/pp_errors.h"
9
10namespace ppapi {
11
12FileIOStateManager::FileIOStateManager()
13    : num_pending_ops_(0), pending_op_(OPERATION_NONE), file_open_(false) {}
14
15FileIOStateManager::~FileIOStateManager() {}
16
17void FileIOStateManager::SetOpenSucceed() { file_open_ = true; }
18
19int32_t FileIOStateManager::CheckOperationState(OperationType new_op,
20                                                bool should_be_open) {
21  if (should_be_open) {
22    if (!file_open_)
23      return PP_ERROR_FAILED;
24  } else {
25    if (file_open_)
26      return PP_ERROR_FAILED;
27  }
28
29  if (pending_op_ != OPERATION_NONE &&
30      (pending_op_ != new_op || pending_op_ == OPERATION_EXCLUSIVE))
31    return PP_ERROR_INPROGRESS;
32
33  return PP_OK;
34}
35
36void FileIOStateManager::SetPendingOperation(OperationType new_op) {
37  DCHECK(pending_op_ == OPERATION_NONE ||
38         (pending_op_ != OPERATION_EXCLUSIVE && pending_op_ == new_op));
39  pending_op_ = new_op;
40  num_pending_ops_++;
41}
42
43void FileIOStateManager::SetOperationFinished() {
44  DCHECK_GT(num_pending_ops_, 0);
45  if (--num_pending_ops_ == 0)
46    pending_op_ = OPERATION_NONE;
47}
48
49}  // namespace ppapi
50