xref: /aosp_15_r20/external/openscreen/osp/public/protocol_connection.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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