forked from eden-emu/eden
		
	HLE/Applets: Implement ErrEula applet
This commit is contained in:
		
							parent
							
								
									c961b73823
								
							
						
					
					
						commit
						367f5dc215
					
				
					 5 changed files with 118 additions and 0 deletions
				
			
		|  | @ -27,6 +27,7 @@ set(SRCS | ||||||
|             hle/config_mem.cpp |             hle/config_mem.cpp | ||||||
|             hle/hle.cpp |             hle/hle.cpp | ||||||
|             hle/applets/applet.cpp |             hle/applets/applet.cpp | ||||||
|  |             hle/applets/erreula.cpp | ||||||
|             hle/applets/mii_selector.cpp |             hle/applets/mii_selector.cpp | ||||||
|             hle/applets/swkbd.cpp |             hle/applets/swkbd.cpp | ||||||
|             hle/kernel/address_arbiter.cpp |             hle/kernel/address_arbiter.cpp | ||||||
|  | @ -168,6 +169,7 @@ set(HEADERS | ||||||
|             hle/function_wrappers.h |             hle/function_wrappers.h | ||||||
|             hle/hle.h |             hle/hle.h | ||||||
|             hle/applets/applet.h |             hle/applets/applet.h | ||||||
|  |             hle/applets/erreula.h | ||||||
|             hle/applets/mii_selector.h |             hle/applets/mii_selector.h | ||||||
|             hle/applets/swkbd.h |             hle/applets/swkbd.h | ||||||
|             hle/kernel/address_arbiter.h |             hle/kernel/address_arbiter.h | ||||||
|  |  | ||||||
|  | @ -12,6 +12,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "core/core_timing.h" | #include "core/core_timing.h" | ||||||
| #include "core/hle/applets/applet.h" | #include "core/hle/applets/applet.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/swkbd.h" | #include "core/hle/applets/swkbd.h" | ||||||
| #include "core/hle/result.h" | #include "core/hle/result.h" | ||||||
|  | @ -52,6 +53,10 @@ ResultCode Applet::Create(Service::APT::AppletId id) { | ||||||
|     case Service::APT::AppletId::Ed2: |     case Service::APT::AppletId::Ed2: | ||||||
|         applets[id] = std::make_shared<MiiSelector>(id); |         applets[id] = std::make_shared<MiiSelector>(id); | ||||||
|         break; |         break; | ||||||
|  |     case Service::APT::AppletId::Error: | ||||||
|  |     case Service::APT::AppletId::Error2: | ||||||
|  |         applets[id] = std::make_shared<ErrEula>(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/erreula.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								src/core/hle/applets/erreula.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/erreula.h" | ||||||
|  | #include "core/hle/service/apt/apt.h" | ||||||
|  | 
 | ||||||
|  | namespace HLE { | ||||||
|  | namespace Applets { | ||||||
|  | 
 | ||||||
|  | ResultCode ErrEula::ReceiveParameter(const Service::APT::MessageParameter& parameter) { | ||||||
|  |     if (parameter.signal != static_cast<u32>(Service::APT::SignalType::LibAppJustStarted)) { | ||||||
|  |         LOG_ERROR(Service_APT, "unsupported signal %u", parameter.signal); | ||||||
|  |         UNIMPLEMENTED(); | ||||||
|  |         // TODO(Subv): Find the right error code
 | ||||||
|  |         return ResultCode(-1); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // The LibAppJustStarted 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, | ||||||
|  |                                                                "ErrEula Memory"); | ||||||
|  | 
 | ||||||
|  |     // Send the response message with the newly created SharedMemory
 | ||||||
|  |     Service::APT::MessageParameter result; | ||||||
|  |     result.signal = static_cast<u32>(Service::APT::SignalType::LibAppFinished); | ||||||
|  |     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 ErrEula::StartImpl(const Service::APT::AppletStartupParameter& parameter) { | ||||||
|  |     started = 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 ErrEula 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::LibAppClosed); | ||||||
|  |     message.destination_id = static_cast<u32>(Service::APT::AppletId::Application); | ||||||
|  |     message.sender_id = static_cast<u32>(id); | ||||||
|  |     Service::APT::SendParameter(message); | ||||||
|  | 
 | ||||||
|  |     started = false; | ||||||
|  |     return RESULT_SUCCESS; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void ErrEula::Update() { | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace Applets
 | ||||||
|  | } // namespace HLE
 | ||||||
							
								
								
									
										31
									
								
								src/core/hle/applets/erreula.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/core/hle/applets/erreula.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,31 @@ | ||||||
|  | // 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 ErrEula final : public Applet { | ||||||
|  | public: | ||||||
|  |     explicit ErrEula(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; | ||||||
|  |     bool IsRunning() const override { return started; } | ||||||
|  | 
 | ||||||
|  |     /// This SharedMemory will be created when we receive the LibAppJustStarted message.
 | ||||||
|  |     /// It holds the framebuffer info retrieved by the application with GSPGPU::ImportDisplayCaptureInfo
 | ||||||
|  |     Kernel::SharedPtr<Kernel::SharedMemory> framebuffer_memory; | ||||||
|  | private: | ||||||
|  |     /// Whether this applet is currently running instead of the host application or not.
 | ||||||
|  |     bool started = false; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } // namespace Applets
 | ||||||
|  | } // namespace HLE
 | ||||||
|  | @ -66,6 +66,8 @@ enum class AppletId : u32 { | ||||||
|     InstructionManual  = 0x115, |     InstructionManual  = 0x115, | ||||||
|     Notifications      = 0x116, |     Notifications      = 0x116, | ||||||
|     Miiverse           = 0x117, |     Miiverse           = 0x117, | ||||||
|  |     MiiversePost       = 0x118, | ||||||
|  |     AmiiboSettings     = 0x119, | ||||||
|     SoftwareKeyboard1  = 0x201, |     SoftwareKeyboard1  = 0x201, | ||||||
|     Ed1                = 0x202, |     Ed1                = 0x202, | ||||||
|     PnoteApp           = 0x204, |     PnoteApp           = 0x204, | ||||||
|  | @ -78,6 +80,12 @@ enum class AppletId : u32 { | ||||||
|     AnyLibraryApplet   = 0x400, |     AnyLibraryApplet   = 0x400, | ||||||
|     SoftwareKeyboard2  = 0x401, |     SoftwareKeyboard2  = 0x401, | ||||||
|     Ed2                = 0x402, |     Ed2                = 0x402, | ||||||
|  |     PnoteApp2          = 0x404, | ||||||
|  |     SnoteApp2          = 0x405, | ||||||
|  |     Error2             = 0x406, | ||||||
|  |     Mint2              = 0x407, | ||||||
|  |     Extrapad2          = 0x408, | ||||||
|  |     Memolib2           = 0x409, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| enum class StartupArgumentType : u32 { | enum class StartupArgumentType : u32 { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 mailwl
						mailwl