using Avalonia; using Avalonia.Controls; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; using Avalonia.Threading; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Remotely.Desktop.Core; using Remotely.Desktop.Core.Interfaces; using Remotely.Desktop.Core.Services; using Remotely.Desktop.Linux.Services; using Remotely.Desktop.Linux.Views; using Remotely.Shared.Utilities; using System; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Remotely.Desktop.Linux { public class App : Application { private static Conductor Conductor; private static IServiceProvider Services => ServiceContainer.Instance; public override void Initialize() { AvaloniaXamlLoader.Load(this); } public override void OnFrameworkInitializationCompleted() { //if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) //{ // desktop.MainWindow = new MainWindow // { // DataContext = new MainWindowViewModel(), // }; //} base.OnFrameworkInitializationCompleted(); _ = Task.Run(Startup); } private void BuildServices() { var serviceCollection = new ServiceCollection(); serviceCollection.AddLogging(builder => { builder.AddConsole().AddDebug(); }); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddTransient(); serviceCollection.AddScoped(); serviceCollection.AddScoped(); serviceCollection.AddScoped(); switch (EnvironmentHelper.Platform) { case Shared.Enums.Platform.Linux: { serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddTransient(); serviceCollection.AddScoped(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddScoped(); serviceCollection.AddScoped(); } break; case Shared.Enums.Platform.OSX: { } break; default: throw new PlatformNotSupportedException(); } ServiceContainer.Instance = serviceCollection.BuildServiceProvider(); } private async Task Startup() { BuildServices(); Conductor = Services.GetRequiredService(); var args = Environment.GetCommandLineArgs().SkipWhile(x => !x.StartsWith("-")); Logger.Write("Processing Args: " + string.Join(", ", args)); Conductor.ProcessArgs(args.ToArray()); await Services.GetRequiredService().GetInitParams(); if (Conductor.Mode == Core.Enums.AppMode.Chat) { await Services.GetRequiredService().StartChat(Conductor.RequesterID, Conductor.OrganizationName); } else if (Conductor.Mode == Core.Enums.AppMode.Unattended) { var casterSocket = Services.GetRequiredService(); await casterSocket.Connect(Conductor.Host).ConfigureAwait(false); await casterSocket.SendDeviceInfo(Conductor.ServiceID, Environment.MachineName, Conductor.DeviceID).ConfigureAwait(false); await casterSocket.NotifyRequesterUnattendedReady(Conductor.RequesterID).ConfigureAwait(false); Services.GetRequiredService().Start(); Services.GetRequiredService().BeginWatching(); Services.GetRequiredService().Init(); } else { await Dispatcher.UIThread.InvokeAsync(() => { this.RunWithMainWindow(); }); } } } }