aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy
diff options
context:
space:
mode:
authorAlex Barney <thealexbarney@gmail.com>2019-10-17 01:17:44 -0500
committerAc_K <Acoustik666@gmail.com>2019-10-17 08:17:44 +0200
commit8a8ea4c8c00e8ba23349d9cdb0a6b681d09e6b0d (patch)
treeaee0876fbc6e5f9fd2808d942297938ab3ab9495 /Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy
parentc0fe6cdca0ebe6b19f8578893ec503d432683897 (diff)
Update to LibHac 0.6.0 (#792)
* Update to LibHac 0.6.0 * Create an IFileSystemProxy object from LibHac * Rename rc -> result * Alignment and spacing * Result formatting * Spacing * Sort usings
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy')
-rw-r--r--Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs34
-rw-r--r--Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs64
-rw-r--r--Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs62
-rw-r--r--Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs196
-rw-r--r--Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs24
5 files changed, 93 insertions, 287 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs
index 04b87b57..2b0f06dd 100644
--- a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs
+++ b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/FileSystemProxyHelper.cs
@@ -1,6 +1,8 @@
using LibHac;
using LibHac.Fs;
-using LibHac.Fs.NcaUtils;
+using LibHac.FsSystem;
+using LibHac.FsSystem.NcaUtils;
+using LibHac.Spl;
using Ryujinx.Common;
using Ryujinx.HLE.FileSystem;
using Ryujinx.HLE.Utilities;
@@ -25,7 +27,14 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
try
{
LocalFileSystem fileSystem = new LocalFileSystem(savePath);
- LibHac.Fs.IFileSystem saveFileSystem = new DirectorySaveDataFileSystem(fileSystem);
+
+ Result result = DirectorySaveDataFileSystem.CreateNew(out DirectorySaveDataFileSystem dirFileSystem, fileSystem);
+ if (result.IsFailure())
+ {
+ return (ResultCode)result.Value;
+ }
+
+ LibHac.Fs.IFileSystem saveFileSystem = dirFileSystem;
if (readOnly)
{
@@ -111,13 +120,16 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
PartitionFileSystem nsp = new PartitionFileSystem(pfsFile.AsStorage());
ImportTitleKeysFromNsp(nsp, context.Device.System.KeySet);
-
+
string filename = fullPath.Replace(archivePath.FullName, string.Empty).TrimStart('\\');
- if (nsp.FileExists(filename))
+ Result result = nsp.OpenFile(out LibHac.Fs.IFile ncaFile, filename, OpenMode.Read);
+ if (result.IsFailure())
{
- return OpenNcaFs(context, fullPath, nsp.OpenFile(filename, OpenMode.Read).AsStorage(), out openedFileSystem);
+ return (ResultCode)result.Value;
}
+
+ return OpenNcaFs(context, fullPath, ncaFile.AsStorage(), out openedFileSystem);
}
catch (HorizonResultException ex)
{
@@ -130,15 +142,17 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
public static void ImportTitleKeysFromNsp(LibHac.Fs.IFileSystem nsp, Keyset keySet)
{
- foreach (DirectoryEntry ticketEntry in nsp.EnumerateEntries("*.tik"))
+ foreach (DirectoryEntryEx ticketEntry in nsp.EnumerateEntries("/", "*.tik"))
{
- Ticket ticket = new Ticket(nsp.OpenFile(ticketEntry.FullPath, OpenMode.Read).AsStream());
+ Result result = nsp.OpenFile(out LibHac.Fs.IFile ticketFile, ticketEntry.FullPath, OpenMode.Read);
- if (!keySet.TitleKeys.ContainsKey(ticket.RightsId))
+ if (result.IsSuccess())
{
- keySet.TitleKeys.Add(ticket.RightsId, ticket.GetTitleKey(keySet));
+ Ticket ticket = new Ticket(ticketFile.AsStream());
+
+ keySet.ExternalKeySet.Add(new RightsId(ticket.RightsId), new AccessKey(ticket.GetTitleKey(keySet)));
}
}
}
}
-} \ No newline at end of file
+}
diff --git a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs
index 4fc8a687..c042ed8e 100644
--- a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs
+++ b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IDirectory.cs
@@ -1,21 +1,17 @@
using LibHac;
-using System.Collections.Generic;
-using System.Text;
+using LibHac.Fs;
+using System;
+using System.Runtime.InteropServices;
namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
class IDirectory : IpcService
{
- private const int DirectoryEntrySize = 0x310;
-
- private IEnumerator<LibHac.Fs.DirectoryEntry> _enumerator;
-
private LibHac.Fs.IDirectory _baseDirectory;
public IDirectory(LibHac.Fs.IDirectory directory)
{
_baseDirectory = directory;
- _enumerator = directory.Read().GetEnumerator();
}
[Command(0)]
@@ -25,60 +21,26 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
long bufferPosition = context.Request.ReceiveBuff[0].Position;
long bufferLen = context.Request.ReceiveBuff[0].Size;
- int maxReadCount = (int)(bufferLen / DirectoryEntrySize);
- int readCount = 0;
-
- try
- {
- while (readCount < maxReadCount && _enumerator.MoveNext())
- {
- long position = bufferPosition + readCount * DirectoryEntrySize;
+ byte[] entriesBytes = new byte[bufferLen];
+ Span<DirectoryEntry> entries = MemoryMarshal.Cast<byte, DirectoryEntry>(entriesBytes);
- WriteDirectoryEntry(context, position, _enumerator.Current);
+ Result result = _baseDirectory.Read(out long entriesRead, entries);
- readCount++;
- }
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
+ context.Memory.WriteBytes(bufferPosition, entriesBytes);
+ context.ResponseData.Write(entriesRead);
- context.ResponseData.Write((long)readCount);
-
- return ResultCode.Success;
- }
-
- private void WriteDirectoryEntry(ServiceCtx context, long position, LibHac.Fs.DirectoryEntry entry)
- {
- for (int offset = 0; offset < 0x300; offset += 8)
- {
- context.Memory.WriteInt64(position + offset, 0);
- }
-
- byte[] nameBuffer = Encoding.UTF8.GetBytes(entry.Name);
-
- context.Memory.WriteBytes(position, nameBuffer);
-
- context.Memory.WriteInt32(position + 0x300, (int)entry.Attributes);
- context.Memory.WriteInt32(position + 0x304, (byte)entry.Type);
- context.Memory.WriteInt64(position + 0x308, entry.Size);
+ return (ResultCode)result.Value;
}
[Command(1)]
// GetEntryCount() -> u64
public ResultCode GetEntryCount(ServiceCtx context)
{
- try
- {
- context.ResponseData.Write((long)_baseDirectory.GetEntryCount());
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
+ Result result = _baseDirectory.GetEntryCount(out long entryCount);
+
+ context.ResponseData.Write(entryCount);
- return ResultCode.Success;
+ return (ResultCode)result.Value;
}
}
}
diff --git a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs
index df9209e6..f09624f8 100644
--- a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs
+++ b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFile.cs
@@ -26,22 +26,14 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
long size = context.RequestData.ReadInt64();
byte[] data = new byte[size];
- int readSize;
- try
- {
- readSize = _baseFile.Read(data, offset, readOption);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
+ Result result = _baseFile.Read(out long bytesRead, offset, data, readOption);
context.Memory.WriteBytes(position, data);
- context.ResponseData.Write((long)readSize);
+ context.ResponseData.Write(bytesRead);
- return ResultCode.Success;
+ return (ResultCode)result.Value;
}
[Command(1)]
@@ -58,66 +50,34 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
byte[] data = context.Memory.ReadBytes(position, size);
- try
- {
- _baseFile.Write(data, offset, writeOption);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
-
- return ResultCode.Success;
+ return (ResultCode)_baseFile.Write(offset, data, writeOption).Value;
}
[Command(2)]
// Flush()
public ResultCode Flush(ServiceCtx context)
{
- try
- {
- _baseFile.Flush();
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
-
- return ResultCode.Success;
+ return (ResultCode)_baseFile.Flush().Value;
}
[Command(3)]
// SetSize(u64 size)
public ResultCode SetSize(ServiceCtx context)
{
- try
- {
- long size = context.RequestData.ReadInt64();
-
- _baseFile.SetSize(size);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
+ long size = context.RequestData.ReadInt64();
- return ResultCode.Success;
+ return (ResultCode)_baseFile.SetSize(size).Value;
}
[Command(4)]
// GetSize() -> u64 fileSize
public ResultCode GetSize(ServiceCtx context)
{
- try
- {
- context.ResponseData.Write(_baseFile.GetSize());
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
+ Result result = _baseFile.GetSize(out long size);
+
+ context.ResponseData.Write(size);
- return ResultCode.Success;
+ return (ResultCode)result.Value;
}
public void Dispose()
diff --git a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs
index 7a7fdbaf..ed7ae0c1 100644
--- a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs
+++ b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IFileSystem.cs
@@ -25,16 +25,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
long size = context.RequestData.ReadInt64();
- try
- {
- _fileSystem.CreateFile(name, size, createOption);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
-
- return ResultCode.Success;
+ return (ResultCode)_fileSystem.CreateFile(name, size, createOption).Value;
}
[Command(1)]
@@ -43,16 +34,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
string name = ReadUtf8String(context);
- try
- {
- _fileSystem.DeleteFile(name);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
-
- return ResultCode.Success;
+ return (ResultCode)_fileSystem.DeleteFile(name).Value;
}
[Command(2)]
@@ -61,16 +43,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
string name = ReadUtf8String(context);
- try
- {
- _fileSystem.CreateDirectory(name);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
-
- return ResultCode.Success;
+ return (ResultCode)_fileSystem.CreateDirectory(name).Value;
}
[Command(3)]
@@ -79,16 +52,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
string name = ReadUtf8String(context);
- try
- {
- _fileSystem.DeleteDirectory(name);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
-
- return ResultCode.Success;
+ return (ResultCode)_fileSystem.DeleteDirectory(name).Value;
}
[Command(4)]
@@ -97,16 +61,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
string name = ReadUtf8String(context);
- try
- {
- _fileSystem.DeleteDirectoryRecursively(name);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
-
- return ResultCode.Success;
+ return (ResultCode)_fileSystem.DeleteDirectoryRecursively(name).Value;
}
[Command(5)]
@@ -116,16 +71,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
string oldName = ReadUtf8String(context, 0);
string newName = ReadUtf8String(context, 1);
- try
- {
- _fileSystem.RenameFile(oldName, newName);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
-
- return ResultCode.Success;
+ return (ResultCode)_fileSystem.RenameFile(oldName, newName).Value;
}
[Command(6)]
@@ -135,16 +81,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
string oldName = ReadUtf8String(context, 0);
string newName = ReadUtf8String(context, 1);
- try
- {
- _fileSystem.RenameDirectory(oldName, newName);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
-
- return ResultCode.Success;
+ return (ResultCode)_fileSystem.RenameDirectory(oldName, newName).Value;
}
[Command(7)]
@@ -153,25 +90,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
string name = ReadUtf8String(context);
- try
- {
- DirectoryEntryType entryType = _fileSystem.GetEntryType(name);
-
- if (entryType == DirectoryEntryType.Directory || entryType == DirectoryEntryType.File)
- {
- context.ResponseData.Write((int)entryType);
- }
- else
- {
- return ResultCode.PathDoesNotExist;
- }
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
+ Result result = _fileSystem.GetEntryType(out DirectoryEntryType entryType, name);
- return ResultCode.Success;
+ context.ResponseData.Write((int)entryType);
+
+ return (ResultCode)result.Value;
}
[Command(8)]
@@ -182,20 +105,16 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
string name = ReadUtf8String(context);
- try
- {
- LibHac.Fs.IFile file = _fileSystem.OpenFile(name, mode);
+ Result result = _fileSystem.OpenFile(out LibHac.Fs.IFile file, name, mode);
+ if (result.IsSuccess())
+ {
IFile fileInterface = new IFile(file);
MakeObject(context, fileInterface);
}
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
- return ResultCode.Success;
+ return (ResultCode)result.Value;
}
[Command(9)]
@@ -206,36 +125,23 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
string name = ReadUtf8String(context);
- try
- {
- LibHac.Fs.IDirectory dir = _fileSystem.OpenDirectory(name, mode);
+ Result result = _fileSystem.OpenDirectory(out LibHac.Fs.IDirectory dir, name, mode);
+ if (result.IsSuccess())
+ {
IDirectory dirInterface = new IDirectory(dir);
MakeObject(context, dirInterface);
}
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
- return ResultCode.Success;
+ return (ResultCode)result.Value;
}
[Command(10)]
// Commit()
public ResultCode Commit(ServiceCtx context)
{
- try
- {
- _fileSystem.Commit();
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
-
- return ResultCode.Success;
+ return (ResultCode)_fileSystem.Commit().Value;
}
[Command(11)]
@@ -244,16 +150,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
string name = ReadUtf8String(context);
- try
- {
- context.ResponseData.Write(_fileSystem.GetFreeSpaceSize(name));
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
+ Result result = _fileSystem.GetFreeSpaceSize(out long size, name);
- return ResultCode.Success;
+ context.ResponseData.Write(size);
+
+ return (ResultCode)result.Value;
}
[Command(12)]
@@ -262,16 +163,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
string name = ReadUtf8String(context);
- try
- {
- context.ResponseData.Write(_fileSystem.GetTotalSpaceSize(name));
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
+ Result result = _fileSystem.GetTotalSpaceSize(out long size, name);
+
+ context.ResponseData.Write(size);
- return ResultCode.Success;
+ return (ResultCode)result.Value;
}
[Command(13)]
@@ -280,16 +176,7 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
string name = ReadUtf8String(context);
- try
- {
- _fileSystem.CleanDirectoryRecursively(name);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
-
- return ResultCode.Success;
+ return (ResultCode)_fileSystem.CleanDirectoryRecursively(name).Value;
}
[Command(14)]
@@ -298,27 +185,20 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
{
string name = ReadUtf8String(context);
- try
- {
- FileTimeStampRaw timestamp = _fileSystem.GetFileTimeStampRaw(name);
+ Result result = _fileSystem.GetFileTimeStampRaw(out FileTimeStampRaw timestamp, name);
- context.ResponseData.Write(timestamp.Created);
- context.ResponseData.Write(timestamp.Modified);
- context.ResponseData.Write(timestamp.Accessed);
+ context.ResponseData.Write(timestamp.Created);
+ context.ResponseData.Write(timestamp.Modified);
+ context.ResponseData.Write(timestamp.Accessed);
- byte[] data = new byte[8];
+ byte[] data = new byte[8];
- // is valid?
- data[0] = 1;
+ // is valid?
+ data[0] = 1;
- context.ResponseData.Write(data);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
+ context.ResponseData.Write(data);
- return ResultCode.Success;
+ return (ResultCode)result.Value;
}
}
} \ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs
index 107599a4..cc407039 100644
--- a/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs
+++ b/Ryujinx.HLE/HOS/Services/Fs/FileSystemProxy/IStorage.cs
@@ -31,16 +31,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
byte[] data = new byte[size];
- try
- {
- _baseStorage.Read(data, offset);
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
+ Result result = _baseStorage.Read(offset, data);
context.Memory.WriteBytes(buffDesc.Position, data);
+
+ return (ResultCode)result.Value;
}
return ResultCode.Success;
@@ -50,16 +45,11 @@ namespace Ryujinx.HLE.HOS.Services.Fs.FileSystemProxy
// GetSize() -> u64 size
public ResultCode GetSize(ServiceCtx context)
{
- try
- {
- context.ResponseData.Write(_baseStorage.GetSize());
- }
- catch (HorizonResultException ex)
- {
- return (ResultCode)ex.ResultValue.Value;
- }
+ Result result = _baseStorage.GetSize(out long size);
- return ResultCode.Success;
+ context.ResponseData.Write(size);
+
+ return (ResultCode)result.Value;
}
}
} \ No newline at end of file