|
@@ -5,7 +5,7 @@
|
|
|
#include "core/hle/service/caps/caps_a.h"
|
|
#include "core/hle/service/caps/caps_a.h"
|
|
|
#include "core/hle/service/caps/caps_manager.h"
|
|
#include "core/hle/service/caps/caps_manager.h"
|
|
|
#include "core/hle/service/caps/caps_result.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"
|
|
#include "core/hle/service/ipc_helpers.h"
|
|
|
|
|
|
|
|
namespace Service::Capture {
|
|
namespace Service::Capture {
|
|
@@ -18,9 +18,9 @@ IAlbumAccessorService::IAlbumAccessorService(Core::System& system_,
|
|
|
{0, nullptr, "GetAlbumFileCount"},
|
|
{0, nullptr, "GetAlbumFileCount"},
|
|
|
{1, nullptr, "GetAlbumFileList"},
|
|
{1, nullptr, "GetAlbumFileList"},
|
|
|
{2, nullptr, "LoadAlbumFile"},
|
|
{2, nullptr, "LoadAlbumFile"},
|
|
|
- {3, &IAlbumAccessorService::DeleteAlbumFile, "DeleteAlbumFile"},
|
|
|
|
|
|
|
+ {3, C<&IAlbumAccessorService::DeleteAlbumFile>, "DeleteAlbumFile"},
|
|
|
{4, nullptr, "StorageCopyAlbumFile"},
|
|
{4, nullptr, "StorageCopyAlbumFile"},
|
|
|
- {5, &IAlbumAccessorService::IsAlbumMounted, "IsAlbumMounted"},
|
|
|
|
|
|
|
+ {5, C<&IAlbumAccessorService::IsAlbumMounted>, "IsAlbumMounted"},
|
|
|
{6, nullptr, "GetAlbumUsage"},
|
|
{6, nullptr, "GetAlbumUsage"},
|
|
|
{7, nullptr, "GetAlbumFileSize"},
|
|
{7, nullptr, "GetAlbumFileSize"},
|
|
|
{8, nullptr, "LoadAlbumFileThumbnail"},
|
|
{8, nullptr, "LoadAlbumFileThumbnail"},
|
|
@@ -33,18 +33,18 @@ IAlbumAccessorService::IAlbumAccessorService(Core::System& system_,
|
|
|
{15, nullptr, "GetAlbumUsage3"},
|
|
{15, nullptr, "GetAlbumUsage3"},
|
|
|
{16, nullptr, "GetAlbumMountResult"},
|
|
{16, nullptr, "GetAlbumMountResult"},
|
|
|
{17, nullptr, "GetAlbumUsage16"},
|
|
{17, nullptr, "GetAlbumUsage16"},
|
|
|
- {18, &IAlbumAccessorService::Unknown18, "Unknown18"},
|
|
|
|
|
|
|
+ {18, C<&IAlbumAccessorService::Unknown18>, "Unknown18"},
|
|
|
{19, nullptr, "Unknown19"},
|
|
{19, nullptr, "Unknown19"},
|
|
|
{100, nullptr, "GetAlbumFileCountEx0"},
|
|
{100, nullptr, "GetAlbumFileCountEx0"},
|
|
|
- {101, &IAlbumAccessorService::GetAlbumFileListEx0, "GetAlbumFileListEx0"},
|
|
|
|
|
|
|
+ {101, C<&IAlbumAccessorService::GetAlbumFileListEx0>, "GetAlbumFileListEx0"},
|
|
|
{202, nullptr, "SaveEditedScreenShot"},
|
|
{202, nullptr, "SaveEditedScreenShot"},
|
|
|
{301, nullptr, "GetLastThumbnail"},
|
|
{301, nullptr, "GetLastThumbnail"},
|
|
|
{302, nullptr, "GetLastOverlayMovieThumbnail"},
|
|
{302, nullptr, "GetLastOverlayMovieThumbnail"},
|
|
|
- {401, &IAlbumAccessorService::GetAutoSavingStorage, "GetAutoSavingStorage"},
|
|
|
|
|
|
|
+ {401, C<&IAlbumAccessorService::GetAutoSavingStorage>, "GetAutoSavingStorage"},
|
|
|
{501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"},
|
|
{501, nullptr, "GetRequiredStorageSpaceSizeToCopyAll"},
|
|
|
{1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"},
|
|
{1001, nullptr, "LoadAlbumScreenShotThumbnailImageEx0"},
|
|
|
- {1002, &IAlbumAccessorService::LoadAlbumScreenShotImageEx1, "LoadAlbumScreenShotImageEx1"},
|
|
|
|
|
- {1003, &IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1, "LoadAlbumScreenShotThumbnailImageEx1"},
|
|
|
|
|
|
|
+ {1002, C<&IAlbumAccessorService::LoadAlbumScreenShotImageEx1>, "LoadAlbumScreenShotImageEx1"},
|
|
|
|
|
+ {1003, C<&IAlbumAccessorService::LoadAlbumScreenShotThumbnailImageEx1>, "LoadAlbumScreenShotThumbnailImageEx1"},
|
|
|
{8001, nullptr, "ForceAlbumUnmounted"},
|
|
{8001, nullptr, "ForceAlbumUnmounted"},
|
|
|
{8002, nullptr, "ResetAlbumMountStatus"},
|
|
{8002, nullptr, "ResetAlbumMountStatus"},
|
|
|
{8011, nullptr, "RefreshAlbumCache"},
|
|
{8011, nullptr, "RefreshAlbumCache"},
|
|
@@ -62,138 +62,70 @@ IAlbumAccessorService::IAlbumAccessorService(Core::System& system_,
|
|
|
|
|
|
|
|
IAlbumAccessorService::~IAlbumAccessorService() = default;
|
|
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={}",
|
|
LOG_INFO(Service_Capture, "called, application_id=0x{:0x}, storage={}, type={}",
|
|
|
file_id.application_id, file_id.storage, file_id.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);
|
|
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");
|
|
LOG_WARNING(Service_Capture, "(STUBBED) called");
|
|
|
-
|
|
|
|
|
- std::vector<UnknownBuffer> buffer{};
|
|
|
|
|
-
|
|
|
|
|
- if (!buffer.empty()) {
|
|
|
|
|
- ctx.WriteBuffer(buffer);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
|
- rb.Push(ResultSuccess);
|
|
|
|
|
- rb.Push(static_cast<u32>(buffer.size()));
|
|
|
|
|
|
|
+ *out_buffer_size = 0;
|
|
|
|
|
+ R_SUCCEED();
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-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);
|
|
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);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 4};
|
|
|
|
|
- rb.Push(result);
|
|
|
|
|
- rb.Push<u64>(entries.size());
|
|
|
|
|
|
|
+ const Result result = manager->GetAlbumFileList(out_entries, *out_entries_size, storage, flags);
|
|
|
|
|
+ R_RETURN(TranslateResult(result));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void IAlbumAccessorService::GetAutoSavingStorage(HLERequestContext& ctx) {
|
|
|
|
|
|
|
+Result IAlbumAccessorService::GetAutoSavingStorage(Out<bool> out_is_autosaving) {
|
|
|
LOG_WARNING(Service_Capture, "(STUBBED) called");
|
|
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={}",
|
|
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);
|
|
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;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- if (result.IsSuccess()) {
|
|
|
|
|
- ctx.WriteBuffer(image_output, 0);
|
|
|
|
|
- ctx.WriteBuffer(image, 1);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
- rb.Push(result);
|
|
|
|
|
|
|
+ const Result result =
|
|
|
|
|
+ manager->LoadAlbumScreenShotImage(*out_image_output, out_image, file_id, decoder_options);
|
|
|
|
|
+ R_RETURN(TranslateResult(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={}",
|
|
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);
|
|
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) {
|
|
Result IAlbumAccessorService::TranslateResult(Result in_result) {
|