| // Copyright 2019 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CAST_COMMON_PUBLIC_SERVICE_INFO_H_ |
| #define CAST_COMMON_PUBLIC_SERVICE_INFO_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <utility> |
| |
| #include "discovery/dnssd/public/dns_sd_instance.h" |
| #include "discovery/dnssd/public/dns_sd_instance_endpoint.h" |
| #include "platform/base/ip_address.h" |
| |
| namespace openscreen { |
| namespace cast { |
| |
| // Constants to identify a CastV2 instance with DNS-SD. |
| constexpr char kCastV2ServiceId[] = "_googlecast._tcp"; |
| constexpr char kCastV2DomainId[] = "local"; |
| |
| // Constants to be used as keys when storing data inside of a DNS-SD TXT record. |
| constexpr char kUniqueIdKey[] = "id"; |
| constexpr char kVersionKey[] = "ve"; |
| constexpr char kCapabilitiesKey[] = "ca"; |
| constexpr char kStatusKey[] = "st"; |
| constexpr char kFriendlyNameKey[] = "fn"; |
| constexpr char kModelNameKey[] = "md"; |
| |
| // This represents the ‘st’ flag in the CastV2 TXT record. |
| enum ReceiverStatus { |
| // The receiver is idle and does not need to be connected now. |
| kIdle = 0, |
| |
| // The receiver is hosting an activity and invites the sender to join. The |
| // receiver should connect to the running activity using the channel |
| // establishment protocol, and then query the activity to determine the next |
| // step, such as showing a description of the activity and prompting the user |
| // to launch the corresponding app. |
| kBusy = 1, |
| kJoin = kBusy |
| }; |
| |
| constexpr uint8_t kCurrentCastVersion = 2; |
| |
| // Bits in the ‘ca’ bitfield, per the CastV2 spec. |
| constexpr uint64_t kHasVideoOutput = 1 << 0; |
| constexpr uint64_t kHasVideoInput = 1 << 1; |
| constexpr uint64_t kHasAudioOutput = 1 << 2; |
| constexpr uint64_t kHasAudioIntput = 1 << 3; |
| constexpr uint64_t kIsDevModeEnabled = 1 << 4; |
| |
| constexpr uint64_t kNoCapabilities = 0; |
| |
| // This is the top-level service info class for CastV2. It describes a specific |
| // service instance. |
| // TODO(crbug.com/openscreen/112): Rename this to CastReceiverInfo or similar. |
| struct ServiceInfo { |
| // returns the instance id associated with this ServiceInfo instance. |
| const std::string& GetInstanceId() const; |
| |
| // Returns whether all fields of this ServiceInfo are valid. |
| bool IsValid() const; |
| |
| // Addresses for the service. Present if an address of this address type |
| // exists and empty otherwise. When publishing a service instance, these |
| // values will be overridden based on |network_config| values provided in the |
| // discovery::Config object used to initialize discovery. |
| IPAddress v4_address; |
| IPAddress v6_address; |
| |
| // Port at which this service can be reached. |
| uint16_t port; |
| |
| // A UUID for the Cast receiver. This should be a universally unique |
| // identifier for the receiver, and should (but does not have to be) be stable |
| // across factory resets. |
| std::string unique_id; |
| |
| // Cast protocol version supported. Begins at 2 and is incremented by 1 with |
| // each version. |
| uint8_t protocol_version = kCurrentCastVersion; |
| |
| // Bitfield of ReceiverCapabilities supported by this service instance. |
| uint64_t capabilities = kNoCapabilities; |
| |
| // Status of the service instance. |
| ReceiverStatus status = ReceiverStatus::kIdle; |
| |
| // The model name of the device, e.g. “Eureka v1”, “Mollie”. |
| std::string model_name; |
| |
| // The friendly name of the device, e.g. “Living Room TV". |
| std::string friendly_name; |
| |
| private: |
| mutable std::string instance_id_ = ""; |
| }; |
| |
| inline bool operator==(const ServiceInfo& lhs, const ServiceInfo& rhs) { |
| return lhs.v4_address == rhs.v4_address && lhs.v6_address == rhs.v6_address && |
| lhs.port == rhs.port && lhs.unique_id == rhs.unique_id && |
| lhs.protocol_version == rhs.protocol_version && |
| lhs.capabilities == rhs.capabilities && lhs.status == rhs.status && |
| lhs.model_name == rhs.model_name && |
| lhs.friendly_name == rhs.friendly_name; |
| } |
| |
| inline bool operator!=(const ServiceInfo& lhs, const ServiceInfo& rhs) { |
| return !(lhs == rhs); |
| } |
| |
| // Functions responsible for converting between CastV2 and DNS-SD |
| // representations of a service instance. |
| discovery::DnsSdInstance ServiceInfoToDnsSdInstance(const ServiceInfo& service); |
| |
| ErrorOr<ServiceInfo> DnsSdInstanceEndpointToServiceInfo( |
| const discovery::DnsSdInstanceEndpoint& endpoint); |
| |
| } // namespace cast |
| } // namespace openscreen |
| |
| #endif // CAST_COMMON_PUBLIC_SERVICE_INFO_H_ |