aboutsummaryrefslogtreecommitdiff
path: root/cast/standalone_receiver/cast_service.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cast/standalone_receiver/cast_service.cc')
-rw-r--r--cast/standalone_receiver/cast_service.cc75
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));
}