diff options
| author | emmauss <emmausssss@gmail.com> | 2018-08-14 03:13:01 +0300 |
|---|---|---|
| committer | gdkchan <gab.dark.100@gmail.com> | 2018-08-13 21:13:01 -0300 |
| commit | 17f54b5d78ac9ee83419dc204a02e3887bdca8e4 (patch) | |
| tree | 76b922c31f620661b541465ba72d10ef049830dd /Ryujinx.HLE/OsHle | |
| parent | 4f499b6845f7f46542cde945bad8f3275d3a11d5 (diff) | |
Implement IProfile Get and GetBase (#266)
* implement IProfile Get(Base)
* use default user
* changed userid
Diffstat (limited to 'Ryujinx.HLE/OsHle')
| -rw-r--r-- | Ryujinx.HLE/OsHle/Profile.cs | 8 | ||||
| -rw-r--r-- | Ryujinx.HLE/OsHle/Services/Acc/IProfile.cs | 35 | ||||
| -rw-r--r-- | Ryujinx.HLE/OsHle/Services/Acc/ProfileBase.cs | 52 | ||||
| -rw-r--r-- | Ryujinx.HLE/OsHle/Utilities/StringUtils.cs | 52 |
4 files changed, 139 insertions, 8 deletions
diff --git a/Ryujinx.HLE/OsHle/Profile.cs b/Ryujinx.HLE/OsHle/Profile.cs new file mode 100644 index 00000000..80b4487b --- /dev/null +++ b/Ryujinx.HLE/OsHle/Profile.cs @@ -0,0 +1,8 @@ +namespace Ryujinx.HLE.OsHle +{ + public struct Profile + { + public string Username; + public string UserId; + } +} diff --git a/Ryujinx.HLE/OsHle/Services/Acc/IProfile.cs b/Ryujinx.HLE/OsHle/Services/Acc/IProfile.cs index 24daa3d5..0639b09c 100644 --- a/Ryujinx.HLE/OsHle/Services/Acc/IProfile.cs +++ b/Ryujinx.HLE/OsHle/Services/Acc/IProfile.cs @@ -1,6 +1,9 @@ +using ChocolArm64.Memory; using Ryujinx.HLE.Logging; using Ryujinx.HLE.OsHle.Ipc; +using Ryujinx.HLE.OsHle.Utilities; using System.Collections.Generic; +using System.Text; namespace Ryujinx.HLE.OsHle.Services.Acc { @@ -14,21 +17,37 @@ namespace Ryujinx.HLE.OsHle.Services.Acc { m_Commands = new Dictionary<int, ServiceProcessRequest>() { + { 0, Get }, { 1, GetBase } }; } - public long GetBase(ServiceCtx Context) + public long Get(ServiceCtx Context) { Context.Ns.Log.PrintStub(LogClass.ServiceAcc, "Stubbed."); - Context.ResponseData.Write(0L); - Context.ResponseData.Write(0L); - Context.ResponseData.Write(0L); - Context.ResponseData.Write(0L); - Context.ResponseData.Write(0L); - Context.ResponseData.Write(0L); - Context.ResponseData.Write(0L); + long Position = Context.Request.ReceiveBuff[0].Position; + + AMemoryHelper.FillWithZeros(Context.Memory, Position, 0x80); + + Context.Memory.WriteInt32(Position, 0); + Context.Memory.WriteInt32(Position + 4, 1); + Context.Memory.WriteByte(Position + 8, 1); + + return GetBase(Context); + } + + public long GetBase(ServiceCtx Context) + { + ProfileBase ProfileBase = new ProfileBase(Context.Ns.Settings.User); + + Context.ResponseData.Write(ProfileBase.UserId.ToBytes()); + Context.ResponseData.Write(ProfileBase.Timestamp); + + int ByteCount = Encoding.UTF8.GetByteCount(ProfileBase.Username); + byte[] Username = StringUtils.GetFixedLengthBytes(ProfileBase.Username, 0x20, Encoding.UTF8); + + Context.ResponseData.Write(Username); return 0; } diff --git a/Ryujinx.HLE/OsHle/Services/Acc/ProfileBase.cs b/Ryujinx.HLE/OsHle/Services/Acc/ProfileBase.cs new file mode 100644 index 00000000..69914a86 --- /dev/null +++ b/Ryujinx.HLE/OsHle/Services/Acc/ProfileBase.cs @@ -0,0 +1,52 @@ +using Ryujinx.HLE.OsHle.Utilities; +using System; +using System.Linq; + +namespace Ryujinx.HLE.OsHle.Services.Acc +{ + struct ProfileBase + { + public UserId UserId; + public long Timestamp; + public string Username; + + public ProfileBase(Profile User) + { + UserId = new UserId(User.UserId); + Username = User.Username; + Timestamp = ((DateTimeOffset)DateTime.Today).ToUnixTimeSeconds(); + } + } + + struct UserId + { + private readonly ulong LowBytes; + private readonly ulong HighBytes; + + public UserId(string UserIdHex) + { + if (UserIdHex == null || UserIdHex.Length != 32 || !UserIdHex.All("0123456789abcdefABCDEF".Contains)) + { + throw new ArgumentException("UserId is not a valid Hex string", "UserIdHex"); + } + + byte[] HexBytes = StringUtils.HexToBytes(UserIdHex); + + LowBytes = BitConverter.ToUInt64(HexBytes, 8); + + Array.Resize(ref HexBytes, 8); + + HighBytes = BitConverter.ToUInt64(HexBytes, 0); + } + + public byte[] ToBytes() + { + return BitConverter.GetBytes(HighBytes).Concat(BitConverter.GetBytes(LowBytes)).ToArray(); + } + + public override string ToString() + { + return BitConverter.ToString(ToBytes()).ToLower().Replace("-", string.Empty); + } + } +} diff --git a/Ryujinx.HLE/OsHle/Utilities/StringUtils.cs b/Ryujinx.HLE/OsHle/Utilities/StringUtils.cs new file mode 100644 index 00000000..b0117f83 --- /dev/null +++ b/Ryujinx.HLE/OsHle/Utilities/StringUtils.cs @@ -0,0 +1,52 @@ +using System; +using System.Globalization; +using System.Linq; +using System.Text; + +namespace Ryujinx.HLE.OsHle.Utilities +{ + static class StringUtils + { + public static byte[] GetFixedLengthBytes(string InputString, int Size, Encoding Encoding) + { + InputString = InputString + "\0"; + + int ByteCount = Encoding.GetByteCount(InputString); + + byte[] Output = new byte[Size]; + + if (ByteCount < Size) + { + Encoding.GetBytes(InputString, 0, InputString.Length, Output, Size - ByteCount); + } + else + { + int NullSize = Encoding.GetByteCount("\0"); + + Output = Encoding.GetBytes(InputString); + + Array.Resize(ref Output, Size - NullSize); + + Output = Output.Concat(Encoding.GetBytes("\0")).ToArray(); + } + + return Output; + } + + public static byte[] HexToBytes(string HexString) + { + //Ignore last charactor if HexLength % 2 != 0 + int BytesInHex = HexString.Length / 2; + + byte[] Output = new byte[BytesInHex]; + + for (int Index = 0; Index < BytesInHex; Index++) + { + Output[Index] = byte.Parse(HexString.Substring(Index * 2, 2), + NumberStyles.HexNumber); + } + + return Output; + } + } +} |
