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