diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index d896082a7..c0e28c2b8 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -45,6 +45,7 @@ constexpr u16 CATEGORY_DLP = 0x0001; constexpr u8 VARIATION_SYSTEM = 0x02; constexpr u32 TID_HIGH_UPDATE = 0x0004000E; constexpr u32 TID_HIGH_DLC = 0x0004008C; +constexpr u16 MAX_CONTENT_COUNT = 255; struct TitleInfo { u64_le tid; @@ -194,7 +195,7 @@ Result CIAFile::WriteTitleMetadata() { // TODO: Correct error code. return FileSys::ResultFileNotFound; } - if (content_count > 255) + if (content_count > MAX_CONTENT_COUNT) file.Close(); } @@ -226,8 +227,6 @@ ResultVal CIAFile::WriteContentData(u64 offset, std::size_t length, // has been written since we might get a written buffer which contains multiple .app // contents or only part of a larger .app's contents. const u64 offset_max = offset + length; - if (content_written.size() > 255) - content_files.clear(); for (std::size_t i = 0; i < content_written.size(); i++) { if (content_written[i] < container.GetContentSize(i)) { // The size, minimum unwritten offset, and maximum unwritten offset of this content @@ -247,9 +246,12 @@ ResultVal CIAFile::WriteContentData(u64 offset, std::size_t length, // Since the incoming TMD has already been written, we can use GetTitleContentPath // to get the content paths to write to. FileSys::TitleMetadata tmd = container.GetTitleMetadata(); - auto path = GetTitleContentPath(media_type, tmd.GetTitleID(), i, is_update); - auto& file = content_written.size() > 255 ? content_files.emplace_back(path, "ab+") - : content_files[i]; + auto& file = content_files[i]; + if (content_written.size() > MAX_CONTENT_COUNT) { + auto path = GetTitleContentPath(media_type, tmd.GetTitleID(), i, is_update); + FileUtil::IOFile fp(path, "ab+"); + file = std::move(fp); + } std::vector temp(buffer + (range_min - offset), buffer + (range_min - offset) + available_to_write); @@ -265,8 +267,9 @@ ResultVal CIAFile::WriteContentData(u64 offset, std::size_t length, content_written[i] += available_to_write; LOG_DEBUG(Service_AM, "Wrote {:x} to content {}, total {:x}", available_to_write, i, content_written[i]); - if (content_written.size() > 255) + if (content_written.size() > MAX_CONTENT_COUNT) { file.Close(); + } } }