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();