| 60 | } |
| 61 | |
| 62 | bool JKRCompArchive::open(long entryNum) { |
| 63 | mArcInfoBlock = nullptr; |
| 64 | _64 = 0; |
| 65 | mAramPart = nullptr; |
| 66 | _6C = 0; |
| 67 | mSizeOfMemPart = 0; |
| 68 | mSizeOfAramPart = 0; |
| 69 | _7C = 0; |
| 70 | mDirectories = nullptr; |
| 71 | mFileEntries = nullptr; |
| 72 | mStrTable = nullptr; |
| 73 | |
| 74 | mDvdFile = new (JKRGetSystemHeap(), 0) JKRDvdFile(entryNum); |
| 75 | if(mDvdFile == nullptr) { |
| 76 | mMountMode = 0; |
| 77 | return 0; |
| 78 | } |
| 79 | SArcHeader *arcHeader = (SArcHeader *)JKRAllocFromSysHeap(sizeof(SArcHeader), -32); // NOTE: unconfirmed if this struct is used |
| 80 | if(arcHeader == nullptr) { |
| 81 | mMountMode = 0; |
| 82 | } |
| 83 | else { |
| 84 | int alignment; |
| 85 | |
| 86 | JKRDvdToMainRam(entryNum, (u8 *)arcHeader, EXPAND_SWITCH_DECOMPRESS, 32, nullptr, JKRDvdRipper::ALLOC_DIR_TOP, 0, &mCompression, nullptr); |
| 87 | DCInvalidateRange(arcHeader, 32); |
| 88 | |
| 89 | mSizeOfMemPart = arcHeader->_14; |
| 90 | mSizeOfAramPart = arcHeader->_18; |
| 91 | #line 352 |
| 92 | JUT_ASSERT(( mSizeOfMemPart & 0x1f ) == 0); |
| 93 | JUT_ASSERT(( mSizeOfAramPart & 0x1f ) == 0); |
| 94 | |
| 95 | switch (mCompression) |
| 96 | { |
| 97 | case JKRCOMPRESSION_NONE: |
| 98 | case JKRCOMPRESSION_YAZ0: |
| 99 | alignment = mMountDirection == 1 ? 32 : -32; |
| 100 | mArcInfoBlock = (SArcDataInfo *)JKRAllocFromHeap(mHeap, arcHeader->file_data_offset + mSizeOfMemPart, alignment); |
| 101 | if (mArcInfoBlock == nullptr) { |
| 102 | mMountMode = 0; |
| 103 | } |
| 104 | else |
| 105 | { |
| 106 | JKRDvdToMainRam(entryNum, (u8 *)mArcInfoBlock, EXPAND_SWITCH_DECOMPRESS, (u32)arcHeader->file_data_offset + mSizeOfMemPart, |
| 107 | nullptr, JKRDvdRipper::ALLOC_DIR_TOP, 0x20, nullptr, nullptr); |
| 108 | DCInvalidateRange(mArcInfoBlock, (u32)arcHeader->file_data_offset + mSizeOfMemPart); |
| 109 | _64 = (u32)mArcInfoBlock + arcHeader->file_data_offset; |
| 110 | |
| 111 | if (mSizeOfAramPart != 0) { |
| 112 | mAramPart = JKRAllocFromAram(mSizeOfAramPart, JKRAramHeap::AM_Head); |
| 113 | if(mAramPart == nullptr) { |
| 114 | mMountMode = 0; |
| 115 | break; |
| 116 | } |
| 117 | |
| 118 | JKRDvdToAram(entryNum, mAramPart->getAddress(), EXPAND_SWITCH_DECOMPRESS, arcHeader->header_length + arcHeader->file_data_offset + mSizeOfMemPart, 0, nullptr); |
| 119 | } |
nothing calls this directly
no test coverage detected