// // DefaultLightProfileManager.swift // Passepartout // // Created by Davide De Rosa on 7/3/22. // Copyright (c) 2024 Davide De Rosa. All rights reserved. // // https://github.com/passepartoutvpn // // This file is part of Passepartout. // // Passepartout is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Passepartout is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Passepartout. If not, see . // import Combine import Foundation import PassepartoutLibrary final class DefaultLightProfile: LightProfile { let id: UUID let name: String let vpnProtocol: String let isActive: Bool let providerName: String? let providerServer: LightProviderServer? init(_ header: Profile.Header, vpnProtocol: String, isActive: Bool, providerServer: LightProviderServer?) { id = header.id name = header.name self.vpnProtocol = vpnProtocol self.isActive = isActive providerName = header.providerName self.providerServer = providerServer } } final class DefaultLightProfileManager: LightProfileManager { private let profileManager = ProfileManager.shared private let providerManager = ProviderManager.shared private var subscriptions: Set = [] weak var delegate: LightProfileManagerDelegate? init() { profileManager.didUpdateProfiles .receive(on: DispatchQueue.main) .sink { [weak self] in self?.delegate?.didUpdateProfiles() }.store(in: &subscriptions) } var hasProfiles: Bool { profileManager.hasProfiles } var profiles: [LightProfile] { profileManager.profiles .sorted { $0.header < $1.header }.map { let server: ProviderServer? if let serverId = $0.providerServerId { server = providerManager.server(withId: serverId) } else { server = nil } return DefaultLightProfile( $0.header, vpnProtocol: $0.currentVPNProtocol.rawValue, isActive: profileManager.isActiveProfile($0.id), providerServer: server.map(DefaultLightProviderServer.init) ) } } var activeProfileId: UUID? { profileManager.activeProfileId } var activeProfileName: String? { guard let header = profileManager.headers.first(where: { $0.id == profileManager.activeProfileId }) else { return nil } return header.name } }