diff options
Diffstat (limited to 'Ryujinx.HLE/FileSystem')
| -rw-r--r-- | Ryujinx.HLE/FileSystem/Content/ContentManager.cs | 26 | ||||
| -rw-r--r-- | Ryujinx.HLE/FileSystem/Content/LocationEntry.cs | 2 | ||||
| -rw-r--r-- | Ryujinx.HLE/FileSystem/FileSystemProvider.cs | 313 | ||||
| -rw-r--r-- | Ryujinx.HLE/FileSystem/IFileSystemProvider.cs | 43 | ||||
| -rw-r--r-- | Ryujinx.HLE/FileSystem/PFsProvider.cs | 152 | ||||
| -rw-r--r-- | Ryujinx.HLE/FileSystem/RomFsProvider.cs | 169 |
6 files changed, 22 insertions, 683 deletions
diff --git a/Ryujinx.HLE/FileSystem/Content/ContentManager.cs b/Ryujinx.HLE/FileSystem/Content/ContentManager.cs index 94f06475..40109f1c 100644 --- a/Ryujinx.HLE/FileSystem/Content/ContentManager.cs +++ b/Ryujinx.HLE/FileSystem/Content/ContentManager.cs @@ -1,5 +1,5 @@ -using LibHac; -using LibHac.IO; +using LibHac.Fs; +using LibHac.Fs.NcaUtils; using Ryujinx.HLE.Utilities; using System; using System.Collections.Generic; @@ -13,6 +13,7 @@ namespace Ryujinx.HLE.FileSystem.Content private Dictionary<StorageId, LinkedList<LocationEntry>> _locationEntries; private Dictionary<string, long> _sharedFontTitleDictionary; + private Dictionary<string, string> _sharedFontFilenameDictionary; private SortedDictionary<(ulong, ContentType), string> _contentDictionary; @@ -33,6 +34,16 @@ namespace Ryujinx.HLE.FileSystem.Content { "FontNintendoExtended", 0x0100000000000810 } }; + _sharedFontFilenameDictionary = new Dictionary<string, string> + { + { "FontStandard", "nintendo_udsg-r_std_003.bfttf" }, + { "FontChineseSimplified", "nintendo_udsg-r_org_zh-cn_003.bfttf" }, + { "FontExtendedChineseSimplified", "nintendo_udsg-r_ext_zh-cn_003.bfttf" }, + { "FontKorean", "nintendo_udsg-r_ko_003.bfttf" }, + { "FontChineseTraditional", "nintendo_udjxh-db_zh-tw_003.bfttf" }, + { "FontNintendoExtended", "nintendo_ext_003.bfttf" } + }; + _device = device; } @@ -74,7 +85,7 @@ namespace Ryujinx.HLE.FileSystem.Content using (FileStream ncaFile = new FileStream(Directory.GetFiles(directoryPath)[0], FileMode.Open, FileAccess.Read)) { - Nca nca = new Nca(_device.System.KeySet, ncaFile.AsStorage(), false); + Nca nca = new Nca(_device.System.KeySet, ncaFile.AsStorage()); string switchPath = Path.Combine(contentPathString + ":", ncaFile.Name.Replace(contentDirectory, string.Empty).TrimStart('\\')); @@ -102,7 +113,7 @@ namespace Ryujinx.HLE.FileSystem.Content using (FileStream ncaFile = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { - Nca nca = new Nca(_device.System.KeySet, ncaFile.AsStorage(), false); + Nca nca = new Nca(_device.System.KeySet, ncaFile.AsStorage()); string switchPath = Path.Combine(contentPathString + ":", filePath.Replace(contentDirectory, string.Empty).TrimStart('\\')); @@ -230,7 +241,7 @@ namespace Ryujinx.HLE.FileSystem.Content { using (FileStream file = new FileStream(installedPath, FileMode.Open, FileAccess.Read)) { - Nca nca = new Nca(_device.System.KeySet, file.AsStorage(), false); + Nca nca = new Nca(_device.System.KeySet, file.AsStorage()); bool contentCheck = nca.Header.ContentType == contentType; return contentCheck; @@ -287,6 +298,11 @@ namespace Ryujinx.HLE.FileSystem.Content return _sharedFontTitleDictionary.TryGetValue(fontName, out titleId); } + public bool TryGetFontFilename(string fontName, out string filename) + { + return _sharedFontFilenameDictionary.TryGetValue(fontName, out filename); + } + private LocationEntry GetLocation(long titleId, ContentType contentType, StorageId storageId) { LinkedList<LocationEntry> locationList = _locationEntries[storageId]; diff --git a/Ryujinx.HLE/FileSystem/Content/LocationEntry.cs b/Ryujinx.HLE/FileSystem/Content/LocationEntry.cs index eabcfed8..2ab7ea80 100644 --- a/Ryujinx.HLE/FileSystem/Content/LocationEntry.cs +++ b/Ryujinx.HLE/FileSystem/Content/LocationEntry.cs @@ -1,4 +1,4 @@ -using LibHac; +using LibHac.Fs.NcaUtils; namespace Ryujinx.HLE.FileSystem.Content { diff --git a/Ryujinx.HLE/FileSystem/FileSystemProvider.cs b/Ryujinx.HLE/FileSystem/FileSystemProvider.cs deleted file mode 100644 index f5459eec..00000000 --- a/Ryujinx.HLE/FileSystem/FileSystemProvider.cs +++ /dev/null @@ -1,313 +0,0 @@ -using Ryujinx.HLE.HOS; -using Ryujinx.HLE.HOS.Services.FspSrv; -using Ryujinx.HLE.Utilities; -using System; -using System.Collections.Generic; -using System.IO; - -using static Ryujinx.HLE.HOS.ErrorCode; - -namespace Ryujinx.HLE.FileSystem -{ - class FileSystemProvider : IFileSystemProvider - { - private readonly string _basePath; - private readonly string _rootPath; - - public FileSystemProvider(string basePath, string rootPath) - { - _basePath = basePath; - _rootPath = rootPath; - - CheckIfDescendentOfRootPath(basePath); - } - - public long CreateDirectory(string name) - { - CheckIfDescendentOfRootPath(name); - - if (Directory.Exists(name)) - { - return MakeError(ErrorModule.Fs, FsErr.PathAlreadyExists); - } - - Directory.CreateDirectory(name); - - return 0; - } - - public long CreateFile(string name, long size) - { - CheckIfDescendentOfRootPath(name); - - if (File.Exists(name)) - { - return MakeError(ErrorModule.Fs, FsErr.PathAlreadyExists); - } - - using (FileStream newFile = File.Create(name)) - { - newFile.SetLength(size); - } - - return 0; - } - - public long DeleteDirectory(string name, bool recursive) - { - CheckIfDescendentOfRootPath(name); - - string dirName = name; - - if (!Directory.Exists(dirName)) - { - return MakeError(ErrorModule.Fs, FsErr.PathDoesNotExist); - } - - Directory.Delete(dirName, recursive); - - return 0; - } - - public long DeleteFile(string name) - { - CheckIfDescendentOfRootPath(name); - - if (!File.Exists(name)) - { - return MakeError(ErrorModule.Fs, FsErr.PathDoesNotExist); - } - else - { - File.Delete(name); - } - - return 0; - } - - public DirectoryEntry[] GetDirectories(string path) - { - CheckIfDescendentOfRootPath(path); - - List<DirectoryEntry> entries = new List<DirectoryEntry>(); - - foreach(string directory in Directory.EnumerateDirectories(path)) - { - DirectoryEntry directoryEntry = new DirectoryEntry(directory, DirectoryEntryType.Directory); - - entries.Add(directoryEntry); - } - - return entries.ToArray(); - } - - public DirectoryEntry[] GetEntries(string path) - { - CheckIfDescendentOfRootPath(path); - - if (Directory.Exists(path)) - { - List<DirectoryEntry> entries = new List<DirectoryEntry>(); - - foreach (string directory in Directory.EnumerateDirectories(path)) - { - DirectoryEntry directoryEntry = new DirectoryEntry(directory, DirectoryEntryType.Directory); - - entries.Add(directoryEntry); - } - - foreach (string file in Directory.EnumerateFiles(path)) - { - FileInfo fileInfo = new FileInfo(file); - DirectoryEntry directoryEntry = new DirectoryEntry(file, DirectoryEntryType.File, fileInfo.Length); - - entries.Add(directoryEntry); - } - - return entries.ToArray(); - } - - return null; - } - - public DirectoryEntry[] GetFiles(string path) - { - CheckIfDescendentOfRootPath(path); - - List<DirectoryEntry> entries = new List<DirectoryEntry>(); - - foreach (string file in Directory.EnumerateFiles(path)) - { - FileInfo fileInfo = new FileInfo(file); - DirectoryEntry directoryEntry = new DirectoryEntry(file, DirectoryEntryType.File, fileInfo.Length); - - entries.Add(directoryEntry); - } - - return entries.ToArray(); - } - - public long GetFreeSpace(ServiceCtx context) - { - return context.Device.FileSystem.GetDrive().AvailableFreeSpace; - } - - public string GetFullPath(string name) - { - if (name.StartsWith("//")) - { - name = name.Substring(2); - } - else if (name.StartsWith('/')) - { - name = name.Substring(1); - } - else - { - return null; - } - - string fullPath = Path.Combine(_basePath, name); - - CheckIfDescendentOfRootPath(fullPath); - - return fullPath; - } - - public long GetTotalSpace(ServiceCtx context) - { - return context.Device.FileSystem.GetDrive().TotalSize; - } - - public bool DirectoryExists(string name) - { - CheckIfDescendentOfRootPath(name); - - return Directory.Exists(name); - } - - public bool FileExists(string name) - { - CheckIfDescendentOfRootPath(name); - - return File.Exists(name); - } - - public long OpenDirectory(string name, int filterFlags, out IDirectory directoryInterface) - { - CheckIfDescendentOfRootPath(name); - - if (Directory.Exists(name)) - { - directoryInterface = new IDirectory(name, filterFlags, this); - - return 0; - } - - directoryInterface = null; - - return MakeError(ErrorModule.Fs, FsErr.PathDoesNotExist); - } - - public long OpenFile(string name, out IFile fileInterface) - { - CheckIfDescendentOfRootPath(name); - - if (File.Exists(name)) - { - FileStream stream = new FileStream(name, FileMode.Open); - - fileInterface = new IFile(stream, name); - - return 0; - } - - fileInterface = null; - - return MakeError(ErrorModule.Fs, FsErr.PathDoesNotExist); - } - - public long RenameDirectory(string oldName, string newName) - { - CheckIfDescendentOfRootPath(oldName); - CheckIfDescendentOfRootPath(newName); - - if (Directory.Exists(oldName)) - { - Directory.Move(oldName, newName); - } - else - { - return MakeError(ErrorModule.Fs, FsErr.PathDoesNotExist); - } - - return 0; - } - - public long RenameFile(string oldName, string newName) - { - CheckIfDescendentOfRootPath(oldName); - CheckIfDescendentOfRootPath(newName); - - if (File.Exists(oldName)) - { - File.Move(oldName, newName); - } - else - { - return MakeError(ErrorModule.Fs, FsErr.PathDoesNotExist); - } - - return 0; - } - - public void CheckIfDescendentOfRootPath(string path) - { - DirectoryInfo pathInfo = new DirectoryInfo(path); - DirectoryInfo rootInfo = new DirectoryInfo(_rootPath); - - while (pathInfo.Parent != null) - { - if (pathInfo.Parent.FullName == rootInfo.FullName) - { - return; - } - else - { - pathInfo = pathInfo.Parent; - } - } - - throw new InvalidOperationException($"Path {path} is not a child directory of {_rootPath}"); - } - - public FileTimestamp GetFileTimeStampRaw(string name) - { - CheckIfDescendentOfRootPath(name); - - DateTime creationDateTime = DateTime.UnixEpoch; - DateTime modifiedDateTime = DateTime.UnixEpoch; - DateTime lastAccessDateTime = DateTime.UnixEpoch; - - if (File.Exists(name)) - { - creationDateTime = File.GetCreationTime(name); - modifiedDateTime = File.GetLastWriteTime(name); - lastAccessDateTime = File.GetLastAccessTime(name); - } - else if (Directory.Exists(name)) - { - creationDateTime = Directory.GetCreationTime(name); - modifiedDateTime = Directory.GetLastWriteTime(name); - lastAccessDateTime = Directory.GetLastAccessTime(name); - } - - return new FileTimestamp - { - CreationDateTime = creationDateTime, - ModifiedDateTime = modifiedDateTime, - LastAccessDateTime = lastAccessDateTime - }; - } - } -} diff --git a/Ryujinx.HLE/FileSystem/IFileSystemProvider.cs b/Ryujinx.HLE/FileSystem/IFileSystemProvider.cs deleted file mode 100644 index 82cdebd9..00000000 --- a/Ryujinx.HLE/FileSystem/IFileSystemProvider.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Ryujinx.HLE.HOS; -using Ryujinx.HLE.HOS.Services.FspSrv; -using System; - -namespace Ryujinx.HLE.FileSystem -{ - interface IFileSystemProvider - { - long CreateFile(string name, long size); - - long CreateDirectory(string name); - - long RenameFile(string oldName, string newName); - - long RenameDirectory(string oldName, string newName); - - DirectoryEntry[] GetEntries(string path); - - DirectoryEntry[] GetDirectories(string path); - - DirectoryEntry[] GetFiles(string path); - - long DeleteFile(string name); - - long DeleteDirectory(string name, bool recursive); - - bool FileExists(string name); - - bool DirectoryExists(string name); - - long OpenFile(string name, out IFile fileInterface); - - long OpenDirectory(string name, int filterFlags, out IDirectory directoryInterface); - - string GetFullPath(string name); - - long GetFreeSpace(ServiceCtx context); - - long GetTotalSpace(ServiceCtx context); - - FileTimestamp GetFileTimeStampRaw(string name); - } -} diff --git a/Ryujinx.HLE/FileSystem/PFsProvider.cs b/Ryujinx.HLE/FileSystem/PFsProvider.cs deleted file mode 100644 index 69e7a9b8..00000000 --- a/Ryujinx.HLE/FileSystem/PFsProvider.cs +++ /dev/null @@ -1,152 +0,0 @@ -using LibHac; -using LibHac.IO; -using Ryujinx.HLE.HOS; -using Ryujinx.HLE.HOS.Services.FspSrv; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -using static Ryujinx.HLE.HOS.ErrorCode; - -namespace Ryujinx.HLE.FileSystem -{ - class PFsProvider : IFileSystemProvider - { - private Pfs _pfs; - - public PFsProvider(Pfs pfs) - { - _pfs = pfs; - } - - public long CreateDirectory(string name) - { - throw new NotSupportedException(); - } - - public long CreateFile(string name, long size) - { - throw new NotSupportedException(); - } - - public long DeleteDirectory(string name, bool recursive) - { - throw new NotSupportedException(); - } - - public long DeleteFile(string name) - { - throw new NotSupportedException(); - } - - public DirectoryEntry[] GetDirectories(string path) - { - return new DirectoryEntry[0]; - } - - public DirectoryEntry[] GetEntries(string path) - { - List<DirectoryEntry> entries = new List<DirectoryEntry>(); - - foreach (PfsFileEntry file in _pfs.Files) - { - DirectoryEntry directoryEntry = new DirectoryEntry(file.Name, DirectoryEntryType.File, file.Size); - - entries.Add(directoryEntry); - } - - return entries.ToArray(); - } - - public DirectoryEntry[] GetFiles(string path) - { - List<DirectoryEntry> entries = new List<DirectoryEntry>(); - - foreach (PfsFileEntry file in _pfs.Files) - { - DirectoryEntry directoryEntry = new DirectoryEntry(file.Name, DirectoryEntryType.File, file.Size); - - entries.Add(directoryEntry); - } - - return entries.ToArray(); - } - - public long GetFreeSpace(ServiceCtx context) - { - return 0; - } - - public string GetFullPath(string name) - { - return name; - } - - public long GetTotalSpace(ServiceCtx context) - { - return _pfs.Files.Sum(x => x.Size); - } - - public bool DirectoryExists(string name) - { - return name == "/"; - } - - public bool FileExists(string name) - { - name = name.TrimStart('/'); - - return _pfs.FileExists(name); - } - - public long OpenDirectory(string name, int filterFlags, out IDirectory directoryInterface) - { - if (name == "/") - { - directoryInterface = new IDirectory(name, filterFlags, this); - - return 0; - } - - throw new NotSupportedException(); - } - - public long OpenFile(string name, out IFile fileInterface) - { - name = name.TrimStart('/'); - - if (_pfs.FileExists(name)) - { - Stream stream = _pfs.OpenFile(name).AsStream(); - fileInterface = new IFile(stream, name); - - return 0; - } - - fileInterface = null; - - return MakeError(ErrorModule.Fs, FsErr.PathDoesNotExist); - } - - public long RenameDirectory(string oldName, string newName) - { - throw new NotSupportedException(); - } - - public long RenameFile(string oldName, string newName) - { - throw new NotSupportedException(); - } - - public void CheckIfOutsideBasePath(string path) - { - throw new NotSupportedException(); - } - - public FileTimestamp GetFileTimeStampRaw(string name) - { - throw new NotImplementedException(); - } - } -} diff --git a/Ryujinx.HLE/FileSystem/RomFsProvider.cs b/Ryujinx.HLE/FileSystem/RomFsProvider.cs deleted file mode 100644 index f64d99c7..00000000 --- a/Ryujinx.HLE/FileSystem/RomFsProvider.cs +++ /dev/null @@ -1,169 +0,0 @@ -using LibHac; -using LibHac.IO; -using Ryujinx.HLE.HOS; -using Ryujinx.HLE.HOS.Services.FspSrv; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -using static Ryujinx.HLE.HOS.ErrorCode; - -namespace Ryujinx.HLE.FileSystem -{ - class RomFsProvider : IFileSystemProvider - { - private Romfs _romFs; - - public RomFsProvider(LibHac.IO.IStorage storage) - { - _romFs = new Romfs(storage); - } - - public long CreateDirectory(string name) - { - throw new NotSupportedException(); - } - - public long CreateFile(string name, long size) - { - throw new NotSupportedException(); - } - - public long DeleteDirectory(string name, bool recursive) - { - throw new NotSupportedException(); - } - - public long DeleteFile(string name) - { - throw new NotSupportedException(); - } - - public DirectoryEntry[] GetDirectories(string path) - { - List<DirectoryEntry> directories = new List<DirectoryEntry>(); - - foreach(RomfsDir directory in _romFs.Directories) - { - DirectoryEntry directoryEntry = new DirectoryEntry(directory.Name, DirectoryEntryType.Directory); - - directories.Add(directoryEntry); - } - - return directories.ToArray(); - } - - public DirectoryEntry[] GetEntries(string path) - { - List<DirectoryEntry> entries = new List<DirectoryEntry>(); - - foreach (RomfsDir directory in _romFs.Directories) - { - DirectoryEntry directoryEntry = new DirectoryEntry(directory.Name, DirectoryEntryType.Directory); - - entries.Add(directoryEntry); - } - - foreach (RomfsFile file in _romFs.Files) - { - DirectoryEntry directoryEntry = new DirectoryEntry(file.Name, DirectoryEntryType.File, file.DataLength); - - entries.Add(directoryEntry); - } - - return entries.ToArray(); - } - - public DirectoryEntry[] GetFiles(string path) - { - List<DirectoryEntry> files = new List<DirectoryEntry>(); - - foreach (RomfsFile file in _romFs.Files) - { - DirectoryEntry directoryEntry = new DirectoryEntry(file.Name, DirectoryEntryType.File, file.DataLength); - - files.Add(directoryEntry); - } - - return files.ToArray(); - } - - public long GetFreeSpace(ServiceCtx context) - { - return 0; - } - - public string GetFullPath(string name) - { - return name; - } - - public long GetTotalSpace(ServiceCtx context) - { - return _romFs.Files.Sum(x => x.DataLength); - } - - public bool DirectoryExists(string name) - { - return _romFs.Directories.Exists(x=>x.Name == name); - } - - public bool FileExists(string name) - { - return _romFs.FileExists(name); - } - - public long OpenDirectory(string name, int filterFlags, out IDirectory directoryInterface) - { - RomfsDir directory = _romFs.Directories.Find(x => x.Name == name); - - if (directory != null) - { - directoryInterface = new IDirectory(name, filterFlags, this); - - return 0; - } - - directoryInterface = null; - - return MakeError(ErrorModule.Fs, FsErr.PathDoesNotExist); - } - - public long OpenFile(string name, out IFile fileInterface) - { - if (_romFs.FileExists(name)) - { - Stream stream = _romFs.OpenFile(name).AsStream(); - - fileInterface = new IFile(stream, name); - - return 0; - } - - fileInterface = null; - - return MakeError(ErrorModule.Fs, FsErr.PathDoesNotExist); - } - - public long RenameDirectory(string oldName, string newName) - { - throw new NotSupportedException(); - } - - public long RenameFile(string oldName, string newName) - { - throw new NotSupportedException(); - } - - public void CheckIfOutsideBasePath(string path) - { - throw new NotSupportedException(); - } - - public FileTimestamp GetFileTimeStampRaw(string name) - { - throw new NotImplementedException(); - } - } -} |
