Files
UwU-Engine/Core/Game/Resource/Resource.cpp
T

143 lines
3.6 KiB
C++

#include "Resource.hpp"
#include <stdexcept>
#include <cstring>
#include <iostream>
std::mutex Resource::mStringResource;
const char* Resource::StringResources = "./Resources/string.res";
std::mutex Resource::mIntResource;
const char* Resource::IntResources = "./Resources/int.res";
std::mutex Resource::mLongResource;
const char* Resource::LongResources = "./Resources/long.res";
std::mutex Resource::mDoubleResource;
const char* Resource::DoubleResources = "./Resources/double.res";
std::mutex Resource::mObjectResource;
const char* Resource::ObjectResources = "./Resources/object.res";
std::string Resource::GetResourceData(const char* name, const char* file_name)
{
size_t size_name = strlen(name);
std::ifstream file(file_name);
if (!file.is_open())
throw std::runtime_error("Can't open resource file");
std::string line;
while (std::getline(file, line))
{
if (line.find(name) == 0 && line[size_name] == ':')
{
size_t begin = size_name + 2;
file.close();
return line.substr(begin, line.length() - begin);
}
}
file.close();
throw std::runtime_error("Can't find resource");
}
void Resource::WriteResource(const char* name, const char* file_name, const std::string& value)
{
size_t size_name = strlen(name);
bool isFind = false;
std::string buffer;
std::ifstream file(file_name);
std::string line;
while (std::getline(file, line))
{
if (line.find(name) == 0 && line[size_name] == ':')
{
isFind = true;
line.resize(size_name + 2 + value.length());
line.replace(size_name + 2, value.length(), value);
}
buffer += line + '\n';
}
file.close();
if (!isFind)
{
buffer += name;
buffer += ": ";
buffer += value;
buffer += '\n';
}
std::ofstream drop_file(file_name, std::ios::trunc);
drop_file << buffer;
drop_file.close();
}
void Resource::SetString(const char* name, const char* value)
{
mStringResource.lock();
WriteResource(name, StringResources, std::string(value));
mStringResource.unlock();
}
void Resource::SetInt(const char* name, int value)
{
mIntResource.lock();
WriteResource(name, IntResources, std::to_string(value));
mIntResource.unlock();
}
void Resource::SetLong(const char* name, long long value)
{
mLongResource.lock();
WriteResource(name, LongResources, std::to_string(value));
mLongResource.unlock();
}
void Resource::SetDouble(const char* name, double value)
{
mDoubleResource.lock();
WriteResource(name, DoubleResources, std::to_string(value));
mDoubleResource.unlock();
}
void Resource::SetObject(const char* name, IResource* object)
{
mObjectResource.lock();
WriteResource(name, ObjectResources, object->serialize());
mObjectResource.unlock();
}
std::string Resource::GetString(const char* name)
{
mStringResource.lock();
std::string data = GetResourceData(name, StringResources);
mStringResource.unlock();
return data;
}
int Resource::GetInt(const char* name)
{
mIntResource.lock();
int data = std::stoi(GetResourceData(name, IntResources));
mIntResource.unlock();
return data;
}
long long Resource::GetLong(const char* name)
{
mLongResource.lock();
long long data = std::stoll(GetResourceData(name, LongResources));
mLongResource.unlock();
return data;
}
double Resource::GetDouble(const char* name)
{
mDoubleResource.lock();
double data = std::stod(GetResourceData(name, DoubleResources));
mDoubleResource.unlock();
return data;
}