mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-15 05:47:56 -07:00
64101137cd
Dolphin is able to generate one with all correct default settings, so we don't need to ship with a pre-generated SYSCONF and worry about syncing default settings. Additionally, this commit changes SysConf to work with session SYSCONFs so that Dolphin is able to generate a default one even for Movie/TAS. Which SYSCONF needs to be touched is explicitly specified to avoid confusion about which file SysConf is managing. (Another notable change is that the Wii root functions are moved into Core to prevent Common from depending on Core.)
193 lines
3.9 KiB
C++
193 lines
3.9 KiB
C++
// Copyright 2009 Dolphin Emulator Project
|
|
// Licensed under GPLv2+
|
|
// Refer to the license.txt file included.
|
|
|
|
#pragma once
|
|
|
|
#include <algorithm>
|
|
#include <cstdio>
|
|
#include <cstring>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "Common/CommonTypes.h"
|
|
#include "Common/Logging/Log.h"
|
|
#include "Common/MsgHandler.h"
|
|
#include "Common/NandPaths.h"
|
|
|
|
namespace File
|
|
{
|
|
class IOFile;
|
|
}
|
|
|
|
// This class is meant to edit the values in a given Wii SYSCONF file
|
|
// It currently does not add/remove/rearrange sections,
|
|
// instead only modifies exiting sections' data
|
|
|
|
#define SYSCONF_SIZE 0x4000
|
|
|
|
enum SysconfType
|
|
{
|
|
Type_BigArray = 1,
|
|
Type_SmallArray,
|
|
Type_Byte,
|
|
Type_Short,
|
|
Type_Long,
|
|
Type_LongLong,
|
|
Type_Bool
|
|
};
|
|
|
|
struct SSysConfHeader
|
|
{
|
|
char version[4];
|
|
u16 numEntries;
|
|
};
|
|
|
|
struct SSysConfEntry
|
|
{
|
|
u16 offset;
|
|
SysconfType type;
|
|
u8 nameLength;
|
|
char name[32];
|
|
u16 dataLength;
|
|
u8* data;
|
|
|
|
template <class T>
|
|
T GetData()
|
|
{
|
|
return *(T*)data;
|
|
}
|
|
bool GetArrayData(u8* dest, u16 destSize)
|
|
{
|
|
if (dest && destSize >= dataLength)
|
|
{
|
|
memcpy(dest, data, dataLength);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
bool SetArrayData(u8* buffer, u16 bufferSize)
|
|
{
|
|
if (buffer)
|
|
{
|
|
memcpy(data, buffer, std::min<u16>(bufferSize, dataLength));
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
};
|
|
|
|
class SysConf
|
|
{
|
|
public:
|
|
SysConf(Common::FromWhichRoot root_type);
|
|
~SysConf();
|
|
|
|
bool IsValid() { return m_IsValid; }
|
|
template <class T>
|
|
T GetData(const char* sectionName)
|
|
{
|
|
if (!m_IsValid)
|
|
{
|
|
PanicAlertT("Trying to read from invalid SYSCONF");
|
|
return 0;
|
|
}
|
|
|
|
std::vector<SSysConfEntry>::iterator index = m_Entries.begin();
|
|
for (; index < m_Entries.end() - 1; ++index)
|
|
{
|
|
if (strcmp(index->name, sectionName) == 0)
|
|
break;
|
|
}
|
|
if (index == m_Entries.end() - 1)
|
|
{
|
|
PanicAlertT("Section %s not found in SYSCONF", sectionName);
|
|
return 0;
|
|
}
|
|
|
|
return index->GetData<T>();
|
|
}
|
|
|
|
bool GetArrayData(const char* sectionName, u8* dest, u16 destSize)
|
|
{
|
|
if (!m_IsValid)
|
|
{
|
|
PanicAlertT("Trying to read from invalid SYSCONF");
|
|
return 0;
|
|
}
|
|
|
|
std::vector<SSysConfEntry>::iterator index = m_Entries.begin();
|
|
for (; index < m_Entries.end() - 1; ++index)
|
|
{
|
|
if (strcmp(index->name, sectionName) == 0)
|
|
break;
|
|
}
|
|
if (index == m_Entries.end() - 1)
|
|
{
|
|
PanicAlertT("Section %s not found in SYSCONF", sectionName);
|
|
return 0;
|
|
}
|
|
|
|
return index->GetArrayData(dest, destSize);
|
|
}
|
|
|
|
bool SetArrayData(const char* sectionName, u8* buffer, u16 bufferSize)
|
|
{
|
|
if (!m_IsValid)
|
|
return false;
|
|
|
|
std::vector<SSysConfEntry>::iterator index = m_Entries.begin();
|
|
for (; index < m_Entries.end() - 1; ++index)
|
|
{
|
|
if (strcmp(index->name, sectionName) == 0)
|
|
break;
|
|
}
|
|
if (index == m_Entries.end() - 1)
|
|
{
|
|
PanicAlertT("Section %s not found in SYSCONF", sectionName);
|
|
return false;
|
|
}
|
|
|
|
return index->SetArrayData(buffer, bufferSize);
|
|
}
|
|
|
|
template <class T>
|
|
bool SetData(const char* sectionName, T newValue)
|
|
{
|
|
if (!m_IsValid)
|
|
return false;
|
|
|
|
std::vector<SSysConfEntry>::iterator index = m_Entries.begin();
|
|
for (; index < m_Entries.end() - 1; ++index)
|
|
{
|
|
if (strcmp(index->name, sectionName) == 0)
|
|
break;
|
|
}
|
|
if (index == m_Entries.end() - 1)
|
|
{
|
|
PanicAlertT("Section %s not found in SYSCONF", sectionName);
|
|
return false;
|
|
}
|
|
|
|
*(T*)index->data = newValue;
|
|
return true;
|
|
}
|
|
|
|
bool Save();
|
|
bool SaveToFile(const std::string& filename);
|
|
bool LoadFromFile(const std::string& filename);
|
|
bool Reload();
|
|
void UpdateLocation(Common::FromWhichRoot root_type);
|
|
|
|
private:
|
|
bool LoadFromFileInternal(File::IOFile&& file);
|
|
void GenerateSysConf();
|
|
void Clear();
|
|
void ApplySettingsFromMovie();
|
|
|
|
std::string m_Filename;
|
|
std::string m_FilenameDefault;
|
|
std::vector<SSysConfEntry> m_Entries;
|
|
bool m_IsValid = false;
|
|
};
|