diff --git a/nx/include/switch/services/caps.h b/nx/include/switch/services/caps.h index e0a1fd91..1fa9f5a6 100644 --- a/nx/include/switch/services/caps.h +++ b/nx/include/switch/services/caps.h @@ -23,8 +23,8 @@ typedef enum { } AlbumReportOption; typedef enum { - CapsAlbumStorage_Nand = 0, ///< BuiltInUser - CapsAlbumStorage_Sd = 1, ///< SdCard + CapsAlbumStorage_Nand = 0, ///< Nand + CapsAlbumStorage_Sd = 1, ///< Sd } CapsAlbumStorage; /// ContentType @@ -83,15 +83,15 @@ typedef struct { typedef struct { u64 application_id; ///< ApplicationId CapsAlbumFileDateTime datetime; ///< \ref CapsAlbumFileDateTime - u8 storage; ///< AlbumStorage - u8 content; ///< FileContentsType + u8 storage; ///< \ref CapsAlbumStorage + u8 content; ///< \ref CapsAlbumFileContents u32 pad_x12; ///< Set to 0 by official software u16 pad_x16; ///< Set to 0 by official software } PACKED CapsAlbumFileId; /// AlbumEntry typedef struct { - u64 size; ///< Unknown. + u64 size; ///< Size. CapsAlbumFileId file_id; ///< \ref CapsAlbumFileId } CapsAlbumEntry; @@ -126,6 +126,7 @@ typedef struct { u32 size; ///< UserData size. } CapsApplicationData; +/// AlbumFileContents typedef enum { CapsAlbumFileContents_ScreenShot = 0, CapsAlbumFileContents_Movie = 1, diff --git a/nx/include/switch/services/capsa.h b/nx/include/switch/services/capsa.h index bf7037e7..2f5d458a 100644 --- a/nx/include/switch/services/capsa.h +++ b/nx/include/switch/services/capsa.h @@ -17,21 +17,22 @@ void capsaExit(void); /// Gets the Service for caps:a. Service* capsaGetServiceSession(void); + Result capsaGetAlbumFileCount(CapsAlbumStorage storage, u64* count); Result capsaGetAlbumFileList(CapsAlbumStorage storage, u64* count, CapsAlbumEntry* buffer, u64 size); -Result capsaLoadAlbumFile(CapsAlbumFileId file_id, u64 *out_size, void* workbuf, u64 workbuf_size); -Result capsaDeleteAlbumFile(CapsAlbumFileId file_id); -Result capsaStorageCopyAlbumFile(CapsAlbumFileId file_id, CapsAlbumStorage dst_storage); +Result capsaLoadAlbumFile(const CapsAlbumFileId *file_id, u64 *out_size, void* workbuf, u64 workbuf_size); +Result capsaDeleteAlbumFile(const CapsAlbumFileId *file_id); +Result capsaStorageCopyAlbumFile(const CapsAlbumFileId *file_id, CapsAlbumStorage dst_storage); Result capsaIsAlbumMounted(CapsAlbumStorage storage, bool* is_mounted); Result capsaGetAlbumUsage(CapsAlbumStorage storage, CapsAlbumUsage2 *out); -Result capsaGetAlbumFileSize(CapsAlbumFileId file_id, u64* size); -Result capsaLoadAlbumFileThumbnail(CapsAlbumFileId file_id, u64 *out_size, void* workbuf, u64 workbuf_size); +Result capsaGetAlbumFileSize(const CapsAlbumFileId *file_id, u64* size); +Result capsaLoadAlbumFileThumbnail(const CapsAlbumFileId *file_id, u64 *out_size, void* workbuf, u64 workbuf_size); /// Only available on [2.0.0+]. -Result capsaLoadAlbumScreenShotImage(u64* width, u64* height, CapsAlbumFileId file_id, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size); -Result capsaLoadAlbumScreenShotThumbnailImage(u64* width, u64* height, CapsAlbumFileId file_id, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size); +Result capsaLoadAlbumScreenShotImage(u64* width, u64* height, const CapsAlbumFileId *file_id, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size); +Result capsaLoadAlbumScreenShotThumbnailImage(u64* width, u64* height, const CapsAlbumFileId *file_id, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size); /// Only available on [3.0.0+]. -Result capsaLoadAlbumScreenShotImageEx(u64* width, u64* height, CapsAlbumFileId file_id, CapsScreenShotDecodeOption opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size); -Result capsaLoadAlbumScreenShotThumbnailImageEx(u64* width, u64* height, CapsAlbumFileId file_id, CapsScreenShotDecodeOption opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size); +Result capsaLoadAlbumScreenShotImageEx(u64* width, u64* height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size); +Result capsaLoadAlbumScreenShotThumbnailImageEx(u64* width, u64* height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size); /// Only available on [4.0.0+]. Result capsaGetAlbumUsage3(CapsAlbumStorage storage, CapsAlbumUsage3 *out); Result capsaGetAlbumMountResult(CapsAlbumStorage storage); @@ -40,7 +41,7 @@ Result capsaGetAlbumUsage16(CapsAlbumStorage storage, CapsAlbumUsage16 *out); Result capsaGetAutoSavingStorage(CapsAlbumStorage* storage); Result capsaGetRequiredStorageSpaceSizeToCopyAll(CapsAlbumStorage dst_storage, CapsAlbumStorage src_storage, u64* out); /// Only available on [4.0.0+]. -Result capsaLoadAlbumScreenShotThumbnailImageEx1(CapsAlbumFileId file_id, CapsScreenShotDecodeOption opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size, void* out, u64 out_size); +Result capsaLoadAlbumScreenShotThumbnailImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size, void* out, u64 out_size); Result capsaForceAlbumUnmounted(CapsAlbumStorage storage); Result capsaResetAlbumMountStatus(CapsAlbumStorage storage); diff --git a/nx/source/services/capsa.c b/nx/source/services/capsa.c index 24cdcd56..2d004a33 100644 --- a/nx/source/services/capsa.c +++ b/nx/source/services/capsa.c @@ -39,23 +39,23 @@ Result capsaGetAlbumFileList(CapsAlbumStorage storage, u64* count, CapsAlbumEntr ); } -Result capsaLoadAlbumFile(CapsAlbumFileId file_id, u64 *out_size, void* workbuf, u64 workbuf_size) { - return serviceDispatchInOut(&g_capsaSrv, 2, file_id, *out_size, +Result capsaLoadAlbumFile(const CapsAlbumFileId *file_id, u64 *out_size, void* workbuf, u64 workbuf_size) { + return serviceDispatchInOut(&g_capsaSrv, 2, *file_id, *out_size, .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, .buffers = { { workbuf, workbuf_size } }, ); } -Result capsaDeleteAlbumFile(CapsAlbumFileId file_id) { - return serviceDispatchIn(&g_capsaSrv, 3, file_id); +Result capsaDeleteAlbumFile(const CapsAlbumFileId *file_id) { + return serviceDispatchIn(&g_capsaSrv, 3, *file_id); } -Result capsaStorageCopyAlbumFile(CapsAlbumFileId file_id, CapsAlbumStorage dst_storage) { +Result capsaStorageCopyAlbumFile(const CapsAlbumFileId* file_id, CapsAlbumStorage dst_storage) { struct { u8 storage; u8 pad_x1[0x7]; CapsAlbumFileId file_id; - } in = { dst_storage, {0}, file_id }; + } in = { dst_storage, {0}, *file_id }; return serviceDispatchIn(&g_capsaSrv, 4, in); } @@ -69,25 +69,25 @@ Result capsaGetAlbumUsage(CapsAlbumStorage storage, CapsAlbumUsage2 *out) { return serviceDispatchInOut(&g_capsaSrv, 6, inval, *out); } -Result capsaGetAlbumFileSize(CapsAlbumFileId file_id, u64* size) { - return serviceDispatchInOut(&g_capsaSrv, 7, file_id, *size); +Result capsaGetAlbumFileSize(const CapsAlbumFileId *file_id, u64* size) { + return serviceDispatchInOut(&g_capsaSrv, 7, *file_id, *size); } -Result capsaLoadAlbumFileThumbnail(CapsAlbumFileId file_id, u64 *out_size, void* workbuf, u64 workbuf_size) { - return serviceDispatchInOut(&g_capsaSrv, 8, file_id, *out_size, +Result capsaLoadAlbumFileThumbnail(const CapsAlbumFileId *file_id, u64 *out_size, void* workbuf, u64 workbuf_size) { + return serviceDispatchInOut(&g_capsaSrv, 8, *file_id, *out_size, .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, .buffers = { { workbuf, workbuf_size } }, ); } -static Result _capsaLoadAlbumScreenshot(u64* width, u64* height, CapsAlbumFileId file_id, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size, u32 cmd_id) { +static Result _capsaLoadAlbumScreenshot(u64* width, u64* height, const CapsAlbumFileId *file_id, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size, u32 cmd_id) { if (hosversionBefore(2,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); struct { u64 width; u64 height; } out; - Result rc = serviceDispatchInOut(&g_capsaSrv, cmd_id, file_id, out, + Result rc = serviceDispatchInOut(&g_capsaSrv, cmd_id, *file_id, out, .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out | SfBufferAttr_HipcMapTransferAllowsNonSecure, SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, .buffers = { { rawbuf, rawbuf_size }, { workbuf, workbuf_size } }, ); @@ -96,21 +96,21 @@ static Result _capsaLoadAlbumScreenshot(u64* width, u64* height, CapsAlbumFileId return rc; } -Result capsaLoadAlbumScreenShotImage(u64* width, u64* height, CapsAlbumFileId file_id, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size) { +Result capsaLoadAlbumScreenShotImage(u64* width, u64* height, const CapsAlbumFileId *file_id, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size) { return _capsaLoadAlbumScreenshot(width, height, file_id, workbuf, workbuf_size, rawbuf, rawbuf_size, 9); } -Result capsaLoadAlbumScreenShotThumbnailImage(u64* width, u64* height, CapsAlbumFileId file_id, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size) { +Result capsaLoadAlbumScreenShotThumbnailImage(u64* width, u64* height, const CapsAlbumFileId *file_id, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size) { return _capsaLoadAlbumScreenshot(width, height, file_id, workbuf, workbuf_size, rawbuf, rawbuf_size, 10); } -static Result _capsaLoadAlbumScreenshotEx(u64* width, u64* height, CapsAlbumFileId file_id, CapsScreenShotDecodeOption opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size, u32 cmd_id) { +static Result _capsaLoadAlbumScreenshotEx(u64* width, u64* height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size, u32 cmd_id) { if (hosversionBefore(3,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); struct { CapsAlbumFileId file_id; CapsScreenShotDecodeOption opts; - } in = { file_id, opts }; + } in = { *file_id, *opts }; struct { u64 width; u64 height; @@ -124,11 +124,11 @@ static Result _capsaLoadAlbumScreenshotEx(u64* width, u64* height, CapsAlbumFile return rc; } -Result capsaLoadAlbumScreenShotImageEx(u64* width, u64* height, CapsAlbumFileId file_id, CapsScreenShotDecodeOption opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size) { +Result capsaLoadAlbumScreenShotImageEx(u64* width, u64* height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size) { return _capsaLoadAlbumScreenshotEx(width, height, file_id, opts, workbuf, workbuf_size, rawbuf, rawbuf_size, 12); } -Result capsaLoadAlbumScreenShotThumbnailImageEx(u64* width, u64* height, CapsAlbumFileId file_id, CapsScreenShotDecodeOption opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size) { +Result capsaLoadAlbumScreenShotThumbnailImageEx(u64* width, u64* height, const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* workbuf, u64 workbuf_size, void* rawbuf, u64 rawbuf_size) { return _capsaLoadAlbumScreenshotEx(width, height, file_id, opts, workbuf, workbuf_size, rawbuf, rawbuf_size, 13); } @@ -153,7 +153,10 @@ Result capsaGetAlbumUsage16(CapsAlbumStorage storage, CapsAlbumUsage16 *out) { } Result capsaGetAutoSavingStorage(CapsAlbumStorage* storage) { - return serviceDispatchOut(&g_capsaSrv, 401, *storage); + u8 tmpval = 0; + Result rc = serviceDispatchOut(&g_capsaSrv, 401, tmpval); + *storage = tmpval; + return rc; } Result capsaGetRequiredStorageSpaceSizeToCopyAll(CapsAlbumStorage dst_storage, CapsAlbumStorage src_storage, u64* out) { @@ -164,13 +167,13 @@ Result capsaGetRequiredStorageSpaceSizeToCopyAll(CapsAlbumStorage dst_storage, C return serviceDispatchInOut(&g_capsaSrv, 501, in, *out); } -Result capsaLoadAlbumScreenShotThumbnailImageEx1(CapsAlbumFileId file_id, CapsScreenShotDecodeOption opts, void* work_buffer, u64 work_buffer_size, void* raw_buffer, u64 raw_buffer_size, void* out, u64 out_size) { +Result capsaLoadAlbumScreenShotThumbnailImageEx1(const CapsAlbumFileId *file_id, const CapsScreenShotDecodeOption *opts, void* work_buffer, u64 work_buffer_size, void* raw_buffer, u64 raw_buffer_size, void* out, u64 out_size) { if (hosversionBefore(4,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); struct { CapsAlbumFileId file_id; CapsScreenShotDecodeOption opts; - } in = { file_id, opts }; + } in = { *file_id, *opts }; return serviceDispatchIn(&g_capsaSrv, 1003, in, .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out | SfBufferAttr_FixedSize, SfBufferAttr_HipcMapAlias | SfBufferAttr_Out | SfBufferAttr_HipcMapTransferAllowsNonSecure, SfBufferAttr_HipcMapAlias | SfBufferAttr_Out }, .buffers = { { out, out_size }, { raw_buffer, raw_buffer_size }, { work_buffer, work_buffer_size } },