1 // Copyright 2019 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 CHROMEOS_COMPONENTS_SYNC_WIFI_SYNCED_NETWORK_UPDATER_IMPL_H_ 6 #define CHROMEOS_COMPONENTS_SYNC_WIFI_SYNCED_NETWORK_UPDATER_IMPL_H_ 7 8 #include "base/memory/weak_ptr.h" 9 #include "base/timer/timer.h" 10 #include "base/values.h" 11 #include "chromeos/components/sync_wifi/network_identifier.h" 12 #include "chromeos/components/sync_wifi/pending_network_configuration_tracker.h" 13 #include "chromeos/components/sync_wifi/synced_network_metrics_logger.h" 14 #include "chromeos/components/sync_wifi/synced_network_updater.h" 15 #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h" 16 #include "components/sync/protocol/model_type_state.pb.h" 17 #include "mojo/public/cpp/bindings/receiver.h" 18 19 namespace chromeos { 20 21 namespace sync_wifi { 22 23 class TimerFactory; 24 25 // Implementation of SyncedNetworkUpdater. This class takes add/update/delete 26 // requests from the sync backend and applies them to the local network stack 27 // using mojom::CrosNetworkConfig. 28 class SyncedNetworkUpdaterImpl 29 : public SyncedNetworkUpdater, 30 public chromeos::network_config::mojom::CrosNetworkConfigObserver { 31 public: 32 // |cros_network_config| must outlive this class. 33 SyncedNetworkUpdaterImpl( 34 std::unique_ptr<PendingNetworkConfigurationTracker> tracker, 35 network_config::mojom::CrosNetworkConfig* cros_network_config, 36 TimerFactory* timer_factory, 37 SyncedNetworkMetricsLogger* metrics_logger); 38 ~SyncedNetworkUpdaterImpl() override; 39 40 void AddOrUpdateNetwork( 41 const sync_pb::WifiConfigurationSpecifics& specifics) override; 42 43 void RemoveNetwork(const NetworkIdentifier& id) override; 44 45 bool IsUpdateInProgress(const std::string& network_guid) override; 46 47 // CrosNetworkConfigObserver: 48 void OnNetworkStateListChanged() override; OnActiveNetworksChanged(std::vector<network_config::mojom::NetworkStatePropertiesPtr>)49 void OnActiveNetworksChanged( 50 std::vector< 51 network_config::mojom::NetworkStatePropertiesPtr> /* networks */) 52 override {} OnNetworkStateChanged(chromeos::network_config::mojom::NetworkStatePropertiesPtr)53 void OnNetworkStateChanged( 54 chromeos::network_config::mojom::NetworkStatePropertiesPtr /* network */) 55 override {} OnDeviceStateListChanged()56 void OnDeviceStateListChanged() override {} OnVpnProvidersChanged()57 void OnVpnProvidersChanged() override {} OnNetworkCertificatesChanged()58 void OnNetworkCertificatesChanged() override {} 59 60 private: 61 void StartAddOrUpdateOperation( 62 const std::string& change_guid, 63 const NetworkIdentifier& id, 64 const sync_pb::WifiConfigurationSpecifics& specifics); 65 void StartDeleteOperation(const std::string& change_guid, 66 const NetworkIdentifier& id, 67 std::string guid); 68 void StartTimer(const std::string& change_guid, const NetworkIdentifier& id); 69 void Retry(const PendingNetworkConfigurationUpdate& update); 70 void HandleShillResult(const std::string& change_guid, 71 const NetworkIdentifier& id, 72 bool is_success); 73 void CleanupUpdate(const std::string& change_guid, 74 const NetworkIdentifier& id); 75 network_config::mojom::NetworkStatePropertiesPtr FindMojoNetwork( 76 const NetworkIdentifier& id); 77 78 base::Optional<base::DictionaryValue> ConvertToDictionary( 79 const sync_pb::WifiConfigurationSpecifics& specifics, 80 const std::string& guid); 81 void OnGetNetworkList( 82 std::vector<network_config::mojom::NetworkStatePropertiesPtr> networks); 83 void OnTimeout(const std::string& change_guid, const NetworkIdentifier& id); 84 void OnSetPropertiesResult(const std::string& change_guid, 85 const std::string& network_guid, 86 const sync_pb::WifiConfigurationSpecifics& proto, 87 bool success, 88 const std::string& error_message); 89 void OnConfigureNetworkResult( 90 const std::string& change_guid, 91 const sync_pb::WifiConfigurationSpecifics& proto, 92 const base::Optional<std::string>& network_guid, 93 const std::string& error_message); 94 void OnForgetNetworkResult(const std::string& change_guid, 95 const NetworkIdentifier& id, 96 bool success); 97 98 std::unique_ptr<PendingNetworkConfigurationTracker> tracker_; 99 network_config::mojom::CrosNetworkConfig* cros_network_config_; 100 mojo::Receiver<chromeos::network_config::mojom::CrosNetworkConfigObserver> 101 cros_network_config_observer_receiver_{this}; 102 std::vector<network_config::mojom::NetworkStatePropertiesPtr> networks_; 103 TimerFactory* timer_factory_; 104 base::flat_map<std::string, std::unique_ptr<base::OneShotTimer>> 105 change_guid_to_timer_map_; 106 base::flat_map<std::string, int> network_guid_to_updates_counter_; 107 SyncedNetworkMetricsLogger* metrics_logger_; 108 109 base::WeakPtrFactory<SyncedNetworkUpdaterImpl> weak_ptr_factory_{this}; 110 }; 111 112 } // namespace sync_wifi 113 114 } // namespace chromeos 115 116 #endif // CHROMEOS_COMPONENTS_SYNC_WIFI_SYNCED_NETWORK_UPDATER_IMPL_H_ 117