dolphin/Source/Core/Common/SettingsHandler.cpp
Lioncash 552c0d8404 Common: Move byte swapping utilities into their own header
This moves all the byte swapping utilities into a header named Swap.h.

A dedicated header is much more preferable here due to the size of the
code itself. In general usage throughout the codebase, CommonFuncs.h was
generally only included for these functions anyway. These being in their
own header avoids dumping the lesser used utilities into scope. As well
as providing a localized area for more utilities related to byte
swapping in the future (should they be needed). This also makes it nicer
to identify which files depend on the byte swapping utilities in
particular.

Since this is a completely new header, moving the code uncovered a few
indirect includes, as well as making some other inclusions unnecessary.
2017-03-03 17:18:18 -05:00

148 lines
3.1 KiB
C++

// Copyright 2012 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
// Thanks to Treeki for writing the original class - 29/01/2012
#include <cstddef>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <string>
#ifdef _WIN32
#include <windows.h>
#include <mmsystem.h>
#include <sys/timeb.h>
#endif
#include "Common/CommonTypes.h"
#include "Common/FileUtil.h"
#include "Common/SettingsHandler.h"
#include "Common/Timer.h"
SettingsHandler::SettingsHandler()
{
Reset();
}
bool SettingsHandler::Open(const std::string& settings_file_path)
{
Reset();
File::IOFile file{settings_file_path, "rb"};
if (!file.ReadBytes(m_buffer.data(), m_buffer.size()))
return false;
Decrypt();
return true;
}
bool SettingsHandler::Save(const std::string& destination_file_path) const
{
if (!File::CreateFullPath(destination_file_path))
return false;
File::IOFile file{destination_file_path, "wb"};
return file.WriteBytes(m_buffer.data(), m_buffer.size());
}
const u8* SettingsHandler::GetData() const
{
return m_buffer.data();
}
const std::string SettingsHandler::GetValue(const std::string& key)
{
std::string delim = std::string("\r\n");
std::string toFind = delim + key + "=";
size_t found = decoded.find(toFind);
if (found != decoded.npos)
{
size_t delimFound = decoded.find(delim, found + toFind.length());
if (delimFound == decoded.npos)
delimFound = decoded.length() - 1;
return decoded.substr(found + toFind.length(), delimFound - (found + toFind.length()));
}
else
{
toFind = key + "=";
found = decoded.find(toFind);
if (found == 0)
{
size_t delimFound = decoded.find(delim, found + toFind.length());
if (delimFound == decoded.npos)
delimFound = decoded.length() - 1;
return decoded.substr(found + toFind.length(), delimFound - (found + toFind.length()));
}
}
return "";
}
void SettingsHandler::Decrypt()
{
const u8* str = m_buffer.data();
while (*str != 0)
{
if (m_position >= m_buffer.size())
return;
decoded.push_back((u8)(m_buffer[m_position] ^ m_key));
m_position++;
str++;
m_key = (m_key >> 31) | (m_key << 1);
}
}
void SettingsHandler::Reset()
{
decoded = "";
m_position = 0;
m_key = INITIAL_SEED;
m_buffer = {};
}
void SettingsHandler::AddSetting(const std::string& key, const std::string& value)
{
for (const char& c : key)
{
WriteByte(c);
}
WriteByte('=');
for (const char& c : value)
{
WriteByte(c);
}
WriteByte(13);
WriteByte(10);
}
void SettingsHandler::WriteByte(u8 b)
{
if (m_position >= m_buffer.size())
return;
m_buffer[m_position] = b ^ m_key;
m_position++;
m_key = (m_key >> 31) | (m_key << 1);
}
std::string SettingsHandler::GenerateSerialNumber()
{
time_t rawtime;
tm* timeinfo;
char buffer[12];
char serialNumber[12];
time(&rawtime);
timeinfo = localtime(&rawtime);
strftime(buffer, 11, "%j%H%M%S", timeinfo);
snprintf(serialNumber, 11, "%s%i", buffer, (Common::Timer::GetTimeMs() >> 1) & 0xF);
serialNumber[10] = 0;
return std::string(serialNumber);
}