1
#pragma once
2

            
3
#include <memory>
4

            
5
#include "envoy/event/dispatcher.h"
6

            
7
#include "source/common/quic/quic_network_connectivity_observer.h"
8

            
9
namespace Envoy {
10
namespace Quic {
11

            
12
// A registry of network connectivity observers.
13
class EnvoyQuicNetworkObserverRegistry {
14
public:
15
57
  virtual ~EnvoyQuicNetworkObserverRegistry() = default;
16

            
17
7
  void registerObserver(QuicNetworkConnectivityObserver& observer) {
18
7
    quic_observers_.insert(&observer);
19
7
  }
20

            
21
7
  void unregisterObserver(QuicNetworkConnectivityObserver& observer) {
22
7
    quic_observers_.erase(&observer);
23
7
  }
24

            
25
  // Get the default network handle.
26
  virtual NetworkHandle getDefaultNetwork() PURE;
27

            
28
  // Get an alternative network handle different from the given one.
29
  virtual NetworkHandle getAlternativeNetwork(NetworkHandle network) PURE;
30

            
31
protected:
32
8
  const absl::flat_hash_set<QuicNetworkConnectivityObserver*>& registeredQuicObservers() const {
33
8
    return quic_observers_;
34
8
  }
35

            
36
private:
37
  absl::flat_hash_set<QuicNetworkConnectivityObserver*> quic_observers_;
38
};
39

            
40
class EnvoyQuicNetworkObserverRegistryFactory {
41
public:
42
  virtual ~EnvoyQuicNetworkObserverRegistryFactory() = default;
43

            
44
  virtual std::unique_ptr<EnvoyQuicNetworkObserverRegistry>
45
  createQuicNetworkObserverRegistry(Event::Dispatcher& /*dispatcher*/) PURE;
46
};
47

            
48
using EnvoyQuicNetworkObserverRegistryPtr = std::unique_ptr<EnvoyQuicNetworkObserverRegistry>;
49
using EnvoyQuicNetworkObserverRegistryFactoryPtr =
50
    std::unique_ptr<EnvoyQuicNetworkObserverRegistryFactory>;
51

            
52
} // namespace Quic
53
} // namespace Envoy