83 lines
2.2 KiB
C++
83 lines
2.2 KiB
C++
// Copyright (c) 2022 Dominic Masters
|
|
//
|
|
// This software is released under the MIT License.
|
|
// https://opensource.org/licenses/MIT
|
|
|
|
#include "LanguageAsset.hpp"
|
|
|
|
using namespace Dawn;
|
|
|
|
LanguageAsset::LanguageAsset(AssetManager *man, std::string name) :
|
|
Asset(man, name),
|
|
loader(name + ".language")
|
|
{
|
|
|
|
}
|
|
|
|
void LanguageAsset::updateSync() {
|
|
|
|
}
|
|
|
|
void LanguageAsset::updateAsync() {
|
|
assertTrue(
|
|
this->state == LANGUAGE_ASSET_LOAD_STATE_NOT_LOADING,
|
|
"LanguageAsset::updateAsync: State must be NOT_LOADING"
|
|
);
|
|
|
|
// Open Asset
|
|
this->state = LANGUAGE_ASSET_LOAD_STATE_OPENING;
|
|
this->loader.open();
|
|
|
|
// Get Length
|
|
size_t len = this->loader.getSize();
|
|
|
|
// Create buffer
|
|
this->state = LANGUAGE_ASSET_LOAD_STATE_CREATING_BUFFER;
|
|
size_t position = 0;
|
|
|
|
// Loop over CSV
|
|
while(position < len) {
|
|
this->loader.read(buffer, 1024);
|
|
|
|
// Get strings
|
|
uint8_t *keyStart = buffer;
|
|
uint8_t *keyEnd = (uint8_t*)strchr((char*)keyStart, '|');
|
|
*keyEnd = '\0';
|
|
uint8_t *valueStart = keyEnd + 1;
|
|
uint8_t *valueEnd = (uint8_t*)strchr((char*)valueStart, '|');
|
|
|
|
// Load value positions
|
|
struct AssetLanguageValue value;
|
|
value.begin = position + (size_t)(valueStart - buffer);
|
|
value.length = (size_t)(valueEnd - valueStart);
|
|
|
|
// Prepare for next string.
|
|
position = position + (size_t)(valueEnd - buffer + 1);
|
|
this->loader.setPosition(position);
|
|
|
|
// Store strings.
|
|
std::string key((char *)keyStart);
|
|
this->values[key] = value;
|
|
}
|
|
|
|
this->state = LANGUAGE_ASSET_LOAD_STATE_READY_TO_READ;
|
|
this->loaded = true;
|
|
}
|
|
|
|
std::string LanguageAsset::getValue(std::string key) {
|
|
assertTrue(
|
|
this->state == LANGUAGE_ASSET_LOAD_STATE_READY_TO_READ,
|
|
"LanguageAsset::getValue: State must be LANGUAGE_ASSET_LOAD_STATE_READY_TO_READ"
|
|
);
|
|
assertMapHasKey(this->values, key, "LanguageAsset::getValue: Key does not exist");
|
|
assertTrue(this->values[key].begin >= 0 && this->values[key].length > 0, "LanguageAsset::getValue: Value is invalid");
|
|
|
|
// Get the positions
|
|
struct AssetLanguageValue value = this->values[key];
|
|
|
|
this->loader.setPosition(value.begin);
|
|
this->loader.read(buffer, value.length);
|
|
buffer[value.length] = '\0';
|
|
|
|
return std::string((char *)buffer, value.length + 1);
|
|
} |