frd:u: Initial stub some functions

This commit is contained in:
mailwl 2016-03-01 20:41:40 +03:00
parent e366f60cff
commit 81d988b022
6 changed files with 236 additions and 55 deletions

View File

@ -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) \

View File

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

View File

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

View File

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

View File

@ -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"},

View File

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