xref: /aosp_15_r20/external/openscreen/cast/common/public/receiver_info.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2019 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 CAST_COMMON_PUBLIC_RECEIVER_INFO_H_
6*3f982cf4SFabien Sanglard #define CAST_COMMON_PUBLIC_RECEIVER_INFO_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <memory>
9*3f982cf4SFabien Sanglard #include <string>
10*3f982cf4SFabien Sanglard #include <utility>
11*3f982cf4SFabien Sanglard 
12*3f982cf4SFabien Sanglard #include "discovery/dnssd/public/dns_sd_instance.h"
13*3f982cf4SFabien Sanglard #include "discovery/dnssd/public/dns_sd_instance_endpoint.h"
14*3f982cf4SFabien Sanglard #include "platform/base/ip_address.h"
15*3f982cf4SFabien Sanglard 
16*3f982cf4SFabien Sanglard namespace openscreen {
17*3f982cf4SFabien Sanglard namespace cast {
18*3f982cf4SFabien Sanglard 
19*3f982cf4SFabien Sanglard // Constants to identify a CastV2 instance with DNS-SD.
20*3f982cf4SFabien Sanglard constexpr char kCastV2ServiceId[] = "_googlecast._tcp";
21*3f982cf4SFabien Sanglard constexpr char kCastV2DomainId[] = "local";
22*3f982cf4SFabien Sanglard 
23*3f982cf4SFabien Sanglard // Constants to be used as keys when storing data inside of a DNS-SD TXT record.
24*3f982cf4SFabien Sanglard constexpr char kUniqueIdKey[] = "id";
25*3f982cf4SFabien Sanglard constexpr char kVersionKey[] = "ve";
26*3f982cf4SFabien Sanglard constexpr char kCapabilitiesKey[] = "ca";
27*3f982cf4SFabien Sanglard constexpr char kStatusKey[] = "st";
28*3f982cf4SFabien Sanglard constexpr char kFriendlyNameKey[] = "fn";
29*3f982cf4SFabien Sanglard constexpr char kModelNameKey[] = "md";
30*3f982cf4SFabien Sanglard 
31*3f982cf4SFabien Sanglard // This represents the ‘st’ flag in the CastV2 TXT record.
32*3f982cf4SFabien Sanglard enum ReceiverStatus {
33*3f982cf4SFabien Sanglard   // The receiver is idle and does not need to be connected now.
34*3f982cf4SFabien Sanglard   kIdle = 0,
35*3f982cf4SFabien Sanglard 
36*3f982cf4SFabien Sanglard   // The receiver is hosting an activity and invites the sender to join.  The
37*3f982cf4SFabien Sanglard   // receiver should connect to the running activity using the channel
38*3f982cf4SFabien Sanglard   // establishment protocol, and then query the activity to determine the next
39*3f982cf4SFabien Sanglard   // step, such as showing a description of the activity and prompting the user
40*3f982cf4SFabien Sanglard   // to launch the corresponding app.
41*3f982cf4SFabien Sanglard   kBusy = 1,
42*3f982cf4SFabien Sanglard   kJoin = kBusy
43*3f982cf4SFabien Sanglard };
44*3f982cf4SFabien Sanglard 
45*3f982cf4SFabien Sanglard constexpr uint8_t kCurrentCastVersion = 2;
46*3f982cf4SFabien Sanglard 
47*3f982cf4SFabien Sanglard // Bits in the ‘ca’ bitfield, per the CastV2 spec.
48*3f982cf4SFabien Sanglard constexpr uint64_t kHasVideoOutput = 1 << 0;
49*3f982cf4SFabien Sanglard constexpr uint64_t kHasVideoInput = 1 << 1;
50*3f982cf4SFabien Sanglard constexpr uint64_t kHasAudioOutput = 1 << 2;
51*3f982cf4SFabien Sanglard constexpr uint64_t kHasAudioIntput = 1 << 3;
52*3f982cf4SFabien Sanglard constexpr uint64_t kIsDevModeEnabled = 1 << 4;
53*3f982cf4SFabien Sanglard 
54*3f982cf4SFabien Sanglard constexpr uint64_t kNoCapabilities = 0;
55*3f982cf4SFabien Sanglard 
56*3f982cf4SFabien Sanglard // This is the top-level receiver info class for CastV2. It describes a specific
57*3f982cf4SFabien Sanglard // service instance.
58*3f982cf4SFabien Sanglard struct ReceiverInfo {
59*3f982cf4SFabien Sanglard   // returns the instance id associated with this ReceiverInfo instance.
60*3f982cf4SFabien Sanglard   const std::string& GetInstanceId() const;
61*3f982cf4SFabien Sanglard 
62*3f982cf4SFabien Sanglard   // Returns whether all fields of this ReceiverInfo are valid.
63*3f982cf4SFabien Sanglard   bool IsValid() const;
64*3f982cf4SFabien Sanglard 
65*3f982cf4SFabien Sanglard   // Addresses for the service. Present if an address of this address type
66*3f982cf4SFabien Sanglard   // exists and empty otherwise. When publishing a service instance, these
67*3f982cf4SFabien Sanglard   // values will be overridden based on |network_config| values provided in the
68*3f982cf4SFabien Sanglard   // discovery::Config object used to initialize discovery.
69*3f982cf4SFabien Sanglard   IPAddress v4_address;
70*3f982cf4SFabien Sanglard   IPAddress v6_address;
71*3f982cf4SFabien Sanglard 
72*3f982cf4SFabien Sanglard   // Port at which this service can be reached.
73*3f982cf4SFabien Sanglard   uint16_t port;
74*3f982cf4SFabien Sanglard 
75*3f982cf4SFabien Sanglard   // A UUID for the Cast receiver. This should be a universally unique
76*3f982cf4SFabien Sanglard   // identifier for the receiver, and should (but does not have to be) be stable
77*3f982cf4SFabien Sanglard   // across factory resets.
78*3f982cf4SFabien Sanglard   std::string unique_id;
79*3f982cf4SFabien Sanglard 
80*3f982cf4SFabien Sanglard   // Cast protocol version supported. Begins at 2 and is incremented by 1 with
81*3f982cf4SFabien Sanglard   // each version.
82*3f982cf4SFabien Sanglard   uint8_t protocol_version = kCurrentCastVersion;
83*3f982cf4SFabien Sanglard 
84*3f982cf4SFabien Sanglard   // Bitfield of ReceiverCapabilities supported by this service instance.
85*3f982cf4SFabien Sanglard   uint64_t capabilities = kNoCapabilities;
86*3f982cf4SFabien Sanglard 
87*3f982cf4SFabien Sanglard   // Status of the service instance.
88*3f982cf4SFabien Sanglard   ReceiverStatus status = ReceiverStatus::kIdle;
89*3f982cf4SFabien Sanglard 
90*3f982cf4SFabien Sanglard   // The model name of the receiver, e.g. “Eureka v1”, “Mollie”.
91*3f982cf4SFabien Sanglard   std::string model_name;
92*3f982cf4SFabien Sanglard 
93*3f982cf4SFabien Sanglard   // The friendly name of the receiver, e.g. “Living Room TV".
94*3f982cf4SFabien Sanglard   std::string friendly_name;
95*3f982cf4SFabien Sanglard 
96*3f982cf4SFabien Sanglard  private:
97*3f982cf4SFabien Sanglard   mutable std::string instance_id_ = "";
98*3f982cf4SFabien Sanglard };
99*3f982cf4SFabien Sanglard 
100*3f982cf4SFabien Sanglard inline bool operator==(const ReceiverInfo& lhs, const ReceiverInfo& rhs) {
101*3f982cf4SFabien Sanglard   return lhs.v4_address == rhs.v4_address && lhs.v6_address == rhs.v6_address &&
102*3f982cf4SFabien Sanglard          lhs.port == rhs.port && lhs.unique_id == rhs.unique_id &&
103*3f982cf4SFabien Sanglard          lhs.protocol_version == rhs.protocol_version &&
104*3f982cf4SFabien Sanglard          lhs.capabilities == rhs.capabilities && lhs.status == rhs.status &&
105*3f982cf4SFabien Sanglard          lhs.model_name == rhs.model_name &&
106*3f982cf4SFabien Sanglard          lhs.friendly_name == rhs.friendly_name;
107*3f982cf4SFabien Sanglard }
108*3f982cf4SFabien Sanglard 
109*3f982cf4SFabien Sanglard inline bool operator!=(const ReceiverInfo& lhs, const ReceiverInfo& rhs) {
110*3f982cf4SFabien Sanglard   return !(lhs == rhs);
111*3f982cf4SFabien Sanglard }
112*3f982cf4SFabien Sanglard 
113*3f982cf4SFabien Sanglard // Functions responsible for converting between CastV2 and DNS-SD
114*3f982cf4SFabien Sanglard // representations of a service instance.
115*3f982cf4SFabien Sanglard discovery::DnsSdInstance ReceiverInfoToDnsSdInstance(
116*3f982cf4SFabien Sanglard     const ReceiverInfo& service);
117*3f982cf4SFabien Sanglard 
118*3f982cf4SFabien Sanglard ErrorOr<ReceiverInfo> DnsSdInstanceEndpointToReceiverInfo(
119*3f982cf4SFabien Sanglard     const discovery::DnsSdInstanceEndpoint& endpoint);
120*3f982cf4SFabien Sanglard 
121*3f982cf4SFabien Sanglard }  // namespace cast
122*3f982cf4SFabien Sanglard }  // namespace openscreen
123*3f982cf4SFabien Sanglard 
124*3f982cf4SFabien Sanglard #endif  // CAST_COMMON_PUBLIC_RECEIVER_INFO_H_
125