168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file.
468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/shared_impl/ppb_tcp_socket_shared.h"
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/logging.h"
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace ppapi {
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TCPSocketState::TCPSocketState(StateType state)
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    : state_(state),
1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      pending_transition_(NONE) {
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(state_ == INITIAL || state_ == CONNECTED);
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TCPSocketState::~TCPSocketState() {
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void TCPSocketState::SetPendingTransition(TransitionType pending_transition) {
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  DCHECK(IsValidTransition(pending_transition));
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  pending_transition_ = pending_transition;
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void TCPSocketState::CompletePendingTransition(bool success) {
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  switch (pending_transition_) {
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case NONE:
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      NOTREACHED();
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case BIND:
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      if (success)
3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        state_ = BOUND;
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CONNECT:
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      state_ = success ? CONNECTED : CLOSED;
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case SSL_CONNECT:
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      state_ = success ? SSL_CONNECTED : CLOSED;
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case LISTEN:
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      if (success)
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)        state_ = LISTENING;
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CLOSE:
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      state_ = CLOSED;
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      break;
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  pending_transition_ = NONE;
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void TCPSocketState::DoTransition(TransitionType transition, bool success) {
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  SetPendingTransition(transition);
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  CompletePendingTransition(success);
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool TCPSocketState::IsValidTransition(TransitionType transition) const {
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  if (pending_transition_ != NONE && transition != CLOSE)
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    return false;
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  switch (transition) {
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case NONE:
6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return false;
6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case BIND:
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return state_ == INITIAL;
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CONNECT:
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return state_ == INITIAL || state_ == BOUND;
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case SSL_CONNECT:
6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return state_ == CONNECTED;
6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case LISTEN:
7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return state_ == BOUND;
7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    case CLOSE:
7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      return true;
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  }
7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  NOTREACHED();
7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return false;
7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool TCPSocketState::IsPending(TransitionType transition) const {
7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return pending_transition_ == transition;
8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool TCPSocketState::IsConnected() const {
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return state_ == CONNECTED || state_ == SSL_CONNECTED;
8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool TCPSocketState::IsBound() const {
8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  return state_ != INITIAL && state_ != CLOSED;
8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace ppapi
91