/* * Copyright (c) 2025 Proton AG * * This file is part of ProtonVPN. * * ProtonVPN 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. * * ProtonVPN 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 ProtonVPN. If not, see . */ using Autofac; using Autofac.Builder; using ProtonVPN.Api.Installers; using ProtonVPN.Client.Commands; using ProtonVPN.Client.Core.Bases.Helpers; using ProtonVPN.Client.Core.Bases.ViewModels; using ProtonVPN.Client.EventMessaging.Installers; using ProtonVPN.Client.Factories; using ProtonVPN.Client.Files.Installers; using ProtonVPN.Client.Handlers; using ProtonVPN.Client.Handlers.Bases; using ProtonVPN.Client.Localization.Installers; using ProtonVPN.Client.Logic.Announcements.Installers; using ProtonVPN.Client.Logic.Auth.Installers; using ProtonVPN.Client.Logic.Connection.Installers; using ProtonVPN.Client.Logic.Feedback.Installers; using ProtonVPN.Client.Logic.Profiles.Installers; using ProtonVPN.Client.Logic.Recents.Installers; using ProtonVPN.Client.Logic.Searches.Installers; using ProtonVPN.Client.Logic.Servers.Installers; using ProtonVPN.Client.Logic.Services.Installers; using ProtonVPN.Client.Logic.Updates.Installers; using ProtonVPN.Client.Logic.Users.Installers; using ProtonVPN.Client.Models.Announcements; using ProtonVPN.Client.Notifications.Installers; using ProtonVPN.Client.Services; using ProtonVPN.Client.Services.Activation; using ProtonVPN.Client.Services.Bootstrapping; using ProtonVPN.Client.Services.Bootstrapping.Activators; using ProtonVPN.Client.Services.Browsing; using ProtonVPN.Client.Services.DefaultConnections; using ProtonVPN.Client.Services.Dispatching; using ProtonVPN.Client.Services.Edition; using ProtonVPN.Client.Services.Enabling; using ProtonVPN.Client.Services.Lifecycle; using ProtonVPN.Client.Services.LocationExclusion; using ProtonVPN.Client.Services.Mapping; using ProtonVPN.Client.Services.Navigation; using ProtonVPN.Client.Services.PortForwarding; using ProtonVPN.Client.Services.ProcessCommunication; using ProtonVPN.Client.Services.Selection; using ProtonVPN.Client.Services.SignoutHandling; using ProtonVPN.Client.Services.TeachingTips; using ProtonVPN.Client.Services.Upselling; using ProtonVPN.Client.Services.Validation; using ProtonVPN.Client.Services.Verification; using ProtonVPN.Client.Settings.Installers; using ProtonVPN.Client.UI; using ProtonVPN.Client.UI.Dialogs.DebugTools; using ProtonVPN.Client.UI.Dialogs.NpsSurvey; using ProtonVPN.Client.UI.Dialogs.OneTimeAnnouncement; using ProtonVPN.Client.UI.Dialogs.ReportIssue; using ProtonVPN.Client.UI.Dialogs.ReportIssue.Pages; using ProtonVPN.Client.UI.Dialogs.Tray; using ProtonVPN.Client.UI.Dialogs.Tray.Pages; using ProtonVPN.Client.UI.Dialogs.Troubleshooting; using ProtonVPN.Client.UI.Dialogs.Upsell; using ProtonVPN.Client.UI.Dialogs.Upsell.Features; using ProtonVPN.Client.UI.Login; using ProtonVPN.Client.UI.Login.Components; using ProtonVPN.Client.UI.Login.Overlays; using ProtonVPN.Client.UI.Login.Pages; using ProtonVPN.Client.UI.Main; using ProtonVPN.Client.UI.Main.Components; using ProtonVPN.Client.UI.Main.Components.Banners; using ProtonVPN.Client.UI.Main.FeatureIcons; using ProtonVPN.Client.UI.Main.Features.KillSwitch; using ProtonVPN.Client.UI.Main.Features.NetShield; using ProtonVPN.Client.UI.Main.Features.PortForwarding; using ProtonVPN.Client.UI.Main.Features.SplitTunneling; using ProtonVPN.Client.UI.Main.Home; using ProtonVPN.Client.UI.Main.Home.Card; using ProtonVPN.Client.UI.Main.Home.Card.DefaultConnections; using ProtonVPN.Client.UI.Main.Home.Details; using ProtonVPN.Client.UI.Main.Home.Details.Connection; using ProtonVPN.Client.UI.Main.Home.Details.Flyouts; using ProtonVPN.Client.UI.Main.Home.Details.Location; using ProtonVPN.Client.UI.Main.Home.Status; using ProtonVPN.Client.UI.Main.Home.Upsell; using ProtonVPN.Client.UI.Main.Map; using ProtonVPN.Client.UI.Main.Profiles; using ProtonVPN.Client.UI.Main.Profiles.Components; using ProtonVPN.Client.UI.Main.Settings; using ProtonVPN.Client.UI.Main.Settings.Connection; using ProtonVPN.Client.UI.Main.Settings.Pages; using ProtonVPN.Client.UI.Main.Settings.Pages.About; using ProtonVPN.Client.UI.Main.Settings.Pages.Advanced; using ProtonVPN.Client.UI.Main.Settings.Pages.Connection; using ProtonVPN.Client.UI.Main.Settings.Pages.ConnectionPreferences; using ProtonVPN.Client.UI.Main.Sidebar; using ProtonVPN.Client.UI.Main.Sidebar.Connections; using ProtonVPN.Client.UI.Main.Sidebar.Connections.Countries; using ProtonVPN.Client.UI.Main.Sidebar.Connections.Countries.All; using ProtonVPN.Client.UI.Main.Sidebar.Connections.Countries.P2P; using ProtonVPN.Client.UI.Main.Sidebar.Connections.Countries.SecureCore; using ProtonVPN.Client.UI.Main.Sidebar.Connections.Countries.Tor; using ProtonVPN.Client.UI.Main.Sidebar.Connections.Gateways; using ProtonVPN.Client.UI.Main.Sidebar.Connections.Profiles; using ProtonVPN.Client.UI.Main.Sidebar.Connections.Recents; using ProtonVPN.Client.UI.Main.Sidebar.Search; using ProtonVPN.Client.UI.Main.Widgets; using ProtonVPN.Client.UI.Overlays.HumanVerification; using ProtonVPN.Client.UI.Overlays.Information; using ProtonVPN.Client.UI.Overlays.Information.Notification; using ProtonVPN.Client.UI.Overlays.Selection; using ProtonVPN.Client.UI.Overlays.Upsell; using ProtonVPN.Client.UI.Overlays.Welcome; using ProtonVPN.Client.UI.Overlays.WhatsNew; using ProtonVPN.Client.UI.Tray; using ProtonVPN.Client.UI.Update; using ProtonVPN.Client.UnsecureWifiDetection.Installers; using ProtonVPN.Common.Legacy.OS.DeviceIds; using ProtonVPN.Common.Legacy.OS.Processes; using ProtonVPN.Common.Legacy.OS.Systems; using ProtonVPN.Configurations.Installers; using ProtonVPN.Crypto.Installers; using ProtonVPN.Dns.Installers; using ProtonVPN.EntityMapping.Installers; using ProtonVPN.Files.Installers; using ProtonVPN.IPv6.Installers; using ProtonVPN.IssueReporting.Installers; using ProtonVPN.Logging.Installers; using ProtonVPN.NetworkTimeProtocols.Installers; using ProtonVPN.OperatingSystems.Antiviruses.Installers; using ProtonVPN.OperatingSystems.Network.Installers; using ProtonVPN.OperatingSystems.Processes.Installers; using ProtonVPN.OperatingSystems.Registries.Installers; using ProtonVPN.OperatingSystems.Services.Installers; using ProtonVPN.OperatingSystems.WebAuthn.Installers; using ProtonVPN.ProcessCommunication.Client.Installers; using ProtonVPN.Serialization.Installers; using ProtonVPN.StatisticalEvents.Installers; using ProtonVPN.Client.UI.Main.Home.Card.Feedback; namespace ProtonVPN.Client.Installers; public class AppModule : Module { protected override void Load(ContainerBuilder builder) { builder.RegisterLoggerConfiguration(c => c.ClientLogsFilePath); RegisterExternalModules(builder); RegisterLocalServices(builder); RegisterLocalHandlers(builder); RegisterViewModels(builder); RegisterExternalServices(builder); RegisterCommands(builder); } private static IRegistrationBuilder RegisterViewModel(ContainerBuilder builder) where TViewModel : ViewModelBase { return builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); } private void RegisterExternalServices(ContainerBuilder builder) { builder.RegisterType().As().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); } private void RegisterExternalModules(ContainerBuilder builder) { builder.RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule() .RegisterModule(); } private void RegisterLocalServices(ContainerBuilder builder) { builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance().AutoActivate(); builder.RegisterType().AsImplementedInterfaces().SingleInstance().AutoActivate(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance().AutoActivate(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsSelf().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); builder.RegisterType().AsImplementedInterfaces().SingleInstance(); } private void RegisterLocalHandlers(ContainerBuilder builder) { Type handlerType = typeof(IHandler); builder.RegisterAssemblyTypes(handlerType.Assembly) .Where(handlerType.IsAssignableFrom) .AsImplementedInterfaces() .SingleInstance() .AutoActivate(); } private void RegisterCommands(ContainerBuilder builder) { Type providerType = typeof(ICommandProvider); builder.RegisterAssemblyTypes(providerType.Assembly) .Where(providerType.IsAssignableFrom) .AsImplementedInterfaces() .SingleInstance(); } private void RegisterViewModels(ContainerBuilder builder) { RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder).AutoActivate(); RegisterViewModel(builder); RegisterViewModel(builder); RegisterViewModel(builder); builder.RegisterType().SingleInstance(); } }