From fe8fbb6fb9b85a528ddfa4848ec8e35fd9a5e9a5 Mon Sep 17 00:00:00 2001 From: emmauss Date: Sun, 18 Nov 2018 21:37:41 +0200 Subject: Implement ContentManager and related services (#438) * Implement contentmanager and related services * small changes * read system firmware version from nand * add pfs support, write directoryentry info for romfs files * add file check in fsp-srv:8 * add support for open fs of internal files * fix filename when accessing pfs * use switch style paths for contentpath * close nca after verifying type * removed publishing profiles, align directory entry * fix style * lots of style fixes * yasf(yet another style fix) * yasf(yet another style fix) plus symbols * enforce path check on every fs access * change enum type to default * fix typo --- Ryujinx.HLE/FileSystem/RomFsProvider.cs | 163 ++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 Ryujinx.HLE/FileSystem/RomFsProvider.cs (limited to 'Ryujinx.HLE/FileSystem/RomFsProvider.cs') diff --git a/Ryujinx.HLE/FileSystem/RomFsProvider.cs b/Ryujinx.HLE/FileSystem/RomFsProvider.cs new file mode 100644 index 00000000..d966d3d7 --- /dev/null +++ b/Ryujinx.HLE/FileSystem/RomFsProvider.cs @@ -0,0 +1,163 @@ +using LibHac; +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(Stream StorageStream) + { + RomFs = new Romfs(StorageStream); + } + + 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 Directories = new List(); + + 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 Entries = new List(); + + 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 Files = new List(); + + 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); + + 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(); + } + } +} -- cgit v1.2.3