mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	core/frd: Correct FunctionInfo and stub more functions (#6209)
This commit is contained in:
		
							parent
							
								
									964f9ee3cf
								
							
						
					
					
						commit
						22c4eb86d7
					
				
					 4 changed files with 89 additions and 6 deletions
				
			
		|  | @ -10,6 +10,7 @@ | ||||||
| #include "common/string_util.h" | #include "common/string_util.h" | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
| #include "core/hle/ipc_helpers.h" | #include "core/hle/ipc_helpers.h" | ||||||
|  | #include "core/hle/kernel/event.h" | ||||||
| #include "core/hle/result.h" | #include "core/hle/result.h" | ||||||
| #include "core/hle/service/cfg/cfg.h" | #include "core/hle/service/cfg/cfg.h" | ||||||
| #include "core/hle/service/frd/frd.h" | #include "core/hle/service/frd/frd.h" | ||||||
|  | @ -157,6 +158,44 @@ void Module::Interface::SetClientSdkVersion(Kernel::HLERequestContext& ctx) { | ||||||
|     LOG_WARNING(Service_FRD, "(STUBBED) called, version: 0x{:08X}", version); |     LOG_WARNING(Service_FRD, "(STUBBED) called, version: 0x{:08X}", version); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Module::Interface::HasLoggedIn(Kernel::HLERequestContext& ctx) { | ||||||
|  |     LOG_WARNING(Service_FRD, "(STUBBED) called"); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestParser rp(ctx); | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  |     rb.Push(frd->logged_in); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Module::Interface::Login(Kernel::HLERequestContext& ctx) { | ||||||
|  |     LOG_WARNING(Service_FRD, "(STUBBED) called"); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestParser rp(ctx); | ||||||
|  |     frd->login_event = rp.PopObject<Kernel::Event>(); | ||||||
|  | 
 | ||||||
|  |     constexpr auto login_delay_ms = 500; | ||||||
|  |     frd->login_delay_event = frd->system.CoreTiming().RegisterEvent( | ||||||
|  |         "frd::login_event", | ||||||
|  |         // Simulate a small login delay
 | ||||||
|  |         [this](u64 thread_id, s64 cycle_late) { | ||||||
|  |             frd->logged_in = true; | ||||||
|  |             frd->login_event->Signal(); | ||||||
|  |             frd->system.CoreTiming().RemoveEvent(frd->login_delay_event); | ||||||
|  |         }); | ||||||
|  |     frd->system.CoreTiming().ScheduleEvent(msToCycles(login_delay_ms), frd->login_delay_event); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Module::Interface::GetLastResponseResult(Kernel::HLERequestContext& ctx) { | ||||||
|  |     LOG_WARNING(Service_FRD, "(STUBBED) called"); | ||||||
|  | 
 | ||||||
|  |     IPC::RequestParser rp(ctx); | ||||||
|  |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|  |     rb.Push(RESULT_SUCCESS); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| Module::Module(Core::System& system) : system(system){}; | Module::Module(Core::System& system) : system(system){}; | ||||||
| Module::~Module() = default; | Module::~Module() = default; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -12,6 +12,10 @@ namespace Core { | ||||||
| class System; | class System; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | namespace Kernel { | ||||||
|  | class Event; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| namespace Service::FRD { | namespace Service::FRD { | ||||||
| 
 | 
 | ||||||
| struct FriendKey { | struct FriendKey { | ||||||
|  | @ -146,6 +150,34 @@ public: | ||||||
|          */ |          */ | ||||||
|         void SetClientSdkVersion(Kernel::HLERequestContext& ctx); |         void SetClientSdkVersion(Kernel::HLERequestContext& ctx); | ||||||
| 
 | 
 | ||||||
|  |         /**
 | ||||||
|  |          * FRD::Login service function | ||||||
|  |          *  Inputs: | ||||||
|  |          *      65 : Address of unknown event | ||||||
|  |          *  Outputs: | ||||||
|  |          *      1  : Result of function, 0 on success, otherwise error code | ||||||
|  |          */ | ||||||
|  |         void Login(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |         /**
 | ||||||
|  |          * FRD::HasLoggedIn service function | ||||||
|  |          *  Inputs: | ||||||
|  |          *      none | ||||||
|  |          *  Outputs: | ||||||
|  |          *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |          *      2 : If the user has logged in 1, otherwise 0 | ||||||
|  |          */ | ||||||
|  |         void HasLoggedIn(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|  |         /**
 | ||||||
|  |          * FRD::GetLastResponseResult service function | ||||||
|  |          *  Inputs: | ||||||
|  |          *      none | ||||||
|  |          *  Outputs: | ||||||
|  |          *      1 : Result of function, 0 on success, otherwise error code | ||||||
|  |          */ | ||||||
|  |         void GetLastResponseResult(Kernel::HLERequestContext& ctx); | ||||||
|  | 
 | ||||||
|     protected: |     protected: | ||||||
|         std::shared_ptr<Module> frd; |         std::shared_ptr<Module> frd; | ||||||
|     }; |     }; | ||||||
|  | @ -153,12 +185,16 @@ public: | ||||||
| private: | private: | ||||||
|     FriendKey my_friend_key = {0, 0, 0ull}; |     FriendKey my_friend_key = {0, 0, 0ull}; | ||||||
|     MyPresence my_presence = {}; |     MyPresence my_presence = {}; | ||||||
|  |     bool logged_in = false; | ||||||
|  |     std::shared_ptr<Kernel::Event> login_event; | ||||||
|  |     Core::TimingEventType* login_delay_event; | ||||||
|     Core::System& system; |     Core::System& system; | ||||||
| 
 | 
 | ||||||
|     template <class Archive> |     template <class Archive> | ||||||
|     void serialize(Archive& ar, const unsigned int) { |     void serialize(Archive& ar, const unsigned int) { | ||||||
|         ar& my_friend_key; |         ar& my_friend_key; | ||||||
|         ar& my_presence; |         ar& my_presence; | ||||||
|  |         ar& logged_in; | ||||||
|     } |     } | ||||||
|     friend class boost::serialization::access; |     friend class boost::serialization::access; | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -11,9 +11,9 @@ namespace Service::FRD { | ||||||
| 
 | 
 | ||||||
| FRD_A::FRD_A(std::shared_ptr<Module> frd) : Module::Interface(std::move(frd), "frd:a", 8) { | FRD_A::FRD_A(std::shared_ptr<Module> frd) : Module::Interface(std::move(frd), "frd:a", 8) { | ||||||
|     static const FunctionInfo functions[] = { |     static const FunctionInfo functions[] = { | ||||||
|         {0x0001, nullptr, "HasLoggedIn"}, |         {0x0001, &FRD_A::HasLoggedIn, "HasLoggedIn"}, | ||||||
|         {0x0002, nullptr, "IsOnline"}, |         {0x0002, nullptr, "IsOnline"}, | ||||||
|         {0x0003, nullptr, "Login"}, |         {0x0003, &FRD_A::Login, "Login"}, | ||||||
|         {0x0004, nullptr, "Logout"}, |         {0x0004, nullptr, "Logout"}, | ||||||
|         {0x0005, &FRD_A::GetMyFriendKey, "GetMyFriendKey"}, |         {0x0005, &FRD_A::GetMyFriendKey, "GetMyFriendKey"}, | ||||||
|         {0x0006, nullptr, "GetMyPreference"}, |         {0x0006, nullptr, "GetMyPreference"}, | ||||||
|  | @ -45,7 +45,7 @@ FRD_A::FRD_A(std::shared_ptr<Module> frd) : Module::Interface(std::move(frd), "f | ||||||
|         {0x0020, nullptr, "AttachToEventNotification"}, |         {0x0020, nullptr, "AttachToEventNotification"}, | ||||||
|         {0x0021, nullptr, "SetNotificationMask"}, |         {0x0021, nullptr, "SetNotificationMask"}, | ||||||
|         {0x0022, nullptr, "GetEventNotification"}, |         {0x0022, nullptr, "GetEventNotification"}, | ||||||
|         {0x0023, nullptr, "GetLastResponseResult"}, |         {0x0023, &FRD_A::GetLastResponseResult, "GetLastResponseResult"}, | ||||||
|         {0x0024, nullptr, "PrincipalIdToFriendCode"}, |         {0x0024, nullptr, "PrincipalIdToFriendCode"}, | ||||||
|         {0x0025, nullptr, "FriendCodeToPrincipalId"}, |         {0x0025, nullptr, "FriendCodeToPrincipalId"}, | ||||||
|         {0x0026, nullptr, "IsValidFriendCode"}, |         {0x0026, nullptr, "IsValidFriendCode"}, | ||||||
|  | @ -64,6 +64,14 @@ FRD_A::FRD_A(std::shared_ptr<Module> frd) : Module::Interface(std::move(frd), "f | ||||||
|         {0x0033, nullptr, "GetMyApproachContext"}, |         {0x0033, nullptr, "GetMyApproachContext"}, | ||||||
|         {0x0034, nullptr, "AddFriendWithApproach"}, |         {0x0034, nullptr, "AddFriendWithApproach"}, | ||||||
|         {0x0035, nullptr, "DecryptApproachContext"}, |         {0x0035, nullptr, "DecryptApproachContext"}, | ||||||
|  |         {0x0406, nullptr, "AddFriendOnline"}, | ||||||
|  |         {0x0409, nullptr, "RemoveFriend"}, | ||||||
|  |         {0x040a, nullptr, "UpdatePlayingGame"}, | ||||||
|  |         {0x040b, nullptr, "UpdatePreference"}, | ||||||
|  |         {0x040c, nullptr, "UpdateMii"}, | ||||||
|  |         {0x040d, nullptr, "UpdateFavoriteGame"}, | ||||||
|  |         {0x040e, nullptr, "UpdateNcPrincipalId"}, | ||||||
|  |         {0x040f, nullptr, "UpdateComment"}, | ||||||
|     }; |     }; | ||||||
|     RegisterHandlers(functions); |     RegisterHandlers(functions); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -11,9 +11,9 @@ namespace Service::FRD { | ||||||
| 
 | 
 | ||||||
| FRD_U::FRD_U(std::shared_ptr<Module> frd) : Module::Interface(std::move(frd), "frd:u", 8) { | FRD_U::FRD_U(std::shared_ptr<Module> frd) : Module::Interface(std::move(frd), "frd:u", 8) { | ||||||
|     static const FunctionInfo functions[] = { |     static const FunctionInfo functions[] = { | ||||||
|         {0x0001, nullptr, "HasLoggedIn"}, |         {0x0001, &FRD_U::HasLoggedIn, "HasLoggedIn"}, | ||||||
|         {0x0002, nullptr, "IsOnline"}, |         {0x0002, nullptr, "IsOnline"}, | ||||||
|         {0x0003, nullptr, "Login"}, |         {0x0003, &FRD_U::Login, "Login"}, | ||||||
|         {0x0004, nullptr, "Logout"}, |         {0x0004, nullptr, "Logout"}, | ||||||
|         {0x0005, &FRD_U::GetMyFriendKey, "GetMyFriendKey"}, |         {0x0005, &FRD_U::GetMyFriendKey, "GetMyFriendKey"}, | ||||||
|         {0x0006, nullptr, "GetMyPreference"}, |         {0x0006, nullptr, "GetMyPreference"}, | ||||||
|  | @ -45,7 +45,7 @@ FRD_U::FRD_U(std::shared_ptr<Module> frd) : Module::Interface(std::move(frd), "f | ||||||
|         {0x0020, nullptr, "AttachToEventNotification"}, |         {0x0020, nullptr, "AttachToEventNotification"}, | ||||||
|         {0x0021, nullptr, "SetNotificationMask"}, |         {0x0021, nullptr, "SetNotificationMask"}, | ||||||
|         {0x0022, nullptr, "GetEventNotification"}, |         {0x0022, nullptr, "GetEventNotification"}, | ||||||
|         {0x0023, nullptr, "GetLastResponseResult"}, |         {0x0023, &FRD_U::GetLastResponseResult, "GetLastResponseResult"}, | ||||||
|         {0x0024, nullptr, "PrincipalIdToFriendCode"}, |         {0x0024, nullptr, "PrincipalIdToFriendCode"}, | ||||||
|         {0x0025, nullptr, "FriendCodeToPrincipalId"}, |         {0x0025, nullptr, "FriendCodeToPrincipalId"}, | ||||||
|         {0x0026, nullptr, "IsValidFriendCode"}, |         {0x0026, nullptr, "IsValidFriendCode"}, | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue