diff options
author | mailwl <mailwl@gmail.com> | 2016-03-30 14:52:59 +0200 |
---|---|---|
committer | mailwl <mailwl@gmail.com> | 2016-07-04 08:54:51 +0200 |
commit | e06f2705f07b71e34ce503b045f6a81e82db91e9 (patch) | |
tree | fd62863b09208c511da9891cc419d31db5578c3d /src/core/hle/applets/erreula.cpp | |
parent | Merge pull request #1935 from wwylele/fix-result-module (diff) | |
download | yuzu-e06f2705f07b71e34ce503b045f6a81e82db91e9.tar yuzu-e06f2705f07b71e34ce503b045f6a81e82db91e9.tar.gz yuzu-e06f2705f07b71e34ce503b045f6a81e82db91e9.tar.bz2 yuzu-e06f2705f07b71e34ce503b045f6a81e82db91e9.tar.lz yuzu-e06f2705f07b71e34ce503b045f6a81e82db91e9.tar.xz yuzu-e06f2705f07b71e34ce503b045f6a81e82db91e9.tar.zst yuzu-e06f2705f07b71e34ce503b045f6a81e82db91e9.zip |
Diffstat (limited to '')
-rw-r--r-- | src/core/hle/applets/erreula.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/src/core/hle/applets/erreula.cpp b/src/core/hle/applets/erreula.cpp new file mode 100644 index 000000000..92a4b2323 --- /dev/null +++ b/src/core/hle/applets/erreula.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/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 |