SetupValidator.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using Ryujinx.Common.Logging;
  2. using Ryujinx.Common.UI;
  3. using Ryujinx.HLE.FileSystem;
  4. using System;
  5. using System.IO;
  6. namespace Ryujinx.Ava.Utilities
  7. {
  8. /// <summary>
  9. /// Ensure installation validity
  10. /// </summary>
  11. public static class SetupValidator
  12. {
  13. public static bool IsFirmwareValid(ContentManager contentManager, out UserError error)
  14. {
  15. error = contentManager.GetCurrentFirmwareVersion() != null
  16. ? UserError.Success
  17. : UserError.NoFirmware;
  18. return error is UserError.Success;
  19. }
  20. public static bool CanFixStartApplication(ContentManager contentManager, string baseApplicationPath, UserError error, out SystemVersion firmwareVersion)
  21. {
  22. try
  23. {
  24. firmwareVersion = contentManager.VerifyFirmwarePackage(baseApplicationPath);
  25. }
  26. catch (Exception)
  27. {
  28. firmwareVersion = null;
  29. }
  30. return error == UserError.NoFirmware && Path.GetExtension(baseApplicationPath).ToLowerInvariant() == ".xci" && firmwareVersion != null;
  31. }
  32. public static bool TryFixStartApplication(ContentManager contentManager, string baseApplicationPath, UserError error, out UserError outError)
  33. {
  34. if (error == UserError.NoFirmware)
  35. {
  36. string baseApplicationExtension = Path.GetExtension(baseApplicationPath).ToLowerInvariant();
  37. // If the target app to start is a XCI, try to install firmware from it
  38. if (baseApplicationExtension == ".xci")
  39. {
  40. SystemVersion firmwareVersion;
  41. try
  42. {
  43. firmwareVersion = contentManager.VerifyFirmwarePackage(baseApplicationPath);
  44. }
  45. catch (Exception)
  46. {
  47. firmwareVersion = null;
  48. }
  49. // The XCI is a valid firmware package, try to install the firmware from it!
  50. if (firmwareVersion != null)
  51. {
  52. try
  53. {
  54. Logger.Info?.Print(LogClass.Application, $"Installing firmware {firmwareVersion.VersionString}");
  55. contentManager.InstallFirmware(baseApplicationPath);
  56. Logger.Info?.Print(LogClass.Application, $"System version {firmwareVersion.VersionString} successfully installed.");
  57. outError = UserError.Success;
  58. return true;
  59. }
  60. catch
  61. {
  62. // ignored
  63. }
  64. }
  65. }
  66. }
  67. outError = error;
  68. return false;
  69. }
  70. public static bool CanStartApplication(ContentManager contentManager, string baseApplicationPath, out UserError error)
  71. {
  72. if (Directory.Exists(baseApplicationPath) || File.Exists(baseApplicationPath))
  73. {
  74. string baseApplicationExtension = Path.GetExtension(baseApplicationPath).ToLowerInvariant();
  75. // NOTE: We don't force homebrew developers to install a system firmware.
  76. if (baseApplicationExtension is ".nro" or ".nso")
  77. {
  78. error = UserError.Success;
  79. return true;
  80. }
  81. return IsFirmwareValid(contentManager, out error);
  82. }
  83. error = UserError.ApplicationNotFound;
  84. return false;
  85. }
  86. }
  87. }