From 675f3f6f816d4f315c2f319d6b323834dc252590 Mon Sep 17 00:00:00 2001
From: emmauss <emmausssss@gmail.com>
Date: Sun, 2 Sep 2018 01:04:20 +0300
Subject: [PATCH] Implement loading of profile image (#391)

* implement loading of profile image

* rename icon to profilepicture

* rename icon file
---
 ...ceForApplication.cs => IAccountService.cs} |   4 +-
 Ryujinx.HLE/HOS/Services/Acc/IProfile.cs      |  36 +++++++++++++++++-
 Ryujinx.HLE/HOS/Services/ServiceFactory.cs    |   5 ++-
 Ryujinx.HLE/Ryujinx.HLE.csproj                |   8 ++++
 Ryujinx.HLE/RyujinxProfileImage.jpg           | Bin 0 -> 5394 bytes
 5 files changed, 48 insertions(+), 5 deletions(-)
 rename Ryujinx.HLE/HOS/Services/Acc/{IAccountServiceForApplication.cs => IAccountService.cs} (97%)
 create mode 100644 Ryujinx.HLE/RyujinxProfileImage.jpg

diff --git a/Ryujinx.HLE/HOS/Services/Acc/IAccountServiceForApplication.cs b/Ryujinx.HLE/HOS/Services/Acc/IAccountService.cs
similarity index 97%
rename from Ryujinx.HLE/HOS/Services/Acc/IAccountServiceForApplication.cs
rename to Ryujinx.HLE/HOS/Services/Acc/IAccountService.cs
index 36dfd9efa9..8fd7bfeafd 100644
--- a/Ryujinx.HLE/HOS/Services/Acc/IAccountServiceForApplication.cs
+++ b/Ryujinx.HLE/HOS/Services/Acc/IAccountService.cs
@@ -7,13 +7,13 @@ using static Ryujinx.HLE.HOS.ErrorCode;
 
 namespace Ryujinx.HLE.HOS.Services.Acc
 {
-    class IAccountServiceForApplication : IpcService
+    class IAccountService : IpcService
     {
         private Dictionary<int, ServiceProcessRequest> m_Commands;
 
         public override IReadOnlyDictionary<int, ServiceProcessRequest> Commands => m_Commands;
 
-        public IAccountServiceForApplication()
+        public IAccountService()
         {
             m_Commands = new Dictionary<int, ServiceProcessRequest>()
             {
diff --git a/Ryujinx.HLE/HOS/Services/Acc/IProfile.cs b/Ryujinx.HLE/HOS/Services/Acc/IProfile.cs
index 960cc49c01..316f16d082 100644
--- a/Ryujinx.HLE/HOS/Services/Acc/IProfile.cs
+++ b/Ryujinx.HLE/HOS/Services/Acc/IProfile.cs
@@ -3,7 +3,10 @@ using Ryujinx.HLE.HOS.Ipc;
 using Ryujinx.HLE.HOS.SystemState;
 using Ryujinx.HLE.Logging;
 using Ryujinx.HLE.Utilities;
+using System;
 using System.Collections.Generic;
+using System.IO;
+using System.Reflection;
 using System.Text;
 
 namespace Ryujinx.HLE.HOS.Services.Acc
@@ -16,15 +19,21 @@ namespace Ryujinx.HLE.HOS.Services.Acc
 
         private UserProfile Profile;
 
+        private Stream ProfilePictureStream;
+
         public IProfile(UserProfile Profile)
         {
             m_Commands = new Dictionary<int, ServiceProcessRequest>()
             {
-                { 0, Get     },
-                { 1, GetBase }
+                { 0,  Get          },
+                { 1,  GetBase      },
+                { 10, GetImageSize },
+                { 11, LoadImage    },
             };
 
             this.Profile = Profile;
+
+            ProfilePictureStream = Assembly.GetCallingAssembly().GetManifestResourceStream("Ryujinx.HLE.RyujinxProfileImage.jpg");
         }
 
         public long Get(ServiceCtx Context)
@@ -54,5 +63,28 @@ namespace Ryujinx.HLE.HOS.Services.Acc
 
             return 0;
         }
+
+        private long LoadImage(ServiceCtx Context)
+        {
+            long BufferPosition = Context.Request.ReceiveBuff[0].Position;
+            long BufferLen      = Context.Request.ReceiveBuff[0].Size;
+
+            byte[] ProfilePictureData = new byte[BufferLen];
+
+            ProfilePictureStream.Read(ProfilePictureData, 0, ProfilePictureData.Length);
+
+            Context.Memory.WriteBytes(BufferPosition, ProfilePictureData);
+
+            Context.ResponseData.Write(ProfilePictureStream.Length);
+
+            return 0;
+        }
+
+        private long GetImageSize(ServiceCtx Context)
+        {
+            Context.ResponseData.Write(ProfilePictureStream.Length);
+
+            return 0;
+        }
     }
 }
\ No newline at end of file
diff --git a/Ryujinx.HLE/HOS/Services/ServiceFactory.cs b/Ryujinx.HLE/HOS/Services/ServiceFactory.cs
index babceb7db9..5e65d1d104 100644
--- a/Ryujinx.HLE/HOS/Services/ServiceFactory.cs
+++ b/Ryujinx.HLE/HOS/Services/ServiceFactory.cs
@@ -31,7 +31,10 @@ namespace Ryujinx.HLE.HOS.Services
             switch (Name)
             {
                 case "acc:u0":
-                    return new IAccountServiceForApplication();
+                    return new IAccountService();
+
+                case "acc:u1":
+                    return new IAccountService();
 
                 case "aoc:u":
                     return new IAddOnContentManager();
diff --git a/Ryujinx.HLE/Ryujinx.HLE.csproj b/Ryujinx.HLE/Ryujinx.HLE.csproj
index f7fb84a588..fa4c254e24 100644
--- a/Ryujinx.HLE/Ryujinx.HLE.csproj
+++ b/Ryujinx.HLE/Ryujinx.HLE.csproj
@@ -13,6 +13,14 @@
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 
+  <ItemGroup>
+    <None Remove="RyujinxProfileImage.jpg" />
+  </ItemGroup>
+
+  <ItemGroup>
+    <EmbeddedResource Include="RyujinxProfileImage.jpg" />
+  </ItemGroup>
+
   <ItemGroup>
     <ProjectReference Include="..\ChocolArm64\ChocolArm64.csproj" />
     <ProjectReference Include="..\Ryujinx.Audio\Ryujinx.Audio.csproj" />
diff --git a/Ryujinx.HLE/RyujinxProfileImage.jpg b/Ryujinx.HLE/RyujinxProfileImage.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..fe9ec2a9590d2d53ef1dcffc8078f5bd04e7b00f
GIT binary patch
literal 5394
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
G?Dz*nfg|Gp

literal 0
HcmV?d00001