#ifndef SERVICES_NETWORK_NETWORK_CHANGE_MANAGER_H_
#define SERVICES_NETWORK_NETWORK_CHANGE_MANAGER_H_
#include <memory>
#include <vector>
#include "base/component_export.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "mojo/public/cpp/bindings/associated_receiver.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "net/base/network_change_notifier.h"
#include "services/network/public/mojom/network_change_manager.mojom.h"
#if BUILDFLAG(IS_LINUX)
#include "services/network/public/mojom/network_interface_change_listener.mojom.h"
#endif
namespace network {
class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkChangeManager
: public mojom::NetworkChangeManager,
public net::NetworkChangeNotifier::NetworkChangeObserver
#if BUILDFLAG(IS_LINUX)
,
public mojom::NetworkInterfaceChangeListener
#endif
{
public:
explicit NetworkChangeManager(
std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier);
NetworkChangeManager(const NetworkChangeManager&) = delete;
NetworkChangeManager& operator=(const NetworkChangeManager&) = delete;
~NetworkChangeManager() override;
void AddReceiver(mojo::PendingReceiver<mojom::NetworkChangeManager> receiver);
void RequestNotifications(
mojo::PendingRemote<mojom::NetworkChangeManagerClient> client_remote)
override;
#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX)
void OnNetworkChanged(
bool dns_changed,
bool ip_address_changed,
bool connection_type_changed,
mojom::ConnectionType new_connection_type,
bool connection_subtype_changed,
mojom::ConnectionSubtype new_connection_subtype) override;
#endif
#if BUILDFLAG(IS_LINUX)
void BindNetworkInterfaceChangeListener(
mojo::PendingAssociatedReceiver<mojom::NetworkInterfaceChangeListener>)
override;
void OnNetworkInterfacesChanged(
mojom::NetworkInterfaceChangeParamsPtr change_params) override;
#endif
size_t GetNumClientsForTesting() const;
private:
void NotificationPipeBroken(mojom::NetworkChangeManagerClient* client);
void OnNetworkChanged(
net::NetworkChangeNotifier::ConnectionType type) override;
std::unique_ptr<net::NetworkChangeNotifier> network_change_notifier_;
mojo::ReceiverSet<mojom::NetworkChangeManager> receivers_;
#if BUILDFLAG(IS_LINUX)
mojo::AssociatedReceiver<mojom::NetworkInterfaceChangeListener>
interface_change_listener_receiver_{this};
#endif
std::vector<mojo::Remote<mojom::NetworkChangeManagerClient>> clients_;
mojom::ConnectionType connection_type_;
};
}
#endif