using Avalonia; using Avalonia.Controls; using Avalonia.Logging.Serilog; using Avalonia.ReactiveUI; 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.Threading; using System.Threading.Tasks; namespace Remotely.Desktop.Linux { class Program { // Avalonia configuration, don't remove; also used by visual designer. public static AppBuilder BuildAvaloniaApp() => AppBuilder.Configure() .UsePlatformDetect() .LogToDebug() .UseReactiveUI(); public static Conductor Conductor { get; private set; } public static IServiceProvider Services => ServiceContainer.Instance; public static async Task Main(string[] args) { try { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; BuildServices(); Conductor = Services.GetRequiredService(); Logger.Write("Processing Args: " + string.Join(", ", Environment.GetCommandLineArgs())); Conductor.ProcessArgs(args); _ = Task.Run(() => { BuildAvaloniaApp().StartWithClassicDesktopLifetime(args); }); while (App.Current is null) { Thread.Sleep(100); } 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).ContinueWith(async (task) => { await casterSocket.SendDeviceInfo(Conductor.ServiceID, Environment.MachineName, Conductor.DeviceID); await casterSocket.NotifyRequesterUnattendedReady(Conductor.RequesterID); Services.GetRequiredService().Start(); Services.GetRequiredService().BeginWatching(); }); } else { Dispatcher.UIThread.Post(() => { App.Current.RunWithMainWindow(); }); } Thread.Sleep(Timeout.Infinite); } catch (Exception ex) { Logger.Write(ex); throw; } } private static void BuildServices() { var serviceCollection = new ServiceCollection(); serviceCollection.AddLogging(builder => { builder.AddConsole().AddDebug(); }); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddTransient(); serviceCollection.AddTransient(); serviceCollection.AddScoped(); serviceCollection.AddScoped(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(); serviceCollection.AddScoped(); serviceCollection.AddScoped(); ServiceContainer.Instance = serviceCollection.BuildServiceProvider(); } private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Logger.Write((Exception)e.ExceptionObject); } } }