Files

89 lines
2.1 KiB
C++

#include "Game/System/FileHolder.hpp"
FileHolderFileEntry::FileHolderFileEntry(const char *pName, JKRHeap *pHeap, void *pData) {
mEntryNum = DVDConvertPathToEntrynum(pName);
mContext = 0;
mHeap = pHeap;
mState = 0;
mContextSet = true;
OSInitMessageQueue(&mQueue, &mMessage, 1);
if (pData) {
mContextSet = false;
mContext = pData;
}
}
FileHolderFileEntry::~FileHolderFileEntry() {
if (mContextSet) {
if (mContext) {
delete (u8*)mContext;
}
}
}
void FileHolderFileEntry::waitReadDone() {
if (mState != 2) {
OSMessage msg;
OSReceiveMessage(&mQueue, &msg, 1);
mState = 2;
}
}
void FileHolderFileEntry::setContext(void *pData, JKRHeap *pHeap) {
mContext = pData;
mHeap = pHeap;
OSSendMessage(&mQueue, 0, 0);
mState = 1;
}
FileHolder::FileHolder() {
mArray.mArray.mArr = new FileHolderFileEntry*[0x180];
mArray.mArray.mMaxSize = 0x180;
}
FileHolderFileEntry* FileHolder::add(const char *pName, JKRHeap *pHeap, void *pData) {
FileHolderFileEntry* entry = new(pHeap, 0) FileHolderFileEntry(pName, pHeap, pData);
s32 count = mArray.mCount;
mArray.mCount++;
mArray.mArray.mArr[count] = entry;
return entry;
}
bool FileHolder::isExist(const char *pFile) const {
return findEntry(pFile);
}
void* FileHolder::getContext(const char *pFile) const {
return findEntry(pFile)->mContext;
}
// FileHolder::removeIfIsEqualHeap
FileHolderFileEntry** FileHolder::removeFile(const char *pFile) {
FileHolderFileEntry* entry = findEntry(pFile);
FileHolderFileEntry** i;
for (i = mArray.mArray.mArr; i != &mArray.mArray.mArr[mArray.mCount] && *i != entry; i++) {
}
delete *i;
return mArray.erase(i);
}
FileHolderFileEntry* FileHolder::findEntry(const char *pFile) const {
s32 entryNum = DVDConvertPathToEntrynum(pFile);
FileHolderFileEntry** curEntry;
for (curEntry = mArray.mArray.mArr; curEntry != &mArray.mArray.mArr[mArray.mCount]; curEntry++) {
if (entryNum == (*(curEntry))->mEntryNum) {
return *curEntry;
}
}
return 0;
}