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)#ifndef PPAPI_SHARED_IMPL_PPB_TCP_SOCKET_SHARED_H_
668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define PPAPI_SHARED_IMPL_PPB_TCP_SOCKET_SHARED_H_
768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ppapi/shared_impl/ppapi_shared_export.h"
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace ppapi {
1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class PPAPI_SHARED_EXPORT TCPSocketState {
1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public:
1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  enum StateType {
1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // The socket hasn't been bound or connected.
1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    INITIAL,
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // The socket has been bound.
1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    BOUND,
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // A connection has been established.
2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    CONNECTED,
2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // An SSL connection has been established.
2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    SSL_CONNECTED,
2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // The socket is listening.
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    LISTENING,
2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // The socket has been closed.
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    CLOSED
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  };
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Transitions that will change the socket state. Please note that
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // read/write/accept are not included because they don't change the socket
3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // state.
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  enum TransitionType { NONE, BIND, CONNECT, SSL_CONNECT, LISTEN, CLOSE };
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  explicit TCPSocketState(StateType state);
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  ~TCPSocketState();
3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  StateType state() const { return state_; }
3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void SetPendingTransition(TransitionType pending_transition);
4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void CompletePendingTransition(bool success);
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void DoTransition(TransitionType transition, bool success);
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool IsValidTransition(TransitionType transition) const;
4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool IsPending(TransitionType transition) const;
4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool IsConnected() const;
4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  bool IsBound() const;
4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private:
5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  StateType state_;
5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  TransitionType pending_transition_;
5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// TCP socket API versions.
5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)enum PPAPI_SHARED_EXPORT TCPSocketVersion {
5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // PPB_TCPSocket_Private.
5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  TCP_SOCKET_VERSION_PRIVATE,
5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // PPB_TCPSocket v1.0.
6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  TCP_SOCKET_VERSION_1_0,
6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // PPB_TCPSocket v1.1 or above.
6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  TCP_SOCKET_VERSION_1_1_OR_ABOVE
6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)};
6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}  // namespace ppapi
6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif  // PPAPI_SHARED_IMPL_PPB_TCP_SOCKET_SHARED_H_
68