mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-11-03 23:28:48 +00:00 
			
		
		
		
	HLE/Applets: Implement ErrEula applet
This commit is contained in:
		
							parent
							
								
									b48b8ed5e5
								
							
						
					
					
						commit
						e06f2705f0
					
				
					 5 changed files with 118 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -12,6 +12,7 @@
 | 
			
		|||
 | 
			
		||||
#include "core/core_timing.h"
 | 
			
		||||
#include "core/hle/applets/applet.h"
 | 
			
		||||
#include "core/hle/applets/erreula.h"
 | 
			
		||||
#include "core/hle/applets/mii_selector.h"
 | 
			
		||||
#include "core/hle/applets/swkbd.h"
 | 
			
		||||
#include "core/hle/result.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -52,6 +53,10 @@ ResultCode Applet::Create(Service::APT::AppletId id) {
 | 
			
		|||
    case Service::APT::AppletId::Ed2:
 | 
			
		||||
        applets[id] = std::make_shared<MiiSelector>(id);
 | 
			
		||||
        break;
 | 
			
		||||
    case Service::APT::AppletId::Error:
 | 
			
		||||
    case Service::APT::AppletId::Error2:
 | 
			
		||||
        applets[id] = std::make_shared<ErrEula>(id);
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
        LOG_ERROR(Service_APT, "Could not create applet %u", id);
 | 
			
		||||
        // 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,
 | 
			
		||||
    Notifications      = 0x116,
 | 
			
		||||
    Miiverse           = 0x117,
 | 
			
		||||
    MiiversePost       = 0x118,
 | 
			
		||||
    AmiiboSettings     = 0x119,
 | 
			
		||||
    SoftwareKeyboard1  = 0x201,
 | 
			
		||||
    Ed1                = 0x202,
 | 
			
		||||
    PnoteApp           = 0x204,
 | 
			
		||||
| 
						 | 
				
			
			@ -78,6 +80,12 @@ enum class AppletId : u32 {
 | 
			
		|||
    AnyLibraryApplet   = 0x400,
 | 
			
		||||
    SoftwareKeyboard2  = 0x401,
 | 
			
		||||
    Ed2                = 0x402,
 | 
			
		||||
    PnoteApp2          = 0x404,
 | 
			
		||||
    SnoteApp2          = 0x405,
 | 
			
		||||
    Error2             = 0x406,
 | 
			
		||||
    Mint2              = 0x407,
 | 
			
		||||
    Extrapad2          = 0x408,
 | 
			
		||||
    Memolib2           = 0x409,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum class StartupArgumentType : u32 {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue