xref: /aosp_15_r20/external/openscreen/cast/standalone_sender/receiver_chooser.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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