public static IImageEncoder GetImageEncoder(ILogger logger, ILogManager logManager, IFileSystem fileSystem, StartupOptions startupOptions, Func <IHttpClient> httpClient, IApplicationPaths appPaths) { if (!startupOptions.ContainsOption("-enablegdi")) { try { return(new ImageMagickEncoder(logManager.GetLogger("ImageMagick"), appPaths, httpClient, fileSystem)); } catch { logger.Error("Error loading ImageMagick. Will revert to GDI."); } } try { return(new GDIImageEncoder(fileSystem, logManager.GetLogger("GDI"))); } catch { logger.Error("Error loading GDI. Will revert to NullImageEncoder."); } return(new NullImageEncoder()); }
private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, StartupOptions options) { SystemEvents.SessionEnding += SystemEvents_SessionEnding; // Allow all https requests ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }); var fileSystem = new CommonFileSystem(logManager.GetLogger("FileSystem"), false, true); var nativeApp = new NativeApp(); _appHost = new ApplicationHost(appPaths, logManager, options, fileSystem, "MBServer.Mono", nativeApp); if (options.ContainsOption("-v")) { Console.WriteLine(_appHost.ApplicationVersion.ToString()); return; } Console.WriteLine("appHost.Init"); var initProgress = new Progress<double>(); var task = _appHost.Init(initProgress); Task.WaitAll(task); Console.WriteLine("Running startup tasks"); task = _appHost.RunStartupTasks(); Task.WaitAll(task); task = ApplicationTaskCompletionSource.Task; Task.WaitAll(task); }
public static IImageEncoder GetImageEncoder(ILogger logger, ILogManager logManager, IFileSystem fileSystem, StartupOptions startupOptions, Func <IHttpClient> httpClient, IApplicationPaths appPaths, IEnvironmentInfo environment, ILocalizationManager localizationManager) { if (!startupOptions.ContainsOption("-enablegdi")) { try { return(new SkiaEncoder(logManager.GetLogger("Skia"), appPaths, httpClient, fileSystem, localizationManager)); } catch (Exception ex) { logger.Info("Skia not available. Will try next image processor. {0}", ex.Message); } try { return(new ImageMagickEncoder(logManager.GetLogger("ImageMagick"), appPaths, httpClient, fileSystem, environment)); } catch { logger.Info("ImageMagick not available. Will try next image processor."); } } return(new NullImageEncoder()); }
/// <summary> /// Runs the application. /// </summary> /// <param name="appPaths">The app paths.</param> /// <param name="logManager">The log manager.</param> /// <param name="options">The options.</param> private static void StartApplication(ServerApplicationPaths appPaths, ILogManager logManager, StartupOptions options) { SystemEvents.SessionEnding += SystemEvents_SessionEnding; // Allow all https requests ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; }); var fileSystem = new ManagedFileSystem(new PatternsLogger(logManager.GetLogger("FileSystem")), false, true); fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem)); var nativeApp = new NativeApp(logManager.GetLogger("App")); AppHost = new ApplicationHost(appPaths, logManager, options, fileSystem, "Emby.Server.Mac.pkg", nativeApp); if (options.ContainsOption("-v")) { Console.WriteLine (AppHost.ApplicationVersion.ToString()); return; } Console.WriteLine ("appHost.Init"); Task.Run (() => StartServer(CancellationToken.None)); }
public static void Restart(StartupOptions startupOptions) { _logger.Info("Disposing app host"); _appHost.Dispose(); _logger.Info("Starting new instance"); string module = startupOptions.GetOption("-restartpath"); string commandLineArgsString = startupOptions.GetOption("-restartargs") ?? string.Empty; if (string.IsNullOrWhiteSpace(module)) { module = Environment.GetCommandLineArgs().First(); } if (!startupOptions.ContainsOption("-restartargs")) { var args = Environment.GetCommandLineArgs() .Skip(1) .Select(NormalizeCommandLineArgument); commandLineArgsString = string.Join(" ", args.ToArray()); } _logger.Info("Executable: {0}", module); _logger.Info("Arguments: {0}", commandLineArgsString); Process.Start(module, commandLineArgsString); _logger.Info("Calling Environment.Exit"); Environment.Exit(0); }
/// <summary> /// Defines the entry point of the application. /// </summary> public static void Main() { var options = new StartupOptions(); _isRunningAsService = options.ContainsOption("-service"); if (_isRunningAsService) { //_canRestartService = CanRestartWindowsService(); } var currentProcess = Process.GetCurrentProcess(); var applicationPath = currentProcess.MainModule.FileName; var architecturePath = Path.Combine(Path.GetDirectoryName(applicationPath), Environment.Is64BitProcess ? "x64" : "x86"); Wand.SetMagickCoderModulePath(architecturePath); var success = SetDllDirectory(architecturePath); var appPaths = CreateApplicationPaths(applicationPath, _isRunningAsService); var logManager = new NlogManager(appPaths.LogDirectoryPath, "server"); logManager.ReloadLogger(LogSeverity.Debug); logManager.AddConsoleOutput(); var logger = _logger = logManager.GetLogger("Main"); ApplicationHost.LogEnvironmentInfo(logger, appPaths, true); // Install directly if (options.ContainsOption("-installservice")) { logger.Info("Performing service installation"); InstallService(applicationPath, logger); return; } // Restart with admin rights, then install if (options.ContainsOption("-installserviceasadmin")) { logger.Info("Performing service installation"); RunServiceInstallation(applicationPath); return; } // Uninstall directly if (options.ContainsOption("-uninstallservice")) { logger.Info("Performing service uninstallation"); UninstallService(applicationPath, logger); return; } // Restart with admin rights, then uninstall if (options.ContainsOption("-uninstallserviceasadmin")) { logger.Info("Performing service uninstallation"); RunServiceUninstallation(applicationPath); return; } AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; RunServiceInstallationIfNeeded(applicationPath); if (IsAlreadyRunning(applicationPath, currentProcess)) { logger.Info("Shutting down because another instance of Emby Server is already running."); return; } if (PerformUpdateIfNeeded(appPaths, logger)) { logger.Info("Exiting to perform application update."); return; } try { RunApplication(appPaths, logManager, _isRunningAsService, options); } finally { OnServiceShutdown(); } }
/// <summary> /// Runs the application. /// </summary> /// <param name="appPaths">The app paths.</param> /// <param name="logManager">The log manager.</param> /// <param name="runService">if set to <c>true</c> [run service].</param> /// <param name="options">The options.</param> private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, bool runService, StartupOptions options) { var fileSystem = new WindowsFileSystem(new PatternsLogger(logManager.GetLogger("FileSystem"))); fileSystem.AddShortcutHandler(new MbLinkShortcutHandler(fileSystem)); //fileSystem.AddShortcutHandler(new LnkShortcutHandler(fileSystem)); var nativeApp = new WindowsApp(fileSystem, _logger) { IsRunningAsService = runService }; _appHost = new ApplicationHost(appPaths, logManager, options, fileSystem, "emby.windows.zip", nativeApp); var initProgress = new Progress<double>(); if (!runService) { if (!options.ContainsOption("-nosplash")) ShowSplashScreen(_appHost.ApplicationVersion, initProgress, logManager.GetLogger("Splash")); // Not crazy about this but it's the only way to suppress ffmpeg crash dialog boxes SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOALIGNMENTFAULTEXCEPT | ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_NOOPENFILEERRORBOX); } var task = _appHost.Init(initProgress); Task.WaitAll(task); task = task.ContinueWith(new Action<Task>(a => _appHost.RunStartupTasks()), TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent); if (runService) { StartService(logManager); } else { Task.WaitAll(task); task = InstallVcredist2013IfNeeded(_appHost, _logger); Task.WaitAll(task); SystemEvents.SessionEnding += SystemEvents_SessionEnding; SystemEvents.SessionSwitch += SystemEvents_SessionSwitch; HideSplashScreen(); ShowTrayIcon(); task = ApplicationTaskCompletionSource.Task; Task.WaitAll(task); } }
/// <summary> /// Runs the application. /// </summary> /// <param name="appPaths">The app paths.</param> /// <param name="logManager">The log manager.</param> /// <param name="runService">if set to <c>true</c> [run service].</param> /// <param name="options">The options.</param> private static void RunApplication(ServerApplicationPaths appPaths, ILogManager logManager, bool runService, StartupOptions options) { var fileSystem = new NativeFileSystem(logManager.GetLogger("FileSystem"), false); var nativeApp = new WindowsApp(fileSystem) { IsRunningAsService = runService }; _appHost = new ApplicationHost(appPaths, logManager, options, fileSystem, "MBServer", nativeApp); var initProgress = new Progress<double>(); if (!runService) { if (!options.ContainsOption("-nosplash")) ShowSplashScreen(_appHost.ApplicationVersion, initProgress, logManager.GetLogger("Splash")); // Not crazy about this but it's the only way to suppress ffmpeg crash dialog boxes SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOALIGNMENTFAULTEXCEPT | ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_NOOPENFILEERRORBOX); } var task = _appHost.Init(initProgress); task = task.ContinueWith(new Action<Task>(a => _appHost.RunStartupTasks())); if (runService) { StartService(logManager); } else { Task.WaitAll(task); SystemEvents.SessionEnding += SystemEvents_SessionEnding; SystemEvents.SessionSwitch += SystemEvents_SessionSwitch; HideSplashScreen(); ShowTrayIcon(); task = ApplicationTaskCompletionSource.Task; Task.WaitAll(task); } }