diff options
| author | Mary-nyan <mary@mary.zone> | 2022-11-24 15:26:29 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-24 15:26:29 +0100 |
| commit | f4e879a1e6ad810aa38c1c020467a2589441871b (patch) | |
| tree | 274c6ee1f55129f01bbd28a6dcd92ce3f84237fb /Ryujinx.HLE/HOS/Services/Friend/ServiceCreator | |
| parent | a1ddaa2736b188de928564af56aa787a25831ff7 (diff) | |
Reduce usage of Marshal.PtrToStructure and Marshal.StructureToPtr (#3805)
* common: Make BinaryReaderExtensions Read & Write take unamanged types
This allows us to not rely on Marshal.PtrToStructure and Marshal.StructureToPtr for those.
* common: Make MemoryHelper Read & Write takes unamanged types
* Update Marshal.SizeOf => Unsafe.SizeOf when appropriate and start moving software applet to unmanaged types
Diffstat (limited to 'Ryujinx.HLE/HOS/Services/Friend/ServiceCreator')
3 files changed, 21 insertions, 24 deletions
diff --git a/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/FriendService/Types/UserPresence.cs b/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/FriendService/Types/UserPresence.cs index e7568a4a..058c5646 100644 --- a/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/FriendService/Types/UserPresence.cs +++ b/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/FriendService/Types/UserPresence.cs @@ -1,9 +1,12 @@ -using Ryujinx.HLE.HOS.Services.Account.Acc; +using Ryujinx.Common.Memory; +using Ryujinx.HLE.HOS.Services.Account.Acc; +using System; using System.Runtime.InteropServices; +using System.Text; namespace Ryujinx.HLE.HOS.Services.Friend.ServiceCreator.FriendService { - [StructLayout(LayoutKind.Sequential, Pack = 0x8, CharSet = CharSet.Ansi)] + [StructLayout(LayoutKind.Sequential, Pack = 0x8)] struct UserPresence { public UserId UserId; @@ -13,15 +16,20 @@ namespace Ryujinx.HLE.HOS.Services.Friend.ServiceCreator.FriendService [MarshalAs(UnmanagedType.I1)] public bool SamePresenceGroupApplication; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x3)] - public char[] Unknown; + public Array3<byte> Unknown; + private AppKeyValueStorageHolder _appKeyValueStorage; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0xC0)] - public char[] AppKeyValueStorage; + public Span<byte> AppKeyValueStorage => MemoryMarshal.Cast<AppKeyValueStorageHolder, byte>(MemoryMarshal.CreateSpan(ref _appKeyValueStorage, AppKeyValueStorageHolder.Size)); + + [StructLayout(LayoutKind.Sequential, Pack = 0x1, Size = Size)] + private struct AppKeyValueStorageHolder + { + public const int Size = 0xC0; + } public override string ToString() { - return $"UserPresence {{ UserId: {UserId}, LastTimeOnlineTimestamp: {LastTimeOnlineTimestamp}, Status: {Status}, AppKeyValueStorage: {AppKeyValueStorage} }}"; + return $"UserPresence {{ UserId: {UserId}, LastTimeOnlineTimestamp: {LastTimeOnlineTimestamp}, Status: {Status}, AppKeyValueStorage: {Encoding.ASCII.GetString(AppKeyValueStorage)} }}"; } } }
\ No newline at end of file diff --git a/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/IFriendService.cs b/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/IFriendService.cs index ec947414..8159d091 100644 --- a/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/IFriendService.cs +++ b/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/IFriendService.cs @@ -236,23 +236,14 @@ namespace Ryujinx.HLE.HOS.Services.Friend.ServiceCreator ulong position = context.Request.PtrBuff[0].Position; ulong size = context.Request.PtrBuff[0].Size; - byte[] bufferContent = new byte[size]; - - context.Memory.Read(position, bufferContent); + ReadOnlySpan<UserPresence> userPresenceInputArray = MemoryMarshal.Cast<byte, UserPresence>(context.Memory.GetSpan(position, (int)size)); if (uuid.IsNull) { return ResultCode.InvalidArgument; } - int elementCount = bufferContent.Length / Marshal.SizeOf<UserPresence>(); - - using (BinaryReader bufferReader = new BinaryReader(new MemoryStream(bufferContent))) - { - UserPresence[] userPresenceInputArray = bufferReader.ReadStructArray<UserPresence>(elementCount); - - Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { UserId = uuid.ToString(), userPresenceInputArray }); - } + Logger.Stub?.PrintStub(LogClass.ServiceFriend, new { UserId = uuid.ToString(), userPresenceInputArray = userPresenceInputArray.ToArray() }); return ResultCode.Success; } diff --git a/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/NotificationService/Types/NotificationInfo.cs b/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/NotificationService/Types/NotificationInfo.cs index 1bd6f011..e710bf06 100644 --- a/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/NotificationService/Types/NotificationInfo.cs +++ b/Ryujinx.HLE/HOS/Services/Friend/ServiceCreator/NotificationService/Types/NotificationInfo.cs @@ -1,15 +1,13 @@ -using System.Runtime.InteropServices; +using Ryujinx.Common.Memory; +using System.Runtime.InteropServices; namespace Ryujinx.HLE.HOS.Services.Friend.ServiceCreator.NotificationService { - [StructLayout(LayoutKind.Sequential, Pack = 0x8, Size = 0x10)] + [StructLayout(LayoutKind.Sequential, Size = 0x10)] struct NotificationInfo { public NotificationEventType Type; - - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 0x4)] - public char[] Padding; - + private Array4<byte> _padding; public long NetworkUserIdPlaceholder; } }
\ No newline at end of file |
