diff options
Diffstat (limited to 'cast/standalone_receiver/cast_service.cc')
-rw-r--r-- | cast/standalone_receiver/cast_service.cc | 75 |
1 files changed, 39 insertions, 36 deletions
diff --git a/cast/standalone_receiver/cast_service.cc b/cast/standalone_receiver/cast_service.cc index 75790197..92ffce93 100644 --- a/cast/standalone_receiver/cast_service.cc +++ b/cast/standalone_receiver/cast_service.cc @@ -4,12 +4,16 @@ #include "cast/standalone_receiver/cast_service.h" +#include <stdint.h> + +#include <array> #include <utility> #include "discovery/common/config.h" #include "platform/api/tls_connection_factory.h" #include "platform/base/interface_info.h" #include "platform/base/tls_listen_options.h" +#include "util/crypto/random_bytes.h" #include "util/osp_logging.h" #include "util/stringprintf.h" @@ -19,6 +23,7 @@ namespace cast { namespace { constexpr uint16_t kDefaultCastServicePort = 8010; +constexpr int kCastUniqueIdLength = 6; constexpr int kDefaultMaxBacklogSize = 64; const TlsListenOptions kDefaultListenOptions{kDefaultMaxBacklogSize}; @@ -32,59 +37,57 @@ IPEndpoint DetermineEndpoint(const InterfaceInfo& interface) { } discovery::Config MakeDiscoveryConfig(const InterfaceInfo& interface) { - discovery::Config config; - - discovery::Config::NetworkInfo::AddressFamilies supported_address_families = - discovery::Config::NetworkInfo::kNoAddressFamily; - if (interface.GetIpAddressV4()) { - supported_address_families |= discovery::Config::NetworkInfo::kUseIpV4; - } else if (interface.GetIpAddressV6()) { - supported_address_families |= discovery::Config::NetworkInfo::kUseIpV6; - } - config.network_info.push_back({interface, supported_address_families}); - - return config; + return discovery::Config{.network_info = {interface}}; } } // namespace -CastService::CastService(TaskRunner* task_runner, - const InterfaceInfo& interface, - GeneratedCredentials credentials, - const std::string& friendly_name, - const std::string& model_name, - bool enable_discovery) - : local_endpoint_(DetermineEndpoint(interface)), - credentials_(std::move(credentials)), - agent_(task_runner, credentials_.provider.get()), - mirroring_application_(task_runner, local_endpoint_.address, &agent_), +CastService::CastService(CastService::Configuration config) + : local_endpoint_(DetermineEndpoint(config.interface)), + credentials_(std::move(config.credentials)), + agent_(config.task_runner, credentials_.provider.get()), + mirroring_application_(config.task_runner, + local_endpoint_.address, + &agent_), socket_factory_(&agent_, agent_.cast_socket_client()), connection_factory_( - TlsConnectionFactory::CreateFactory(&socket_factory_, task_runner)), - discovery_service_(enable_discovery ? discovery::CreateDnsSdService( - task_runner, - this, - MakeDiscoveryConfig(interface)) - : LazyDeletedDiscoveryService()), + TlsConnectionFactory::CreateFactory(&socket_factory_, + config.task_runner)), + discovery_service_(config.enable_discovery + ? discovery::CreateDnsSdService( + config.task_runner, + this, + MakeDiscoveryConfig(config.interface)) + : LazyDeletedDiscoveryService()), discovery_publisher_( discovery_service_ - ? MakeSerialDelete<discovery::DnsSdServicePublisher<ServiceInfo>>( - task_runner, + ? MakeSerialDelete< + discovery::DnsSdServicePublisher<ReceiverInfo>>( + config.task_runner, discovery_service_.get(), kCastV2ServiceId, - ServiceInfoToDnsSdInstance) + ReceiverInfoToDnsSdInstance) : LazyDeletedDiscoveryPublisher()) { connection_factory_->SetListenCredentials(credentials_.tls_credentials); connection_factory_->Listen(local_endpoint_, kDefaultListenOptions); if (discovery_publisher_) { - ServiceInfo info; + ReceiverInfo info; info.port = local_endpoint_.port; - info.unique_id = HexEncode(interface.hardware_address); - info.friendly_name = friendly_name; - info.model_name = model_name; + if (config.interface.HasHardwareAddress()) { + info.unique_id = HexEncode(config.interface.hardware_address.data(), + config.interface.hardware_address.size()); + } else { + OSP_LOG_WARN << "Hardware address for interface " << config.interface.name + << " is empty. Generating a random unique_id."; + std::array<uint8_t, kCastUniqueIdLength> random_bytes; + GenerateRandomBytes(random_bytes.data(), kCastUniqueIdLength); + info.unique_id = HexEncode(random_bytes.data(), kCastUniqueIdLength); + } + info.friendly_name = config.friendly_name; + info.model_name = config.model_name; info.capabilities = kHasVideoOutput | kHasAudioOutput; - Error error = discovery_publisher_->Register(info); + const Error error = discovery_publisher_->Register(info); if (!error.ok()) { OnFatalError(std::move(error)); } |