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 9 namespace ppapi { 10 TCPSocketState(StateType state)11TCPSocketState::TCPSocketState(StateType state) 12 : state_(state), pending_transition_(NONE) { 13 DCHECK(state_ == INITIAL || state_ == CONNECTED); 14 } 15 ~TCPSocketState()16TCPSocketState::~TCPSocketState() {} 17 SetPendingTransition(TransitionType pending_transition)18void TCPSocketState::SetPendingTransition(TransitionType pending_transition) { 19 DCHECK(IsValidTransition(pending_transition)); 20 pending_transition_ = pending_transition; 21 } 22 CompletePendingTransition(bool success)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 DoTransition(TransitionType transition,bool success)49void TCPSocketState::DoTransition(TransitionType transition, bool success) { 50 SetPendingTransition(transition); 51 CompletePendingTransition(success); 52 } 53 IsValidTransition(TransitionType transition) const54bool 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 IsPending(TransitionType transition) const76bool TCPSocketState::IsPending(TransitionType transition) const { 77 return pending_transition_ == transition; 78 } 79 IsConnected() const80bool TCPSocketState::IsConnected() const { 81 return state_ == CONNECTED || state_ == SSL_CONNECTED; 82 } 83 IsBound() const84bool TCPSocketState::IsBound() const { 85 return state_ != INITIAL && state_ != CLOSED; 86 } 87 88 } // namespace ppapi 89