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_H_ 6*3f982cf4SFabien Sanglard #define OSP_PUBLIC_PROTOCOL_CONNECTION_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <cstddef> 9*3f982cf4SFabien Sanglard #include <cstdint> 10*3f982cf4SFabien Sanglard #include <type_traits> 11*3f982cf4SFabien Sanglard 12*3f982cf4SFabien Sanglard #include "osp/msgs/osp_messages.h" 13*3f982cf4SFabien Sanglard #include "platform/base/error.h" 14*3f982cf4SFabien Sanglard #include "util/osp_logging.h" 15*3f982cf4SFabien Sanglard 16*3f982cf4SFabien Sanglard namespace openscreen { 17*3f982cf4SFabien Sanglard 18*3f982cf4SFabien Sanglard class Error; 19*3f982cf4SFabien Sanglard 20*3f982cf4SFabien Sanglard namespace osp { 21*3f982cf4SFabien Sanglard 22*3f982cf4SFabien Sanglard template <typename T> 23*3f982cf4SFabien Sanglard using MessageEncodingFunction = 24*3f982cf4SFabien Sanglard std::add_pointer_t<bool(const T&, msgs::CborEncodeBuffer*)>; 25*3f982cf4SFabien Sanglard 26*3f982cf4SFabien Sanglard struct NetworkMetrics; 27*3f982cf4SFabien Sanglard 28*3f982cf4SFabien Sanglard // Represents an embedder's view of a connection between an Open Screen 29*3f982cf4SFabien Sanglard // controller and a receiver. Both the controller and receiver will have a 30*3f982cf4SFabien Sanglard // ProtocolConnection object, although the information known about the other 31*3f982cf4SFabien Sanglard // party may not be symmetrical. 32*3f982cf4SFabien Sanglard // 33*3f982cf4SFabien Sanglard // A ProtocolConnection supports multiple protocols defined by the Open Screen 34*3f982cf4SFabien Sanglard // standard and can be extended by embedders with additional protocols. 35*3f982cf4SFabien Sanglard // 36*3f982cf4SFabien Sanglard // TODO(jophba): move to sharing underlying QUIC connections between multiple 37*3f982cf4SFabien Sanglard // instances of ProtocolConnection. 38*3f982cf4SFabien Sanglard class ProtocolConnection { 39*3f982cf4SFabien Sanglard public: 40*3f982cf4SFabien Sanglard class Observer { 41*3f982cf4SFabien Sanglard public: 42*3f982cf4SFabien Sanglard virtual ~Observer() = default; 43*3f982cf4SFabien Sanglard 44*3f982cf4SFabien Sanglard // Called when |connection| is no longer available, either because the 45*3f982cf4SFabien Sanglard // underlying transport was terminated, the underying system resource was 46*3f982cf4SFabien Sanglard // closed, or data can no longer be exchanged. 47*3f982cf4SFabien Sanglard virtual void OnConnectionClosed(const ProtocolConnection& connection) = 0; 48*3f982cf4SFabien Sanglard }; 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglard ProtocolConnection(uint64_t endpoint_id, uint64_t connection_id); 51*3f982cf4SFabien Sanglard virtual ~ProtocolConnection() = default; 52*3f982cf4SFabien Sanglard 53*3f982cf4SFabien Sanglard // TODO(mfoltz): Define extension API exposed to embedders. This would be 54*3f982cf4SFabien Sanglard // used, for example, to query for and implement vendor-specific protocols 55*3f982cf4SFabien Sanglard // alongside the Open Screen Protocol. 56*3f982cf4SFabien Sanglard 57*3f982cf4SFabien Sanglard // NOTE: ProtocolConnection instances that are owned by clients will have a 58*3f982cf4SFabien Sanglard // ServiceInfo attached with data from discovery and QUIC connection 59*3f982cf4SFabien Sanglard // establishment. What about server connections? We probably want to have 60*3f982cf4SFabien Sanglard // two different structures representing what the client and server know about 61*3f982cf4SFabien Sanglard // a connection. 62*3f982cf4SFabien Sanglard 63*3f982cf4SFabien Sanglard void SetObserver(Observer* observer); 64*3f982cf4SFabien Sanglard 65*3f982cf4SFabien Sanglard template <typename T> WriteMessage(const T & message,MessageEncodingFunction<T> encoder)66*3f982cf4SFabien Sanglard Error WriteMessage(const T& message, MessageEncodingFunction<T> encoder) { 67*3f982cf4SFabien Sanglard msgs::CborEncodeBuffer buffer; 68*3f982cf4SFabien Sanglard 69*3f982cf4SFabien Sanglard if (!encoder(message, &buffer)) { 70*3f982cf4SFabien Sanglard OSP_LOG_WARN << "failed to properly encode presentation message"; 71*3f982cf4SFabien Sanglard return Error::Code::kParseError; 72*3f982cf4SFabien Sanglard } 73*3f982cf4SFabien Sanglard 74*3f982cf4SFabien Sanglard Write(buffer.data(), buffer.size()); 75*3f982cf4SFabien Sanglard 76*3f982cf4SFabien Sanglard return Error::None(); 77*3f982cf4SFabien Sanglard } 78*3f982cf4SFabien Sanglard 79*3f982cf4SFabien Sanglard // TODO(btolsch): This should be derived from the handshake auth identifier 80*3f982cf4SFabien Sanglard // when that is finalized and implemented. endpoint_id()81*3f982cf4SFabien Sanglard uint64_t endpoint_id() const { return endpoint_id_; } id()82*3f982cf4SFabien Sanglard uint64_t id() const { return id_; } 83*3f982cf4SFabien Sanglard 84*3f982cf4SFabien Sanglard virtual void Write(const uint8_t* data, size_t data_size) = 0; 85*3f982cf4SFabien Sanglard virtual void CloseWriteEnd() = 0; 86*3f982cf4SFabien Sanglard 87*3f982cf4SFabien Sanglard protected: 88*3f982cf4SFabien Sanglard uint64_t endpoint_id_; 89*3f982cf4SFabien Sanglard uint64_t id_; 90*3f982cf4SFabien Sanglard Observer* observer_ = nullptr; 91*3f982cf4SFabien Sanglard }; 92*3f982cf4SFabien Sanglard 93*3f982cf4SFabien Sanglard class ProtocolConnectionServiceObserver { 94*3f982cf4SFabien Sanglard public: 95*3f982cf4SFabien Sanglard // Called when the state becomes kRunning. 96*3f982cf4SFabien Sanglard virtual void OnRunning() = 0; 97*3f982cf4SFabien Sanglard // Called when the state becomes kStopped. 98*3f982cf4SFabien Sanglard virtual void OnStopped() = 0; 99*3f982cf4SFabien Sanglard 100*3f982cf4SFabien Sanglard // Called when metrics have been collected by the service. 101*3f982cf4SFabien Sanglard virtual void OnMetrics(const NetworkMetrics& metrics) = 0; 102*3f982cf4SFabien Sanglard // Called when an error has occurred. 103*3f982cf4SFabien Sanglard virtual void OnError(const Error& error) = 0; 104*3f982cf4SFabien Sanglard 105*3f982cf4SFabien Sanglard protected: 106*3f982cf4SFabien Sanglard virtual ~ProtocolConnectionServiceObserver() = default; 107*3f982cf4SFabien Sanglard }; 108*3f982cf4SFabien Sanglard 109*3f982cf4SFabien Sanglard } // namespace osp 110*3f982cf4SFabien Sanglard } // namespace openscreen 111*3f982cf4SFabien Sanglard 112*3f982cf4SFabien Sanglard #endif // OSP_PUBLIC_PROTOCOL_CONNECTION_H_ 113