1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CAST_SENDER_PUBLIC_CAST_APP_DISCOVERY_SERVICE_H_
6 #define CAST_SENDER_PUBLIC_CAST_APP_DISCOVERY_SERVICE_H_
7 
8 #include <vector>
9 
10 #include "cast/common/public/service_info.h"
11 
12 namespace openscreen {
13 namespace cast {
14 
15 class CastMediaSource;
16 
17 // Interface for app discovery for Cast devices.
18 class CastAppDiscoveryService {
19  public:
20   using AvailabilityCallback =
21       std::function<void(const CastMediaSource& source,
22                          const std::vector<ServiceInfo>& devices)>;
23 
24   class Subscription {
25    public:
26     Subscription(CastAppDiscoveryService* discovery_service, uint32_t id);
27     Subscription(Subscription&&) noexcept;
28     Subscription(Subscription&) = delete;
29     Subscription& operator=(Subscription&&);
30     Subscription& operator=(const Subscription&) = delete;
31     ~Subscription();
32 
33     void Reset();
34 
35    private:
36     friend class CastAppDiscoveryService;
37 
38     void Swap(Subscription& other);
39 
40     CastAppDiscoveryService* discovery_service_;
41     uint32_t id_;
42   };
43 
44   virtual ~CastAppDiscoveryService() = default;
45 
46   // Adds an availability query for |source|. Results will be continuously
47   // returned via |callback| until the returned Subscription is destroyed by the
48   // caller.  If there are cached results available, |callback| will be invoked
49   // before this method returns.  |callback| may be invoked with an empty list
50   // if all devices respond to the respective queries with "unavailable" or
51   // don't respond before a timeout.  |callback| may be invoked successively
52   // with the same list.
53   virtual Subscription StartObservingAvailability(
54       const CastMediaSource& source,
55       AvailabilityCallback callback) = 0;
56 
57   // Refreshes the state of app discovery in the service. It is suitable to call
58   // this method when the user initiates a user gesture.
59   virtual void Refresh() = 0;
60 
61  private:
62   virtual void RemoveAvailabilityCallback(uint32_t id) = 0;
63 };
64 
65 }  // namespace cast
66 }  // namespace openscreen
67 
68 #endif  // CAST_SENDER_PUBLIC_CAST_APP_DISCOVERY_SERVICE_H_
69