SMG-Decomp
A decompilation of Super Mario Galaxy 1
Loading...
Searching...
No Matches
ArchiveHolder.cpp
1#include "Game/System/ArchiveHolder.hpp"
2#include "Game/Util.hpp"
3#include <cstring>
4
5ArchiveHolderArchiveEntry::ArchiveHolderArchiveEntry(void *pData, JKRHeap *pHeap, const char *pName) {
6 mHeap = pHeap;
7 mArchive = nullptr;
8 mArchiveName = nullptr;
9 JKRMemArchive* archive = new(pHeap, 0) JKRMemArchive();
10 archive->mountFixed(pData, JKR_MEM_BREAK_FLAG_0);
11 mArchive = archive;
12 s32 len = strlen(pName) + 1;
13 char* name = new(pHeap, 0) char[len];
14 mArchiveName = name;
15 MR::copyString(mArchiveName, pName, len);
16}
17
18ArchiveHolderArchiveEntry::~ArchiveHolderArchiveEntry() {
19 mArchive->unmount();
20 delete mArchiveName;
21}
22
23ArchiveHolder::ArchiveHolder() {
24 mEntries = nullptr;
25 mMaxEntries = 0;
26 mCurEntryNum = 0;
27 mEntries = new ArchiveHolderArchiveEntry*[0x180];
28 mMaxEntries = 0x180;
29 OSInitMutex(&mMutex);
30}
31
32ArchiveHolderArchiveEntry* ArchiveHolder::createAndAdd(void *pData, JKRHeap *pHeap, const char *pName) {
33 ArchiveHolderArchiveEntry* entry = new(pHeap, 0) ArchiveHolderArchiveEntry(pData, pHeap, pName);
34 OSMutex* mutex = &mMutex;
35 OSLockMutex(mutex);
36 s32 num = mCurEntryNum;
37 mCurEntryNum = num + 1;
38 mEntries[num] = entry;
39 OSUnlockMutex(mutex);
40 return entry;
41}
42
43JKRMemArchive* ArchiveHolder::getArchive(const char *pName) const {
44 ArchiveHolderArchiveEntry* entry = findEntry(pName);
45 return (entry != nullptr) ? entry->mArchive : nullptr;
46}
47
48void ArchiveHolder::getArchiveAndHeap(const char *pName, JKRArchive** pArchive, JKRHeap** pHeap) const {
49 ArchiveHolderArchiveEntry* entry = findEntry(pName);
50
51 if (entry != nullptr) {
52 *pArchive = entry->mArchive;
53 *pHeap = entry->mHeap;
54 }
55}
56
57// void ArchiveHolder::removeIfIsEqualHeap(JKRHeap *pHeap)
58
59ArchiveHolderArchiveEntry* ArchiveHolder::findEntry(const char *pName) const {
60 for (ArchiveHolderArchiveEntry** i = first(); i != last(); i++) {
61 if (MR::isEqualStringCase((*i)->mArchiveName, pName)) {
62 return *i;
63 }
64 }
65
66 return nullptr;
67}