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