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