mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	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
					
				
			
			
				
	
			
			
			
						parent
						
							0b9c59ff22
						
					
				
				
					commit
					d0bf7df5ba
				
			@@ -12,6 +12,7 @@
 | 
			
		||||
#include "core/hle/applets/applet.h"
 | 
			
		||||
#include "core/hle/applets/erreula.h"
 | 
			
		||||
#include "core/hle/applets/mii_selector.h"
 | 
			
		||||
#include "core/hle/applets/mint.h"
 | 
			
		||||
#include "core/hle/applets/swkbd.h"
 | 
			
		||||
#include "core/hle/result.h"
 | 
			
		||||
#include "core/hle/service/apt/apt.h"
 | 
			
		||||
@@ -56,6 +57,10 @@ ResultCode Applet::Create(Service::APT::AppletId id) {
 | 
			
		||||
    case Service::APT::AppletId::Error2:
 | 
			
		||||
        applets[id] = std::make_shared<ErrEula>(id);
 | 
			
		||||
        break;
 | 
			
		||||
    case Service::APT::AppletId::Mint:
 | 
			
		||||
    case Service::APT::AppletId::Mint2:
 | 
			
		||||
        applets[id] = std::make_shared<Mint>(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/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