Index: ppapi/shared_impl/ppb_tcp_socket_shared.cc |
diff --git a/ppapi/shared_impl/ppb_tcp_socket_shared.cc b/ppapi/shared_impl/ppb_tcp_socket_shared.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..934c573d16d09f26f43eb5b63cd40bdd7e63677f |
--- /dev/null |
+++ b/ppapi/shared_impl/ppb_tcp_socket_shared.cc |
@@ -0,0 +1,90 @@ |
+// 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 |