#pragma once
#include <string_view>
#include <map>
#include <vector>
#include "Common/CommonTypes.h"
#include "Common/Log.h"
class Path;
class ParamSFOData {
public:
void SetValue(std::string_view key, unsigned int value, int max_size);
void SetValue(std::string_view key, std::string_view value, int max_size);
void SetValue(std::string_view key, const u8 *value, unsigned int size, int max_size);
int GetValueInt(std::string_view key) const;
std::string GetValueString(std::string_view key) const;
bool HasKey(std::string_view key) const;
const u8 *GetValueData(std::string_view key, unsigned int *size) const;
std::vector<std::string> GetKeys() const;
std::string GenerateFakeID(const Path &filename) const;
std::string GetDiscID();
void WriteSFO(u8 **paramsfo, size_t *size) const;
bool ReadSFO(const u8 *paramsfo, size_t size);
bool ReadSFO(const std::vector<u8> ¶msfo) {
if (!paramsfo.empty()) {
return ReadSFO(¶msfo[0], paramsfo.size());
} else {
return false;
}
}
int GetDataOffset(const u8 *paramsfo, const char *dataName);
bool IsValid() const { return !values.empty(); }
void Clear();
enum ValueType {
VT_INT,
VT_UTF8,
VT_UTF8_SPE
};
class ValueData {
public:
ValueType type = VT_INT;
int max_size = 0;
std::string s_value;
int i_value = 0;
std::vector<u8> u_value;
void SetData(const u8* data, int size) {
u_value = std::vector<u8>(data, data + size);
}
};
const std::map<std::string, ValueData, std::less<>> &Values() {
return values;
}
static const char *ValueTypeToString(ValueType t) {
switch (t) {
case ParamSFOData::VT_INT: return "INT";
case ParamSFOData::VT_UTF8: return "UTF8";
case ParamSFOData::VT_UTF8_SPE: return "UTF8_SPE";
default: return "N/A";
}
}
private:
std::map<std::string, ValueData, std::less<>> values;
};
enum class GameRegion {
JAPAN,
USA,
EUROPE,
HONGKONG,
ASIA,
KOREA,
COUNT,
HOMEBREW = COUNT,
UNKNOWN,
INTERNAL,
TEST,
DIAGNOSTIC,
};
GameRegion DetectGameRegionFromID(std::string_view id_version);
std::string_view GameRegionToString(GameRegion region);