1*3f982cf4SFabien Sanglard // Copyright 2018 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef OSP_PUBLIC_PROTOCOL_CONNECTION_SERVER_H_ 6*3f982cf4SFabien Sanglard #define OSP_PUBLIC_PROTOCOL_CONNECTION_SERVER_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <memory> 9*3f982cf4SFabien Sanglard #include <ostream> 10*3f982cf4SFabien Sanglard #include <string> 11*3f982cf4SFabien Sanglard #include <vector> 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglard #include "osp/public/endpoint_request_ids.h" 14*3f982cf4SFabien Sanglard #include "osp/public/message_demuxer.h" 15*3f982cf4SFabien Sanglard #include "osp/public/protocol_connection.h" 16*3f982cf4SFabien Sanglard #include "osp/public/server_config.h" 17*3f982cf4SFabien Sanglard #include "platform/base/error.h" 18*3f982cf4SFabien Sanglard #include "platform/base/ip_address.h" 19*3f982cf4SFabien Sanglard #include "platform/base/macros.h" 20*3f982cf4SFabien Sanglard 21*3f982cf4SFabien Sanglard namespace openscreen { 22*3f982cf4SFabien Sanglard namespace osp { 23*3f982cf4SFabien Sanglard 24*3f982cf4SFabien Sanglard class ProtocolConnectionServer { 25*3f982cf4SFabien Sanglard public: 26*3f982cf4SFabien Sanglard enum class State { 27*3f982cf4SFabien Sanglard kStopped = 0, 28*3f982cf4SFabien Sanglard kStarting, 29*3f982cf4SFabien Sanglard kRunning, 30*3f982cf4SFabien Sanglard kStopping, 31*3f982cf4SFabien Sanglard kSuspended, 32*3f982cf4SFabien Sanglard }; 33*3f982cf4SFabien Sanglard 34*3f982cf4SFabien Sanglard class Observer : public ProtocolConnectionServiceObserver { 35*3f982cf4SFabien Sanglard public: 36*3f982cf4SFabien Sanglard virtual ~Observer() = default; 37*3f982cf4SFabien Sanglard 38*3f982cf4SFabien Sanglard // Called when the state becomes kSuspended. 39*3f982cf4SFabien Sanglard virtual void OnSuspended() = 0; 40*3f982cf4SFabien Sanglard 41*3f982cf4SFabien Sanglard virtual void OnIncomingConnection( 42*3f982cf4SFabien Sanglard std::unique_ptr<ProtocolConnection> connection) = 0; 43*3f982cf4SFabien Sanglard }; 44*3f982cf4SFabien Sanglard 45*3f982cf4SFabien Sanglard virtual ~ProtocolConnectionServer(); 46*3f982cf4SFabien Sanglard 47*3f982cf4SFabien Sanglard // Starts the server, listening for new connections on the endpoints in the 48*3f982cf4SFabien Sanglard // config object. Returns true if state() == kStopped and the service will be 49*3f982cf4SFabien Sanglard // started, false otherwise. 50*3f982cf4SFabien Sanglard virtual bool Start() = 0; 51*3f982cf4SFabien Sanglard 52*3f982cf4SFabien Sanglard // Stops the server and frees any resources associated with the server 53*3f982cf4SFabien Sanglard // instance. Returns true if state() != (kStopped|kStopping). 54*3f982cf4SFabien Sanglard virtual bool Stop() = 0; 55*3f982cf4SFabien Sanglard 56*3f982cf4SFabien Sanglard // NOTE: We need to decide if suspend/resume semantics for QUIC connections 57*3f982cf4SFabien Sanglard // are well defined, and if we can resume the server and existing connections 58*3f982cf4SFabien Sanglard // in a consistent and useful state. 59*3f982cf4SFabien Sanglard 60*3f982cf4SFabien Sanglard // Temporarily stops accepting new connections and sending/receiving data on 61*3f982cf4SFabien Sanglard // existing connections. Any resources associated with existing connections 62*3f982cf4SFabien Sanglard // are not freed. 63*3f982cf4SFabien Sanglard virtual bool Suspend() = 0; 64*3f982cf4SFabien Sanglard 65*3f982cf4SFabien Sanglard // Resumes exchange of data on existing connections and acceptance of new 66*3f982cf4SFabien Sanglard // connections. 67*3f982cf4SFabien Sanglard virtual bool Resume() = 0; 68*3f982cf4SFabien Sanglard 69*3f982cf4SFabien Sanglard // Synchronously open a new connection to an endpoint identified by 70*3f982cf4SFabien Sanglard // |endpoint_id|. Returns nullptr if it can't be completed synchronously 71*3f982cf4SFabien Sanglard // (e.g. there are no existing open connections to that endpoint). 72*3f982cf4SFabien Sanglard virtual std::unique_ptr<ProtocolConnection> CreateProtocolConnection( 73*3f982cf4SFabien Sanglard uint64_t endpoint_id) = 0; 74*3f982cf4SFabien Sanglard message_demuxer()75*3f982cf4SFabien Sanglard MessageDemuxer* message_demuxer() const { return demuxer_; } 76*3f982cf4SFabien Sanglard endpoint_request_ids()77*3f982cf4SFabien Sanglard EndpointRequestIds* endpoint_request_ids() { return &endpoint_request_ids_; } 78*3f982cf4SFabien Sanglard 79*3f982cf4SFabien Sanglard // Returns the current state of the listener. state()80*3f982cf4SFabien Sanglard State state() const { return state_; } 81*3f982cf4SFabien Sanglard 82*3f982cf4SFabien Sanglard // Returns the last error reported by this client. last_error()83*3f982cf4SFabien Sanglard const Error& last_error() const { return last_error_; } 84*3f982cf4SFabien Sanglard 85*3f982cf4SFabien Sanglard protected: 86*3f982cf4SFabien Sanglard explicit ProtocolConnectionServer(MessageDemuxer* demuxer, 87*3f982cf4SFabien Sanglard Observer* observer); 88*3f982cf4SFabien Sanglard 89*3f982cf4SFabien Sanglard State state_ = State::kStopped; 90*3f982cf4SFabien Sanglard Error last_error_; 91*3f982cf4SFabien Sanglard MessageDemuxer* const demuxer_; 92*3f982cf4SFabien Sanglard EndpointRequestIds endpoint_request_ids_; 93*3f982cf4SFabien Sanglard Observer* const observer_; 94*3f982cf4SFabien Sanglard 95*3f982cf4SFabien Sanglard OSP_DISALLOW_COPY_AND_ASSIGN(ProtocolConnectionServer); 96*3f982cf4SFabien Sanglard }; 97*3f982cf4SFabien Sanglard 98*3f982cf4SFabien Sanglard std::ostream& operator<<(std::ostream& os, 99*3f982cf4SFabien Sanglard ProtocolConnectionServer::State state); 100*3f982cf4SFabien Sanglard 101*3f982cf4SFabien Sanglard } // namespace osp 102*3f982cf4SFabien Sanglard } // namespace openscreen 103*3f982cf4SFabien Sanglard 104*3f982cf4SFabien Sanglard #endif // OSP_PUBLIC_PROTOCOL_CONNECTION_SERVER_H_ 105