Files
tp/libs/JSystem/JKernel/JKRMemArchive.cpp
T

261 lines
8.2 KiB
C++
Raw Normal View History

2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// Generated By: dol2asm
// Translation Unit: JKRMemArchive
2021-04-01 02:07:58 +02:00
//
2020-12-06 21:02:25 +01:00
2021-04-01 02:07:58 +02:00
#include "JSystem/JKernel/JKRMemArchive.h"
2023-05-12 12:10:14 -07:00
#include "JSystem/JKernel/JKRDecomp.h"
2021-05-03 02:03:24 +02:00
#include "JSystem/JKernel/JKRDvdRipper.h"
2023-09-19 03:46:45 -07:00
#include "JSystem/JUtility/JUTAssert.h"
2021-05-03 02:03:24 +02:00
#include "JSystem/JUtility/JUTException.h"
2023-04-24 15:28:31 -07:00
#include "MSL_C/string.h"
2023-05-12 12:10:14 -07:00
#include "dolphin/os/OSCache.h"
#include "global.h"
2021-03-28 22:49:05 +02:00
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// Forward References:
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// External References:
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
// Declarations:
2021-04-01 02:07:58 +02:00
//
2021-03-28 22:49:05 +02:00
2021-04-06 18:00:35 +02:00
/* 802D69B8-802D6A6C 2D12F8 00B4+00 0/0 2/2 0/0 .text
2021-04-01 02:07:58 +02:00
* __ct__13JKRMemArchiveFlQ210JKRArchive15EMountDirection */
2023-09-19 03:46:45 -07:00
JKRMemArchive::JKRMemArchive(s32 entryNum, JKRArchive::EMountDirection mountDirection)
2021-05-03 02:03:24 +02:00
: JKRArchive(entryNum, MOUNT_MEM) {
mIsMounted = false;
mMountDirection = mountDirection;
if (!open(entryNum, mMountDirection)) {
return;
}
mVolumeType = 'RARC';
2022-05-21 01:26:15 -07:00
mVolumeName = mStringTable + mNodes->name_offset;
2021-05-03 02:03:24 +02:00
getVolumeList().prepend(&mFileLoaderLink);
mIsMounted = true;
2021-01-31 15:33:34 -05:00
}
2021-04-06 18:00:35 +02:00
/* 802D6A6C-802D6B24 2D13AC 00B8+00 0/0 2/2 0/0 .text __ct__13JKRMemArchiveFPvUl15JKRMemBreakFlag
2021-04-01 02:07:58 +02:00
*/
2021-05-03 02:03:24 +02:00
JKRMemArchive::JKRMemArchive(void* buffer, u32 bufferSize, JKRMemBreakFlag param_3)
: JKRArchive((s32)buffer, MOUNT_MEM) {
mIsMounted = false;
if (!open(buffer, bufferSize, param_3)) {
return;
}
mVolumeType = 'RARC';
2022-05-21 01:26:15 -07:00
mVolumeName = mStringTable + mNodes->name_offset;
2021-05-03 02:03:24 +02:00
getVolumeList().prepend(&mFileLoaderLink);
mIsMounted = true;
2020-12-06 21:02:25 +01:00
}
2021-04-06 18:00:35 +02:00
/* 802D6B24-802D6BCC 2D1464 00A8+00 1/0 0/0 0/0 .text __dt__13JKRMemArchiveFv */
2021-05-03 02:03:24 +02:00
JKRMemArchive::~JKRMemArchive() {
if (mIsMounted == true) {
if (mIsOpen) {
if (mArcHeader)
JKRFreeToHeap(mHeap, mArcHeader);
}
getVolumeList().remove(&mFileLoaderLink);
mIsMounted = false;
}
2020-12-06 21:02:25 +01:00
}
2021-04-06 18:00:35 +02:00
/* 802D6BCC-802D6D30 2D150C 0164+00 1/1 0/0 0/0 .text
2021-04-01 02:07:58 +02:00
* open__13JKRMemArchiveFlQ210JKRArchive15EMountDirection */
2023-09-19 03:46:45 -07:00
bool JKRMemArchive::open(s32 entryNum, JKRArchive::EMountDirection mountDirection) {
2021-05-03 02:03:24 +02:00
mArcHeader = NULL;
mArcInfoBlock = NULL;
mArchiveData = NULL;
mNodes = NULL;
mFiles = NULL;
mStringTable = NULL;
mIsOpen = false;
mMountDirection = mountDirection;
2022-12-19 11:06:32 -08:00
if (mMountDirection == JKRArchive::MOUNT_DIRECTION_HEAD) {
2021-05-03 02:03:24 +02:00
u32 loadedSize;
2023-09-19 03:46:45 -07:00
mArcHeader = (SArcHeader *)JKRDvdToMainRam(
2023-02-26 17:50:56 -08:00
entryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, mHeap, JKRDvdRipper::ALLOC_DIRECTION_FORWARD,
2023-07-24 01:30:24 +03:00
0, (int *)&mCompression, &loadedSize);
2021-05-03 02:03:24 +02:00
if (mArcHeader) {
DCInvalidateRange(mArcHeader, loadedSize);
}
2023-07-24 01:30:24 +03:00
}
else {
2021-05-03 02:03:24 +02:00
u32 loadedSize;
2023-09-19 03:46:45 -07:00
mArcHeader = (SArcHeader *)JKRDvdToMainRam(
2023-02-26 17:50:56 -08:00
entryNum, NULL, EXPAND_SWITCH_UNKNOWN1, 0, mHeap,
2023-07-24 01:30:24 +03:00
JKRDvdRipper::ALLOC_DIRECTION_BACKWARD, 0, (int *)&mCompression, &loadedSize);
2021-05-03 02:03:24 +02:00
if (mArcHeader) {
DCInvalidateRange(mArcHeader, loadedSize);
}
}
if (!mArcHeader) {
mMountMode = UNKNOWN_MOUNT_MODE;
2023-07-24 01:30:24 +03:00
}
else {
2023-09-19 03:46:45 -07:00
JUT_ASSERT(438, mArcHeader->signature =='RARC');
2023-07-24 01:30:24 +03:00
mArcInfoBlock = (SArcDataInfo *)((u8 *)mArcHeader + mArcHeader->header_length);
mNodes = (SDIDirEntry *)((u8 *)&mArcInfoBlock->num_nodes + mArcInfoBlock->node_offset);
mFiles = (SDIFileEntry *)((u8 *)&mArcInfoBlock->num_nodes + mArcInfoBlock->file_entry_offset);
mStringTable = (char *)((u8 *)&mArcInfoBlock->num_nodes + mArcInfoBlock->string_table_offset);
2021-05-03 02:03:24 +02:00
mArchiveData =
2023-07-24 01:30:24 +03:00
(u8 *)((u32)mArcHeader + mArcHeader->header_length + mArcHeader->file_data_offset);
2021-05-03 02:03:24 +02:00
mIsOpen = true;
}
2023-09-19 03:46:45 -07:00
#if DEBUG
if (mMountMode == 0) {
OSReport(":::Cannot alloc memory [%s][%d]\n", __FILE__, 460)
}
#endif
2023-07-24 01:30:24 +03:00
return (mMountMode == UNKNOWN_MOUNT_MODE) ? false : true;
2021-05-03 02:03:24 +02:00
}
2020-12-06 21:02:25 +01:00
2021-04-06 18:00:35 +02:00
/* 802D6D30-802D6DDC 2D1670 00AC+00 1/1 0/0 0/0 .text open__13JKRMemArchiveFPvUl15JKRMemBreakFlag
2021-04-01 02:07:58 +02:00
*/
2021-05-03 02:03:24 +02:00
bool JKRMemArchive::open(void* buffer, u32 bufferSize, JKRMemBreakFlag flag) {
2023-07-24 01:30:24 +03:00
mArcHeader = (SArcHeader *)buffer;
2023-09-19 03:46:45 -07:00
JUT_ASSERT(491, mArcHeader->signature =='RARC');
2023-07-24 01:30:24 +03:00
mArcInfoBlock = (SArcDataInfo *)((u8 *)mArcHeader + mArcHeader->header_length);
mNodes = (SDIDirEntry *)((u8 *)&mArcInfoBlock->num_nodes + mArcInfoBlock->node_offset);
mFiles = (SDIFileEntry *)((u8 *)&mArcInfoBlock->num_nodes + mArcInfoBlock->file_entry_offset);
mStringTable = (char *)((u8 *)&mArcInfoBlock->num_nodes + mArcInfoBlock->string_table_offset);
mArchiveData = (u8 *)(((u32)mArcHeader + mArcHeader->header_length) + mArcHeader->file_data_offset);
mIsOpen = (flag == JKRMEMBREAK_FLAG_UNKNOWN1) ? true : false; // mIsOpen might be u8
2021-05-03 02:03:24 +02:00
mHeap = JKRHeap::findFromRoot(buffer);
2022-12-19 11:06:32 -08:00
mCompression = COMPRESSION_NONE;
2021-05-03 02:03:24 +02:00
return true;
}
2021-03-28 22:49:05 +02:00
2021-04-06 18:00:35 +02:00
/* 802D6DDC-802D6E10 2D171C 0034+00 1/0 0/0 0/0 .text
2021-04-01 02:07:58 +02:00
* fetchResource__13JKRMemArchiveFPQ210JKRArchive12SDIFileEntryPUl */
2021-05-03 02:03:24 +02:00
void* JKRMemArchive::fetchResource(SDIFileEntry* fileEntry, u32* resourceSize) {
2023-09-19 03:46:45 -07:00
JUT_ASSERT(555, isMounted());
2021-05-03 02:03:24 +02:00
if (!fileEntry->data) {
fileEntry->data = mArchiveData + fileEntry->data_offset;
}
if (resourceSize) {
*resourceSize = fileEntry->data_size;
}
return fileEntry->data;
2020-12-06 21:02:25 +01:00
}
2021-04-06 18:00:35 +02:00
/* 802D6E10-802D6ED0 2D1750 00C0+00 1/0 0/0 0/0 .text
2021-04-01 02:07:58 +02:00
* fetchResource__13JKRMemArchiveFPvUlPQ210JKRArchive12SDIFileEntryPUl */
2021-05-03 02:03:24 +02:00
void* JKRMemArchive::fetchResource(void* buffer, u32 bufferSize, SDIFileEntry* fileEntry,
u32* resourceSize) {
2023-09-19 03:46:45 -07:00
JUT_ASSERT(595, isMounted());
2021-05-03 02:03:24 +02:00
u32 srcLength = fileEntry->data_size;
if (srcLength > bufferSize) {
srcLength = bufferSize;
}
if (fileEntry->data != NULL) {
memcpy(buffer, fileEntry->data, srcLength);
} else {
JKRCompression compression = JKRConvertAttrToCompressionType(fileEntry->getAttr());
void* data = mArchiveData + fileEntry->data_offset;
srcLength =
fetchResource_subroutine((u8*)data, srcLength, (u8*)buffer, bufferSize, compression);
}
if (resourceSize) {
*resourceSize = srcLength;
}
return buffer;
2021-01-05 17:34:58 +01:00
}
2021-03-28 22:49:05 +02:00
2021-04-06 18:00:35 +02:00
/* 802D6ED0-802D6F20 2D1810 0050+00 1/0 0/0 0/0 .text removeResourceAll__13JKRMemArchiveFv */
2021-05-03 02:03:24 +02:00
void JKRMemArchive::removeResourceAll(void) {
2023-09-19 03:46:45 -07:00
JUT_ASSERT(642, isMounted());
2021-05-03 02:03:24 +02:00
if (mArcInfoBlock == NULL)
return;
if (mMountMode == MOUNT_MEM)
return;
// !@bug: looping over file entries without incrementing the fileEntry pointer. Thus, only the
// first fileEntry will clear/remove the resource data.
SDIFileEntry* fileEntry = mFiles;
for (int i = 0; i < mArcInfoBlock->num_file_entries; i++) {
if (fileEntry->data) {
fileEntry->data = NULL;
}
}
2020-12-06 21:02:25 +01:00
}
2021-04-06 18:00:35 +02:00
/* 802D6F20-802D6F5C 2D1860 003C+00 1/0 0/0 0/0 .text removeResource__13JKRMemArchiveFPv
*/
2021-05-03 02:03:24 +02:00
bool JKRMemArchive::removeResource(void* resource) {
2023-09-19 03:46:45 -07:00
JUT_ASSERT(673, isMounted());
2021-05-03 02:03:24 +02:00
SDIFileEntry* fileEntry = findPtrResource(resource);
if (!fileEntry)
return false;
fileEntry->data = NULL;
return true;
2020-12-06 21:02:25 +01:00
}
2021-04-06 18:00:35 +02:00
/* 802D6F5C-802D7030 2D189C 00D4+00 1/1 1/1 0/0 .text
2021-04-01 02:07:58 +02:00
* fetchResource_subroutine__13JKRMemArchiveFPUcUlPUcUli */
2021-05-03 02:03:24 +02:00
u32 JKRMemArchive::fetchResource_subroutine(u8* src, u32 srcLength, u8* dst, u32 dstLength,
JKRCompression compression) {
switch (compression) {
case COMPRESSION_NONE:
if (srcLength > dstLength) {
srcLength = dstLength;
}
memcpy(dst, src, srcLength);
return srcLength;
case COMPRESSION_YAY0:
case COMPRESSION_YAZ0:
2023-07-21 19:30:25 +03:00
u32 expendedSize = JKRDecompExpandSize(src);
2021-05-03 02:03:24 +02:00
srcLength = expendedSize;
if (expendedSize > dstLength) {
srcLength = dstLength;
}
JKRDecompress(src, dst, srcLength, 0);
return srcLength;
default: {
2023-09-19 03:46:45 -07:00
JUTException::panic(__FILE__, 723, "??? bad sequence\n");
2021-05-03 02:03:24 +02:00
} break;
}
return 0;
2020-12-06 21:02:25 +01:00
}
2021-04-06 18:00:35 +02:00
/* 802D7030-802D70C0 2D1970 0090+00 1/0 0/0 0/0 .text getExpandedResSize__13JKRMemArchiveCFPCv */
2021-05-03 02:03:24 +02:00
u32 JKRMemArchive::getExpandedResSize(const void* resource) const {
SDIFileEntry* fileEntry = findPtrResource(resource);
if (fileEntry == NULL)
return -1;
if (fileEntry->isCompressed() == false) {
return getResSize(resource);
} else {
2023-07-21 19:30:25 +03:00
return JKRDecompExpandSize((u8*)resource);
2021-05-03 02:03:24 +02:00
}
2020-12-06 21:02:25 +01:00
}