diff options
| -rw-r--r-- | src/core/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/core/hle/applets/applet.cpp | 5 | ||||
| -rw-r--r-- | src/core/hle/applets/mint.cpp | 72 | ||||
| -rw-r--r-- | src/core/hle/applets/mint.h | 29 | 
4 files changed, 108 insertions, 0 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index bd0e3c595..408d3a0cb 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -40,6 +40,7 @@ set(SRCS              hle/applets/applet.cpp              hle/applets/erreula.cpp              hle/applets/mii_selector.cpp +            hle/applets/mint.cpp              hle/applets/swkbd.cpp              hle/kernel/address_arbiter.cpp              hle/kernel/client_port.cpp @@ -219,6 +220,7 @@ set(HEADERS              hle/applets/applet.h              hle/applets/erreula.h              hle/applets/mii_selector.h +            hle/applets/mint.h              hle/applets/swkbd.h              hle/kernel/address_arbiter.h              hle/kernel/client_port.h diff --git a/src/core/hle/applets/applet.cpp b/src/core/hle/applets/applet.cpp index 645b2d5fe..9c43ed2fd 100644 --- a/src/core/hle/applets/applet.cpp +++ b/src/core/hle/applets/applet.cpp @@ -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 diff --git a/src/core/hle/applets/mint.cpp b/src/core/hle/applets/mint.cpp new file mode 100644 index 000000000..31a79ea17 --- /dev/null +++ b/src/core/hle/applets/mint.cpp @@ -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 diff --git a/src/core/hle/applets/mint.h b/src/core/hle/applets/mint.h new file mode 100644 index 000000000..d23dc40f9 --- /dev/null +++ b/src/core/hle/applets/mint.h @@ -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  | 
