1 // Copyright 2015 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 #include "ash/system/network/vpn_list.h" 6 7 #include <utility> 8 9 #include "ash/public/cpp/network_config_service.h" 10 #include "ash/system/model/system_tray_model.h" 11 #include "ash/system/network/tray_network_state_model.h" 12 #include "base/notreached.h" 13 14 namespace ash { 15 16 VpnList::Observer::~Observer() = default; 17 VpnList(TrayNetworkStateModel * model)18VpnList::VpnList(TrayNetworkStateModel* model) : model_(model) { 19 model_->AddObserver(this); 20 AddBuiltInProvider(); 21 VpnProvidersChanged(); 22 } 23 ~VpnList()24VpnList::~VpnList() { 25 model_->RemoveObserver(this); 26 } 27 HaveExtensionOrArcVpnProviders() const28bool VpnList::HaveExtensionOrArcVpnProviders() const { 29 for (const VpnProviderPtr& extension_provider : extension_vpn_providers_) { 30 if (extension_provider->type == VpnType::kExtension) 31 return true; 32 } 33 return arc_vpn_providers_.size() > 0; 34 } 35 AddObserver(Observer * observer)36void VpnList::AddObserver(Observer* observer) { 37 observer_list_.AddObserver(observer); 38 } 39 RemoveObserver(Observer * observer)40void VpnList::RemoveObserver(Observer* observer) { 41 observer_list_.RemoveObserver(observer); 42 } 43 ActiveNetworkStateChanged()44void VpnList::ActiveNetworkStateChanged() { 45 Update(); 46 } 47 VpnProvidersChanged()48void VpnList::VpnProvidersChanged() { 49 Update(); 50 } 51 SetVpnProvidersForTest(std::vector<VpnProviderPtr> providers)52void VpnList::SetVpnProvidersForTest(std::vector<VpnProviderPtr> providers) { 53 OnGetVpnProviders(std::move(providers)); 54 } 55 OnGetVpnProviders(std::vector<VpnProviderPtr> providers)56void VpnList::OnGetVpnProviders(std::vector<VpnProviderPtr> providers) { 57 extension_vpn_providers_.clear(); 58 arc_vpn_providers_.clear(); 59 AddBuiltInProvider(); 60 // Add Third Party (Extension and Arc) providers. 61 for (auto& provider : providers) { 62 switch (provider->type) { 63 case VpnType::kL2TPIPsec: 64 case VpnType::kOpenVPN: 65 // Only third party VpnProvider instances should exist. 66 NOTREACHED(); 67 break; 68 case VpnType::kExtension: 69 extension_vpn_providers_.push_back(std::move(provider)); 70 break; 71 case VpnType::kArc: 72 arc_vpn_providers_.push_back(std::move(provider)); 73 break; 74 } 75 } 76 NotifyObservers(); 77 } 78 NotifyObservers()79void VpnList::NotifyObservers() { 80 for (auto& observer : observer_list_) 81 observer.OnVpnProvidersChanged(); 82 } 83 AddBuiltInProvider()84void VpnList::AddBuiltInProvider() { 85 // Create a VpnProvider with type kOpenVPN for the built-in provider. 86 extension_vpn_providers_.push_back( 87 VpnProvider::New(VpnType::kOpenVPN, 88 /*provider_id=*/std::string(), 89 /*provider_name=*/std::string(), 90 /*app_id=*/std::string(), 91 /*last_launch_time=*/base::Time())); 92 } 93 Update()94void VpnList::Update() { 95 model_->cros_network_config()->GetVpnProviders( 96 base::BindOnce(&VpnList::OnGetVpnProviders, base::Unretained(this))); 97 } 98 99 } // namespace ash 100