1*3f982cf4SFabien Sanglard // Copyright 2020 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef CAST_STANDALONE_SENDER_RECEIVER_CHOOSER_H_ 6*3f982cf4SFabien Sanglard #define CAST_STANDALONE_SENDER_RECEIVER_CHOOSER_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <functional> 9*3f982cf4SFabien Sanglard #include <memory> 10*3f982cf4SFabien Sanglard #include <vector> 11*3f982cf4SFabien Sanglard 12*3f982cf4SFabien Sanglard #include "cast/common/public/receiver_info.h" 13*3f982cf4SFabien Sanglard #include "discovery/common/reporting_client.h" 14*3f982cf4SFabien Sanglard #include "discovery/public/dns_sd_service_factory.h" 15*3f982cf4SFabien Sanglard #include "discovery/public/dns_sd_service_watcher.h" 16*3f982cf4SFabien Sanglard #include "platform/api/network_interface.h" 17*3f982cf4SFabien Sanglard #include "platform/api/serial_delete_ptr.h" 18*3f982cf4SFabien Sanglard #include "platform/api/task_runner.h" 19*3f982cf4SFabien Sanglard #include "platform/base/ip_address.h" 20*3f982cf4SFabien Sanglard #include "util/alarm.h" 21*3f982cf4SFabien Sanglard #include "util/chrono_helpers.h" 22*3f982cf4SFabien Sanglard 23*3f982cf4SFabien Sanglard namespace openscreen { 24*3f982cf4SFabien Sanglard namespace cast { 25*3f982cf4SFabien Sanglard 26*3f982cf4SFabien Sanglard // Discovers Cast Receivers on the LAN for a given network interface, and 27*3f982cf4SFabien Sanglard // provides a console menu interface for the user to choose one. 28*3f982cf4SFabien Sanglard class ReceiverChooser final : public discovery::ReportingClient { 29*3f982cf4SFabien Sanglard public: 30*3f982cf4SFabien Sanglard using ResultCallback = std::function<void(IPEndpoint)>; 31*3f982cf4SFabien Sanglard 32*3f982cf4SFabien Sanglard ReceiverChooser(const InterfaceInfo& interface, 33*3f982cf4SFabien Sanglard TaskRunner* task_runner, 34*3f982cf4SFabien Sanglard ResultCallback result_callback); 35*3f982cf4SFabien Sanglard 36*3f982cf4SFabien Sanglard ~ReceiverChooser() final; 37*3f982cf4SFabien Sanglard 38*3f982cf4SFabien Sanglard private: 39*3f982cf4SFabien Sanglard // discovery::ReportingClient implementation. 40*3f982cf4SFabien Sanglard void OnFatalError(Error error) final; 41*3f982cf4SFabien Sanglard void OnRecoverableError(Error error) final; 42*3f982cf4SFabien Sanglard 43*3f982cf4SFabien Sanglard // Called from the DnsWatcher with |all| ReceiverInfos any time there is a 44*3f982cf4SFabien Sanglard // change in the set of discovered devices. 45*3f982cf4SFabien Sanglard void OnDnsWatcherUpdate( 46*3f982cf4SFabien Sanglard std::vector<std::reference_wrapper<const ReceiverInfo>> all); 47*3f982cf4SFabien Sanglard 48*3f982cf4SFabien Sanglard // Called from |menu_alarm_| when it is a good time for the user to choose 49*3f982cf4SFabien Sanglard // from the discovered-so-far set of Cast Receivers. 50*3f982cf4SFabien Sanglard void PrintMenuAndHandleChoice(); 51*3f982cf4SFabien Sanglard 52*3f982cf4SFabien Sanglard ResultCallback result_callback_; 53*3f982cf4SFabien Sanglard SerialDeletePtr<discovery::DnsSdService> service_; 54*3f982cf4SFabien Sanglard std::unique_ptr<discovery::DnsSdServiceWatcher<ReceiverInfo>> watcher_; 55*3f982cf4SFabien Sanglard std::vector<ReceiverInfo> discovered_receivers_; 56*3f982cf4SFabien Sanglard Alarm menu_alarm_; 57*3f982cf4SFabien Sanglard 58*3f982cf4SFabien Sanglard // After there is another Cast Receiver discovered, ready to show to the user 59*3f982cf4SFabien Sanglard // via the console menu, how long should the ReceiverChooser wait for 60*3f982cf4SFabien Sanglard // additional receivers to be discovered and be included in the menu too? 61*3f982cf4SFabien Sanglard static constexpr auto kWaitForStragglersDelay = seconds(5); 62*3f982cf4SFabien Sanglard }; 63*3f982cf4SFabien Sanglard 64*3f982cf4SFabien Sanglard } // namespace cast 65*3f982cf4SFabien Sanglard } // namespace openscreen 66*3f982cf4SFabien Sanglard 67*3f982cf4SFabien Sanglard #endif // CAST_STANDALONE_SENDER_RECEIVER_CHOOSER_H_ 68