SaveModel.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. using LibHac;
  2. using LibHac.Fs;
  3. using LibHac.Fs.Shim;
  4. using LibHac.Ncm;
  5. using Ryujinx.Ava.Common;
  6. using Ryujinx.Ava.Common.Locale;
  7. using Ryujinx.Ava.UI.Helpers;
  8. using Ryujinx.Ava.UI.ViewModels;
  9. using Ryujinx.Ava.UI.Windows;
  10. using Ryujinx.HLE.FileSystem;
  11. using System.IO;
  12. using System.Linq;
  13. using System.Threading.Tasks;
  14. namespace Ryujinx.Ava.UI.Models
  15. {
  16. public class SaveModel : BaseModel
  17. {
  18. private readonly HorizonClient _horizonClient;
  19. private long _size;
  20. public ulong SaveId { get; }
  21. public ProgramId TitleId { get; }
  22. public string TitleIdString => $"{TitleId.Value:X16}";
  23. public UserId UserId { get; }
  24. public bool InGameList { get; }
  25. public string Title { get; }
  26. public byte[] Icon { get; }
  27. public long Size
  28. {
  29. get => _size; set
  30. {
  31. _size = value;
  32. SizeAvailable = true;
  33. OnPropertyChanged();
  34. OnPropertyChanged(nameof(SizeString));
  35. OnPropertyChanged(nameof(SizeAvailable));
  36. }
  37. }
  38. public bool SizeAvailable { get; set; }
  39. public string SizeString => $"{((float)_size * 0.000000954):0.###}MB";
  40. public SaveModel(SaveDataInfo info, HorizonClient horizonClient, VirtualFileSystem virtualFileSystem)
  41. {
  42. _horizonClient = horizonClient;
  43. SaveId = info.SaveDataId;
  44. TitleId = info.ProgramId;
  45. UserId = info.UserId;
  46. var appData = MainWindow.MainWindowViewModel.Applications.FirstOrDefault(x => x.TitleId.ToUpper() == TitleIdString);
  47. InGameList = appData != null;
  48. if (InGameList)
  49. {
  50. Icon = appData.Icon;
  51. Title = appData.TitleName;
  52. }
  53. else
  54. {
  55. var appMetadata = MainWindow.MainWindowViewModel.ApplicationLibrary.LoadAndSaveMetaData(TitleIdString);
  56. Title = appMetadata.Title ?? TitleIdString;
  57. }
  58. Task.Run(() =>
  59. {
  60. var saveRoot = System.IO.Path.Combine(virtualFileSystem.GetNandPath(), $"user/save/{info.SaveDataId:x16}");
  61. long total_size = GetDirectorySize(saveRoot);
  62. long GetDirectorySize(string path)
  63. {
  64. long size = 0;
  65. if (Directory.Exists(path))
  66. {
  67. var directories = Directory.GetDirectories(path);
  68. foreach (var directory in directories)
  69. {
  70. size += GetDirectorySize(directory);
  71. }
  72. var files = Directory.GetFiles(path);
  73. foreach (var file in files)
  74. {
  75. size += new FileInfo(file).Length;
  76. }
  77. }
  78. return size;
  79. }
  80. Size = total_size;
  81. });
  82. }
  83. }
  84. }