HLE/Applets: Stub Mint (eShop) Applet (#2463)
This allows Phoenix Wright - Dual Destinies to boot.
This commit is contained in:
		
				
					committed by
					
						 Yuri Kunde Schlesner
						Yuri Kunde Schlesner
					
				
			
			
				
	
			
			
			
						parent
						
							0b9c59ff22
						
					
				
				
					commit
					d0bf7df5ba
				
			| @@ -40,6 +40,7 @@ set(SRCS | |||||||
|             hle/applets/applet.cpp |             hle/applets/applet.cpp | ||||||
|             hle/applets/erreula.cpp |             hle/applets/erreula.cpp | ||||||
|             hle/applets/mii_selector.cpp |             hle/applets/mii_selector.cpp | ||||||
|  |             hle/applets/mint.cpp | ||||||
|             hle/applets/swkbd.cpp |             hle/applets/swkbd.cpp | ||||||
|             hle/kernel/address_arbiter.cpp |             hle/kernel/address_arbiter.cpp | ||||||
|             hle/kernel/client_port.cpp |             hle/kernel/client_port.cpp | ||||||
| @@ -219,6 +220,7 @@ set(HEADERS | |||||||
|             hle/applets/applet.h |             hle/applets/applet.h | ||||||
|             hle/applets/erreula.h |             hle/applets/erreula.h | ||||||
|             hle/applets/mii_selector.h |             hle/applets/mii_selector.h | ||||||
|  |             hle/applets/mint.h | ||||||
|             hle/applets/swkbd.h |             hle/applets/swkbd.h | ||||||
|             hle/kernel/address_arbiter.h |             hle/kernel/address_arbiter.h | ||||||
|             hle/kernel/client_port.h |             hle/kernel/client_port.h | ||||||
|   | |||||||
| @@ -12,6 +12,7 @@ | |||||||
| #include "core/hle/applets/applet.h" | #include "core/hle/applets/applet.h" | ||||||
| #include "core/hle/applets/erreula.h" | #include "core/hle/applets/erreula.h" | ||||||
| #include "core/hle/applets/mii_selector.h" | #include "core/hle/applets/mii_selector.h" | ||||||
|  | #include "core/hle/applets/mint.h" | ||||||
| #include "core/hle/applets/swkbd.h" | #include "core/hle/applets/swkbd.h" | ||||||
| #include "core/hle/result.h" | #include "core/hle/result.h" | ||||||
| #include "core/hle/service/apt/apt.h" | #include "core/hle/service/apt/apt.h" | ||||||
| @@ -56,6 +57,10 @@ ResultCode Applet::Create(Service::APT::AppletId id) { | |||||||
|     case Service::APT::AppletId::Error2: |     case Service::APT::AppletId::Error2: | ||||||
|         applets[id] = std::make_shared<ErrEula>(id); |         applets[id] = std::make_shared<ErrEula>(id); | ||||||
|         break; |         break; | ||||||
|  |     case Service::APT::AppletId::Mint: | ||||||
|  |     case Service::APT::AppletId::Mint2: | ||||||
|  |         applets[id] = std::make_shared<Mint>(id); | ||||||
|  |         break; | ||||||
|     default: |     default: | ||||||
|         LOG_ERROR(Service_APT, "Could not create applet %u", id); |         LOG_ERROR(Service_APT, "Could not create applet %u", id); | ||||||
|         // TODO(Subv): Find the right error code |         // TODO(Subv): Find the right error code | ||||||
|   | |||||||
							
								
								
									
										72
									
								
								src/core/hle/applets/mint.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								src/core/hle/applets/mint.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | |||||||
|  | // Copyright 2016 Citra Emulator Project | ||||||
|  | // Licensed under GPLv2 or any later version | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #include "common/string_util.h" | ||||||
|  | #include "core/hle/applets/mint.h" | ||||||
|  | #include "core/hle/service/apt/apt.h" | ||||||
|  |  | ||||||
|  | namespace HLE { | ||||||
|  | namespace Applets { | ||||||
|  |  | ||||||
|  | ResultCode Mint::ReceiveParameter(const Service::APT::MessageParameter& parameter) { | ||||||
|  |     if (parameter.signal != static_cast<u32>(Service::APT::SignalType::Request)) { | ||||||
|  |         LOG_ERROR(Service_APT, "unsupported signal %u", parameter.signal); | ||||||
|  |         UNIMPLEMENTED(); | ||||||
|  |         // TODO(Subv): Find the right error code | ||||||
|  |         return ResultCode(-1); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // The Request message contains a buffer with the size of the framebuffer shared | ||||||
|  |     // memory. | ||||||
|  |     // Create the SharedMemory that will hold the framebuffer data | ||||||
|  |     Service::APT::CaptureBufferInfo capture_info; | ||||||
|  |     ASSERT(sizeof(capture_info) == parameter.buffer.size()); | ||||||
|  |  | ||||||
|  |     memcpy(&capture_info, parameter.buffer.data(), sizeof(capture_info)); | ||||||
|  |  | ||||||
|  |     // TODO: allocated memory never released | ||||||
|  |     using Kernel::MemoryPermission; | ||||||
|  |     // Allocate a heap block of the required size for this applet. | ||||||
|  |     heap_memory = std::make_shared<std::vector<u8>>(capture_info.size); | ||||||
|  |     // Create a SharedMemory that directly points to this heap block. | ||||||
|  |     framebuffer_memory = Kernel::SharedMemory::CreateForApplet( | ||||||
|  |         heap_memory, 0, heap_memory->size(), MemoryPermission::ReadWrite, | ||||||
|  |         MemoryPermission::ReadWrite, "Mint Memory"); | ||||||
|  |  | ||||||
|  |     // Send the response message with the newly created SharedMemory | ||||||
|  |     Service::APT::MessageParameter result; | ||||||
|  |     result.signal = static_cast<u32>(Service::APT::SignalType::Response); | ||||||
|  |     result.buffer.clear(); | ||||||
|  |     result.destination_id = static_cast<u32>(Service::APT::AppletId::Application); | ||||||
|  |     result.sender_id = static_cast<u32>(id); | ||||||
|  |     result.object = framebuffer_memory; | ||||||
|  |  | ||||||
|  |     Service::APT::SendParameter(result); | ||||||
|  |     return RESULT_SUCCESS; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ResultCode Mint::StartImpl(const Service::APT::AppletStartupParameter& parameter) { | ||||||
|  |     is_running = true; | ||||||
|  |  | ||||||
|  |     // TODO(Subv): Set the expected fields in the response buffer before resending it to the | ||||||
|  |     // application. | ||||||
|  |     // TODO(Subv): Reverse the parameter format for the Mint applet | ||||||
|  |  | ||||||
|  |     // Let the application know that we're closing | ||||||
|  |     Service::APT::MessageParameter message; | ||||||
|  |     message.buffer.resize(parameter.buffer.size()); | ||||||
|  |     std::fill(message.buffer.begin(), message.buffer.end(), 0); | ||||||
|  |     message.signal = static_cast<u32>(Service::APT::SignalType::WakeupByExit); | ||||||
|  |     message.destination_id = static_cast<u32>(Service::APT::AppletId::Application); | ||||||
|  |     message.sender_id = static_cast<u32>(id); | ||||||
|  |     Service::APT::SendParameter(message); | ||||||
|  |  | ||||||
|  |     is_running = false; | ||||||
|  |     return RESULT_SUCCESS; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Mint::Update() {} | ||||||
|  |  | ||||||
|  | } // namespace Applets | ||||||
|  | } // namespace HLE | ||||||
							
								
								
									
										29
									
								
								src/core/hle/applets/mint.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/core/hle/applets/mint.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | |||||||
|  | // Copyright 2016 Citra Emulator Project | ||||||
|  | // Licensed under GPLv2 or any later version | ||||||
|  | // Refer to the license.txt file included. | ||||||
|  |  | ||||||
|  | #pragma once | ||||||
|  |  | ||||||
|  | #include "core/hle/applets/applet.h" | ||||||
|  | #include "core/hle/kernel/shared_memory.h" | ||||||
|  |  | ||||||
|  | namespace HLE { | ||||||
|  | namespace Applets { | ||||||
|  |  | ||||||
|  | class Mint final : public Applet { | ||||||
|  | public: | ||||||
|  |     explicit Mint(Service::APT::AppletId id) : Applet(id) {} | ||||||
|  |  | ||||||
|  |     ResultCode ReceiveParameter(const Service::APT::MessageParameter& parameter) override; | ||||||
|  |     ResultCode StartImpl(const Service::APT::AppletStartupParameter& parameter) override; | ||||||
|  |     void Update() override; | ||||||
|  |  | ||||||
|  | private: | ||||||
|  |     /// This SharedMemory will be created when we receive the Request message. | ||||||
|  |     /// It holds the framebuffer info retrieved by the application with | ||||||
|  |     /// GSPGPU::ImportDisplayCaptureInfo | ||||||
|  |     Kernel::SharedPtr<Kernel::SharedMemory> framebuffer_memory; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | } // namespace Applets | ||||||
|  | } // namespace HLE | ||||||
		Reference in New Issue
	
	Block a user