diff options
Diffstat (limited to 'cast/sender')
-rw-r--r-- | cast/sender/BUILD.gn | 5 | ||||
-rw-r--r-- | cast/sender/cast_app_availability_tracker.cc | 36 | ||||
-rw-r--r-- | cast/sender/cast_app_availability_tracker.h | 60 | ||||
-rw-r--r-- | cast/sender/cast_app_availability_tracker_unittest.cc | 59 | ||||
-rw-r--r-- | cast/sender/cast_app_discovery_service_impl.cc | 65 | ||||
-rw-r--r-- | cast/sender/cast_app_discovery_service_impl.h | 28 | ||||
-rw-r--r-- | cast/sender/cast_app_discovery_service_impl_unittest.cc | 58 | ||||
-rw-r--r-- | cast/sender/cast_platform_client.cc | 46 | ||||
-rw-r--r-- | cast/sender/cast_platform_client.h | 18 | ||||
-rw-r--r-- | cast/sender/cast_platform_client_unittest.cc | 10 | ||||
-rw-r--r-- | cast/sender/channel/cast_auth_util.cc | 63 | ||||
-rw-r--r-- | cast/sender/channel/cast_auth_util.h | 3 | ||||
-rw-r--r-- | cast/sender/channel/sender_socket_factory.cc | 4 | ||||
-rw-r--r-- | cast/sender/public/README.md | 2 | ||||
-rw-r--r-- | cast/sender/public/cast_app_discovery_service.h | 8 | ||||
-rw-r--r-- | cast/sender/public/sender_socket_factory.h | 4 |
16 files changed, 254 insertions, 215 deletions
diff --git a/cast/sender/BUILD.gn b/cast/sender/BUILD.gn index ae17f7cf..09e39453 100644 --- a/cast/sender/BUILD.gn +++ b/cast/sender/BUILD.gn @@ -13,6 +13,7 @@ source_set("channel") { ] deps = [ + "../../third_party/abseil", "../common:channel", "../common/certificate/proto:certificate_proto", "../common/channel/proto:channel_proto", @@ -65,9 +66,7 @@ source_set("test_helpers") { "../receiver:channel", ] - public_deps = [ - ":channel", - ] + public_deps = [ ":channel" ] } source_set("unittests") { diff --git a/cast/sender/cast_app_availability_tracker.cc b/cast/sender/cast_app_availability_tracker.cc index 0a018d19..7e980797 100644 --- a/cast/sender/cast_app_availability_tracker.cc +++ b/cast/sender/cast_app_availability_tracker.cc @@ -54,10 +54,10 @@ void CastAppAvailabilityTracker::UnregisterSource( } std::vector<CastMediaSource> CastAppAvailabilityTracker::UpdateAppAvailability( - const std::string& device_id, + const std::string& receiver_id, const std::string& app_id, AppAvailability availability) { - auto& availabilities = app_availabilities_[device_id]; + auto& availabilities = app_availabilities_[receiver_id]; auto it = availabilities.find(app_id); AppAvailabilityResult old_availability = it == availabilities.end() @@ -84,21 +84,22 @@ std::vector<CastMediaSource> CastAppAvailabilityTracker::UpdateAppAvailability( return affected_sources; } -std::vector<CastMediaSource> CastAppAvailabilityTracker::RemoveResultsForDevice( - const std::string& device_id) { - auto affected_sources = GetSupportedSources(device_id); - app_availabilities_.erase(device_id); +std::vector<CastMediaSource> +CastAppAvailabilityTracker::RemoveResultsForReceiver( + const std::string& receiver_id) { + auto affected_sources = GetSupportedSources(receiver_id); + app_availabilities_.erase(receiver_id); return affected_sources; } std::vector<CastMediaSource> CastAppAvailabilityTracker::GetSupportedSources( - const std::string& device_id) const { - auto it = app_availabilities_.find(device_id); + const std::string& receiver_id) const { + auto it = app_availabilities_.find(receiver_id); if (it == app_availabilities_.end()) { return std::vector<CastMediaSource>(); } - // Find all app IDs that are available on the device. + // Find all app IDs that are available on the receiver. std::vector<std::string> supported_app_ids; for (const auto& availability : it->second) { if (availability.second.availability == AppAvailabilityResult::kAvailable) { @@ -106,7 +107,7 @@ std::vector<CastMediaSource> CastAppAvailabilityTracker::GetSupportedSources( } } - // Find all registered sources whose query results contain the device ID. + // Find all registered sources whose query results contain the receiver ID. std::vector<CastMediaSource> sources; for (const auto& source : registered_sources_) { if (source.second.ContainsAnyAppIdFrom(supported_app_ids)) { @@ -117,9 +118,9 @@ std::vector<CastMediaSource> CastAppAvailabilityTracker::GetSupportedSources( } CastAppAvailabilityTracker::AppAvailability -CastAppAvailabilityTracker::GetAvailability(const std::string& device_id, +CastAppAvailabilityTracker::GetAvailability(const std::string& receiver_id, const std::string& app_id) const { - auto availabilities_it = app_availabilities_.find(device_id); + auto availabilities_it = app_availabilities_.find(receiver_id); if (availabilities_it == app_availabilities_.end()) { return {AppAvailabilityResult::kUnknown, Clock::time_point{}}; } @@ -142,10 +143,11 @@ std::vector<std::string> CastAppAvailabilityTracker::GetRegisteredApps() const { return registered_apps; } -std::vector<std::string> CastAppAvailabilityTracker::GetAvailableDevices( +std::vector<std::string> CastAppAvailabilityTracker::GetAvailableReceivers( const CastMediaSource& source) const { - std::vector<std::string> device_ids; - // For each device, check if there is at least one available app in |source|. + std::vector<std::string> receiver_ids; + // For each receiver, check if there is at least one available app in + // |source|. for (const auto& availabilities : app_availabilities_) { for (const std::string& app_id : source.app_ids()) { const auto& availabilities_map = availabilities.second; @@ -153,12 +155,12 @@ std::vector<std::string> CastAppAvailabilityTracker::GetAvailableDevices( if (availability_it != availabilities_map.end() && availability_it->second.availability == AppAvailabilityResult::kAvailable) { - device_ids.push_back(availabilities.first); + receiver_ids.push_back(availabilities.first); break; } } } - return device_ids; + return receiver_ids; } } // namespace cast diff --git a/cast/sender/cast_app_availability_tracker.h b/cast/sender/cast_app_availability_tracker.h index c0bded96..74d3bc25 100644 --- a/cast/sender/cast_app_availability_tracker.h +++ b/cast/sender/cast_app_availability_tracker.h @@ -16,8 +16,8 @@ namespace openscreen { namespace cast { -// Tracks device queries and their extracted Cast app IDs and their -// availabilities on discovered devices. +// Tracks receiver queries and their extracted Cast app IDs and their +// availabilities on discovered receivers. // Example usage: /// // (1) A page is interested in a Cast URL (e.g. by creating a @@ -28,24 +28,24 @@ namespace cast { // auto new_app_ids = tracker.RegisterSource(source.value()); // // (2) The set of app IDs returned by the tracker can then be used by the caller -// to send an app availability request to each of the discovered devices. +// to send an app availability request to each of the discovered receivers. // -// (3) Once the caller knows the availability value for a (device, app) pair, it -// may inform the tracker to update its results: +// (3) Once the caller knows the availability value for a (receiver, app) pair, +// it may inform the tracker to update its results: // auto affected_sources = -// tracker.UpdateAppAvailability(device_id, app_id, {availability, now}); +// tracker.UpdateAppAvailability(receiver_id, app_id, {availability, +// now}); // // (4) The tracker returns a subset of discovered sources that were affected by -// the update. The caller can then call |GetAvailableDevices()| to get the +// the update. The caller can then call |GetAvailableReceivers()| to get the // updated results for each affected source. // -// (5a): At any time, the caller may call |RemoveResultsForDevice()| to remove -// cached results pertaining to the device, when it detects that a device is +// (5a): At any time, the caller may call |RemoveResultsForReceiver()| to remove +// cached results pertaining to the receiver, when it detects that a receiver is // removed or no longer valid. // -// (5b): At any time, the caller may call |GetAvailableDevices()| (even before +// (5b): At any time, the caller may call |GetAvailableReceivers()| (even before // the source is registered) to determine if there are cached results available. -// TODO(crbug.com/openscreen/112): Device -> Receiver renaming. class CastAppAvailabilityTracker { public: // The result of an app availability request and the time when it is obtained. @@ -69,40 +69,40 @@ class CastAppAvailabilityTracker { void UnregisterSource(const std::string& source_id); void UnregisterSource(const CastMediaSource& source); - // Updates the availability of |app_id| on |device_id| to |availability|. + // Updates the availability of |app_id| on |receiver_id| to |availability|. // Returns a list of registered CastMediaSources for which the set of - // available devices might have been updated by this call. The caller should - // call |GetAvailableDevices| with the returned CastMediaSources to get the + // available receivers might have been updated by this call. The caller should + // call |GetAvailableReceivers| with the returned CastMediaSources to get the // updated lists. std::vector<CastMediaSource> UpdateAppAvailability( - const std::string& device_id, + const std::string& receiver_id, const std::string& app_id, AppAvailability availability); - // Removes all results associated with |device_id|, i.e. when the device + // Removes all results associated with |receiver_id|, i.e. when the receiver // becomes invalid. Returns a list of registered CastMediaSources for which - // the set of available devices might have been updated by this call. The - // caller should call |GetAvailableDevices| with the returned CastMediaSources - // to get the updated lists. - std::vector<CastMediaSource> RemoveResultsForDevice( - const std::string& device_id); + // the set of available receivers might have been updated by this call. The + // caller should call |GetAvailableReceivers| with the returned + // CastMediaSources to get the updated lists. + std::vector<CastMediaSource> RemoveResultsForReceiver( + const std::string& receiver_id); - // Returns a list of registered CastMediaSources supported by |device_id|. + // Returns a list of registered CastMediaSources supported by |receiver_id|. std::vector<CastMediaSource> GetSupportedSources( - const std::string& device_id) const; + const std::string& receiver_id) const; - // Returns the availability for |app_id| on |device_id| and the time at which - // the availability was determined. If availability is kUnknown, then the time - // may be null (e.g. if an availability request was never sent). - AppAvailability GetAvailability(const std::string& device_id, + // Returns the availability for |app_id| on |receiver_id| and the time at + // which the availability was determined. If availability is kUnknown, then + // the time may be null (e.g. if an availability request was never sent). + AppAvailability GetAvailability(const std::string& receiver_id, const std::string& app_id) const; // Returns a list of registered app IDs. std::vector<std::string> GetRegisteredApps() const; - // Returns a list of device IDs compatible with |source|, using the current + // Returns a list of receiver IDs compatible with |source|, using the current // availability info. - std::vector<std::string> GetAvailableDevices( + std::vector<std::string> GetAvailableReceivers( const CastMediaSource& source) const; private: @@ -115,7 +115,7 @@ class CastAppAvailabilityTracker { // App IDs tracked and the number of registered sources containing them. std::map<std::string, int> registration_count_by_app_id_; - // IDs and app availabilities of known devices. + // IDs and app availabilities of known receivers. std::map<std::string, AppAvailabilityMap> app_availabilities_; }; diff --git a/cast/sender/cast_app_availability_tracker_unittest.cc b/cast/sender/cast_app_availability_tracker_unittest.cc index b45d3563..1b721577 100644 --- a/cast/sender/cast_app_availability_tracker_unittest.cc +++ b/cast/sender/cast_app_availability_tracker_unittest.cc @@ -97,62 +97,63 @@ TEST_F(CastAppAvailabilityTrackerTest, UpdateAppAvailability) { // |source3| not affected. EXPECT_THAT( tracker_.UpdateAppAvailability( - "deviceId1", "AAA", {AppAvailabilityResult::kAvailable, Now()}), + "receiverId1", "AAA", {AppAvailabilityResult::kAvailable, Now()}), CastMediaSourcesEqual(std::vector<CastMediaSource>())); - std::vector<std::string> devices_1 = {"deviceId1"}; - std::vector<std::string> devices_1_2 = {"deviceId1", "deviceId2"}; + std::vector<std::string> receivers_1 = {"receiverId1"}; + std::vector<std::string> receivers_1_2 = {"receiverId1", "receiverId2"}; std::vector<CastMediaSource> sources_1 = {source1}; std::vector<CastMediaSource> sources_1_2 = {source1, source2}; - // Tracker returns available devices even though sources aren't registered. - EXPECT_EQ(devices_1, tracker_.GetAvailableDevices(source1)); - EXPECT_EQ(devices_1, tracker_.GetAvailableDevices(source2)); - EXPECT_TRUE(tracker_.GetAvailableDevices(source3).empty()); + // Tracker returns available receivers even though sources aren't registered. + EXPECT_EQ(receivers_1, tracker_.GetAvailableReceivers(source1)); + EXPECT_EQ(receivers_1, tracker_.GetAvailableReceivers(source2)); + EXPECT_TRUE(tracker_.GetAvailableReceivers(source3).empty()); tracker_.RegisterSource(source1); // Only |source1| is registered for this app. EXPECT_THAT( tracker_.UpdateAppAvailability( - "deviceId2", "AAA", {AppAvailabilityResult::kAvailable, Now()}), + "receiverId2", "AAA", {AppAvailabilityResult::kAvailable, Now()}), CastMediaSourcesEqual(sources_1)); - EXPECT_THAT(tracker_.GetAvailableDevices(source1), - UnorderedElementsAreArray(devices_1_2)); - EXPECT_THAT(tracker_.GetAvailableDevices(source2), - UnorderedElementsAreArray(devices_1_2)); - EXPECT_TRUE(tracker_.GetAvailableDevices(source3).empty()); + EXPECT_THAT(tracker_.GetAvailableReceivers(source1), + UnorderedElementsAreArray(receivers_1_2)); + EXPECT_THAT(tracker_.GetAvailableReceivers(source2), + UnorderedElementsAreArray(receivers_1_2)); + EXPECT_TRUE(tracker_.GetAvailableReceivers(source3).empty()); tracker_.RegisterSource(source2); EXPECT_THAT( tracker_.UpdateAppAvailability( - "deviceId2", "AAA", {AppAvailabilityResult::kUnavailable, Now()}), + "receiverId2", "AAA", {AppAvailabilityResult::kUnavailable, Now()}), CastMediaSourcesEqual(sources_1_2)); - EXPECT_EQ(devices_1, tracker_.GetAvailableDevices(source1)); - EXPECT_EQ(devices_1, tracker_.GetAvailableDevices(source2)); - EXPECT_TRUE(tracker_.GetAvailableDevices(source3).empty()); + EXPECT_EQ(receivers_1, tracker_.GetAvailableReceivers(source1)); + EXPECT_EQ(receivers_1, tracker_.GetAvailableReceivers(source2)); + EXPECT_TRUE(tracker_.GetAvailableReceivers(source3).empty()); } -TEST_F(CastAppAvailabilityTrackerTest, RemoveResultsForDevice) { +TEST_F(CastAppAvailabilityTrackerTest, RemoveResultsForReceiver) { CastMediaSource source1("cast:AAA?clientId=1", {"AAA"}); - tracker_.UpdateAppAvailability("deviceId1", "AAA", + tracker_.UpdateAppAvailability("receiverId1", "AAA", {AppAvailabilityResult::kAvailable, Now()}); EXPECT_EQ(AppAvailabilityResult::kAvailable, - tracker_.GetAvailability("deviceId1", "AAA").availability); + tracker_.GetAvailability("receiverId1", "AAA").availability); - std::vector<std::string> expected_device_ids = {"deviceId1"}; - EXPECT_EQ(expected_device_ids, tracker_.GetAvailableDevices(source1)); + std::vector<std::string> expected_receiver_ids = {"receiverId1"}; + EXPECT_EQ(expected_receiver_ids, tracker_.GetAvailableReceivers(source1)); - // Unrelated device ID. - tracker_.RemoveResultsForDevice("deviceId2"); + // Unrelated receiver ID. + tracker_.RemoveResultsForReceiver("receiverId2"); EXPECT_EQ(AppAvailabilityResult::kAvailable, - tracker_.GetAvailability("deviceId1", "AAA").availability); - EXPECT_EQ(expected_device_ids, tracker_.GetAvailableDevices(source1)); + tracker_.GetAvailability("receiverId1", "AAA").availability); + EXPECT_EQ(expected_receiver_ids, tracker_.GetAvailableReceivers(source1)); - tracker_.RemoveResultsForDevice("deviceId1"); + tracker_.RemoveResultsForReceiver("receiverId1"); EXPECT_EQ(AppAvailabilityResult::kUnknown, - tracker_.GetAvailability("deviceId1", "AAA").availability); - EXPECT_EQ(std::vector<std::string>{}, tracker_.GetAvailableDevices(source1)); + tracker_.GetAvailability("receiverId1", "AAA").availability); + EXPECT_EQ(std::vector<std::string>{}, + tracker_.GetAvailableReceivers(source1)); } } // namespace cast diff --git a/cast/sender/cast_app_discovery_service_impl.cc b/cast/sender/cast_app_discovery_service_impl.cc index 4ca9a016..1e428a79 100644 --- a/cast/sender/cast_app_discovery_service_impl.cc +++ b/cast/sender/cast_app_discovery_service_impl.cc @@ -41,10 +41,10 @@ CastAppDiscoveryServiceImpl::StartObservingAvailability( const std::string& source_id = source.source_id(); // Return cached results immediately, if available. - std::vector<std::string> cached_device_ids = - availability_tracker_.GetAvailableDevices(source); - if (!cached_device_ids.empty()) { - callback(source, GetReceiversByIds(cached_device_ids)); + std::vector<std::string> cached_receiver_ids = + availability_tracker_.GetAvailableReceivers(source); + if (!cached_receiver_ids.empty()) { + callback(source, GetReceiversByIds(cached_receiver_ids)); } auto& callbacks = avail_queries_[source_id]; @@ -76,54 +76,54 @@ void CastAppDiscoveryServiceImpl::Refresh() { } void CastAppDiscoveryServiceImpl::AddOrUpdateReceiver( - const ServiceInfo& receiver) { - const std::string& device_id = receiver.unique_id; - receivers_by_id_[device_id] = receiver; + const ReceiverInfo& receiver) { + const std::string& receiver_id = receiver.unique_id; + receivers_by_id_[receiver_id] = receiver; // Any queries that currently contain this receiver should be updated. UpdateAvailabilityQueries( - availability_tracker_.GetSupportedSources(device_id)); + availability_tracker_.GetSupportedSources(receiver_id)); for (const std::string& app_id : availability_tracker_.GetRegisteredApps()) { - RequestAppAvailability(device_id, app_id); + RequestAppAvailability(receiver_id, app_id); } } -void CastAppDiscoveryServiceImpl::RemoveReceiver(const ServiceInfo& receiver) { - const std::string& device_id = receiver.unique_id; - receivers_by_id_.erase(device_id); +void CastAppDiscoveryServiceImpl::RemoveReceiver(const ReceiverInfo& receiver) { + const std::string& receiver_id = receiver.unique_id; + receivers_by_id_.erase(receiver_id); UpdateAvailabilityQueries( - availability_tracker_.RemoveResultsForDevice(device_id)); + availability_tracker_.RemoveResultsForReceiver(receiver_id)); } void CastAppDiscoveryServiceImpl::RequestAppAvailability( - const std::string& device_id, + const std::string& receiver_id, const std::string& app_id) { - if (ShouldRefreshAppAvailability(device_id, app_id, clock_())) { + if (ShouldRefreshAppAvailability(receiver_id, app_id, clock_())) { platform_client_->RequestAppAvailability( - device_id, app_id, - [self = weak_factory_.GetWeakPtr(), device_id]( + receiver_id, app_id, + [self = weak_factory_.GetWeakPtr(), receiver_id]( const std::string& app_id, AppAvailabilityResult availability) { if (self) { - self->UpdateAppAvailability(device_id, app_id, availability); + self->UpdateAppAvailability(receiver_id, app_id, availability); } }); } } void CastAppDiscoveryServiceImpl::UpdateAppAvailability( - const std::string& device_id, + const std::string& receiver_id, const std::string& app_id, AppAvailabilityResult availability) { - if (receivers_by_id_.find(device_id) == receivers_by_id_.end()) { + if (receivers_by_id_.find(receiver_id) == receivers_by_id_.end()) { return; } - OSP_DVLOG << "App " << app_id << " on receiver " << device_id << " is " + OSP_DVLOG << "App " << app_id << " on receiver " << receiver_id << " is " << ToString(availability); UpdateAvailabilityQueries(availability_tracker_.UpdateAppAvailability( - device_id, app_id, {availability, clock_()})); + receiver_id, app_id, {availability, clock_()})); } void CastAppDiscoveryServiceImpl::UpdateAvailabilityQueries( @@ -133,20 +133,20 @@ void CastAppDiscoveryServiceImpl::UpdateAvailabilityQueries( auto it = avail_queries_.find(source_id); if (it == avail_queries_.end()) continue; - std::vector<std::string> device_ids = - availability_tracker_.GetAvailableDevices(source); - std::vector<ServiceInfo> receivers = GetReceiversByIds(device_ids); + std::vector<std::string> receiver_ids = + availability_tracker_.GetAvailableReceivers(source); + std::vector<ReceiverInfo> receivers = GetReceiversByIds(receiver_ids); for (const auto& callback : it->second) { callback.callback(source, receivers); } } } -std::vector<ServiceInfo> CastAppDiscoveryServiceImpl::GetReceiversByIds( - const std::vector<std::string>& device_ids) const { - std::vector<ServiceInfo> receivers; - for (const std::string& device_id : device_ids) { - auto entry = receivers_by_id_.find(device_id); +std::vector<ReceiverInfo> CastAppDiscoveryServiceImpl::GetReceiversByIds( + const std::vector<std::string>& receiver_ids) const { + std::vector<ReceiverInfo> receivers; + for (const std::string& receiver_id : receiver_ids) { + auto entry = receivers_by_id_.find(receiver_id); if (entry != receivers_by_id_.end()) { receivers.push_back(entry->second); } @@ -155,13 +155,14 @@ std::vector<ServiceInfo> CastAppDiscoveryServiceImpl::GetReceiversByIds( } bool CastAppDiscoveryServiceImpl::ShouldRefreshAppAvailability( - const std::string& device_id, + const std::string& receiver_id, const std::string& app_id, Clock::time_point now) const { // TODO(btolsch): Consider an exponential backoff mechanism instead. // Receivers will typically respond with "unavailable" immediately after boot // and then become available 10-30 seconds later. - auto availability = availability_tracker_.GetAvailability(device_id, app_id); + auto availability = + availability_tracker_.GetAvailability(receiver_id, app_id); switch (availability.availability) { case AppAvailabilityResult::kAvailable: return false; diff --git a/cast/sender/cast_app_discovery_service_impl.h b/cast/sender/cast_app_discovery_service_impl.h index fa577808..49943994 100644 --- a/cast/sender/cast_app_discovery_service_impl.h +++ b/cast/sender/cast_app_discovery_service_impl.h @@ -9,7 +9,7 @@ #include <string> #include <vector> -#include "cast/common/public/service_info.h" +#include "cast/common/public/receiver_info.h" #include "cast/sender/cast_app_availability_tracker.h" #include "cast/sender/cast_platform_client.h" #include "cast/sender/public/cast_app_discovery_service.h" @@ -33,12 +33,12 @@ class CastAppDiscoveryServiceImpl : public CastAppDiscoveryService { const CastMediaSource& source, AvailabilityCallback callback) override; - // Reissues app availability requests for currently registered (device_id, + // Reissues app availability requests for currently registered (receiver_id, // app_id) pairs whose status is kUnavailable or kUnknown. void Refresh() override; - void AddOrUpdateReceiver(const ServiceInfo& receiver); - void RemoveReceiver(const ServiceInfo& receiver); + void AddOrUpdateReceiver(const ReceiverInfo& receiver); + void RemoveReceiver(const ReceiverInfo& receiver); private: struct AvailabilityCallbackEntry { @@ -47,32 +47,32 @@ class CastAppDiscoveryServiceImpl : public CastAppDiscoveryService { }; // Issues an app availability request for |app_id| to the receiver given by - // |device_id|. - void RequestAppAvailability(const std::string& device_id, + // |receiver_id|. + void RequestAppAvailability(const std::string& receiver_id, const std::string& app_id); - // Updates the availability result for |device_id| and |app_id| with |result|, - // and notifies callbacks with updated availability query results. - void UpdateAppAvailability(const std::string& device_id, + // Updates the availability result for |receiver_id| and |app_id| with + // |result|, and notifies callbacks with updated availability query results. + void UpdateAppAvailability(const std::string& receiver_id, const std::string& app_id, AppAvailabilityResult result); // Updates the availability query results for |sources|. void UpdateAvailabilityQueries(const std::vector<CastMediaSource>& sources); - std::vector<ServiceInfo> GetReceiversByIds( - const std::vector<std::string>& device_ids) const; + std::vector<ReceiverInfo> GetReceiversByIds( + const std::vector<std::string>& receiver_ids) const; // Returns true if an app availability request should be issued for - // |device_id| and |app_id|. |now| is used for checking whether previously + // |receiver_id| and |app_id|. |now| is used for checking whether previously // cached results should be refreshed. - bool ShouldRefreshAppAvailability(const std::string& device_id, + bool ShouldRefreshAppAvailability(const std::string& receiver_id, const std::string& app_id, Clock::time_point now) const; void RemoveAvailabilityCallback(uint32_t id) override; - std::map<std::string, ServiceInfo> receivers_by_id_; + std::map<std::string, ReceiverInfo> receivers_by_id_; // Registered availability queries and their associated callbacks keyed by // media source IDs. diff --git a/cast/sender/cast_app_discovery_service_impl_unittest.cc b/cast/sender/cast_app_discovery_service_impl_unittest.cc index a2eeb046..60175f59 100644 --- a/cast/sender/cast_app_discovery_service_impl_unittest.cc +++ b/cast/sender/cast_app_discovery_service_impl_unittest.cc @@ -9,7 +9,7 @@ #include "cast/common/channel/testing/fake_cast_socket.h" #include "cast/common/channel/testing/mock_socket_error_handler.h" #include "cast/common/channel/virtual_connection_router.h" -#include "cast/common/public/service_info.h" +#include "cast/common/public/receiver_info.h" #include "cast/sender/testing/test_helpers.h" #include "gtest/gtest.h" #include "platform/test/fake_clock.h" @@ -32,7 +32,7 @@ class CastAppDiscoveryServiceImplTest : public ::testing::Test { receiver_.v4_address = fake_cast_socket_pair_.remote_endpoint.address; receiver_.port = fake_cast_socket_pair_.remote_endpoint.port; - receiver_.unique_id = "deviceId1"; + receiver_.unique_id = "receiverId1"; receiver_.friendly_name = "Some Name"; } @@ -42,23 +42,23 @@ class CastAppDiscoveryServiceImplTest : public ::testing::Test { return fake_cast_socket_pair_.mock_peer_client; } - void AddOrUpdateReceiver(const ServiceInfo& receiver, int32_t socket_id) { + void AddOrUpdateReceiver(const ReceiverInfo& receiver, int32_t socket_id) { platform_client_.AddOrUpdateReceiver(receiver, socket_id); app_discovery_service_.AddOrUpdateReceiver(receiver); } CastAppDiscoveryService::Subscription StartObservingAvailability( const CastMediaSource& source, - std::vector<ServiceInfo>* save_receivers) { + std::vector<ReceiverInfo>* save_receivers) { return app_discovery_service_.StartObservingAvailability( source, [save_receivers](const CastMediaSource& source, - const std::vector<ServiceInfo>& receivers) { + const std::vector<ReceiverInfo>& receivers) { *save_receivers = receivers; }); } CastAppDiscoveryService::Subscription StartSourceA1Query( - std::vector<ServiceInfo>* receivers, + std::vector<ReceiverInfo>* receivers, int* request_id, std::string* sender_id) { auto subscription = StartObservingAvailability(source_a_1_, receivers); @@ -91,18 +91,18 @@ class CastAppDiscoveryServiceImplTest : public ::testing::Test { CastMediaSource source_a_2_{"cast:AAA?clientId=2", {"AAA"}}; CastMediaSource source_b_1_{"cast:BBB?clientId=1", {"BBB"}}; - ServiceInfo receiver_; + ReceiverInfo receiver_; }; TEST_F(CastAppDiscoveryServiceImplTest, StartObservingAvailability) { - std::vector<ServiceInfo> receivers1; + std::vector<ReceiverInfo> receivers1; int request_id; std::string sender_id; auto subscription1 = StartSourceA1Query(&receivers1, &request_id, &sender_id); // Same app ID should not trigger another request. EXPECT_CALL(peer_client(), OnMessage(_, _)).Times(0); - std::vector<ServiceInfo> receivers2; + std::vector<ReceiverInfo> receivers2; auto subscription2 = StartObservingAvailability(source_a_2_, &receivers2); CastMessage availability_response = @@ -110,8 +110,8 @@ TEST_F(CastAppDiscoveryServiceImplTest, StartObservingAvailability) { EXPECT_TRUE(peer_socket().Send(availability_response).ok()); ASSERT_EQ(receivers1.size(), 1u); ASSERT_EQ(receivers2.size(), 1u); - EXPECT_EQ(receivers1[0].unique_id, "deviceId1"); - EXPECT_EQ(receivers2[0].unique_id, "deviceId1"); + EXPECT_EQ(receivers1[0].unique_id, "receiverId1"); + EXPECT_EQ(receivers2[0].unique_id, "receiverId1"); // No more updates for |source_a_1_| (i.e. |receivers1|). subscription1.Reset(); @@ -119,11 +119,11 @@ TEST_F(CastAppDiscoveryServiceImplTest, StartObservingAvailability) { app_discovery_service_.RemoveReceiver(receiver_); ASSERT_EQ(receivers1.size(), 1u); EXPECT_EQ(receivers2.size(), 0u); - EXPECT_EQ(receivers1[0].unique_id, "deviceId1"); + EXPECT_EQ(receivers1[0].unique_id, "receiverId1"); } TEST_F(CastAppDiscoveryServiceImplTest, ReAddAvailQueryUsesCachedValue) { - std::vector<ServiceInfo> receivers1; + std::vector<ReceiverInfo> receivers1; int request_id; std::string sender_id; auto subscription1 = StartSourceA1Query(&receivers1, &request_id, &sender_id); @@ -132,7 +132,7 @@ TEST_F(CastAppDiscoveryServiceImplTest, ReAddAvailQueryUsesCachedValue) { CreateAppAvailableResponseChecked(request_id, sender_id, "AAA"); EXPECT_TRUE(peer_socket().Send(availability_response).ok()); ASSERT_EQ(receivers1.size(), 1u); - EXPECT_EQ(receivers1[0].unique_id, "deviceId1"); + EXPECT_EQ(receivers1[0].unique_id, "receiverId1"); subscription1.Reset(); receivers1.clear(); @@ -141,11 +141,11 @@ TEST_F(CastAppDiscoveryServiceImplTest, ReAddAvailQueryUsesCachedValue) { EXPECT_CALL(peer_client(), OnMessage(_, _)).Times(0); subscription1 = StartObservingAvailability(source_a_1_, &receivers1); ASSERT_EQ(receivers1.size(), 1u); - EXPECT_EQ(receivers1[0].unique_id, "deviceId1"); + EXPECT_EQ(receivers1[0].unique_id, "receiverId1"); } TEST_F(CastAppDiscoveryServiceImplTest, AvailQueryUpdatedOnReceiverUpdate) { - std::vector<ServiceInfo> receivers1; + std::vector<ReceiverInfo> receivers1; int request_id; std::string sender_id; auto subscription1 = StartSourceA1Query(&receivers1, &request_id, &sender_id); @@ -155,7 +155,7 @@ TEST_F(CastAppDiscoveryServiceImplTest, AvailQueryUpdatedOnReceiverUpdate) { CreateAppAvailableResponseChecked(request_id, sender_id, "AAA"); EXPECT_TRUE(peer_socket().Send(availability_response).ok()); ASSERT_EQ(receivers1.size(), 1u); - EXPECT_EQ(receivers1[0].unique_id, "deviceId1"); + EXPECT_EQ(receivers1[0].unique_id, "receiverId1"); // Updating |receiver_| causes |source_a_1_| query to be updated, but it's too // soon for a new message to be sent. @@ -169,9 +169,9 @@ TEST_F(CastAppDiscoveryServiceImplTest, AvailQueryUpdatedOnReceiverUpdate) { } TEST_F(CastAppDiscoveryServiceImplTest, Refresh) { - std::vector<ServiceInfo> receivers1; + std::vector<ReceiverInfo> receivers1; auto subscription1 = StartObservingAvailability(source_a_1_, &receivers1); - std::vector<ServiceInfo> receivers2; + std::vector<ReceiverInfo> receivers2; auto subscription2 = StartObservingAvailability(source_b_1_, &receivers2); // Adding a receiver after app registered causes two separate app availability @@ -207,7 +207,7 @@ TEST_F(CastAppDiscoveryServiceImplTest, Refresh) { EXPECT_TRUE(peer_socket().Send(availability_response).ok()); ASSERT_EQ(receivers1.size(), 1u); ASSERT_EQ(receivers2.size(), 0u); - EXPECT_EQ(receivers1[0].unique_id, "deviceId1"); + EXPECT_EQ(receivers1[0].unique_id, "receiverId1"); // Not enough time has passed for a refresh. clock_.Advance(std::chrono::seconds(30)); @@ -236,7 +236,7 @@ TEST_F(CastAppDiscoveryServiceImplTest, .WillOnce([&request_idA, &sender_id](CastSocket*, CastMessage message) { VerifyAppAvailabilityRequest(message, "AAA", &request_idA, &sender_id); }); - std::vector<ServiceInfo> receivers1; + std::vector<ReceiverInfo> receivers1; auto subscription1 = StartObservingAvailability(source_a_1_, &receivers1); int request_idB = -1; @@ -244,7 +244,7 @@ TEST_F(CastAppDiscoveryServiceImplTest, .WillOnce([&request_idB, &sender_id](CastSocket*, CastMessage message) { VerifyAppAvailabilityRequest(message, "BBB", &request_idB, &sender_id); }); - std::vector<ServiceInfo> receivers2; + std::vector<ReceiverInfo> receivers2; auto subscription2 = StartObservingAvailability(source_b_1_, &receivers2); // Add a new receiver with a corresponding socket. @@ -252,8 +252,8 @@ TEST_F(CastAppDiscoveryServiceImplTest, {{192, 168, 1, 19}, 2345}); CastSocket* socket2 = fake_sockets2.socket.get(); router_.TakeSocket(&mock_error_handler_, std::move(fake_sockets2.socket)); - ServiceInfo receiver2; - receiver2.unique_id = "deviceId2"; + ReceiverInfo receiver2; + receiver2.unique_id = "receiverId2"; receiver2.v4_address = fake_sockets2.remote_endpoint.address; receiver2.port = fake_sockets2.remote_endpoint.port; @@ -283,7 +283,7 @@ TEST_F(CastAppDiscoveryServiceImplTest, } TEST_F(CastAppDiscoveryServiceImplTest, StartObservingAvailabilityCachedValue) { - std::vector<ServiceInfo> receivers1; + std::vector<ReceiverInfo> receivers1; int request_id; std::string sender_id; auto subscription1 = StartSourceA1Query(&receivers1, &request_id, &sender_id); @@ -292,19 +292,19 @@ TEST_F(CastAppDiscoveryServiceImplTest, StartObservingAvailabilityCachedValue) { CreateAppAvailableResponseChecked(request_id, sender_id, "AAA"); EXPECT_TRUE(peer_socket().Send(availability_response).ok()); ASSERT_EQ(receivers1.size(), 1u); - EXPECT_EQ(receivers1[0].unique_id, "deviceId1"); + EXPECT_EQ(receivers1[0].unique_id, "receiverId1"); // Same app ID should not trigger another request, but it should return // cached value. EXPECT_CALL(peer_client(), OnMessage(_, _)).Times(0); - std::vector<ServiceInfo> receivers2; + std::vector<ReceiverInfo> receivers2; auto subscription2 = StartObservingAvailability(source_a_2_, &receivers2); ASSERT_EQ(receivers2.size(), 1u); - EXPECT_EQ(receivers2[0].unique_id, "deviceId1"); + EXPECT_EQ(receivers2[0].unique_id, "receiverId1"); } TEST_F(CastAppDiscoveryServiceImplTest, AvailabilityUnknownOrUnavailable) { - std::vector<ServiceInfo> receivers1; + std::vector<ReceiverInfo> receivers1; int request_id; std::string sender_id; auto subscription1 = StartSourceA1Query(&receivers1, &request_id, &sender_id); diff --git a/cast/sender/cast_platform_client.cc b/cast/sender/cast_platform_client.cc index c321201a..b0b956a8 100644 --- a/cast/sender/cast_platform_client.cc +++ b/cast/sender/cast_platform_client.cc @@ -11,7 +11,7 @@ #include "absl/strings/str_cat.h" #include "cast/common/channel/virtual_connection_router.h" #include "cast/common/public/cast_socket.h" -#include "cast/common/public/service_info.h" +#include "cast/common/public/receiver_info.h" #include "util/json/json_serialization.h" #include "util/osp_logging.h" #include "util/stringprintf.h" @@ -38,7 +38,7 @@ CastPlatformClient::~CastPlatformClient() { virtual_conn_router_->RemoveConnectionsByLocalId(sender_id_); virtual_conn_router_->RemoveHandlerForLocalId(sender_id_); - for (auto& pending_requests : pending_requests_by_device_id_) { + for (auto& pending_requests : pending_requests_by_receiver_id_) { for (auto& avail_request : pending_requests.second.availability) { avail_request.callback(avail_request.app_id, AppAvailabilityResult::kUnknown); @@ -47,11 +47,11 @@ CastPlatformClient::~CastPlatformClient() { } absl::optional<int> CastPlatformClient::RequestAppAvailability( - const std::string& device_id, + const std::string& receiver_id, const std::string& app_id, AppAvailabilityCallback callback) { - auto entry = socket_id_by_device_id_.find(device_id); - if (entry == socket_id_by_device_id_.end()) { + auto entry = socket_id_by_receiver_id_.find(receiver_id); + if (entry == socket_id_by_receiver_id_.end()) { callback(app_id, AppAvailabilityResult::kUnknown); return absl::nullopt; } @@ -62,7 +62,8 @@ absl::optional<int> CastPlatformClient::RequestAppAvailability( CreateAppAvailabilityRequest(sender_id_, request_id, app_id); OSP_DCHECK(message); - PendingRequests& pending_requests = pending_requests_by_device_id_[device_id]; + PendingRequests& pending_requests = + pending_requests_by_receiver_id_[receiver_id]; auto timeout = std::make_unique<Alarm>(clock_, task_runner_); timeout->ScheduleFromNow( [this, request_id]() { CancelAppAvailabilityRequest(request_id); }, @@ -82,28 +83,28 @@ absl::optional<int> CastPlatformClient::RequestAppAvailability( return request_id; } -void CastPlatformClient::AddOrUpdateReceiver(const ServiceInfo& device, +void CastPlatformClient::AddOrUpdateReceiver(const ReceiverInfo& receiver, int socket_id) { - socket_id_by_device_id_[device.unique_id] = socket_id; + socket_id_by_receiver_id_[receiver.unique_id] = socket_id; } -void CastPlatformClient::RemoveReceiver(const ServiceInfo& device) { +void CastPlatformClient::RemoveReceiver(const ReceiverInfo& receiver) { auto pending_requests_it = - pending_requests_by_device_id_.find(device.unique_id); - if (pending_requests_it != pending_requests_by_device_id_.end()) { + pending_requests_by_receiver_id_.find(receiver.unique_id); + if (pending_requests_it != pending_requests_by_receiver_id_.end()) { for (const AvailabilityRequest& availability : pending_requests_it->second.availability) { availability.callback(availability.app_id, AppAvailabilityResult::kUnknown); } - pending_requests_by_device_id_.erase(pending_requests_it); + pending_requests_by_receiver_id_.erase(pending_requests_it); } - socket_id_by_device_id_.erase(device.unique_id); + socket_id_by_receiver_id_.erase(receiver.unique_id); } void CastPlatformClient::CancelRequest(int request_id) { - for (auto entry = pending_requests_by_device_id_.begin(); - entry != pending_requests_by_device_id_.end(); ++entry) { + for (auto entry = pending_requests_by_receiver_id_.begin(); + entry != pending_requests_by_receiver_id_.end(); ++entry) { auto& pending_requests = entry->second; auto it = std::find_if(pending_requests.availability.begin(), pending_requests.availability.end(), @@ -128,7 +129,6 @@ void CastPlatformClient::OnMessage(VirtualConnectionRouter* router, } ErrorOr<Json::Value> dict_or_error = json::Parse(message.payload_utf8()); if (dict_or_error.is_error()) { - OSP_DVLOG << "Failed to deserialize CastMessage payload."; return; } @@ -137,22 +137,22 @@ void CastPlatformClient::OnMessage(VirtualConnectionRouter* router, MaybeGetInt(dict, JSON_EXPAND_FIND_CONSTANT_ARGS(kMessageKeyRequestId)); if (request_id) { auto entry = std::find_if( - socket_id_by_device_id_.begin(), socket_id_by_device_id_.end(), + socket_id_by_receiver_id_.begin(), socket_id_by_receiver_id_.end(), [socket_id = ToCastSocketId(socket)](const std::pair<std::string, int>& entry) { return entry.second == socket_id; }); - if (entry != socket_id_by_device_id_.end()) { + if (entry != socket_id_by_receiver_id_.end()) { HandleResponse(entry->first, request_id.value(), dict); } } } -void CastPlatformClient::HandleResponse(const std::string& device_id, +void CastPlatformClient::HandleResponse(const std::string& receiver_id, int request_id, const Json::Value& message) { - auto entry = pending_requests_by_device_id_.find(device_id); - if (entry == pending_requests_by_device_id_.end()) { + auto entry = pending_requests_by_receiver_id_.find(receiver_id); + if (entry == pending_requests_by_receiver_id_.end()) { return; } PendingRequests& pending_requests = entry->second; @@ -178,7 +178,7 @@ void CastPlatformClient::HandleResponse(const std::string& device_id, } else if (result.value() == kMessageValueAppUnavailable) { availability_result = AppAvailabilityResult::kUnavailable; } else { - OSP_DVLOG << "Invalid availability result: " << result.value(); + OSP_VLOG << "Invalid availability result: " << result.value(); } it->callback(it->app_id, availability_result); } @@ -188,7 +188,7 @@ void CastPlatformClient::HandleResponse(const std::string& device_id, } void CastPlatformClient::CancelAppAvailabilityRequest(int request_id) { - for (auto& entry : pending_requests_by_device_id_) { + for (auto& entry : pending_requests_by_receiver_id_) { PendingRequests& pending_requests = entry.second; auto it = std::find_if(pending_requests.availability.begin(), pending_requests.availability.end(), diff --git a/cast/sender/cast_platform_client.h b/cast/sender/cast_platform_client.h index 8ea9a99a..c80a8b95 100644 --- a/cast/sender/cast_platform_client.h +++ b/cast/sender/cast_platform_client.h @@ -20,7 +20,7 @@ namespace openscreen { namespace cast { -struct ServiceInfo; +struct ReceiverInfo; class VirtualConnectionRouter; // This class handles Cast messages that generally relate to the "platform", in @@ -41,15 +41,15 @@ class CastPlatformClient final : public CastMessageHandler { ~CastPlatformClient() override; // Requests availability information for |app_id| from the receiver identified - // by |device_id|. |callback| will be called exactly once with a result. - absl::optional<int> RequestAppAvailability(const std::string& device_id, + // by |receiver_id|. |callback| will be called exactly once with a result. + absl::optional<int> RequestAppAvailability(const std::string& receiver_id, const std::string& app_id, AppAvailabilityCallback callback); // Notifies this object about general receiver connectivity or property // changes. - void AddOrUpdateReceiver(const ServiceInfo& device, int socket_id); - void RemoveReceiver(const ServiceInfo& device); + void AddOrUpdateReceiver(const ReceiverInfo& receiver, int socket_id); + void RemoveReceiver(const ReceiverInfo& receiver); void CancelRequest(int request_id); @@ -70,7 +70,7 @@ class CastPlatformClient final : public CastMessageHandler { CastSocket* socket, ::cast::channel::CastMessage message) override; - void HandleResponse(const std::string& device_id, + void HandleResponse(const std::string& receiver_id, int request_id, const Json::Value& message); @@ -82,9 +82,9 @@ class CastPlatformClient final : public CastMessageHandler { const std::string sender_id_; VirtualConnectionRouter* const virtual_conn_router_; - std::map<std::string /* device_id */, int> socket_id_by_device_id_; - std::map<std::string /* device_id */, PendingRequests> - pending_requests_by_device_id_; + std::map<std::string /* receiver_id */, int> socket_id_by_receiver_id_; + std::map<std::string /* receiver_id */, PendingRequests> + pending_requests_by_receiver_id_; const ClockNowFunctionPtr clock_; TaskRunner* const task_runner_; diff --git a/cast/sender/cast_platform_client_unittest.cc b/cast/sender/cast_platform_client_unittest.cc index ae721a15..702e35eb 100644 --- a/cast/sender/cast_platform_client_unittest.cc +++ b/cast/sender/cast_platform_client_unittest.cc @@ -9,7 +9,7 @@ #include "cast/common/channel/testing/fake_cast_socket.h" #include "cast/common/channel/testing/mock_socket_error_handler.h" #include "cast/common/channel/virtual_connection_router.h" -#include "cast/common/public/service_info.h" +#include "cast/common/public/receiver_info.h" #include "cast/sender/testing/test_helpers.h" #include "gmock/gmock.h" #include "gtest/gtest.h" @@ -34,7 +34,7 @@ class CastPlatformClientTest : public ::testing::Test { receiver_.v4_address = IPAddress{192, 168, 0, 17}; receiver_.port = 4434; - receiver_.unique_id = "deviceId1"; + receiver_.unique_id = "receiverId1"; platform_client_.AddOrUpdateReceiver(receiver_, socket_->socket_id()); } @@ -51,7 +51,7 @@ class CastPlatformClientTest : public ::testing::Test { FakeClock clock_{Clock::now()}; FakeTaskRunner task_runner_{&clock_}; CastPlatformClient platform_client_{&router_, &FakeClock::now, &task_runner_}; - ServiceInfo receiver_; + ReceiverInfo receiver_; }; TEST_F(CastPlatformClientTest, AppAvailability) { @@ -64,7 +64,7 @@ TEST_F(CastPlatformClientTest, AppAvailability) { }); bool ran = false; platform_client_.RequestAppAvailability( - "deviceId1", "AAA", + "receiverId1", "AAA", [&ran](const std::string& app_id, AppAvailabilityResult availability) { EXPECT_EQ("AAA", app_id); EXPECT_EQ(availability, AppAvailabilityResult::kAvailable); @@ -92,7 +92,7 @@ TEST_F(CastPlatformClientTest, CancelRequest) { }); absl::optional<int> maybe_request_id = platform_client_.RequestAppAvailability( - "deviceId1", "AAA", + "receiverId1", "AAA", [](const std::string& app_id, AppAvailabilityResult availability) { EXPECT_TRUE(false); }); diff --git a/cast/sender/channel/cast_auth_util.cc b/cast/sender/channel/cast_auth_util.cc index cb1ced69..f0e1c36f 100644 --- a/cast/sender/channel/cast_auth_util.cc +++ b/cast/sender/channel/cast_auth_util.cc @@ -9,6 +9,7 @@ #include <algorithm> #include <memory> +#include "absl/strings/str_cat.h" #include "cast/common/certificate/cast_cert_validator.h" #include "cast/common/certificate/cast_cert_validator_internal.h" #include "cast/common/certificate/cast_crl.h" @@ -104,43 +105,56 @@ class CastNonce { std::chrono::seconds nonce_generation_time_; }; -// Maps Error::Code from certificate verification to Error. -// If crl_required is set to false, all revocation related errors are ignored. -Error MapToOpenscreenError(Error::Code error, bool crl_required) { - switch (error) { +// Maps an error from certificate verification to an error reported to the +// library client. If crl_required is set to false, all revocation related +// errors are ignored. +// +// TODO(https://issuetracker.google.com/issues/193164666): It would be simpler +// to just pass the underlying verification error directly to the client. +Error MapToOpenscreenError(Error verify_error, bool crl_required) { + switch (verify_error.code()) { case Error::Code::kErrCertsMissing: return Error(Error::Code::kCastV2PeerCertEmpty, - "Failed to locate certificates."); + absl::StrCat("Failed to locate certificates: ", + verify_error.message())); case Error::Code::kErrCertsParse: return Error(Error::Code::kErrCertsParse, - "Failed to parse certificates."); + absl::StrCat("Failed to parse certificates: ", + verify_error.message())); case Error::Code::kErrCertsDateInvalid: - return Error(Error::Code::kCastV2CertNotSignedByTrustedCa, - "Failed date validity check."); + return Error( + Error::Code::kCastV2CertNotSignedByTrustedCa, + absl::StrCat("Failed date validity check: ", verify_error.message())); case Error::Code::kErrCertsVerifyGeneric: - return Error(Error::Code::kCastV2CertNotSignedByTrustedCa, - "Failed with a generic certificate verification error."); + return Error( + Error::Code::kCastV2CertNotSignedByTrustedCa, + absl::StrCat("Failed with a generic certificate verification error: ", + verify_error.message())); case Error::Code::kErrCertsRestrictions: return Error(Error::Code::kCastV2CertNotSignedByTrustedCa, - "Failed certificate restrictions."); + absl::StrCat("Failed certificate restrictions: ", + verify_error.message())); case Error::Code::kErrCertsVerifyUntrustedCert: return Error(Error::Code::kCastV2CertNotSignedByTrustedCa, - "Failed with untrusted certificate."); + absl::StrCat("Failed with untrusted certificate: ", + verify_error.message())); case Error::Code::kErrCrlInvalid: // This error is only encountered if |crl_required| is true. OSP_DCHECK(crl_required); return Error(Error::Code::kErrCrlInvalid, - "Failed to provide a valid CRL."); + absl::StrCat("Failed to provide a valid CRL: ", + verify_error.message())); case Error::Code::kErrCertsRevoked: return Error(Error::Code::kErrCertsRevoked, - "Failed certificate revocation check."); + absl::StrCat("Failed certificate revocation check: ", + verify_error.message())); case Error::Code::kNone: return Error::None(); default: return Error(Error::Code::kCastV2CertNotSignedByTrustedCa, - "Failed verifying cast device certificate."); + absl::StrCat("Failed verifying cast device certificate: ", + verify_error.message())); } - return Error::None(); } Error VerifyAndMapDigestAlgorithm(HashAlgorithm response_digest_algorithm, @@ -170,6 +184,21 @@ AuthContext AuthContext::Create() { return AuthContext(CastNonce::Get()); } +// static +AuthContext AuthContext::CreateForTest(const std::string& nonce_data) { + std::string nonce; + if (nonce_data.empty()) { + nonce = std::string(kNonceSizeInBytes, '0'); + } else { + while (nonce.size() < kNonceSizeInBytes) { + nonce += nonce_data; + } + nonce.erase(kNonceSizeInBytes); + } + OSP_DCHECK_EQ(nonce.size(), kNonceSizeInBytes); + return AuthContext(nonce); +} + AuthContext::AuthContext(const std::string& nonce) : nonce_(nonce) {} AuthContext::~AuthContext() {} @@ -356,7 +385,7 @@ ErrorOr<CastDeviceCertPolicy> VerifyCredentialsImpl( &device_policy, crl.get(), crl_policy, cast_trust_store); // Handle and report errors. - Error result = MapToOpenscreenError(verify_result.code(), + Error result = MapToOpenscreenError(verify_result, crl_policy == CRLPolicy::kCrlRequired); if (!result.ok()) { return result; diff --git a/cast/sender/channel/cast_auth_util.h b/cast/sender/channel/cast_auth_util.h index d23ebd7e..9c0646ec 100644 --- a/cast/sender/channel/cast_auth_util.h +++ b/cast/sender/channel/cast_auth_util.h @@ -36,6 +36,9 @@ class AuthContext { // The same context must be used in the challenge and reply. static AuthContext Create(); + // Create a context with some seed nonce data for testing. + static AuthContext CreateForTest(const std::string& nonce_data); + // Verifies the nonce received in the response is equivalent to the one sent. // Returns success if |nonce_response| matches nonce_ Error VerifySenderNonce(const std::string& nonce_response, diff --git a/cast/sender/channel/sender_socket_factory.cc b/cast/sender/channel/sender_socket_factory.cc index e971976b..c0924836 100644 --- a/cast/sender/channel/sender_socket_factory.cc +++ b/cast/sender/channel/sender_socket_factory.cc @@ -16,6 +16,8 @@ using ::cast::channel::CastMessage; namespace openscreen { namespace cast { +SenderSocketFactory::Client::~Client() = default; + bool operator<(const std::unique_ptr<SenderSocketFactory::PendingAuth>& a, int b) { return a && a->socket->socket_id() < b; @@ -106,8 +108,6 @@ void SenderSocketFactory::OnConnectionFailed(TlsConnectionFactory* factory, const IPEndpoint& remote_address) { auto it = FindPendingConnection(remote_address); if (it == pending_connections_.end()) { - OSP_DVLOG << "OnConnectionFailed reported for untracked address: " - << remote_address; return; } pending_connections_.erase(it); diff --git a/cast/sender/public/README.md b/cast/sender/public/README.md index b670d110..eb7527f5 100644 --- a/cast/sender/public/README.md +++ b/cast/sender/public/README.md @@ -1,5 +1,5 @@ # cast/sender/public This module contains an implementation of the Cast "sender", i.e. the client -that discovers Cast devices on the LAN and launches apps on them. +that discovers Cast receivers on the LAN and launches apps on them. diff --git a/cast/sender/public/cast_app_discovery_service.h b/cast/sender/public/cast_app_discovery_service.h index c05d66bd..2e095b6d 100644 --- a/cast/sender/public/cast_app_discovery_service.h +++ b/cast/sender/public/cast_app_discovery_service.h @@ -7,19 +7,19 @@ #include <vector> -#include "cast/common/public/service_info.h" +#include "cast/common/public/receiver_info.h" namespace openscreen { namespace cast { class CastMediaSource; -// Interface for app discovery for Cast devices. +// Interface for app discovery for Cast receivers. class CastAppDiscoveryService { public: using AvailabilityCallback = std::function<void(const CastMediaSource& source, - const std::vector<ServiceInfo>& devices)>; + const std::vector<ReceiverInfo>& receivers)>; class Subscription { public: @@ -47,7 +47,7 @@ class CastAppDiscoveryService { // returned via |callback| until the returned Subscription is destroyed by the // caller. If there are cached results available, |callback| will be invoked // before this method returns. |callback| may be invoked with an empty list - // if all devices respond to the respective queries with "unavailable" or + // if all receivers respond to the respective queries with "unavailable" or // don't respond before a timeout. |callback| may be invoked successively // with the same list. virtual Subscription StartObservingAvailability( diff --git a/cast/sender/public/sender_socket_factory.h b/cast/sender/public/sender_socket_factory.h index f0247a28..0b9b05aa 100644 --- a/cast/sender/public/sender_socket_factory.h +++ b/cast/sender/public/sender_socket_factory.h @@ -7,6 +7,7 @@ #include <openssl/x509.h> +#include <memory> #include <set> #include <utility> #include <vector> @@ -33,6 +34,9 @@ class SenderSocketFactory final : public TlsConnectionFactory::Client, virtual void OnError(SenderSocketFactory* factory, const IPEndpoint& endpoint, Error error) = 0; + + protected: + virtual ~Client(); }; enum class DeviceMediaPolicy { |