SetupValidator.cs 3.9 KB

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