Implement IProfile Get and GetBase (#266)

* implement IProfile Get(Base)

* use default user

* changed userid
This commit is contained in:
emmauss 2018-08-14 03:13:01 +03:00 committed by gdkchan
parent 4f499b6845
commit 17f54b5d78
8 changed files with 154 additions and 13 deletions

View File

@ -0,0 +1,8 @@
namespace Ryujinx.HLE.OsHle
{
public struct Profile
{
public string Username;
public string UserId;
}
}

View File

@ -1,6 +1,9 @@
using ChocolArm64.Memory;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using Ryujinx.HLE.OsHle.Ipc; using Ryujinx.HLE.OsHle.Ipc;
using Ryujinx.HLE.OsHle.Utilities;
using System.Collections.Generic; using System.Collections.Generic;
using System.Text;
namespace Ryujinx.HLE.OsHle.Services.Acc namespace Ryujinx.HLE.OsHle.Services.Acc
{ {
@ -14,21 +17,37 @@ namespace Ryujinx.HLE.OsHle.Services.Acc
{ {
m_Commands = new Dictionary<int, ServiceProcessRequest>() m_Commands = new Dictionary<int, ServiceProcessRequest>()
{ {
{ 0, Get },
{ 1, GetBase } { 1, GetBase }
}; };
} }
public long GetBase(ServiceCtx Context) public long Get(ServiceCtx Context)
{ {
Context.Ns.Log.PrintStub(LogClass.ServiceAcc, "Stubbed."); Context.Ns.Log.PrintStub(LogClass.ServiceAcc, "Stubbed.");
Context.ResponseData.Write(0L); long Position = Context.Request.ReceiveBuff[0].Position;
Context.ResponseData.Write(0L);
Context.ResponseData.Write(0L); AMemoryHelper.FillWithZeros(Context.Memory, Position, 0x80);
Context.ResponseData.Write(0L);
Context.ResponseData.Write(0L); Context.Memory.WriteInt32(Position, 0);
Context.ResponseData.Write(0L); Context.Memory.WriteInt32(Position + 4, 1);
Context.ResponseData.Write(0L); 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; return 0;
} }

View File

@ -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);
}
}
}

View File

@ -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;
}
}
}

View File

@ -1,7 +1,11 @@
using System.Collections.Generic;
using Ryujinx.HLE.OsHle;
namespace Ryujinx.HLE.Settings namespace Ryujinx.HLE.Settings
{ {
public class SystemSettings public class SystemSettings
{ {
public ColorSet ThemeColor; public Profile User { get; set; }
public ColorSet ThemeColor { get; set; }
} }
} }

View File

@ -67,6 +67,12 @@ namespace Ryujinx.HLE
Os.FontSharedMem.MemoryMapped += Font.ShMemMap; Os.FontSharedMem.MemoryMapped += Font.ShMemMap;
Os.FontSharedMem.MemoryUnmapped += Font.ShMemUnmap; Os.FontSharedMem.MemoryUnmapped += Font.ShMemUnmap;
Settings.User = new Profile()
{
Username = "Ryujinx",
UserId = "000123456789abcdef09876543210000"
};
} }
public void LoadCart(string ExeFsDir, string RomFsFile = null) public void LoadCart(string ExeFsDir, string RomFsFile = null)
@ -109,4 +115,4 @@ namespace Ryujinx.HLE
} }
} }
} }
} }

View File

@ -1,4 +1,4 @@
using Ryujinx.UI.Input; using Ryujinx.UI.Input;
using Ryujinx.HLE.Logging; using Ryujinx.HLE.Logging;
using System; using System;
using System.Globalization; using System.Globalization;
@ -180,4 +180,4 @@ namespace Ryujinx
return Values.TryGetValue(Name, out string Value) ? Value : null; return Values.TryGetValue(Name, out string Value) ? Value : null;
} }
} }
} }

View File

@ -85,4 +85,4 @@ Controls_Right_JoyConController_Button_R = RShoulder
Controls_Right_JoyConController_Button_ZR = RTrigger Controls_Right_JoyConController_Button_ZR = RTrigger
Controls_Left_JoyConController_Stick = LJoystick Controls_Left_JoyConController_Stick = LJoystick
Controls_Right_JoyConController_Stick = RJoystick Controls_Right_JoyConController_Stick = RJoystick