diff --git a/src/LibHac/FileSystem/IFileSystem.cs b/src/LibHac/FileSystem/IFileSystem.cs index ea4417ae..b601d266 100644 --- a/src/LibHac/FileSystem/IFileSystem.cs +++ b/src/LibHac/FileSystem/IFileSystem.cs @@ -50,10 +50,10 @@ namespace LibHac public abstract class IFileSytemEntry { - public abstract IFileSystem FileSystem { get; } - public abstract string Path { get; } + public abstract IFileSystem FileSystem { get; protected set; } + public abstract string Path { get; protected set; } public virtual string Name => System.IO.Path.GetFileName(Path); - public abstract bool Exists { get; } + public virtual bool Exists { get; protected set; } public IDirectory Parent { @@ -68,19 +68,18 @@ namespace LibHac } - public class IDirectory : IFileSytemEntry + public abstract class IDirectory : IFileSytemEntry { - public override IFileSystem FileSystem { get; } - public override string Path { get; } + public override IFileSystem FileSystem { get; protected set; } + public override string Path { get; protected set; } public override bool Exists => FileSystem.DirectoryExists(this); public IFile[] Files => FileSystem.GetFiles(this); public IDirectory[] Directories => FileSystem.GetDirectories(this); - public IDirectory(IFileSystem filesystem, string path) + public IDirectory(IFileSystem filesystem) { FileSystem = filesystem; - Path = path; } public IFile GetFile(string path) @@ -104,20 +103,27 @@ namespace LibHac } } + public class Directory : IDirectory + { + public Directory(IFileSystem fileSystem, string path) : base(fileSystem) + { + Path = path; + } + } + public class IFile : IFileSytemEntry { - public override IFileSystem FileSystem { get; } - public override string Path { get; } + public override IFileSystem FileSystem { get; protected set; } + public override string Path { get; protected set; } public override bool Exists => FileSystem.FileExists(this); public string Extension => System.IO.Path.GetExtension(Path); public string FileName => System.IO.Path.GetFileName(Path); public long Length => FileSystem.GetSize(this); - public IFile(IFileSystem filesystem, string path) + public IFile(IFileSystem filesystem) { FileSystem = filesystem; - Path = path; } public IStorage Open(FileMode mode) @@ -140,5 +146,13 @@ namespace LibHac { return base.GetHashCode(); } + + public class File : IFile + { + public File(IFileSystem fileSystem, string path) : base(fileSystem) + { + Path = path; + } + } } } diff --git a/src/LibHac/Romfs.cs b/src/LibHac/Romfs.cs index 25bc1ae2..8c382b4a 100644 --- a/src/LibHac/Romfs.cs +++ b/src/LibHac/Romfs.cs @@ -6,8 +6,10 @@ using LibHac.IO; namespace LibHac { - public class Romfs + public class Romfs : IFileSystem { + public const string Delimiter = "/"; + public new string PathSeperator = Romfs.Delimiter; public const int IvfcMaxLevel = 6; public RomfsHeader Header { get; } public List Directories { get; } = new List(); @@ -37,7 +39,7 @@ namespace LibHac int position = 0; while (position + 20 < Header.DirMetaTableSize) { - var dir = new RomfsDir(reader) { Offset = position }; + var dir = new RomfsDir(reader, this) { Offset = position }; Directories.Add(dir); if (dir.ParentDirOffset == position) RootDir = dir; position = (int)reader.BaseStream.Position; diff --git a/src/LibHac/RomfsEntry.cs b/src/LibHac/RomfsEntry.cs index 1fa90653..9b33f907 100644 --- a/src/LibHac/RomfsEntry.cs +++ b/src/LibHac/RomfsEntry.cs @@ -5,30 +5,31 @@ using System.Text; namespace LibHac { - public abstract class RomfsEntry + public abstract class RomfsEntry : IFileSytemEntry { + private const string PathSeperator = "/"; public int Offset { get; set; } public int ParentDirOffset { get; protected set; } public int NameLength { get; protected set; } - public string Name { get; protected set; } + public new string Name { get; protected set; } - public RomfsDir ParentDir { get; internal set; } - public string FullPath { get; private set; } + public new IDirectory Parent { get; internal set; } + public override string Path { get; protected set; } internal static void ResolveFilenames(IEnumerable entries) { var list = new List(); var sb = new StringBuilder(); - const string delimiter = "/"; + const string delimiter = RomfsEntry.PathSeperator; foreach (RomfsEntry file in entries) { list.Add(file.Name); - RomfsDir dir = file.ParentDir; + RomfsDir dir = file.Parent as RomfsDir; while (dir != null) { list.Add(delimiter); list.Add(dir.Name); - dir = dir.ParentDir; + dir = dir.Parent as RomfsDir; } for (int i = list.Count - 1; i >= 0; i--) @@ -36,7 +37,7 @@ namespace LibHac sb.Append(list[i]); } - file.FullPath = sb.ToString(); + file.Path = sb.ToString(); list.Clear(); sb.Clear(); } @@ -44,7 +45,7 @@ namespace LibHac } [DebuggerDisplay("{" + nameof(Name) + "}")] - public class RomfsDir : RomfsEntry + public class RomfsDir : Directory { public int NextSiblingOffset { get; } public int FirstChildOffset { get; } @@ -56,8 +57,9 @@ namespace LibHac public RomfsFile FirstFile { get; internal set; } public RomfsDir NextDirHash { get; internal set; } - public RomfsDir(BinaryReader reader) + public RomfsDir(BinaryReader reader, IFileSystem fs) : base(fs) { + FileSystem = fs; ParentDirOffset = reader.ReadInt32(); NextSiblingOffset = reader.ReadInt32(); FirstChildOffset = reader.ReadInt32();