diff options
author | emmauss <emmausssss@gmail.com> | 2018-11-18 21:37:41 +0200 |
---|---|---|
committer | gdkchan <gab.dark.100@gmail.com> | 2018-11-18 17:37:41 -0200 |
commit | fe8fbb6fb9b85a528ddfa4848ec8e35fd9a5e9a5 (patch) | |
tree | 7cd33a50d1ebc98e467df93aeb86315679110778 /Ryujinx.HLE/FileSystem/PFsProvider.cs | |
parent | e603b7afbcdff0fc732304872f5a65d410c601f9 (diff) |
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
Diffstat (limited to 'Ryujinx.HLE/FileSystem/PFsProvider.cs')
-rw-r--r-- | Ryujinx.HLE/FileSystem/PFsProvider.cs | 146 |
1 files changed, 146 insertions, 0 deletions
diff --git a/Ryujinx.HLE/FileSystem/PFsProvider.cs b/Ryujinx.HLE/FileSystem/PFsProvider.cs new file mode 100644 index 00000000..c901f073 --- /dev/null +++ b/Ryujinx.HLE/FileSystem/PFsProvider.cs @@ -0,0 +1,146 @@ +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 PFsProvider : IFileSystemProvider + { + private Pfs Pfs; + + public PFsProvider(Pfs Pfs) + { + this.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 == "/" ? true : false; + } + + 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); + 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(); + } + } +} |