ee81ab547e
* am: Initial swkbd implementation Currently only implements the full screen keyboard, inline keyboard will come later. * Remove unnecessary logging * Miscellaneous tidy up * am: Always pop incoming interactive session data * am: Add a reminder to implement the full config struct * am: Check for a max length of zero We should only limit/truncate text when the max length is set to a non-zero value. * Add documentation * am: Return IStorage not available when queue is empty We should be returning the appropriate error code when the FIFO is empty, rather than just throwing an exception and killing the emulator. * Fix typo * Code style changes
79 lines
No EOL
2.1 KiB
C#
79 lines
No EOL
2.1 KiB
C#
using System;
|
|
|
|
namespace Ryujinx.HLE.HOS.Services.Am.AppletAE
|
|
{
|
|
class IStorageAccessor : IpcService
|
|
{
|
|
private IStorage _storage;
|
|
|
|
public IStorageAccessor(IStorage storage)
|
|
{
|
|
_storage = storage;
|
|
}
|
|
|
|
[Command(0)]
|
|
// GetSize() -> u64
|
|
public ResultCode GetSize(ServiceCtx context)
|
|
{
|
|
context.ResponseData.Write((long)_storage.Data.Length);
|
|
|
|
return ResultCode.Success;
|
|
}
|
|
|
|
[Command(10)]
|
|
// Write(u64, buffer<bytes, 0x21>)
|
|
public ResultCode Write(ServiceCtx context)
|
|
{
|
|
long writePosition = context.RequestData.ReadInt64();
|
|
|
|
if (writePosition > _storage.Data.Length)
|
|
{
|
|
return ResultCode.OutOfBounds;
|
|
}
|
|
|
|
(long position, long size) = context.Request.GetBufferType0x21();
|
|
|
|
size = Math.Min(size, _storage.Data.Length - writePosition);
|
|
|
|
if (size > 0)
|
|
{
|
|
long maxSize = _storage.Data.Length - writePosition;
|
|
|
|
if (size > maxSize)
|
|
{
|
|
size = maxSize;
|
|
}
|
|
|
|
byte[] data = context.Memory.ReadBytes(position, size);
|
|
|
|
Buffer.BlockCopy(data, 0, _storage.Data, (int)writePosition, (int)size);
|
|
}
|
|
|
|
return ResultCode.Success;
|
|
}
|
|
|
|
[Command(11)]
|
|
// Read(u64) -> buffer<bytes, 0x22>
|
|
public ResultCode Read(ServiceCtx context)
|
|
{
|
|
long readPosition = context.RequestData.ReadInt64();
|
|
|
|
if (readPosition > _storage.Data.Length)
|
|
{
|
|
return ResultCode.OutOfBounds;
|
|
}
|
|
|
|
(long position, long size) = context.Request.GetBufferType0x22();
|
|
|
|
size = Math.Min(size, _storage.Data.Length - readPosition);
|
|
|
|
byte[] data = new byte[size];
|
|
|
|
Buffer.BlockCopy(_storage.Data, (int)readPosition, data, 0, (int)size);
|
|
|
|
context.Memory.WriteBytes(position, data);
|
|
|
|
return ResultCode.Success;
|
|
}
|
|
}
|
|
} |