e3b36db71c
* hle: Some cleanup This PR cleaned up a bit the HLE folder and the VirtualFileSystem one, since we use LibHac, we can use some class of it directly instead of duplicate things. The "Content" of VFS folder is removed since it should be handled in the NCM service directly. A larger cleanup should be done later since there is still be duplicated code here and there. * Fix Headless.SDL2 * Addresses gdkchan feedback
119 lines
3.9 KiB
C#
119 lines
3.9 KiB
C#
using Ryujinx.Common.Logging;
|
|
using Ryujinx.HLE.FileSystem;
|
|
using Ryujinx.Ui.Widgets;
|
|
using System;
|
|
using System.IO;
|
|
|
|
namespace Ryujinx.Ui.Helper
|
|
{
|
|
/// <summary>
|
|
/// Ensure installation validity
|
|
/// </summary>
|
|
static class SetupValidator
|
|
{
|
|
public static bool IsFirmwareValid(ContentManager contentManager, out UserError error)
|
|
{
|
|
bool hasFirmware = contentManager.GetCurrentFirmwareVersion() != null;
|
|
|
|
if (hasFirmware)
|
|
{
|
|
error = UserError.Success;
|
|
|
|
return true;
|
|
}
|
|
else
|
|
{
|
|
error = UserError.NoFirmware;
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static bool CanFixStartApplication(ContentManager contentManager, string baseApplicationPath, UserError error, out SystemVersion firmwareVersion)
|
|
{
|
|
try
|
|
{
|
|
firmwareVersion = contentManager.VerifyFirmwarePackage(baseApplicationPath);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
firmwareVersion = null;
|
|
}
|
|
|
|
return error == UserError.NoFirmware && Path.GetExtension(baseApplicationPath).ToLowerInvariant() == ".xci" && firmwareVersion != null;
|
|
}
|
|
|
|
public static bool TryFixStartApplication(ContentManager contentManager, string baseApplicationPath, UserError error, out UserError outError)
|
|
{
|
|
if (error == UserError.NoFirmware)
|
|
{
|
|
string baseApplicationExtension = Path.GetExtension(baseApplicationPath).ToLowerInvariant();
|
|
|
|
// If the target app to start is a XCI, try to install firmware from it
|
|
if (baseApplicationExtension == ".xci")
|
|
{
|
|
SystemVersion firmwareVersion;
|
|
|
|
try
|
|
{
|
|
firmwareVersion = contentManager.VerifyFirmwarePackage(baseApplicationPath);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
firmwareVersion = null;
|
|
}
|
|
|
|
// The XCI is a valid firmware package, try to install the firmware from it!
|
|
if (firmwareVersion != null)
|
|
{
|
|
try
|
|
{
|
|
Logger.Info?.Print(LogClass.Application, $"Installing firmware {firmwareVersion.VersionString}");
|
|
|
|
contentManager.InstallFirmware(baseApplicationPath);
|
|
|
|
Logger.Info?.Print(LogClass.Application, $"System version {firmwareVersion.VersionString} successfully installed.");
|
|
|
|
outError = UserError.Success;
|
|
|
|
return true;
|
|
}
|
|
catch (Exception) { }
|
|
}
|
|
|
|
outError = error;
|
|
|
|
return false;
|
|
}
|
|
}
|
|
|
|
outError = error;
|
|
|
|
return false;
|
|
}
|
|
|
|
public static bool CanStartApplication(ContentManager contentManager, string baseApplicationPath, out UserError error)
|
|
{
|
|
if (Directory.Exists(baseApplicationPath) || File.Exists(baseApplicationPath))
|
|
{
|
|
string baseApplicationExtension = Path.GetExtension(baseApplicationPath).ToLowerInvariant();
|
|
|
|
// NOTE: We don't force homebrew developers to install a system firmware.
|
|
if (baseApplicationExtension == ".nro" || baseApplicationExtension == ".nso")
|
|
{
|
|
error = UserError.Success;
|
|
|
|
return true;
|
|
}
|
|
|
|
return IsFirmwareValid(contentManager, out error);
|
|
}
|
|
else
|
|
{
|
|
error = UserError.ApplicationNotFound;
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
}
|