#pragma once
#include <string_view>
#include <map>
#include <vector>
#include "Common/CommonTypes.h"
#include "Common/Log.h"
class Path;
class ParamSFOData {
public:
void SetValue(const std::string &key, unsigned int value, int max_size);
void SetValue(const std::string &key, const std::string &value, int max_size);
void SetValue(const std::string &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();
private:
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;
u8* u_value = nullptr;
unsigned int u_size = 0;
void SetData(const u8* data, int size);
~ValueData() {
delete[] u_value;
}
};
std::map<std::string, ValueData, std::less<>> values;
};
enum class GameRegion {
JAPAN,
USA,
EUROPE,
HONGKONG,
ASIA,
KOREA,
COUNT,
HOMEBREW = COUNT,
OTHER,
};
GameRegion DetectGameRegionFromID(std::string_view id_version);
std::string_view GameRegionToString(GameRegion region);