mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	frd:u: Initial stub some functions
This commit is contained in:
		
							parent
							
								
									e366f60cff
								
							
						
					
					
						commit
						81d988b022
					
				
					 6 changed files with 236 additions and 55 deletions
				
			
		|  | @ -34,6 +34,7 @@ namespace Log { | ||||||
|         SUB(Kernel, SVC) \ |         SUB(Kernel, SVC) \ | ||||||
|         CLS(Service) \ |         CLS(Service) \ | ||||||
|         SUB(Service, SRV) \ |         SUB(Service, SRV) \ | ||||||
|  |         SUB(Service, FRD) \ | ||||||
|         SUB(Service, FS) \ |         SUB(Service, FS) \ | ||||||
|         SUB(Service, ERR) \ |         SUB(Service, ERR) \ | ||||||
|         SUB(Service, APT) \ |         SUB(Service, APT) \ | ||||||
|  |  | ||||||
|  | @ -49,6 +49,7 @@ enum class Class : ClassType { | ||||||
|     Service,                    ///< HLE implementation of system services. Each major service
 |     Service,                    ///< HLE implementation of system services. Each major service
 | ||||||
|                                 ///  should have its own subclass.
 |                                 ///  should have its own subclass.
 | ||||||
|     Service_SRV,                ///< The SRV (Service Directory) implementation
 |     Service_SRV,                ///< The SRV (Service Directory) implementation
 | ||||||
|  |     Service_FRD,                ///< The FRD (Friends) service
 | ||||||
|     Service_FS,                 ///< The FS (Filesystem) service implementation
 |     Service_FS,                 ///< The FS (Filesystem) service implementation
 | ||||||
|     Service_ERR,                ///< The ERR (Error) port implementation
 |     Service_ERR,                ///< The ERR (Error) port implementation
 | ||||||
|     Service_APT,                ///< The APT (Applets) service
 |     Service_APT,                ///< The APT (Applets) service
 | ||||||
|  |  | ||||||
|  | @ -2,6 +2,8 @@ | ||||||
| // Licensed under GPLv2 or any later version
 | // Licensed under GPLv2 or any later version
 | ||||||
| // Refer to the license.txt file included.
 | // Refer to the license.txt file included.
 | ||||||
| 
 | 
 | ||||||
|  | #include "common/string_util.h" | ||||||
|  | 
 | ||||||
| #include "core/hle/service/service.h" | #include "core/hle/service/service.h" | ||||||
| #include "core/hle/service/frd/frd.h" | #include "core/hle/service/frd/frd.h" | ||||||
| #include "core/hle/service/frd/frd_a.h" | #include "core/hle/service/frd/frd_a.h" | ||||||
|  | @ -10,6 +12,95 @@ | ||||||
| namespace Service { | namespace Service { | ||||||
| namespace FRD { | namespace FRD { | ||||||
| 
 | 
 | ||||||
|  | static FriendKey my_friend_key = {0, 0, 0ull}; | ||||||
|  | static MyPresence my_presence = {}; | ||||||
|  | 
 | ||||||
|  | void GetMyPresence(Service::Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  | 
 | ||||||
|  |     u32 shifted_out_size = cmd_buff[64]; | ||||||
|  |     u32 my_presence_addr = cmd_buff[65]; | ||||||
|  | 
 | ||||||
|  |     ASSERT(shifted_out_size == ((sizeof(MyPresence) << 14) | 2)); | ||||||
|  | 
 | ||||||
|  |     Memory::WriteBlock(my_presence_addr, reinterpret_cast<const u8*>(&my_presence), sizeof(MyPresence)); | ||||||
|  | 
 | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; // No error
 | ||||||
|  | 
 | ||||||
|  |     LOG_WARNING(Service_FRD, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GetFriendKeyList(Service::Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  | 
 | ||||||
|  |     u32 unknown = cmd_buff[1]; | ||||||
|  |     u32 frd_count = cmd_buff[2]; | ||||||
|  |     u32 frd_key_addr = cmd_buff[65]; | ||||||
|  | 
 | ||||||
|  |     FriendKey zero_key = {}; | ||||||
|  |     for (u32 i = 0; i < frd_count; ++i) { | ||||||
|  |         Memory::WriteBlock(frd_key_addr + i * sizeof(FriendKey), | ||||||
|  |                            reinterpret_cast<const u8*>(&zero_key), sizeof(FriendKey)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; // No error
 | ||||||
|  |     cmd_buff[2] = 0; // 0 friends
 | ||||||
|  |     LOG_WARNING(Service_FRD, "(STUBBED) called, unknown=%d, frd_count=%d, frd_key_addr=0x%08X", | ||||||
|  |                 unknown, frd_count, frd_key_addr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GetFriendProfile(Service::Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  | 
 | ||||||
|  |     u32 count = cmd_buff[1]; | ||||||
|  |     u32 frd_key_addr = cmd_buff[3]; | ||||||
|  |     u32 profiles_addr = cmd_buff[65]; | ||||||
|  | 
 | ||||||
|  |     Profile zero_profile = {}; | ||||||
|  |     for (u32 i = 0; i < count; ++i) { | ||||||
|  |         Memory::WriteBlock(profiles_addr + i * sizeof(Profile), | ||||||
|  |             reinterpret_cast<const u8*>(&zero_profile), sizeof(Profile)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; // No error
 | ||||||
|  |     LOG_WARNING(Service_FRD, "(STUBBED) called, count=%d, frd_key_addr=0x%08X, profiles_addr=0x%08X", | ||||||
|  |                 count, frd_key_addr, profiles_addr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GetFriendAttributeFlags(Service::Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  | 
 | ||||||
|  |     u32 count           = cmd_buff[1]; | ||||||
|  |     u32 frd_key_addr    = cmd_buff[3]; | ||||||
|  |     u32 attr_flags_addr = cmd_buff[65]; | ||||||
|  | 
 | ||||||
|  |     for (u32 i = 0; i < count; ++i) { | ||||||
|  |         //TODO:(mailwl) figure out AttributeFlag size and zero all buffer. Assume 1 byte
 | ||||||
|  |         Memory::Write8(attr_flags_addr + i, 0); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; // No error
 | ||||||
|  |     LOG_WARNING(Service_FRD, "(STUBBED) called, count=%d, frd_key_addr=0x%08X, attr_flags_addr=0x%08X", | ||||||
|  |                 count, frd_key_addr, attr_flags_addr); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GetMyFriendKey(Service::Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  | 
 | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; // No error
 | ||||||
|  |     Memory::WriteBlock(cmd_buff[2], reinterpret_cast<const u8*>(&my_friend_key), sizeof(FriendKey)); | ||||||
|  |     LOG_WARNING(Service_FRD, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void GetMyScreenName(Service::Interface* self) { | ||||||
|  |     u32* cmd_buff = Kernel::GetCommandBuffer(); | ||||||
|  | 
 | ||||||
|  |     cmd_buff[1] = RESULT_SUCCESS.raw; // No error
 | ||||||
|  |     // TODO: (mailwl) get the name from config
 | ||||||
|  |     Common::UTF8ToUTF16("Citra").copy(reinterpret_cast<char16_t*>(&cmd_buff[2]), 11); | ||||||
|  |     LOG_WARNING(Service_FRD, "(STUBBED) called"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Init() { | void Init() { | ||||||
|     using namespace Kernel; |     using namespace Kernel; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -4,9 +4,97 @@ | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include "common/common_types.h" | ||||||
|  | 
 | ||||||
| namespace Service { | namespace Service { | ||||||
|  | 
 | ||||||
|  | class Interface; | ||||||
|  | 
 | ||||||
| namespace FRD { | namespace FRD { | ||||||
| 
 | 
 | ||||||
|  | struct FriendKey { | ||||||
|  |     u32 friend_id; | ||||||
|  |     u32 unknown; | ||||||
|  |     u64 friend_code; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct MyPresence { | ||||||
|  |     u8 unknown[0x12C]; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | struct Profile { | ||||||
|  |     u8 region; | ||||||
|  |     u8 country; | ||||||
|  |     u8 area; | ||||||
|  |     u8 language; | ||||||
|  |     u32 unknown; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * FRD::GetMyPresence service function | ||||||
|  |  *  Inputs: | ||||||
|  |  *      64 : sizeof (MyPresence) << 14 | 2 | ||||||
|  |  *      65 : Address of MyPresence structure | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  */ | ||||||
|  | void GetMyPresence(Service::Interface* self); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * FRD::GetFriendKeyList service function | ||||||
|  |  *  Inputs: | ||||||
|  |  *      1 : Unknown | ||||||
|  |  *      2 : Max friends count | ||||||
|  |  *      65 : Address of FriendKey List | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  *      2 : FriendKey count filled | ||||||
|  |  */ | ||||||
|  | void GetFriendKeyList(Service::Interface* self); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * FRD::GetFriendProfile service function | ||||||
|  |  *  Inputs: | ||||||
|  |  *      1 : Friends count | ||||||
|  |  *      2 : Friends count << 18 | 2 | ||||||
|  |  *      3 : Address of FriendKey List | ||||||
|  |  *      64 : (count * sizeof (Profile)) << 10 | 2 | ||||||
|  |  *      65 : Address of Profiles List | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  */ | ||||||
|  | void GetFriendProfile(Service::Interface* self); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * FRD::GetFriendAttributeFlags service function | ||||||
|  |  *  Inputs: | ||||||
|  |  *      1 : Friends count | ||||||
|  |  *      2 : Friends count << 18 | 2 | ||||||
|  |  *      3 : Address of FriendKey List | ||||||
|  |  *      65 : Address of AttributeFlags | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  */ | ||||||
|  | void GetFriendAttributeFlags(Service::Interface* self); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * FRD::GetMyFriendKey service function | ||||||
|  |  *  Inputs: | ||||||
|  |  *      none | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  *      2-5 : FriendKey | ||||||
|  |  */ | ||||||
|  | void GetMyFriendKey(Service::Interface* self); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * FRD::GetMyScreenName service function | ||||||
|  |  *  Outputs: | ||||||
|  |  *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |  *      2 : UTF16 encoded name (max 11 symbols) | ||||||
|  |  */ | ||||||
|  | void GetMyScreenName(Service::Interface* self); | ||||||
|  | 
 | ||||||
| /// Initialize FRD service(s)
 | /// Initialize FRD service(s)
 | ||||||
| void Init(); | void Init(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,6 +2,7 @@ | ||||||
| // Licensed under GPLv2 or any later version
 | // Licensed under GPLv2 or any later version
 | ||||||
| // Refer to the license.txt file included.
 | // Refer to the license.txt file included.
 | ||||||
| 
 | 
 | ||||||
|  | #include "core/hle/service/frd/frd.h" | ||||||
| #include "core/hle/service/frd/frd_u.h" | #include "core/hle/service/frd/frd_u.h" | ||||||
| 
 | 
 | ||||||
| namespace Service { | namespace Service { | ||||||
|  | @ -12,11 +13,11 @@ const Interface::FunctionInfo FunctionTable[] = { | ||||||
|     {0x00020000, nullptr,                 "IsOnline"}, |     {0x00020000, nullptr,                 "IsOnline"}, | ||||||
|     {0x00030000, nullptr,                 "Login"}, |     {0x00030000, nullptr,                 "Login"}, | ||||||
|     {0x00040000, nullptr,                 "Logout"}, |     {0x00040000, nullptr,                 "Logout"}, | ||||||
|     {0x00050000, nullptr,               "GetMyFriendKey"}, |     {0x00050000, GetMyFriendKey,          "GetMyFriendKey"}, | ||||||
|     {0x00060000, nullptr,                 "GetMyPreference"}, |     {0x00060000, nullptr,                 "GetMyPreference"}, | ||||||
|     {0x00070000, nullptr,                 "GetMyProfile"}, |     {0x00070000, nullptr,                 "GetMyProfile"}, | ||||||
|     {0x00080000, nullptr,               "GetMyPresence"}, |     {0x00080000, GetMyPresence,           "GetMyPresence"}, | ||||||
|     {0x00090000, nullptr,               "GetMyScreenName"}, |     {0x00090000, GetMyScreenName,         "GetMyScreenName"}, | ||||||
|     {0x000A0000, nullptr,                 "GetMyMii"}, |     {0x000A0000, nullptr,                 "GetMyMii"}, | ||||||
|     {0x000B0000, nullptr,                 "GetMyLocalAccountId"}, |     {0x000B0000, nullptr,                 "GetMyLocalAccountId"}, | ||||||
|     {0x000C0000, nullptr,                 "GetMyPlayingGame"}, |     {0x000C0000, nullptr,                 "GetMyPlayingGame"}, | ||||||
|  | @ -24,13 +25,13 @@ const Interface::FunctionInfo FunctionTable[] = { | ||||||
|     {0x000E0000, nullptr,                 "GetMyNcPrincipalId"}, |     {0x000E0000, nullptr,                 "GetMyNcPrincipalId"}, | ||||||
|     {0x000F0000, nullptr,                 "GetMyComment"}, |     {0x000F0000, nullptr,                 "GetMyComment"}, | ||||||
|     {0x00100040, nullptr,                 "GetMyPassword"}, |     {0x00100040, nullptr,                 "GetMyPassword"}, | ||||||
|     {0x00110080, nullptr,               "GetFriendKeyList"}, |     {0x00110080, GetFriendKeyList,        "GetFriendKeyList"}, | ||||||
|     {0x00120042, nullptr,                 "GetFriendPresence"}, |     {0x00120042, nullptr,                 "GetFriendPresence"}, | ||||||
|     {0x00130142, nullptr,                 "GetFriendScreenName"}, |     {0x00130142, nullptr,                 "GetFriendScreenName"}, | ||||||
|     {0x00140044, nullptr,                 "GetFriendMii"}, |     {0x00140044, nullptr,                 "GetFriendMii"}, | ||||||
|     {0x00150042, nullptr,               "GetFriendProfile"}, |     {0x00150042, GetFriendProfile,        "GetFriendProfile"}, | ||||||
|     {0x00160042, nullptr,                 "GetFriendRelationship"}, |     {0x00160042, nullptr,                 "GetFriendRelationship"}, | ||||||
|     {0x00170042, nullptr,               "GetFriendAttributeFlags"}, |     {0x00170042, GetFriendAttributeFlags, "GetFriendAttributeFlags"}, | ||||||
|     {0x00180044, nullptr,                 "GetFriendPlayingGame"}, |     {0x00180044, nullptr,                 "GetFriendPlayingGame"}, | ||||||
|     {0x00190042, nullptr,                 "GetFriendFavoriteGame"}, |     {0x00190042, nullptr,                 "GetFriendFavoriteGame"}, | ||||||
|     {0x001A00C4, nullptr,                 "GetFriendInfo"}, |     {0x001A00C4, nullptr,                 "GetFriendInfo"}, | ||||||
|  |  | ||||||
|  | @ -70,9 +70,8 @@ ResultVal<bool> Interface::SyncRequest() { | ||||||
|         // TODO(bunnei): Hack - ignore error
 |         // TODO(bunnei): Hack - ignore error
 | ||||||
|         cmd_buff[1] = 0; |         cmd_buff[1] = 0; | ||||||
|         return MakeResult<bool>(false); |         return MakeResult<bool>(false); | ||||||
|     } else { |  | ||||||
|         LOG_TRACE(Service, "%s", MakeFunctionString(itr->second.name, GetPortName().c_str(), cmd_buff).c_str()); |  | ||||||
|     } |     } | ||||||
|  |     LOG_TRACE(Service, "%s", MakeFunctionString(itr->second.name, GetPortName().c_str(), cmd_buff).c_str()); | ||||||
| 
 | 
 | ||||||
|     itr->second.func(this); |     itr->second.func(this); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue