mirror of
https://github.com/Thealexbarney/LibHac.git
synced 2024-11-14 10:49:41 +01:00
Fix usages of SharedRef/UniqueRef
This commit is contained in:
parent
f9f31056ef
commit
257bdf0c46
20 changed files with 53 additions and 36 deletions
|
@ -4,7 +4,7 @@ using System.Threading;
|
|||
using InlineIL;
|
||||
using LibHac.Diag;
|
||||
|
||||
#pragma warning disable LH0001, LH0002, LH0003, LH0004, LH0005
|
||||
#pragma warning disable LH0001
|
||||
|
||||
namespace LibHac.Common
|
||||
{
|
||||
|
|
|
@ -5,6 +5,7 @@ using static LibHac.Fs.StringTraits;
|
|||
|
||||
namespace LibHac.Fs.Common
|
||||
{
|
||||
[NonCopyableDisposable]
|
||||
public ref struct DirectoryPathParser
|
||||
{
|
||||
private Span<byte> _buffer;
|
||||
|
@ -48,10 +49,10 @@ namespace LibHac.Fs.Common
|
|||
}
|
||||
|
||||
// Todo: Return reference when escape semantics are better
|
||||
public readonly Path GetCurrentPath()
|
||||
{
|
||||
return CurrentPath;
|
||||
}
|
||||
//public ref readonly Path GetCurrentPath()
|
||||
//{
|
||||
// return ref CurrentPath;
|
||||
//}
|
||||
|
||||
public Result ReadNext(out bool isFinished)
|
||||
{
|
||||
|
|
|
@ -1077,7 +1077,7 @@ namespace LibHac.Fs
|
|||
}
|
||||
}
|
||||
|
||||
public override string ToString() => StringUtils.Utf8ZToString(_string);
|
||||
public override readonly string ToString() => StringUtils.Utf8ZToString(_string);
|
||||
|
||||
public override bool Equals(object obj) => throw new NotSupportedException();
|
||||
public override int GetHashCode() => throw new NotImplementedException();
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using LibHac.Common;
|
||||
using LibHac.Fs.Fsa;
|
||||
using LibHac.Fs.Shim;
|
||||
using LibHac.FsSystem;
|
||||
|
@ -23,6 +24,7 @@ namespace LibHac.Fs
|
|||
}
|
||||
}
|
||||
|
||||
[NonCopyable]
|
||||
internal struct FileSystemClientGlobals : IDisposable
|
||||
{
|
||||
public HorizonClient Hos;
|
||||
|
|
|
@ -175,7 +175,7 @@ namespace LibHac.Fs.Shim
|
|||
fs.Impl.AbortIfNeeded(rc);
|
||||
if (rc.IsFailure()) return rc;
|
||||
|
||||
var storageAdapter = new UniqueRef<IStorage>(new StorageServiceObjectAdapter(ref storage.Ref()));
|
||||
using var storageAdapter = new UniqueRef<IStorage>(new StorageServiceObjectAdapter(ref storage.Ref()));
|
||||
|
||||
if (!storageAdapter.HasValue)
|
||||
return ResultFs.AllocationMemoryFailedInBisC.Log();
|
||||
|
|
|
@ -76,7 +76,7 @@ namespace LibHac.Fs.Shim
|
|||
programId);
|
||||
if (rc.IsFailure()) return rc;
|
||||
|
||||
var fileSystemAdapter =
|
||||
using var fileSystemAdapter =
|
||||
new UniqueRef<IFileSystem>(new FileSystemServiceObjectAdapter(ref fileSystem.Ref()));
|
||||
|
||||
if (!fileSystemAdapter.HasValue)
|
||||
|
|
|
@ -501,12 +501,12 @@ namespace LibHac.Fs.Shim
|
|||
Result rc = fileSystemProxy.Get.OpenSaveDataInfoReaderBySaveDataSpaceId(ref reader.Ref(), spaceId);
|
||||
if (rc.IsFailure()) return rc;
|
||||
|
||||
var iterator = new UniqueRef<SaveDataIterator>(new SaveDataIterator(fs.Fs, ref reader.Ref()));
|
||||
using var iterator = new UniqueRef<SaveDataIterator>(new SaveDataIterator(fs.Fs, ref reader.Ref()));
|
||||
|
||||
if (!iterator.HasValue)
|
||||
return ResultFs.AllocationMemoryFailedInSaveDataManagementA.Log();
|
||||
|
||||
outIterator.Set(ref iterator);
|
||||
outIterator.Set(ref iterator.Ref());
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
|
@ -520,12 +520,12 @@ namespace LibHac.Fs.Shim
|
|||
Result rc = fileSystemProxy.Get.OpenSaveDataInfoReaderWithFilter(ref reader.Ref(), spaceId, in filter);
|
||||
if (rc.IsFailure()) return rc;
|
||||
|
||||
var iterator = new UniqueRef<SaveDataIterator>(new SaveDataIterator(fs.Fs, ref reader.Ref()));
|
||||
using var iterator = new UniqueRef<SaveDataIterator>(new SaveDataIterator(fs.Fs, ref reader.Ref()));
|
||||
|
||||
if (!iterator.HasValue)
|
||||
return ResultFs.AllocationMemoryFailedInSaveDataManagementA.Log();
|
||||
|
||||
outIterator.Set(ref iterator);
|
||||
outIterator.Set(ref iterator.Ref());
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
|
|
|
@ -180,8 +180,13 @@ namespace LibHac.FsSrv
|
|||
_currentProcess = processId;
|
||||
|
||||
// Initialize the NCA file system service
|
||||
_ncaFsService = NcaFileSystemService.CreateShared(Globals.NcaFileSystemServiceImpl, processId);
|
||||
_saveFsService = SaveDataFileSystemService.CreateShared(Globals.SaveDataFileSystemServiceImpl, processId);
|
||||
using SharedRef<NcaFileSystemService> ncaFsService =
|
||||
NcaFileSystemService.CreateShared(Globals.NcaFileSystemServiceImpl, processId);
|
||||
_ncaFsService.SetByMove(ref ncaFsService.Ref());
|
||||
|
||||
using SharedRef<SaveDataFileSystemService> saveFsService =
|
||||
SaveDataFileSystemService.CreateShared(Globals.SaveDataFileSystemServiceImpl, processId);
|
||||
_saveFsService.SetByMove(ref saveFsService.Ref());
|
||||
|
||||
return Result.Success;
|
||||
}
|
||||
|
|
|
@ -461,7 +461,7 @@ namespace LibHac.FsSrv
|
|||
return rc;
|
||||
|
||||
// Delete the actual save data.
|
||||
Path saveDataRootPath = _saveDataRootPath.DangerousGetPath();
|
||||
using Path saveDataRootPath = _saveDataRootPath.DangerousGetPath();
|
||||
rc = _serviceImpl.DeleteSaveDataFileSystem(spaceId, saveDataId, wipeSaveFile, in saveDataRootPath);
|
||||
if (rc.IsFailure() && !ResultFs.PathNotFound.Includes(rc))
|
||||
return rc;
|
||||
|
@ -774,7 +774,7 @@ namespace LibHac.FsSrv
|
|||
}
|
||||
|
||||
// After the new save was added to the save indexer, create the save data file or directory.
|
||||
Path saveDataRootPath = _saveDataRootPath.DangerousGetPath();
|
||||
using Path saveDataRootPath = _saveDataRootPath.DangerousGetPath();
|
||||
rc = _serviceImpl.CreateSaveDataFileSystem(saveDataId, in attribute, in creationInfo,
|
||||
in saveDataRootPath, in hashSalt, false);
|
||||
|
||||
|
@ -1020,7 +1020,7 @@ namespace LibHac.FsSrv
|
|||
}
|
||||
|
||||
// Open the save data using its ID
|
||||
Path saveDataRootPath = _saveDataRootPath.DangerousGetPath();
|
||||
using Path saveDataRootPath = _saveDataRootPath.DangerousGetPath();
|
||||
Result saveFsResult = _serviceImpl.OpenSaveDataFileSystem(ref outFileSystem, spaceId, tempSaveDataId,
|
||||
in saveDataRootPath, openReadOnly, attribute.Type, cacheExtraData);
|
||||
|
||||
|
@ -1205,7 +1205,7 @@ namespace LibHac.FsSrv
|
|||
if (!accessibility.CanRead || !accessibility.CanWrite)
|
||||
return ResultFs.PermissionDenied.Log();
|
||||
|
||||
Path saveDataRootPath = _saveDataRootPath.DangerousGetPath();
|
||||
using Path saveDataRootPath = _saveDataRootPath.DangerousGetPath();
|
||||
bool useAsyncFileSystem = !_serviceImpl.IsAllowedDirectorySaveData(spaceId, in saveDataRootPath);
|
||||
|
||||
using var fileSystem = new SharedRef<IFileSystem>();
|
||||
|
@ -1220,7 +1220,7 @@ namespace LibHac.FsSrv
|
|||
|
||||
Result ReadExtraData(out SaveDataExtraData data)
|
||||
{
|
||||
Path savePath = _saveDataRootPath.DangerousGetPath();
|
||||
using Path savePath = _saveDataRootPath.DangerousGetPath();
|
||||
return _serviceImpl.ReadSaveDataFileSystemExtraData(out data, spaceId, saveDataId, type,
|
||||
in savePath);
|
||||
}
|
||||
|
@ -1342,7 +1342,7 @@ namespace LibHac.FsSrv
|
|||
ReadExtraData);
|
||||
if (rc.IsFailure()) return rc;
|
||||
|
||||
Path saveDataRootPath = _saveDataRootPath.DangerousGetPath();
|
||||
using Path saveDataRootPath = _saveDataRootPath.DangerousGetPath();
|
||||
rc = _serviceImpl.ReadSaveDataFileSystemExtraData(out SaveDataExtraData tempExtraData, resolvedSpaceId,
|
||||
saveDataId, key.Type, in saveDataRootPath);
|
||||
if (rc.IsFailure()) return rc;
|
||||
|
|
|
@ -8,7 +8,7 @@ namespace LibHac.FsSystem
|
|||
{
|
||||
public class AesXtsFile : IFile
|
||||
{
|
||||
private UniqueRef<IFile> BaseFile { get; }
|
||||
private UniqueRef<IFile> _baseFile;
|
||||
private U8String Path { get; }
|
||||
private byte[] KekSeed { get; }
|
||||
private byte[] VerificationKey { get; }
|
||||
|
@ -23,15 +23,15 @@ namespace LibHac.FsSystem
|
|||
public AesXtsFile(OpenMode mode, ref UniqueRef<IFile> baseFile, U8String path, ReadOnlySpan<byte> kekSeed, ReadOnlySpan<byte> verificationKey, int blockSize)
|
||||
{
|
||||
Mode = mode;
|
||||
BaseFile = new UniqueRef<IFile>(ref baseFile);
|
||||
_baseFile = new UniqueRef<IFile>(ref baseFile);
|
||||
Path = path;
|
||||
KekSeed = kekSeed.ToArray();
|
||||
VerificationKey = verificationKey.ToArray();
|
||||
BlockSize = blockSize;
|
||||
|
||||
Header = new AesXtsFileHeader(BaseFile.Get);
|
||||
Header = new AesXtsFileHeader(_baseFile.Get);
|
||||
|
||||
BaseFile.Get.GetSize(out long fileSize).ThrowIfFailure();
|
||||
_baseFile.Get.GetSize(out long fileSize).ThrowIfFailure();
|
||||
|
||||
if (!Header.TryDecryptHeader(Path.ToString(), KekSeed, VerificationKey))
|
||||
{
|
||||
|
@ -43,7 +43,7 @@ namespace LibHac.FsSystem
|
|||
ThrowHelper.ThrowResult(ResultFs.AesXtsFileTooShort.Value, "NAX0 key derivation failed.");
|
||||
}
|
||||
|
||||
var fileStorage = new FileStorage(BaseFile.Get);
|
||||
var fileStorage = new FileStorage(_baseFile.Get);
|
||||
var encStorage = new SubStorage(fileStorage, HeaderLength, fileSize - HeaderLength);
|
||||
encStorage.SetResizable(true);
|
||||
|
||||
|
@ -116,7 +116,7 @@ namespace LibHac.FsSystem
|
|||
{
|
||||
Header.SetSize(size, VerificationKey);
|
||||
|
||||
Result rc = BaseFile.Get.Write(0, Header.ToBytes(false));
|
||||
Result rc = _baseFile.Get.Write(0, Header.ToBytes(false));
|
||||
if (rc.IsFailure()) return rc;
|
||||
|
||||
return BaseStorage.SetSize(Alignment.AlignUp(size, 0x10));
|
||||
|
@ -126,7 +126,7 @@ namespace LibHac.FsSystem
|
|||
{
|
||||
BaseStorage.Flush();
|
||||
BaseStorage.Dispose();
|
||||
BaseFile.Destroy();
|
||||
_baseFile.Destroy();
|
||||
|
||||
base.Dispose();
|
||||
}
|
||||
|
|
|
@ -457,7 +457,7 @@ namespace LibHac.FsSystem
|
|||
Unsafe.SkipInit(out DirectoryEntry entry);
|
||||
using var directory = new UniqueRef<IDirectory>();
|
||||
|
||||
Path path = _path.DangerousGetPath();
|
||||
using Path path = _path.DangerousGetPath();
|
||||
|
||||
Result rc = _baseFileSystem.OpenDirectory(ref directory.Ref(), in path,
|
||||
OpenDirectoryMode.All | OpenDirectoryMode.NoFileSize);
|
||||
|
|
|
@ -178,6 +178,7 @@ namespace LibHac.FsSystem
|
|||
base.Dispose();
|
||||
}
|
||||
|
||||
[NonCopyable]
|
||||
private ref struct RetryClosure
|
||||
{
|
||||
public DirectorySaveDataFileSystem This;
|
||||
|
|
|
@ -159,11 +159,15 @@ namespace LibHac.FsSystem
|
|||
bool ignoreCase = searchOptions.HasFlag(SearchOptions.CaseInsensitive);
|
||||
bool recurse = searchOptions.HasFlag(SearchOptions.RecurseSubdirectories);
|
||||
|
||||
var pathNormalized = new Path();
|
||||
InitializeFromString(ref pathNormalized, path).ThrowIfFailure();
|
||||
|
||||
using var directory = new UniqueRef<IDirectory>();
|
||||
fileSystem.OpenDirectory(ref directory.Ref(), in pathNormalized, OpenDirectoryMode.All).ThrowIfFailure();
|
||||
|
||||
using (var pathNormalized = new Path())
|
||||
{
|
||||
InitializeFromString(ref pathNormalized.Ref(), path).ThrowIfFailure();
|
||||
|
||||
fileSystem.OpenDirectory(ref directory.Ref(), in pathNormalized, OpenDirectoryMode.All)
|
||||
.ThrowIfFailure();
|
||||
}
|
||||
|
||||
while (true)
|
||||
{
|
||||
|
|
|
@ -270,7 +270,7 @@ namespace LibHac.FsSystem
|
|||
// todo: Efficient way to remove duplicates
|
||||
var names = new HashSet<string>();
|
||||
|
||||
Path path = _path.DangerousGetPath();
|
||||
using Path path = _path.DangerousGetPath();
|
||||
using var dir = new UniqueRef<IDirectory>();
|
||||
|
||||
// Open new directories for each source because we need to remove duplicate entries
|
||||
|
|
|
@ -175,7 +175,7 @@ namespace LibHac.FsSystem
|
|||
rc = pathNormalized.Normalize(pathFlags);
|
||||
if (rc.IsFailure()) return rc;
|
||||
|
||||
Path rootPath = _rootPath.DangerousGetPath();
|
||||
using Path rootPath = _rootPath.DangerousGetPath();
|
||||
|
||||
using var fullPath = new Path();
|
||||
rc = fullPath.Combine(in rootPath, in pathNormalized);
|
||||
|
|
|
@ -22,7 +22,7 @@ namespace LibHac.FsSystem
|
|||
Result rc = Initialize(baseStorage.Get);
|
||||
if (rc.IsFailure()) return rc;
|
||||
|
||||
_baseStorageShared = SharedRef<IStorage>.CreateMove(ref baseStorage);
|
||||
_baseStorageShared.SetByMove(ref baseStorage);
|
||||
return Result.Success;
|
||||
}
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ namespace LibHac.FsSystem
|
|||
|
||||
private Result ResolveFullPath(ref Path outPath, in Path relativePath)
|
||||
{
|
||||
Path rootPath = _rootPath.DangerousGetPath();
|
||||
using Path rootPath = _rootPath.DangerousGetPath();
|
||||
return outPath.Combine(in rootPath, in relativePath);
|
||||
}
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@ namespace LibHac.FsSystem
|
|||
/// The struct must also be manually passed through the <see cref="Utility.IterateDirectoryRecursively"/> method.
|
||||
/// And because ref fields aren't as thing as of C# 10, some ref structs may have to be copied into the closure struct.
|
||||
/// </remarks>
|
||||
[NonCopyable]
|
||||
public ref struct FsIterationTaskClosure
|
||||
{
|
||||
public Span<byte> Buffer;
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using LibHac.Common;
|
||||
|
||||
namespace LibHac.Lr
|
||||
{
|
||||
|
@ -18,6 +19,7 @@ namespace LibHac.Lr
|
|||
}
|
||||
}
|
||||
|
||||
[NonCopyable]
|
||||
internal struct LrClientGlobals : IDisposable
|
||||
{
|
||||
public HorizonClient Hos;
|
||||
|
|
|
@ -6,6 +6,7 @@ using LibHac.Os;
|
|||
|
||||
namespace LibHac.Lr
|
||||
{
|
||||
[NonCopyable]
|
||||
internal struct LrServiceGlobals : IDisposable
|
||||
{
|
||||
public SharedRef<ILocationResolverManager> LocationResolver;
|
||||
|
|
Loading…
Reference in a new issue