// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef SERVICES_NETWORK_NETWORK_CHANGE_MANAGER_H_ #define SERVICES_NETWORK_NETWORK_CHANGE_MANAGER_H_ #include #include #include "base/component_export.h" #include "build/build_config.h" #include "build/chromeos_buildflags.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" namespace network { // Implementation of mojom::NetworkChangeManager. All accesses to this class are // done through mojo on the main thread. This registers itself to receive // broadcasts from net::NetworkChangeNotifier and rebroadcasts the notifications // to mojom::NetworkChangeManagerClients through mojo pipes. class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkChangeManager : public mojom::NetworkChangeManager, public net::NetworkChangeNotifier::NetworkChangeObserver { public: // If |network_change_notifier| is not null, |this| will take ownership of it. // Otherwise, the global net::NetworkChangeNotifier will be used. explicit NetworkChangeManager( std::unique_ptr network_change_notifier); NetworkChangeManager(const NetworkChangeManager&) = delete; NetworkChangeManager& operator=(const NetworkChangeManager&) = delete; ~NetworkChangeManager() override; // Binds a NetworkChangeManager receiver to this object. Mojo messages // coming through the associated pipe will be served by this object. void AddReceiver(mojo::PendingReceiver receiver); // mojom::NetworkChangeManager implementation: void RequestNotifications( mojo::PendingRemote client_remote) override; #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) 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 size_t GetNumClientsForTesting() const; private: // Handles connection errors on notification pipes. void NotificationPipeBroken(mojom::NetworkChangeManagerClient* client); // net::NetworkChangeNotifier::NetworkChangeObserver implementation: void OnNetworkChanged( net::NetworkChangeNotifier::ConnectionType type) override; std::unique_ptr network_change_notifier_; mojo::ReceiverSet receivers_; std::vector> clients_; mojom::ConnectionType connection_type_; }; } // namespace network #endif // SERVICES_NETWORK_NETWORK_CHANGE_MANAGER_H_