// Copyright 2013 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/ppb_tcp_socket_shared.h" #include "base/logging.h" namespace ppapi { TCPSocketState::TCPSocketState(StateType state) : state_(state), pending_transition_(NONE) { DCHECK(state_ == INITIAL || state_ == CONNECTED); } TCPSocketState::~TCPSocketState() {} void TCPSocketState::SetPendingTransition(TransitionType pending_transition) { DCHECK(IsValidTransition(pending_transition)); pending_transition_ = pending_transition; } void TCPSocketState::CompletePendingTransition(bool success) { switch (pending_transition_) { case NONE: NOTREACHED(); break; case BIND: if (success) state_ = BOUND; break; case CONNECT: state_ = success ? CONNECTED : CLOSED; break; case SSL_CONNECT: state_ = success ? SSL_CONNECTED : CLOSED; break; case LISTEN: if (success) state_ = LISTENING; break; case CLOSE: state_ = CLOSED; break; } pending_transition_ = NONE; } void TCPSocketState::DoTransition(TransitionType transition, bool success) { SetPendingTransition(transition); CompletePendingTransition(success); } bool TCPSocketState::IsValidTransition(TransitionType transition) const { if (pending_transition_ != NONE && transition != CLOSE) return false; switch (transition) { case NONE: return false; case BIND: return state_ == INITIAL; case CONNECT: return state_ == INITIAL || state_ == BOUND; case SSL_CONNECT: return state_ == CONNECTED; case LISTEN: return state_ == BOUND; case CLOSE: return true; } NOTREACHED(); return false; } bool TCPSocketState::IsPending(TransitionType transition) const { return pending_transition_ == transition; } bool TCPSocketState::IsConnected() const { return state_ == CONNECTED || state_ == SSL_CONNECTED; } bool TCPSocketState::IsBound() const { return state_ != INITIAL && state_ != CLOSED; } } // namespace ppapi