1// Copyright 2013 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/ppb_tcp_socket_shared.h"
6
7#include "base/logging.h"
8
9namespace ppapi {
10
11TCPSocketState::TCPSocketState(StateType state)
12    : state_(state), pending_transition_(NONE) {
13  DCHECK(state_ == INITIAL || state_ == CONNECTED);
14}
15
16TCPSocketState::~TCPSocketState() {}
17
18void TCPSocketState::SetPendingTransition(TransitionType pending_transition) {
19  DCHECK(IsValidTransition(pending_transition));
20  pending_transition_ = pending_transition;
21}
22
23void TCPSocketState::CompletePendingTransition(bool success) {
24  switch (pending_transition_) {
25    case NONE:
26      NOTREACHED();
27      break;
28    case BIND:
29      if (success)
30        state_ = BOUND;
31      break;
32    case CONNECT:
33      state_ = success ? CONNECTED : CLOSED;
34      break;
35    case SSL_CONNECT:
36      state_ = success ? SSL_CONNECTED : CLOSED;
37      break;
38    case LISTEN:
39      if (success)
40        state_ = LISTENING;
41      break;
42    case CLOSE:
43      state_ = CLOSED;
44      break;
45  }
46  pending_transition_ = NONE;
47}
48
49void TCPSocketState::DoTransition(TransitionType transition, bool success) {
50  SetPendingTransition(transition);
51  CompletePendingTransition(success);
52}
53
54bool TCPSocketState::IsValidTransition(TransitionType transition) const {
55  if (pending_transition_ != NONE && transition != CLOSE)
56    return false;
57
58  switch (transition) {
59    case NONE:
60      return false;
61    case BIND:
62      return state_ == INITIAL;
63    case CONNECT:
64      return state_ == INITIAL || state_ == BOUND;
65    case SSL_CONNECT:
66      return state_ == CONNECTED;
67    case LISTEN:
68      return state_ == BOUND;
69    case CLOSE:
70      return true;
71  }
72  NOTREACHED();
73  return false;
74}
75
76bool TCPSocketState::IsPending(TransitionType transition) const {
77  return pending_transition_ == transition;
78}
79
80bool TCPSocketState::IsConnected() const {
81  return state_ == CONNECTED || state_ == SSL_CONNECTED;
82}
83
84bool TCPSocketState::IsBound() const {
85  return state_ != INITIAL && state_ != CLOSED;
86}
87
88}  // namespace ppapi
89