You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

125 lines
4.3 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

// 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_