aboutsummaryrefslogtreecommitdiff
path: root/cast/common/public/receiver_info.h
diff options
context:
space:
mode:
Diffstat (limited to 'cast/common/public/receiver_info.h')
-rw-r--r--cast/common/public/receiver_info.h124
1 files changed, 124 insertions, 0 deletions
diff --git a/cast/common/public/receiver_info.h b/cast/common/public/receiver_info.h
new file mode 100644
index 00000000..c4e82c82
--- /dev/null
+++ b/cast/common/public/receiver_info.h
@@ -0,0 +1,124 @@
+// 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_RECEIVER_INFO_H_
+#define CAST_COMMON_PUBLIC_RECEIVER_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 receiver info class for CastV2. It describes a specific
+// service instance.
+struct ReceiverInfo {
+ // returns the instance id associated with this ReceiverInfo instance.
+ const std::string& GetInstanceId() const;
+
+ // Returns whether all fields of this ReceiverInfo 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 receiver, e.g. “Eureka v1”, “Mollie”.
+ std::string model_name;
+
+ // The friendly name of the receiver, e.g. “Living Room TV".
+ std::string friendly_name;
+
+ private:
+ mutable std::string instance_id_ = "";
+};
+
+inline bool operator==(const ReceiverInfo& lhs, const ReceiverInfo& 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 ReceiverInfo& lhs, const ReceiverInfo& rhs) {
+ return !(lhs == rhs);
+}
+
+// Functions responsible for converting between CastV2 and DNS-SD
+// representations of a service instance.
+discovery::DnsSdInstance ReceiverInfoToDnsSdInstance(
+ const ReceiverInfo& service);
+
+ErrorOr<ReceiverInfo> DnsSdInstanceEndpointToReceiverInfo(
+ const discovery::DnsSdInstanceEndpoint& endpoint);
+
+} // namespace cast
+} // namespace openscreen
+
+#endif // CAST_COMMON_PUBLIC_RECEIVER_INFO_H_