Skip to content

Commit bdf1c4e

Browse files
committed
Merge branch 'upstream-master'
2 parents cc13cd1 + 32752e0 commit bdf1c4e

13 files changed

+281
-204
lines changed

XbTool/XbTool/Bdat/BdatTables.cs

+5-2
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
using System.Reflection;
66
using System.Text.RegularExpressions;
77
using LibHac;
8-
using LibHac.IO;
8+
using LibHac.Fs;
9+
using LibHac.FsSystem;
910
using XbTool.CodeGen;
1011
using XbTool.Common;
12+
using XbTool.Types;
1113

1214
namespace XbTool.Bdat
1315
{
@@ -104,7 +106,8 @@ public static BdatTable[] ReadAllBdats(IFileSystem fs, IProgressReport progress
104106
tables.AddRange(ReadBdatFile(new DataBuffer(fs.ReadFile("/bdat/common_gmk.bdat"), Game.XB2, 0), "/bdat/common_gmk.bdat"));
105107
tables.AddRange(ReadBdatFile(new DataBuffer(fs.ReadFile("/bdat/lookat.bdat"), Game.XB2, 0), "/bdat/lookat.bdat"));
106108

107-
string[] files = fs.OpenDirectory($"/bdat/{lang}", OpenDirectoryMode.Files).Read().Select(x => x.FullPath).ToArray();
109+
string[] files = fs.EnumerateEntries($"/bdat/{lang}", "*").Select(x => x.FullPath).ToArray();
110+
108111
progress?.SetTotal(files.Length);
109112

110113
foreach (string filename in files)

XbTool/XbTool/Common/Helpers.cs

+25-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
using System;
1+
using LibHac.Common;
2+
using LibHac.Fs;
3+
using LibHac.FsService.Creators;
4+
using LibHac.FsSystem;
5+
using System;
6+
using System.Collections;
7+
using System.Collections.Generic;
28
using System.IO;
3-
using LibHac.IO;
49

510
namespace XbTool.Common
611
{
@@ -76,11 +81,26 @@ public static int GetNextMultiple(int value, int multiple)
7681

7782
public static byte[] ReadFile(this IFileSystem fs, string path)
7883
{
79-
IFile file = fs.OpenFile(path, OpenMode.Read);
80-
var fileArr = new byte[file.GetSize()];
81-
file.Read(fileArr, 0);
84+
fs.OpenFile(out IFile file, path.ToU8Span(), OpenMode.Read);
85+
file.GetSize(out long size);
86+
var fileArr = new byte[size];
87+
file.Read(out _, 0, fileArr.AsSpan());
8288

8389
return fileArr;
8490
}
91+
92+
public static IDirectory OpenDirectory(this IFileSystem fs, string path, OpenDirectoryMode mode)
93+
{
94+
fs.OpenDirectory(out IDirectory outDir, path.ToU8Span(), mode);
95+
return outDir;
96+
}
97+
98+
public static IEnumerable<DirectoryEntry> Read(this IDirectory directory)
99+
{
100+
directory.GetEntryCount(out long entryCount);
101+
DirectoryEntry[] dirEntries = new DirectoryEntry[entryCount];
102+
directory.Read(out long _, dirEntries.AsSpan());
103+
return dirEntries;
104+
}
85105
}
86106
}

XbTool/XbTool/Gimmick/ExportMap.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
using System.Collections.Generic;
1+
using LibHac.Fs;
2+
using System.Collections.Generic;
23
using System.Drawing;
34
using System.Drawing.Drawing2D;
45
using System.Drawing.Imaging;
56
using System.IO;
67
using System.Text;
7-
using LibHac.IO;
88
using XbTool.Common;
99
using XbTool.Common.Textures;
1010
using XbTool.Xb2.Textures;

XbTool/XbTool/Gimmick/MapInfo.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
using System.Collections.Generic;
1+
using LibHac.Fs;
2+
using LibHac.FsSystem;
3+
using System.Collections.Generic;
24
using System.Diagnostics;
35
using System.IO;
46
using System.Linq;
5-
using LibHac.IO;
67
using XbTool.Common;
78

89
namespace XbTool.Gimmick
@@ -66,8 +67,7 @@ public MapAreaInfo GetContainingArea(Point3 point)
6667
public static Dictionary<string, MapInfo> ReadAll(IFileSystem fs)
6768
{
6869
var infos = new Dictionary<string, MapInfo>();
69-
IEnumerable<string> filenames = fs.OpenDirectory("/menu/minimap", OpenDirectoryMode.Files)
70-
.EnumerateEntries("*.mi", SearchOptions.Default).Select(x => x.FullPath);
70+
IEnumerable<string> filenames = fs.EnumerateEntries("/menu/minimap", "*.mi", SearchOptions.Default).Where(x=>x.Type == DirectoryEntryType.File).Select(x => x.FullPath);
7171

7272
foreach (string filename in filenames)
7373
{

XbTool/XbTool/Gimmick/ReadGmk.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
using System.Linq;
33
using System.Reflection;
44
using LibHac;
5-
using LibHac.IO;
5+
using LibHac.Fs;
6+
using LibHac.FsSystem;
67
using XbTool.Bdat;
78
using XbTool.Common;
89
using XbTool.Types;

XbTool/XbTool/Tasks.cs

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
using System;
1+
using LibHac.Fs;
2+
using LibHac.FsSystem;
3+
using System;
24
using System.IO;
35
using System.Linq;
4-
using LibHac.IO;
56
using XbTool.Bdat;
67
using XbTool.BdatString;
78
using XbTool.CodeGen;
@@ -467,8 +468,8 @@ private static void SdPrintTest(Options options)
467468
File.WriteAllLines(options.Output,
468469
fs.EnumerateEntries().Where(x => x.Type == DirectoryEntryType.File).Select(x => x.FullPath));
469470

470-
var localFs = new LocalFileSystem("output");
471-
fs.CopyFileSystem(localFs, options.Progress);
471+
//var localFs = new LocalFileSystem("output");
472+
//fs.CopyFileSystem(localFs, options.Progress);
472473
}
473474
private static void GiveMaps(Options options)
474475
{

XbTool/XbTool/Website/Generate.cs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
using System.IO;
2-
using LibHac;
3-
using LibHac.IO;
1+
using LibHac;
2+
using LibHac.Fs;
3+
using System.IO;
44
using XbTool.Bdat;
55
using XbTool.BdatString;
66
using XbTool.Gimmick;

XbTool/XbTool/Xb2/ArchiveDirectory.cs

+42-25
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,89 @@
1-
using System.Collections.Generic;
2-
using LibHac.IO;
3-
using LibHac.IO.RomFs;
1+
using LibHac;
2+
using LibHac.Common;
3+
using LibHac.Fs;
4+
using LibHac.FsSystem.RomFs;
5+
using System;
6+
using System.Collections.Generic;
7+
using System.Text;
48

59
namespace XbTool.Xb2
610
{
711
public class ArchiveDirectory : IDirectory
812
{
9-
IFileSystem IDirectory.ParentFileSystem => ParentFileSystem;
1013
public ArchiveFileSystem ParentFileSystem { get; }
1114
public string FullPath { get; }
1215
public OpenDirectoryMode Mode { get; }
1316

1417
private FindPosition InitialPosition { get; }
18+
private FindPosition _curPosition;
1519

1620
public ArchiveDirectory(ArchiveFileSystem fs, string path, FindPosition position, OpenDirectoryMode mode)
1721
{
1822
ParentFileSystem = fs;
1923
InitialPosition = position;
24+
_curPosition = position;
2025
FullPath = path;
2126
Mode = mode;
2227
}
2328

24-
public IEnumerable<DirectoryEntry> Read()
29+
public Result Read(out long entriesRead, Span<DirectoryEntry> entryBuffer)
2530
{
26-
FindPosition position = InitialPosition;
27-
HierarchicalRomFileTable tab = ParentFileSystem.FileTable;
31+
int i = 0;
32+
ref FindPosition position = ref _curPosition;
33+
HierarchicalRomFileTable<RomFileInfo> table = ParentFileSystem.FileTable;
2834

29-
if (Mode.HasFlag(OpenDirectoryMode.Directories))
35+
if (Mode.HasFlag(OpenDirectoryMode.Directory))
3036
{
31-
while (tab.FindNextDirectory(ref position, out string name))
37+
while (table.FindNextDirectory(ref position, out string name))
3238
{
33-
yield return new DirectoryEntry(name, FullPath + '/' + name, DirectoryEntryType.Directory, 0);
39+
if (i >= entryBuffer.Length)
40+
break;
41+
entryBuffer[i].Type = DirectoryEntryType.Directory;
42+
entryBuffer[i].Size = 0;
43+
StringUtils.Copy(entryBuffer[i].Name, Encoding.UTF8.GetBytes(name));
44+
i++;
3445
}
3546
}
36-
37-
if (Mode.HasFlag(OpenDirectoryMode.Files))
47+
if (Mode.HasFlag(OpenDirectoryMode.File))
3848
{
39-
while (tab.FindNextFile(ref position, out RomFileInfo info, out string name))
49+
while (table.FindNextFile(ref position, out RomFileInfo info, out string name))
4050
{
41-
yield return new DirectoryEntry(name, FullPath + '/' + name, DirectoryEntryType.File, info.Length);
51+
if (i >= entryBuffer.Length)
52+
break;
53+
entryBuffer[i].Type = DirectoryEntryType.File;
54+
entryBuffer[i].Size = info.Length;
55+
StringUtils.Copy(entryBuffer[i].Name, Encoding.UTF8.GetBytes(name));
56+
i++;
4257
}
4358
}
59+
60+
entriesRead = i;
61+
return Result.Success;
4462
}
4563

46-
public int GetEntryCount()
64+
public Result GetEntryCount(out long entryCount)
4765
{
48-
int count = 0;
49-
66+
entryCount = 0;
5067
FindPosition position = InitialPosition;
51-
HierarchicalRomFileTable tab = ParentFileSystem.FileTable;
68+
HierarchicalRomFileTable<RomFileInfo> table = ParentFileSystem.FileTable;
5269

53-
if (Mode.HasFlag(OpenDirectoryMode.Directories))
70+
if (Mode.HasFlag(OpenDirectoryMode.Directory))
5471
{
55-
while (tab.FindNextDirectory(ref position, out string _))
72+
while (table.FindNextDirectory(ref position, out string _))
5673
{
57-
count++;
74+
entryCount++;
5875
}
5976
}
6077

61-
if (Mode.HasFlag(OpenDirectoryMode.Files))
78+
if (Mode.HasFlag(OpenDirectoryMode.File))
6279
{
63-
while (tab.FindNextFile(ref position, out RomFileInfo _, out string _))
80+
while (table.FindNextFile(ref position, out RomFileInfo _, out string _))
6481
{
65-
count++;
82+
entryCount++;
6683
}
6784
}
6885

69-
return count;
86+
return Result.Success;
7087
}
7188
}
7289
}

XbTool/XbTool/Xb2/ArchiveFile.cs

+19-14
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
using System;
2-
using LibHac.IO;
1+
using LibHac;
2+
using LibHac.Fs;
3+
using System;
34

45
namespace XbTool.Xb2
56
{
@@ -14,41 +15,45 @@ public class ArchiveFile : FileBase
1415

1516
public ArchiveFile(byte[] file, OpenMode mode)
1617
{
17-
Mode = mode;
1818
FileData = file;
1919
IsCompressed = true;
2020
Size = file.Length;
2121
}
2222

2323
public ArchiveFile(IStorage baseStorage, long offset, long size)
2424
{
25-
Mode = OpenMode.Read;
2625
BaseStorage = baseStorage;
2726
Offset = offset;
2827
Size = size;
2928
}
3029

31-
public override int Read(Span<byte> destination, long offset)
30+
protected override Result ReadImpl(out long bytesRead, long offset, Span<byte> destination, ReadOption options)
3231
{
33-
int toRead = ValidateReadParamsAndGetSize(destination, offset);
32+
Result res = ValidateReadParams(out bytesRead, offset, destination.Length, OpenMode.Read);
33+
if (res.IsFailure())
34+
return res;
3435

3536
if (IsCompressed)
3637
{
37-
FileData.AsSpan((int)offset, toRead).CopyTo(destination);
38+
FileData.AsSpan((int)offset, (int)bytesRead).CopyTo(destination);
39+
res = Result.Success;
3840
}
3941
else
4042
{
4143
long storageOffset = Offset + offset;
42-
BaseStorage.Read(destination.Slice(0, toRead), storageOffset);
44+
res = BaseStorage.Read(storageOffset, destination.Slice(0, (int)bytesRead));
4345
}
4446

45-
return toRead;
47+
return res;
4648
}
4749

48-
public override long GetSize() => Size;
49-
public override void Flush() { }
50-
51-
public override void Write(ReadOnlySpan<byte> source, long offset) => throw new NotSupportedException();
52-
public override void SetSize(long size) => throw new NotSupportedException();
50+
protected override Result WriteImpl(long offset, ReadOnlySpan<byte> source, WriteOption options) => throw new NotSupportedException();
51+
protected override Result FlushImpl() => Result.Success;
52+
protected override Result SetSizeImpl(long size) => throw new NotSupportedException();
53+
protected override Result GetSizeImpl(out long size)
54+
{
55+
size = Size;
56+
return Result.Success;
57+
}
5358
}
5459
}

0 commit comments

Comments
 (0)