| Index: chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h
|
| diff --git a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h
|
| index 2030c055fb8ae148ab6724d52968c79c34f86a9f..5b12f532e33ef68f0c5ca0fd493c7ebbf6d12a4d 100644
|
| --- a/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h
|
| +++ b/chrome/browser/media/router/discovery/mdns/cast_media_sink_service.h
|
| @@ -11,6 +11,7 @@
|
| #include "base/gtest_prod_util.h"
|
| #include "base/memory/ref_counted.h"
|
| #include "base/threading/thread_checker.h"
|
| +#include "chrome/browser/media/router/discovery/dial/dial_media_sink_service_impl.h"
|
| #include "chrome/browser/media/router/discovery/mdns/dns_sd_delegate.h"
|
| #include "chrome/browser/media/router/discovery/mdns/dns_sd_registry.h"
|
| #include "chrome/browser/media/router/discovery/media_sink_service_base.h"
|
| @@ -31,10 +32,9 @@ namespace media_router {
|
| // A service which can be used to start background discovery and resolution of
|
| // Cast devices.
|
| // Public APIs should be invoked on the UI thread.
|
| -class CastMediaSinkService
|
| - : public MediaSinkServiceBase,
|
| - public DnsSdRegistry::DnsSdObserver,
|
| - public base::RefCountedThreadSafe<CastMediaSinkService> {
|
| +class CastMediaSinkService : public MediaSinkServiceBase,
|
| + public DialMediaSinkServiceDelegate,
|
| + public DnsSdRegistry::DnsSdObserver {
|
| public:
|
| CastMediaSinkService(const OnSinksDiscoveredCallback& callback,
|
| content::BrowserContext* browser_context);
|
| @@ -46,10 +46,17 @@ class CastMediaSinkService
|
| // mDNS service types.
|
| static const char kCastServiceType[];
|
|
|
| + // Default Cast control port to open Cast Socket from DIAL sink.
|
| + static const int kCastControlPort;
|
| +
|
| // MediaSinkService implementation
|
| void Start() override;
|
| void Stop() override;
|
|
|
| + // DialMediaSinkServiceDelegate implementation.
|
| + void OnDialSinkAdded(const MediaSinkInternal& sink) override;
|
| + void OnDialSinksRemoved() override;
|
| +
|
| protected:
|
| // Used to mock out the DnsSdRegistry for testing.
|
| void SetDnsSdRegistryForTest(DnsSdRegistry* registry);
|
| @@ -85,45 +92,59 @@ class CastMediaSinkService
|
| FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestOnDnsSdEvent);
|
| FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestMultipleOnDnsSdEvent);
|
| FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestTimer);
|
| + FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestOnDialSinkAdded);
|
| + FRIEND_TEST_ALL_PREFIXES(CastMediaSinkServiceTest, TestOnFetchCompleted);
|
| +
|
| + // MediaSinkServiceBase implementation
|
| + void OnFetchCompleted() override;
|
| +
|
| + // Returns cast sinks from |current_sinks_by_mdns_map_| and
|
| + // |current_sinks_by_dial_map_|.
|
| + std::set<MediaSinkInternal> GetCastSinksOnIOThread();
|
| +
|
| + // Stores |cast_sinks| in |current_sinks_| and invokes
|
| + // MediaSinkServiceBase::OnFetchCompleted on the UI thread.
|
| + void OnFetchCompletedOnUIThread(std::set<MediaSinkInternal> cast_sinks);
|
|
|
| // DnsSdRegistry::DnsSdObserver implementation
|
| void OnDnsSdEvent(const std::string& service_type,
|
| const DnsSdRegistry::DnsSdServiceList& services) override;
|
|
|
| + // Opens cast channels on the IO thread.
|
| + void OpenChannelsOnIOThread(std::vector<MediaSinkInternal> cast_sinks);
|
| +
|
| // Opens cast channel on IO thread.
|
| - // |service|: mDNS service description.
|
| // |ip_endpoint|: cast channel's target IP endpoint.
|
| - void OpenChannelOnIOThread(const DnsSdService& service,
|
| - const net::IPEndPoint& ip_endpoint);
|
| + // |cast_sink|: Cast sink created from mDNS service description or DIAL sink.
|
| + void OpenChannelOnIOThread(const net::IPEndPoint& ip_endpoint,
|
| + MediaSinkInternal cast_sink);
|
|
|
| // Invoked when opening cast channel on IO thread completes.
|
| - // |service|: mDNS service description.
|
| + // |cast_sink|: Cast sink created from mDNS service description or DIAL sink.
|
| // |channel_id|: channel id of newly created cast channel.
|
| // |channel_error|: error encounted when opending cast channel.
|
| - void OnChannelOpenedOnIOThread(const DnsSdService& service,
|
| + void OnChannelOpenedOnIOThread(MediaSinkInternal cast_sink,
|
| int channel_id,
|
| cast_channel::ChannelError channel_error);
|
|
|
| - // Invoked by |OnChannelOpenedOnIOThread| to post task on UI thread.
|
| - // |service|: mDNS service description.
|
| - // |channel_id|: channel id of newly created cast channel.
|
| - // |audio_only|: if cast channel is audio only or not.
|
| - void OnChannelOpenedOnUIThread(const DnsSdService& service,
|
| - int channel_id,
|
| - bool audio_only);
|
| -
|
| // Raw pointer to DnsSdRegistry instance, which is a global leaky singleton
|
| // and lives as long as the browser process.
|
| DnsSdRegistry* dns_sd_registry_ = nullptr;
|
|
|
| - // Service list from current round of discovery.
|
| - DnsSdRegistry::DnsSdServiceList current_services_;
|
| + // Set of mDNS service ip addresses from current round of discovery.
|
| + std::set<net::IPEndPoint> current_service_ip_endpoints_;
|
| +
|
| + using MediaSinkInternalMap = std::map<net::IPEndPoint, MediaSinkInternal>;
|
| +
|
| + // Map of sinks from current round of mDNS discovery keyed by IP address.
|
| + MediaSinkInternalMap current_sinks_by_mdns_;
|
| +
|
| + // Map of sinks from current round of DIAL discovery keyed by IP address.
|
| + MediaSinkInternalMap current_sinks_by_dial_;
|
|
|
| // Service managing creating and removing cast channels.
|
| scoped_refptr<cast_channel::CastSocketService> cast_socket_service_;
|
|
|
| - THREAD_CHECKER(thread_checker_);
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(CastMediaSinkService);
|
| };
|
|
|
|
|