mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Add ProgramIndexMapInfoManager
This commit is contained in:
parent
004e46cacc
commit
0b050d2189
3 changed files with 131 additions and 0 deletions
13
src/LibHac/Fs/ProgramIndexMapInfo.cs
Normal file
13
src/LibHac/Fs/ProgramIndexMapInfo.cs
Normal file
|
@ -0,0 +1,13 @@
|
|||
using System.Runtime.InteropServices;
|
||||
using LibHac.Ncm;
|
||||
|
||||
namespace LibHac.Fs
|
||||
{
|
||||
[StructLayout(LayoutKind.Explicit, Size = 0x20)]
|
||||
public struct ProgramIndexMapInfo
|
||||
{
|
||||
[FieldOffset(0x00)] public ProgramId ProgramId;
|
||||
[FieldOffset(0x08)] public ProgramId MainProgramId;
|
||||
[FieldOffset(0x10)] public byte ProgramIndex;
|
||||
}
|
||||
}
|
103
src/LibHac/FsSrv/ProgramIndexMapInfoManager.cs
Normal file
103
src/LibHac/FsSrv/ProgramIndexMapInfoManager.cs
Normal file
|
@ -0,0 +1,103 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using LibHac.Fs;
|
||||
using LibHac.Ncm;
|
||||
|
||||
namespace LibHac.FsSrv
|
||||
{
|
||||
public class ProgramIndexMapInfoManager
|
||||
{
|
||||
private LinkedList<ProgramIndexMapInfo> MapEntries { get; } = new LinkedList<ProgramIndexMapInfo>();
|
||||
|
||||
/// <summary>
|
||||
/// Clears any existing
|
||||
/// </summary>
|
||||
/// <param name="entries">The entries </param>
|
||||
/// <returns><see cref="Result.Success"/>: The operation was successful.</returns>
|
||||
public Result Reset(ReadOnlySpan<ProgramIndexMapInfo> entries)
|
||||
{
|
||||
lock (MapEntries)
|
||||
{
|
||||
ClearImpl();
|
||||
|
||||
for (int i = 0; i < entries.Length; i++)
|
||||
{
|
||||
MapEntries.AddLast(entries[i]);
|
||||
}
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
}
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
lock (MapEntries)
|
||||
{
|
||||
ClearImpl();
|
||||
}
|
||||
}
|
||||
|
||||
public ProgramIndexMapInfo? Get(ProgramId programId)
|
||||
{
|
||||
lock (MapEntries)
|
||||
{
|
||||
return GetImpl((in ProgramIndexMapInfo x) => x.ProgramId == programId);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref="ProgramId"/> of the program with index <paramref name="programIndex"/> in the
|
||||
/// multi-program app <paramref name="programId"/> is part of.
|
||||
/// </summary>
|
||||
/// <param name="programId">A program ID in the multi-program app to query.</param>
|
||||
/// <param name="programIndex">The index of the program to get.</param>
|
||||
/// <returns>If the program exists, the ID of the program with the specified index,
|
||||
/// otherwise <see cref="ProgramId.InvalidId"/></returns>
|
||||
public ProgramId GetProgramId(ProgramId programId, byte programIndex)
|
||||
{
|
||||
lock (MapEntries)
|
||||
{
|
||||
ProgramIndexMapInfo? mainProgramMapInfo = GetImpl((in ProgramIndexMapInfo x) => x.ProgramId == programId);
|
||||
|
||||
if(!mainProgramMapInfo.HasValue)
|
||||
return ProgramId.InvalidId;
|
||||
|
||||
ProgramIndexMapInfo? requestedMapInfo = GetImpl((in ProgramIndexMapInfo x) =>
|
||||
x.MainProgramId == mainProgramMapInfo.Value.MainProgramId && x.ProgramIndex == programIndex);
|
||||
|
||||
if (!requestedMapInfo.HasValue)
|
||||
return ProgramId.InvalidId;
|
||||
|
||||
return requestedMapInfo.Value.ProgramId;
|
||||
}
|
||||
}
|
||||
|
||||
public int GetProgramCount()
|
||||
{
|
||||
lock (MapEntries)
|
||||
{
|
||||
return MapEntries.Count;
|
||||
}
|
||||
}
|
||||
|
||||
private delegate bool EntrySelector(in ProgramIndexMapInfo candidate);
|
||||
|
||||
private ProgramIndexMapInfo? GetImpl(EntrySelector selector)
|
||||
{
|
||||
foreach (ProgramIndexMapInfo entry in MapEntries)
|
||||
{
|
||||
if (selector(in entry))
|
||||
{
|
||||
return entry;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private void ClearImpl()
|
||||
{
|
||||
MapEntries.Clear();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -8,10 +8,12 @@ namespace LibHac.FsSrv
|
|||
public class ProgramRegistryServiceImpl
|
||||
{
|
||||
private ProgramRegistryManager RegistryManager { get; }
|
||||
private ProgramIndexMapInfoManager ProgramIndexManager { get; }
|
||||
|
||||
public ProgramRegistryServiceImpl(FileSystemServer fsServer)
|
||||
{
|
||||
RegistryManager = new ProgramRegistryManager(fsServer);
|
||||
ProgramIndexManager = new ProgramIndexMapInfoManager();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
@ -67,5 +69,18 @@ namespace LibHac.FsSrv
|
|||
{
|
||||
return RegistryManager.GetProgramInfoByProgramId(out programInfo, programId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the <see cref="ProgramId"/> of the program with index <paramref name="programIndex"/> in the
|
||||
/// multi-program app <paramref name="programId"/> is part of.
|
||||
/// </summary>
|
||||
/// <param name="programId">A program ID in the multi-program app to query.</param>
|
||||
/// <param name="programIndex">The index of the program to get.</param>
|
||||
/// <returns>If the program exists, the ID of the program with the specified index,
|
||||
/// otherwise <see cref="ProgramId.InvalidId"/></returns>
|
||||
public ProgramId GetProgramId(ProgramId programId, byte programIndex)
|
||||
{
|
||||
return ProgramIndexManager.GetProgramId(programId, programIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue