Files
tp/src/JSystem/JKernel/JKRFileLoader.cpp
T

147 lines
3.8 KiB
C++
Raw Normal View History

2025-09-11 16:20:45 -04:00
#include "JSystem/JSystem.h" // IWYU pragma: keep
2021-04-01 02:07:58 +02:00
#include "JSystem/JKernel/JKRFileLoader.h"
#include "string.h"
#include "ctype.h"
2021-05-03 02:03:24 +02:00
#include "global.h"
2021-03-28 22:49:05 +02:00
2021-05-03 02:03:24 +02:00
JKRFileLoader* JKRFileLoader::sCurrentVolume;
JSUList<JKRFileLoader> JKRFileLoader::sVolumeList;
2021-03-28 22:49:05 +02:00
2021-05-03 02:03:24 +02:00
JKRFileLoader::JKRFileLoader(void)
: mFileLoaderLink(this), mVolumeName(NULL), mVolumeType(0), mMountCount(0) {}
2021-01-10 02:15:52 +01:00
2021-05-03 02:03:24 +02:00
JKRFileLoader::~JKRFileLoader() {
if (getCurrentVolume() == this) {
setCurrentVolume(NULL);
}
}
2021-05-03 02:03:24 +02:00
void JKRFileLoader::unmount(void) {
s32 count = mMountCount;
if (mMountCount != 0) {
count--;
mMountCount = count;
if (count == 0) {
delete this;
}
}
}
2021-05-03 02:03:24 +02:00
void* JKRFileLoader::getGlbResource(const char* name) {
const char* name_reference[1];
name_reference[0] = name;
JKRFileLoader* fileLoader = findVolume(name_reference);
void* resource;
if (fileLoader == NULL) {
resource = NULL;
} else {
resource = fileLoader->getResource(name_reference[0]);
}
return resource;
}
2021-03-28 22:49:05 +02:00
2021-05-03 02:03:24 +02:00
void* JKRFileLoader::getGlbResource(const char* name, JKRFileLoader* fileLoader) {
void* resource = NULL;
if (fileLoader) {
return fileLoader->getResource(0, name);
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
resource = iterator->getResource(0, name);
if (resource)
break;
}
return resource;
}
2021-05-03 02:03:24 +02:00
bool JKRFileLoader::removeResource(void* resource, JKRFileLoader* fileLoader) {
if (fileLoader) {
return fileLoader->removeResource(resource);
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (iterator->removeResource(resource)) {
return true;
}
}
return false;
}
2021-05-03 02:03:24 +02:00
bool JKRFileLoader::detachResource(void* resource, JKRFileLoader* fileLoader) {
if (fileLoader) {
return fileLoader->detachResource(resource);
}
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (iterator->detachResource(resource)) {
return true;
}
}
return false;
}
2021-05-03 02:03:24 +02:00
JKRFileLoader* JKRFileLoader::findVolume(const char** volumeName) {
if (*volumeName[0] != '/') {
return getCurrentVolume();
}
char volumeNameBuffer[0x101];
2025-09-04 07:56:59 -07:00
*volumeName = fetchVolumeName(volumeNameBuffer, ARRAY_SIZEU(volumeNameBuffer), *volumeName);
2021-05-03 02:03:24 +02:00
JSUList<JKRFileLoader>& volumeList = getVolumeList();
JSUListIterator<JKRFileLoader> iterator;
for (iterator = volumeList.getFirst(); iterator != volumeList.getEnd(); ++iterator) {
if (strcmp(volumeNameBuffer, iterator->mVolumeName) == 0) {
return iterator.getObject();
}
}
return NULL;
}
2023-07-21 05:39:25 +03:00
static char rootPath[2] = "/";
2023-09-24 02:05:03 -07:00
const char* JKRFileLoader::fetchVolumeName(char* buffer, s32 bufferSize, const char* path) {
2022-12-19 11:06:32 -08:00
if (strcmp(path, "/") == 0) {
strcpy(buffer, rootPath);
return rootPath;
2021-05-03 02:03:24 +02:00
}
path++;
while (*path != 0 && *path != '/') {
if (1 < bufferSize) {
2023-07-21 05:39:25 +03:00
int lower_char;
2021-05-03 02:03:24 +02:00
int ch = (int)*path;
if (ch == -1) {
lower_char = -1;
} else {
2022-12-19 11:06:32 -08:00
lower_char = __lower_map[ch & 0xFF];
2021-05-03 02:03:24 +02:00
}
*buffer = lower_char;
buffer++;
bufferSize--;
}
path++;
}
*buffer = '\0';
if (*path == '\0') {
2022-12-19 11:06:32 -08:00
path = rootPath;
2021-05-03 02:03:24 +02:00
}
return path;
2025-09-04 07:56:59 -07:00
}