From 648ee46742654722db74742961ed74c4172cd4a9 Mon Sep 17 00:00:00 2001 From: motezazer Date: Mon, 16 Jan 2017 13:41:35 +0100 Subject: [PATCH] Add AM_FinishCiaInstallWithoutCommit and AM_CommitImportPrograms (#321) * Add AM_FinishCiaInstallWithoutCommit and AM_CommitImportPrograms * Make the tids const * In the headers also --- libctru/include/3ds/services/am.h | 17 +++++++++++++++- libctru/source/services/am.c | 33 ++++++++++++++++++++++++++++++- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/libctru/include/3ds/services/am.h b/libctru/include/3ds/services/am.h index 19e065a..167a29f 100644 --- a/libctru/include/3ds/services/am.h +++ b/libctru/include/3ds/services/am.h @@ -203,6 +203,21 @@ Result AM_CancelCIAInstall(Handle ciaHandle); */ Result AM_FinishCiaInstall(Handle ciaHandle); +/** + * @brief Finalizes the CIA install process without committing the title to title.db or tmp*.db. + * @param ciaHandle CIA handle to finalize. + */ +Result AM_FinishCiaInstallWithoutCommit(Handle ciaHandle); + +/** + * @brief Commits installed CIAs. + * @param mediaType Location of the titles to finalize. + * @param titleCount Number of titles to finalize. + * @param temp Whether the titles being finalized are in the temporary database. + * @param titleIds Title IDs to finalize. + */ +Result AM_CommitImportPrograms(FS_MediaType mediaType, u32 titleCount, bool temp, const u64* titleIds); + /** * @brief Deletes a title. * @param mediatype Media type to delete from. @@ -381,7 +396,7 @@ Result AM_InstallTitleFinish(); * @param temp Whether the titles being finalized are in the temporary database. * @param titleIds Title IDs to finalize. */ -Result AM_CommitImportTitles(FS_MediaType mediaType, u32 titleCount, bool temp, u64* titleIds); +Result AM_CommitImportTitles(FS_MediaType mediaType, u32 titleCount, bool temp, const u64* titleIds); /** * @brief Begins installing a TMD. diff --git a/libctru/source/services/am.c b/libctru/source/services/am.c index f310ab4..ad6c50f 100644 --- a/libctru/source/services/am.c +++ b/libctru/source/services/am.c @@ -343,6 +343,37 @@ Result AM_FinishCiaInstall(Handle ciaHandle) return (Result)cmdbuf[1]; } +Result AM_FinishCiaInstallWithoutCommit(Handle ciaHandle) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x406,0,2); // 0x04060002 + cmdbuf[1] = IPC_Desc_MoveHandles(1); + cmdbuf[2] = ciaHandle; + + if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; + + return (Result)cmdbuf[1]; +} + +Result AM_CommitImportPrograms(FS_MediaType mediaType, u32 titleCount, bool temp, const u64* titleIds) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = IPC_MakeHeader(0x407,3,2); // 0x040700C2 + cmdbuf[1] = mediaType; + cmdbuf[2] = titleCount; + cmdbuf[3] = temp ? 1 : 0; + cmdbuf[4] = IPC_Desc_Buffer(titleCount * 8, IPC_BUFFER_R); + cmdbuf[5] = (u32)titleIds; + + if(R_FAILED(ret = svcSendSyncRequest(amHandle))) return ret; + + return (Result)cmdbuf[1]; +} + Result AM_DeleteTitle(FS_MediaType mediatype, u64 titleID) { Result ret = 0; @@ -748,7 +779,7 @@ Result AM_InstallTitleFinish() return (Result)cmdbuf[1]; } -Result AM_CommitImportTitles(FS_MediaType mediaType, u32 titleCount, bool temp, u64* titleIds) +Result AM_CommitImportTitles(FS_MediaType mediaType, u32 titleCount, bool temp, const u64* titleIds) { Result ret = 0; u32 *cmdbuf = getThreadCommandBuffer();