|
|
|
@ -5,7 +5,7 @@
|
|
|
|
|
#include "core/hle/service/caps/caps_a.h"
|
|
|
|
|
#include "core/hle/service/caps/caps_manager.h"
|
|
|
|
|
#include "core/hle/service/caps/caps_result.h"
|
|
|
|
|
#include "core/hle/service/caps/caps_types.h"
|
|
|
|
|
#include "core/hle/service/cmif_serialization.h"
|
|
|
|
|
#include "core/hle/service/ipc_helpers.h"
|
|
|
|
|
|
|
|
|
|
namespace Service::Capture {
|
|
|
|
@ -18,9 +18,9 @@ IAlbumAccessorService::IAlbumAccessorService(Core::System& system_,
|
|
|
|
|
{0, nullptr, "GetAlbumFileCount"},
|
|
|
|
|
{1, nullptr, "GetAlbumFileList"},
|
|
|
|
|
{2, nullptr, "LoadAlbumFile"},
|
|
|
|
|
{3, &IAlbumAccessorService::DeleteAlbumFile, "DeleteAlbumFile"},
|
|
|
|
|
{3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"},
|
|
|
|
|
{4, nullptr, "StorageCopyAlbumFile"},
|
|
|
|
|
{5, &IAlbumAccessorService::IsAlbumMounted, "IsAlbumMounted"},
|
|
|
|
|
{5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"},
|
|
|
|
|
{6, nullptr, "GetAlbumUsage"},
|
|
|
|
|
{7, nullptr, "GetAlbumFileSize"},
|
|
|
|
|
{8, nullptr, "LoadAlbumFileThumbnail"},
|
|
|
|
@ -33,18 +33,18 @@ IAlbumAccessorService::IAlbumAccessorService(Core::System& system_,
|
|
|
|
|
{15, nullptr, "GetAlbumUsage3"},
|
|
|
|
|
{16, nullptr, "GetAlbumMountResult"},
|
|
|
|
|
{17, nullptr, "GetAlbumUsage16"},
|
|
|
|
|
{18, &IAlbumAccessorService::Unknown18, "Unknown18"},
|
|
|
|
|
{18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"},
|
|
|
|
|
{19, nullptr, "Unknown19"},
|
|
|
|
|
{100, nullptr, "GetAlbumFileCountEx0"},
|
|
|
|
|
{101, &IAlbumAccessorService::GetAlbumFileListEx0, "GetAlbumFileListEx0"},
|
|
|
|
|
{101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"},
|
|
|
|
|
{202, nullptr, "SaveEditedScreenShot"},
|
|
|
|
|
{301, nullptr, "GetLastThumbnail"},
|
|
|
|
|
{302, nullptr, "GetLastOverlayMovieThumbnail"},
|
|
|
|
|
{401, &IAlbumAccessorService::GetAutoSavingStorage, "GetAutoSavingStorage"},
|
|
|
|
|
{401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"},
|
|
|
|
|
{501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"},
|
|
|
|
|
{1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"},
|
|
|
|
|
{1002, &IAlbumAccessorService::LoadAlbumScreenShotImageEx1, "LoadAlbumScreenShotImageEx1"},
|
|
|
|
|
{1003, &IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1, "LoadAlbumScreenShotThumbnailImageEx1"},
|
|
|
|
|
{1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"},
|
|
|
|
|
{1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"},
|
|
|
|
|
{8001, nullptr, "ForceAlbumUnmounted"},
|
|
|
|
|
{8002, nullptr, "ResetAlbumMountStatus"},
|
|
|
|
|
{8011, nullptr, "RefreshAlbumCache"},
|
|
|
|
@ -62,138 +62,70 @@ IAlbumAccessorService::IAlbumAccessorService(Core::System& system_,
|
|
|
|
|
|
|
|
|
|
IAlbumAccessorService::~IAlbumAccessorService() = default;
|
|
|
|
|
|
|
|
|
|
void IAlbumAccessorService::DeleteAlbumFile(HLERequestContext& ctx) {
|
|
|
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
|
const auto file_id{rp.PopRaw<AlbumFileId>()};
|
|
|
|
|
|
|
|
|
|
Result IAlbumAccessorService::DeleteAlbumFile(AlbumFileId file_id) {
|
|
|
|
|
LOG_INFO(Service_Capture, "called, application_id=0x{:0x}, storage={}, type={}",
|
|
|
|
|
file_id.application_id, file_id.storage, file_id.type);
|
|
|
|
|
|
|
|
|
|
Result result = manager->DeleteAlbumFile(file_id);
|
|
|
|
|
result = TranslateResult(result);
|
|
|
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
rb.Push(result);
|
|
|
|
|
const Result result = manager->DeleteAlbumFile(file_id);
|
|
|
|
|
R_RETURN(TranslateResult(result));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void IAlbumAccessorService::IsAlbumMounted(HLERequestContext& ctx) {
|
|
|
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
|
const auto storage{rp.PopEnum<AlbumStorage>()};
|
|
|
|
|
|
|
|
|
|
Result IAlbumAccessorService::IsAlbumMounted(Out<bool> out_is_mounted, AlbumStorage storage) {
|
|
|
|
|
LOG_INFO(Service_Capture, "called, storage={}", storage);
|
|
|
|
|
|
|
|
|
|
Result result = manager->IsAlbumMounted(storage);
|
|
|
|
|
const bool is_mounted = result.IsSuccess();
|
|
|
|
|
result = TranslateResult(result);
|
|
|
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
|
rb.Push(result);
|
|
|
|
|
rb.Push<u8>(is_mounted);
|
|
|
|
|
const Result result = manager->IsAlbumMounted(storage);
|
|
|
|
|
*out_is_mounted = result.IsSuccess();
|
|
|
|
|
R_RETURN(TranslateResult(result));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void IAlbumAccessorService::Unknown18(HLERequestContext& ctx) {
|
|
|
|
|
struct UnknownBuffer {
|
|
|
|
|
INSERT_PADDING_BYTES(0x10);
|
|
|
|
|
};
|
|
|
|
|
static_assert(sizeof(UnknownBuffer) == 0x10, "UnknownBuffer is an invalid size");
|
|
|
|
|
|
|
|
|
|
Result IAlbumAccessorService::Unknown18(
|
|
|
|
|
Out<u32> out_buffer_size,
|
|
|
|
|
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_buffer) {
|
|
|
|
|
LOG_WARNING(Service_Capture, "(STUBBED) called");
|
|
|
|
|
|
|
|
|
|
std::vector<UnknownBuffer> buffer{};
|
|
|
|
|
|
|
|
|
|
if (!buffer.empty()) {
|
|
|
|
|
ctx.WriteBuffer(buffer);
|
|
|
|
|
*out_buffer_size = 0;
|
|
|
|
|
R_SUCCEED();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
|
rb.Push(ResultSuccess);
|
|
|
|
|
rb.Push(static_cast<u32>(buffer.size()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void IAlbumAccessorService::GetAlbumFileListEx0(HLERequestContext& ctx) {
|
|
|
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
|
const auto storage{rp.PopEnum<AlbumStorage>()};
|
|
|
|
|
const auto flags{rp.Pop<u8>()};
|
|
|
|
|
const auto album_entry_size{ctx.GetWriteBufferNumElements<AlbumEntry>()};
|
|
|
|
|
|
|
|
|
|
Result IAlbumAccessorService::GetAlbumFileListEx0(
|
|
|
|
|
Out<u64> out_entries_size, AlbumStorage storage, u8 flags,
|
|
|
|
|
OutArray<AlbumEntry, BufferAttr_HipcMapAlias> out_entries) {
|
|
|
|
|
LOG_INFO(Service_Capture, "called, storage={}, flags={}", storage, flags);
|
|
|
|
|
|
|
|
|
|
std::vector<AlbumEntry> entries;
|
|
|
|
|
Result result = manager->GetAlbumFileList(entries, storage, flags);
|
|
|
|
|
result = TranslateResult(result);
|
|
|
|
|
|
|
|
|
|
entries.resize(std::min(album_entry_size, entries.size()));
|
|
|
|
|
|
|
|
|
|
if (!entries.empty()) {
|
|
|
|
|
ctx.WriteBuffer(entries);
|
|
|
|
|
const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags);
|
|
|
|
|
R_RETURN(TranslateResult(result));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 4};
|
|
|
|
|
rb.Push(result);
|
|
|
|
|
rb.Push<u64>(entries.size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void IAlbumAccessorService::GetAutoSavingStorage(HLERequestContext& ctx) {
|
|
|
|
|
Result IAlbumAccessorService::GetAutoSavingStorage(Out<bool> out_is_autosaving) {
|
|
|
|
|
LOG_WARNING(Service_Capture, "(STUBBED) called");
|
|
|
|
|
|
|
|
|
|
bool is_autosaving{};
|
|
|
|
|
Result result = manager->GetAutoSavingStorage(is_autosaving);
|
|
|
|
|
result = TranslateResult(result);
|
|
|
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
|
rb.Push(result);
|
|
|
|
|
rb.Push<u8>(is_autosaving);
|
|
|
|
|
const Result result = manager->GetAutoSavingStorage(*out_is_autosaving);
|
|
|
|
|
R_RETURN(TranslateResult(result));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void IAlbumAccessorService::LoadAlbumScreenShotImageEx1(HLERequestContext& ctx) {
|
|
|
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
|
const auto file_id{rp.PopRaw<AlbumFileId>()};
|
|
|
|
|
const auto decoder_options{rp.PopRaw<ScreenShotDecodeOption>()};
|
|
|
|
|
const auto image_buffer_size{ctx.GetWriteBufferSize(1)};
|
|
|
|
|
|
|
|
|
|
Result IAlbumAccessorService::LoadAlbumScreenShotImageEx1(
|
|
|
|
|
const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
|
|
|
|
|
OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
|
|
|
|
|
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
|
|
|
|
|
OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
|
|
|
|
|
LOG_INFO(Service_Capture, "called, application_id=0x{:0x}, storage={}, type={}, flags={}",
|
|
|
|
|
file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
|
|
|
|
|
|
|
|
|
|
std::vector<u8> image;
|
|
|
|
|
LoadAlbumScreenShotImageOutput image_output;
|
|
|
|
|
Result result =
|
|
|
|
|
manager->LoadAlbumScreenShotImage(image_output, image, file_id, decoder_options);
|
|
|
|
|
result = TranslateResult(result);
|
|
|
|
|
|
|
|
|
|
if (image.size() > image_buffer_size) {
|
|
|
|
|
result = ResultWorkMemoryError;
|
|
|
|
|
const Result result =
|
|
|
|
|
manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options);
|
|
|
|
|
R_RETURN(TranslateResult(result));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (result.IsSuccess()) {
|
|
|
|
|
ctx.WriteBuffer(image_output, 0);
|
|
|
|
|
ctx.WriteBuffer(image, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
rb.Push(result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1(HLERequestContext& ctx) {
|
|
|
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
|
const auto file_id{rp.PopRaw<AlbumFileId>()};
|
|
|
|
|
const auto decoder_options{rp.PopRaw<ScreenShotDecodeOption>()};
|
|
|
|
|
|
|
|
|
|
Result IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1(
|
|
|
|
|
const AlbumFileId& file_id, const ScreenShotDecodeOption& decoder_options,
|
|
|
|
|
OutLargeData<LoadAlbumScreenShotImageOutput, BufferAttr_HipcMapAlias> out_image_output,
|
|
|
|
|
OutArray<u8, BufferAttr_HipcMapAlias | BufferAttr_HipcMapTransferAllowsNonSecure> out_image,
|
|
|
|
|
OutArray<u8, BufferAttr_HipcMapAlias> out_buffer) {
|
|
|
|
|
LOG_INFO(Service_Capture, "called, application_id=0x{:0x}, storage={}, type={}, flags={}",
|
|
|
|
|
file_id.application_id, file_id.storage, file_id.type, decoder_options.flags);
|
|
|
|
|
|
|
|
|
|
std::vector<u8> image(ctx.GetWriteBufferSize(1));
|
|
|
|
|
LoadAlbumScreenShotImageOutput image_output;
|
|
|
|
|
Result result =
|
|
|
|
|
manager->LoadAlbumScreenShotThumbnail(image_output, image, file_id, decoder_options);
|
|
|
|
|
result = TranslateResult(result);
|
|
|
|
|
|
|
|
|
|
if (result.IsSuccess()) {
|
|
|
|
|
ctx.WriteBuffer(image_output, 0);
|
|
|
|
|
ctx.WriteBuffer(image, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
rb.Push(result);
|
|
|
|
|
const Result result = manager->LoadAlbumScreenShotThumbnail(*out_image_output, out_image,
|
|
|
|
|
file_id, decoder_options);
|
|
|
|
|
R_RETURN(TranslateResult(result));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Result IAlbumAccessorService::TranslateResult(Result in_result) {
|
|
|
|
|