// 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); }