Rewrote some code from C to C++

This commit is contained in:
Leon Styhre 2020-12-16 23:59:00 +01:00
parent 605aa4ba8e
commit debf072a0e
52 changed files with 138 additions and 154 deletions

View file

@ -200,12 +200,12 @@ const std::string FileData::getMediaDirectory()
const std::string FileData::getMediafilePath(std::string subdirectory, std::string mediatype) const const std::string FileData::getMediafilePath(std::string subdirectory, std::string mediatype) const
{ {
const char* extList[2] = { ".png", ".jpg" }; std::vector<std::string> extList = { ".png", ".jpg" };
// Look for an image file in the media directory. // Look for an image file in the media directory.
std::string tempPath = getMediaDirectory() + mSystemName + "/" + std::string tempPath = getMediaDirectory() + mSystemName + "/" +
subdirectory + "/" + getDisplayName(); subdirectory + "/" + getDisplayName();
for (int i = 0; i < 2; i++) { for (int i = 0; i < extList.size(); i++) {
std::string mediaPath = tempPath + extList[i]; std::string mediaPath = tempPath + extList[i];
if (Utils::FileSystem::exists(mediaPath)) if (Utils::FileSystem::exists(mediaPath))
return mediaPath; return mediaPath;
@ -214,7 +214,7 @@ const std::string FileData::getMediafilePath(std::string subdirectory, std::stri
// No media found in the media directory, so look // No media found in the media directory, so look
// for local art as well (if configured to do so). // for local art as well (if configured to do so).
if (Settings::getInstance()->getBool("ROMDirGameMedia")) { if (Settings::getInstance()->getBool("ROMDirGameMedia")) {
for (int i = 0; i < 2; i++) { for (int i = 0; i < extList.size(); i++) {
std::string localMediaPath = mEnvData->mStartPath + "/images/" + std::string localMediaPath = mEnvData->mStartPath + "/images/" +
getDisplayName() + "-" + mediatype + extList[i]; getDisplayName() + "-" + mediatype + extList[i];
if (Utils::FileSystem::exists(localMediaPath)) if (Utils::FileSystem::exists(localMediaPath))
@ -273,11 +273,11 @@ const std::string FileData::getThumbnailPath() const
const std::string FileData::getVideoPath() const const std::string FileData::getVideoPath() const
{ {
const char* extList[5] = { ".avi", ".mkv", ".mov", ".mp4", ".wmv" }; std::vector<std::string> extList = { ".avi", ".mkv", ".mov", ".mp4", ".wmv" };
std::string tempPath = getMediaDirectory() + mSystemName + "/videos/" + getDisplayName(); std::string tempPath = getMediaDirectory() + mSystemName + "/videos/" + getDisplayName();
// Look for media in the media directory. // Look for media in the media directory.
for (int i = 0; i < 5; i++) { for (int i = 0; i < extList.size(); i++) {
std::string mediaPath = tempPath + extList[i]; std::string mediaPath = tempPath + extList[i];
if (Utils::FileSystem::exists(mediaPath)) if (Utils::FileSystem::exists(mediaPath))
return mediaPath; return mediaPath;
@ -287,7 +287,7 @@ const std::string FileData::getVideoPath() const
// for local art as well (if configured to do so). // for local art as well (if configured to do so).
if (Settings::getInstance()->getBool("ROMDirGameMedia")) if (Settings::getInstance()->getBool("ROMDirGameMedia"))
{ {
for (int i = 0; i < 5; i++) { for (int i = 0; i < extList.size(); i++) {
std::string localMediaPath = mEnvData->mStartPath + "/videos/" + std::string localMediaPath = mEnvData->mStartPath + "/videos/" +
getDisplayName() + "-video" + extList[i]; getDisplayName() + "-video" + extList[i];
if (Utils::FileSystem::exists(localMediaPath)) if (Utils::FileSystem::exists(localMediaPath))

View file

@ -26,10 +26,6 @@ enum FileType {
PLACEHOLDER = 3 PLACEHOLDER = 3
}; };
// Used for loading/saving gamelist.xml.
const char* fileTypeToString(FileType type);
FileType stringToFileType(const char* str);
// A tree node that holds information for a file. // A tree node that holds information for a file.
class FileData class FileData
{ {

View file

@ -116,13 +116,13 @@ void parseGamelist(SystemData* system)
std::string relativeTo = system->getStartPath(); std::string relativeTo = system->getStartPath();
bool showHiddenFiles = Settings::getInstance()->getBool("ShowHiddenFiles"); bool showHiddenFiles = Settings::getInstance()->getBool("ShowHiddenFiles");
const char* tagList[2] = { "game", "folder" }; std::vector<std::string> tagList = { "game", "folder" };
FileType typeList[2] = { GAME, FOLDER }; FileType typeList[2] = { GAME, FOLDER };
for (int i = 0; i < 2; i++) { for (int i = 0; i < 2; i++) {
const char* tag = tagList[i]; std::string tag = tagList[i];
FileType type = typeList[i]; FileType type = typeList[i];
for (pugi::xml_node fileNode = root.child(tag); fileNode; fileNode = for (pugi::xml_node fileNode = root.child(tag.c_str()); fileNode; fileNode =
fileNode.next_sibling(tag)) { fileNode.next_sibling(tag.c_str())) {
const std::string path = const std::string path =
Utils::FileSystem::resolveRelativePath(fileNode.child("path").text().get(), Utils::FileSystem::resolveRelativePath(fileNode.child("path").text().get(),
relativeTo, false); relativeTo, false);
@ -179,10 +179,10 @@ void parseGamelist(SystemData* system)
} }
void addFileDataNode(pugi::xml_node& parent, const FileData* file, void addFileDataNode(pugi::xml_node& parent, const FileData* file,
const char* tag, SystemData* system) const std::string& tag, SystemData* system)
{ {
// Create game and add to parent node. // Create game and add to parent node.
pugi::xml_node newNode = parent.append_child(tag); pugi::xml_node newNode = parent.append_child(tag.c_str());
// Write metadata. // Write metadata.
file->metadata.appendToXML(newNode, true, system->getStartPath()); file->metadata.appendToXML(newNode, true, system->getStartPath());
@ -258,7 +258,7 @@ void updateGamelist(SystemData* system)
// Iterate through all files, checking if they're already in the XML file. // Iterate through all files, checking if they're already in the XML file.
for (std::vector<FileData*>::const_iterator fit = files.cbegin(); for (std::vector<FileData*>::const_iterator fit = files.cbegin();
fit != files.cend(); ++fit) { fit != files.cend(); ++fit) {
const char* tag = ((*fit)->getType() == GAME) ? "game" : "folder"; const std::string tag = ((*fit)->getType() == GAME) ? "game" : "folder";
// Do not touch if it wasn't changed and is not flagged for deletion. // Do not touch if it wasn't changed and is not flagged for deletion.
if (!(*fit)->metadata.wasChanged() && !(*fit)->getDeletionFlag()) if (!(*fit)->metadata.wasChanged() && !(*fit)->getDeletionFlag())
@ -266,8 +266,8 @@ void updateGamelist(SystemData* system)
// Check if the file already exists in the XML file. // Check if the file already exists in the XML file.
// If it does, remove the entry before adding it back. // If it does, remove the entry before adding it back.
for (pugi::xml_node fileNode = root.child(tag); fileNode; for (pugi::xml_node fileNode = root.child(tag.c_str()); fileNode;
fileNode = fileNode.next_sibling(tag)) { fileNode = fileNode.next_sibling(tag.c_str())) {
pugi::xml_node pathNode = fileNode.child("path"); pugi::xml_node pathNode = fileNode.child("path");
if (!pathNode) { if (!pathNode) {
LOG(LogError) << "<" << tag << "> node contains no <path> child"; LOG(LogError) << "<" << tag << "> node contains no <path> child";

View file

@ -9,10 +9,11 @@
#include "PlatformId.h" #include "PlatformId.h"
#include <string.h> #include <string.h>
#include <vector>
namespace PlatformIds namespace PlatformIds
{ {
const char* PlatformNames[PLATFORM_COUNT + 1] = { std::vector<std::string> PlatformNames = {
"unknown", // Nothing set. "unknown", // Nothing set.
"3do", "3do",
@ -124,20 +125,20 @@ namespace PlatformIds
"invalid" "invalid"
}; };
PlatformId getPlatformId(const char* str) PlatformId getPlatformId(const std::string& str)
{ {
if (str == nullptr) if (str == "")
return PLATFORM_UNKNOWN; return PLATFORM_UNKNOWN;
for (unsigned int i = 1; i < PLATFORM_COUNT; i++) { for (unsigned int i = 1; i < PLATFORM_COUNT; i++) {
if (strcmp(PlatformNames[i], str) == 0) if (PlatformNames[i] == str)
return (PlatformId)i; return (PlatformId)i;
} }
return PLATFORM_UNKNOWN; return PLATFORM_UNKNOWN;
} }
const char* getPlatformName(PlatformId id) const std::string getPlatformName(PlatformId id)
{ {
return PlatformNames[id]; return PlatformNames[id];
} }

View file

@ -9,6 +9,8 @@
#ifndef ES_APP_PLATFORM_ID_H #ifndef ES_APP_PLATFORM_ID_H
#define ES_APP_PLATFORM_ID_H #define ES_APP_PLATFORM_ID_H
#include <string>
namespace PlatformIds namespace PlatformIds
{ {
enum PlatformId : unsigned int { enum PlatformId : unsigned int {
@ -123,8 +125,8 @@ namespace PlatformIds
PLATFORM_COUNT PLATFORM_COUNT
}; };
PlatformId getPlatformId(const char* str); PlatformId getPlatformId(const std::string& str);
const char* getPlatformName(PlatformId id); const std::string getPlatformName(PlatformId id);
} }
#endif // ES_APP_PLATFORM_ID_H #endif // ES_APP_PLATFORM_ID_H

View file

@ -206,7 +206,7 @@ void SystemData::indexAllGameFilters(const FileData* folder)
} }
} }
std::vector<std::string> readList(const std::string& str, const char* delims = " \t\r\n,") std::vector<std::string> readList(const std::string& str, const std::string& delims = " \t\r\n,")
{ {
std::vector<std::string> ret; std::vector<std::string> ret;
@ -285,11 +285,11 @@ bool SystemData::loadConfig()
cmd = system.child("command").text().get(); cmd = system.child("command").text().get();
// Platform ID list // Platform ID list
const char* platformList = system.child("platform").text().get(); const std::string platformList = system.child("platform").text().get();
std::vector<std::string> platformStrs = readList(platformList); std::vector<std::string> platformStrs = readList(platformList);
std::vector<PlatformIds::PlatformId> platformIds; std::vector<PlatformIds::PlatformId> platformIds;
for (auto it = platformStrs.cbegin(); it != platformStrs.cend(); it++) { for (auto it = platformStrs.cbegin(); it != platformStrs.cend(); it++) {
const char* str = it->c_str(); std::string str = it->c_str();
PlatformIds::PlatformId platformId = PlatformIds::getPlatformId(str); PlatformIds::PlatformId platformId = PlatformIds::getPlatformId(str);
if (platformId == PlatformIds::PLATFORM_IGNORE) { if (platformId == PlatformIds::PLATFORM_IGNORE) {
@ -301,7 +301,7 @@ bool SystemData::loadConfig()
// If there appears to be an actual platform ID supplied // If there appears to be an actual platform ID supplied
// but it didn't match the list, generate a warning. // but it didn't match the list, generate a warning.
if (str != nullptr && str[0] != '\0' && platformId == PlatformIds::PLATFORM_UNKNOWN) if (str != "" && platformId == PlatformIds::PLATFORM_UNKNOWN)
LOG(LogWarning) << "Unknown platform for system \"" << name << LOG(LogWarning) << "Unknown platform for system \"" << name <<
"\" (platform \"" << str << "\" from list \"" << platformList << "\")"; "\" (platform \"" << str << "\" from list \"" << platformList << "\")";
else if (platformId != PlatformIds::PLATFORM_UNKNOWN) else if (platformId != PlatformIds::PLATFORM_UNKNOWN)

View file

@ -26,11 +26,11 @@
// the rest of the volume control code in here compiles and works fine. // the rest of the volume control code in here compiles and works fine.
#if defined(__linux__) #if defined(__linux__)
#if defined(_RPI_) || defined(_VERO4K_) #if defined(_RPI_) || defined(_VERO4K_)
const char * VolumeControl::mixerName = "PCM"; const std::string VolumeControl::mixerName = "PCM";
#else #else
const char * VolumeControl::mixerName = "Master"; const std::string VolumeControl::mixerName = "Master";
#endif #endif
const char * VolumeControl::mixerCard = "default"; const std::string VolumeControl::mixerCard = "default";
#endif #endif
std::weak_ptr<VolumeControl> VolumeControl::sInstance; std::weak_ptr<VolumeControl> VolumeControl::sInstance;
@ -113,19 +113,19 @@ void VolumeControl::init()
if (mixerHandle == nullptr) { if (mixerHandle == nullptr) {
// Allow user to override the AudioCard and AudioDevice in es_settings.cfg. // Allow user to override the AudioCard and AudioDevice in es_settings.cfg.
#if defined(_RPI_) #if defined(_RPI_)
mixerCard = Settings::getInstance()->getString("AudioCard").c_str(); mixerCard = Settings::getInstance()->getString("AudioCard");
mixerName = Settings::getInstance()->getString("AudioDevice").c_str(); mixerName = Settings::getInstance()->getString("AudioDevice");
#endif #endif
snd_mixer_selem_id_alloca(&mixerSelemId); snd_mixer_selem_id_alloca(&mixerSelemId);
// Sets simple-mixer index and name. // Sets simple-mixer index and name.
snd_mixer_selem_id_set_index(mixerSelemId, mixerIndex); snd_mixer_selem_id_set_index(mixerSelemId, mixerIndex);
snd_mixer_selem_id_set_name(mixerSelemId, mixerName); snd_mixer_selem_id_set_name(mixerSelemId, mixerName.c_str());
// Open mixer. // Open mixer.
if (snd_mixer_open(&mixerHandle, 0) >= 0) { if (snd_mixer_open(&mixerHandle, 0) >= 0) {
LOG(LogDebug) << "VolumeControl::init() - Opened ALSA mixer"; LOG(LogDebug) << "VolumeControl::init() - Opened ALSA mixer";
// Ok, attach to defualt card. // Ok, attach to defualt card.
if (snd_mixer_attach(mixerHandle, mixerCard) >= 0) { if (snd_mixer_attach(mixerHandle, mixerCard.c_str()) >= 0) {
LOG(LogDebug) << "VolumeControl::init() - Attached to default card"; LOG(LogDebug) << "VolumeControl::init() - Attached to default card";
// Ok, register simple element class. // Ok, register simple element class.
if (snd_mixer_selem_register(mixerHandle, nullptr, nullptr) >= 0) { if (snd_mixer_selem_register(mixerHandle, nullptr, nullptr) >= 0) {
@ -253,7 +253,7 @@ void VolumeControl::deinit()
// #error TODO: Not implemented for MacOS yet!!! // #error TODO: Not implemented for MacOS yet!!!
#elif defined(__linux__) #elif defined(__linux__)
if (mixerHandle != nullptr) { if (mixerHandle != nullptr) {
snd_mixer_detach(mixerHandle, mixerCard); snd_mixer_detach(mixerHandle, mixerCard.c_str());
snd_mixer_free(mixerHandle); snd_mixer_free(mixerHandle);
snd_mixer_close(mixerHandle); snd_mixer_close(mixerHandle);
mixerHandle = nullptr; mixerHandle = nullptr;

View file

@ -30,8 +30,8 @@ class VolumeControl
#if defined(__APPLE__) #if defined(__APPLE__)
// #error TODO: Not implemented for MacOS yet!!! // #error TODO: Not implemented for MacOS yet!!!
#elif defined(__linux__) #elif defined(__linux__)
static const char * mixerName; static const std::string mixerName;
static const char * mixerCard; static const std::string mixerCard;
int mixerIndex; int mixerIndex;
snd_mixer_t* mixerHandle; snd_mixer_t* mixerHandle;
snd_mixer_elem_t* mixerElem; snd_mixer_elem_t* mixerElem;

View file

@ -938,7 +938,7 @@ void GuiMenu::onSizeChanged()
mVersion.setPosition(0, mSize.y() - mVersion.getSize().y()); mVersion.setPosition(0, mSize.y() - mVersion.getSize().y());
} }
void GuiMenu::addEntry(const char* name, unsigned int color, void GuiMenu::addEntry(const std::string& name, unsigned int color,
bool add_arrow, const std::function<void()>& func) bool add_arrow, const std::function<void()>& func)
{ {
std::shared_ptr<Font> font = Font::get(FONT_SIZE_MEDIUM); std::shared_ptr<Font> font = Font::get(FONT_SIZE_MEDIUM);

View file

@ -26,7 +26,7 @@ public:
private: private:
void close(bool closeAllWindows); void close(bool closeAllWindows);
void addEntry(const char* name, unsigned int color, void addEntry(const std::string& name, unsigned int color,
bool add_arrow, const std::function<void()>& func); bool add_arrow, const std::function<void()>& func);
void addVersionInfo(); void addVersionInfo();

View file

@ -579,7 +579,7 @@ std::queue<ScraperSearchParams> GuiScraperMenu::getSearches(
return queue; return queue;
} }
void GuiScraperMenu::addEntry(const char* name, unsigned int color, void GuiScraperMenu::addEntry(const std::string& name, unsigned int color,
bool add_arrow, const std::function<void()>& func) bool add_arrow, const std::function<void()>& func)
{ {
std::shared_ptr<Font> font = Font::get(FONT_SIZE_MEDIUM); std::shared_ptr<Font> font = Font::get(FONT_SIZE_MEDIUM);

View file

@ -37,7 +37,7 @@ private:
void pressedStart(); void pressedStart();
void start(); void start();
void addEntry(const char* name, unsigned int color, void addEntry(const std::string&, unsigned int color,
bool add_arrow, const std::function<void()>& func); bool add_arrow, const std::function<void()>& func);
void openAccountSettings(); void openAccountSettings();
void openContentSettings(); void openContentSettings();

View file

@ -15,7 +15,7 @@
#include "guis/GuiMsgBox.h" #include "guis/GuiMsgBox.h"
#include "Settings.h" #include "Settings.h"
GuiScreensaverOptions::GuiScreensaverOptions(Window* window, const char* title) GuiScreensaverOptions::GuiScreensaverOptions(Window* window, const std::string& title)
: GuiSettings(window, title) : GuiSettings(window, title)
{ {
// Screensaver timer. // Screensaver timer.

View file

@ -15,7 +15,7 @@
class GuiScreensaverOptions : public GuiSettings class GuiScreensaverOptions : public GuiSettings
{ {
public: public:
GuiScreensaverOptions(Window* window, const char* title); GuiScreensaverOptions(Window* window, const std::string& title);
private: private:
void openSlideshowScreensaverOptions(); void openSlideshowScreensaverOptions();

View file

@ -143,7 +143,7 @@ pugi::xml_node find_child_by_attribute_list(const pugi::xml_node& node_parent,
{ {
for (auto _val : attribute_values) { for (auto _val : attribute_values) {
for (pugi::xml_node node : node_parent.children(node_name.c_str())) { for (pugi::xml_node node : node_parent.children(node_name.c_str())) {
if (strcmp(node.attribute(attribute_name.c_str()).value(), _val.c_str()) == 0) if (node.attribute(attribute_name.c_str()).value() == _val)
return node; return node;
} }
} }

View file

@ -30,7 +30,7 @@ public:
virtual FileData* getLastEntry() override; virtual FileData* getLastEntry() override;
virtual FileData* getFirstGameEntry() override; virtual FileData* getFirstGameEntry() override;
virtual const char* getName() const override { return "basic"; } virtual std::string getName() const override { return "basic"; }
virtual std::vector<HelpPrompt> getHelpPrompts() override; virtual std::vector<HelpPrompt> getHelpPrompts() override;
virtual void launch(FileData* game) override; virtual void launch(FileData* game) override;

View file

@ -150,9 +150,9 @@ void DetailedGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& them
initMDLabels(); initMDLabels();
std::vector<TextComponent*> labels = getMDLabels(); std::vector<TextComponent*> labels = getMDLabels();
assert(labels.size() == 8); assert(labels.size() == 8);
const char* lblElements[8] = { std::vector<std::string> lblElements = {
"md_lbl_rating", "md_lbl_releasedate", "md_lbl_developer", "md_lbl_publisher", "md_lbl_rating", "md_lbl_releasedate", "md_lbl_developer", "md_lbl_publisher",
"md_lbl_genre", "md_lbl_players", "md_lbl_lastplayed", "md_lbl_playcount" "md_lbl_genre", "md_lbl_players", "md_lbl_lastplayed", "md_lbl_playcount"
}; };
for (unsigned int i = 0; i < labels.size(); i++) for (unsigned int i = 0; i < labels.size(); i++)
@ -161,9 +161,9 @@ void DetailedGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& them
initMDValues(); initMDValues();
std::vector<GuiComponent*> values = getMDValues(); std::vector<GuiComponent*> values = getMDValues();
assert(values.size() == 8); assert(values.size() == 8);
const char* valElements[8] = { std::vector<std::string> valElements = {
"md_rating", "md_releasedate", "md_developer", "md_publisher", "md_rating", "md_releasedate", "md_developer", "md_publisher",
"md_genre", "md_players", "md_lastplayed", "md_playcount" "md_genre", "md_players", "md_lastplayed", "md_playcount"
}; };
for (unsigned int i = 0; i < values.size(); i++) for (unsigned int i = 0; i < values.size(); i++)

View file

@ -21,7 +21,7 @@ public:
virtual void onShow() override; virtual void onShow() override;
virtual void onThemeChanged(const std::shared_ptr<ThemeData>& theme) override; virtual void onThemeChanged(const std::shared_ptr<ThemeData>& theme) override;
virtual const char* getName() const override { return "detailed"; } virtual std::string getName() const override { return "detailed"; }
virtual void launch(FileData* game) override; virtual void launch(FileData* game) override;
protected: protected:

View file

@ -282,7 +282,7 @@ void GridGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& theme)
initMDLabels(); initMDLabels();
std::vector<TextComponent*> labels = getMDLabels(); std::vector<TextComponent*> labels = getMDLabels();
assert(labels.size() == 8); assert(labels.size() == 8);
const char* lblElements[8] = { std::vector<std::string> lblElements = {
"md_lbl_rating", "md_lbl_releasedate", "md_lbl_developer", "md_lbl_publisher", "md_lbl_rating", "md_lbl_releasedate", "md_lbl_developer", "md_lbl_publisher",
"md_lbl_genre", "md_lbl_players", "md_lbl_lastplayed", "md_lbl_playcount" "md_lbl_genre", "md_lbl_players", "md_lbl_lastplayed", "md_lbl_playcount"
}; };
@ -293,7 +293,7 @@ void GridGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& theme)
initMDValues(); initMDValues();
std::vector<GuiComponent*> values = getMDValues(); std::vector<GuiComponent*> values = getMDValues();
assert(values.size() == 8); assert(values.size() == 8);
const char* valElements[8] = { std::vector<std::string> valElements = {
"md_rating", "md_releasedate", "md_developer", "md_publisher", "md_rating", "md_releasedate", "md_developer", "md_publisher",
"md_genre", "md_players", "md_lastplayed", "md_playcount" "md_genre", "md_players", "md_lastplayed", "md_playcount"
}; };

View file

@ -36,7 +36,7 @@ public:
virtual bool input(InputConfig* config, Input input) override; virtual bool input(InputConfig* config, Input input) override;
virtual const char* getName() const override { return "grid"; } virtual std::string getName() const override { return "grid"; }
virtual std::vector<HelpPrompt> getHelpPrompts() override; virtual std::vector<HelpPrompt> getHelpPrompts() override;
virtual void launch(FileData* game) override; virtual void launch(FileData* game) override;

View file

@ -52,7 +52,7 @@ public:
virtual void remove(FileData* game, bool deleteFile) = 0; virtual void remove(FileData* game, bool deleteFile) = 0;
virtual void removeMedia(FileData* game) = 0; virtual void removeMedia(FileData* game) = 0;
virtual const char* getName() const = 0; virtual std::string getName() const = 0;
virtual void launch(FileData* game) = 0; virtual void launch(FileData* game) = 0;
virtual HelpStyle getHelpStyle() override; virtual HelpStyle getHelpStyle() override;

View file

@ -175,9 +175,9 @@ void VideoGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& theme)
initMDLabels(); initMDLabels();
std::vector<TextComponent*> labels = getMDLabels(); std::vector<TextComponent*> labels = getMDLabels();
assert(labels.size() == 8); assert(labels.size() == 8);
const char* lblElements[8] = { std::vector<std::string> lblElements = {
"md_lbl_rating", "md_lbl_releasedate", "md_lbl_developer", "md_lbl_publisher", "md_lbl_rating", "md_lbl_releasedate", "md_lbl_developer", "md_lbl_publisher",
"md_lbl_genre", "md_lbl_players", "md_lbl_lastplayed", "md_lbl_playcount" "md_lbl_genre", "md_lbl_players", "md_lbl_lastplayed", "md_lbl_playcount"
}; };
for (unsigned int i = 0; i < labels.size(); i++) for (unsigned int i = 0; i < labels.size(); i++)
@ -186,9 +186,9 @@ void VideoGameListView::onThemeChanged(const std::shared_ptr<ThemeData>& theme)
initMDValues(); initMDValues();
std::vector<GuiComponent*> values = getMDValues(); std::vector<GuiComponent*> values = getMDValues();
assert(values.size() == 8); assert(values.size() == 8);
const char* valElements[8] = { std::vector<std::string> valElements = {
"md_rating", "md_releasedate", "md_developer", "md_publisher", "md_rating", "md_releasedate", "md_developer", "md_publisher",
"md_genre", "md_players", "md_lastplayed", "md_playcount" "md_genre", "md_players", "md_lastplayed", "md_playcount"
}; };
for (unsigned int i = 0; i < values.size(); i++) for (unsigned int i = 0; i < values.size(); i++)

View file

@ -24,7 +24,7 @@ public:
virtual void onShow() override; virtual void onShow() override;
virtual void onThemeChanged(const std::shared_ptr<ThemeData>& theme) override; virtual void onThemeChanged(const std::shared_ptr<ThemeData>& theme) override;
virtual const char* getName() const override { return "video"; } virtual std::string getName() const override { return "video"; }
virtual void launch(FileData* game) override; virtual void launch(FileData* game) override;
protected: protected:

View file

@ -355,7 +355,7 @@ void GuiComponent::setHiddenValue(const std::string& /*value*/)
{ {
} }
void GuiComponent::textInput(const char* text) void GuiComponent::textInput(const std::string& text)
{ {
for (auto iter = mChildren.cbegin(); iter != mChildren.cend(); iter++) for (auto iter = mChildren.cbegin(); iter != mChildren.cend(); iter++)
(*iter)->textInput(text); (*iter)->textInput(text);

View file

@ -41,7 +41,7 @@ public:
GuiComponent(Window* window); GuiComponent(Window* window);
virtual ~GuiComponent(); virtual ~GuiComponent();
virtual void textInput(const char* text); virtual void textInput(const std::string& text);
// Called when input is received. // Called when input is received.
// Return true if the input is consumed, false if // Return true if the input is consumed, false if

View file

@ -190,7 +190,7 @@ std::string HttpReq::getContent() const
return mContent.str(); return mContent.str();
} }
void HttpReq::onError(const char* msg) void HttpReq::onError(const std::string& msg)
{ {
mErrorMsg = msg; mErrorMsg = msg;
} }

View file

@ -67,7 +67,7 @@ public:
private: private:
static size_t write_content(void* buff, size_t size, size_t nmemb, void* req_ptr); static size_t write_content(void* buff, size_t size, size_t nmemb, void* req_ptr);
void onError(const char* msg); void onError(const std::string& msg);
// God dammit libcurl why can't you have some way to check the status of an // God dammit libcurl why can't you have some way to check the status of an
// individual handle why do I have to handle ALL messages at once. // individual handle why do I have to handle ALL messages at once.

View file

@ -15,8 +15,8 @@
class ImageIO class ImageIO
{ {
public: public:
static std::vector<unsigned char> loadFromMemoryRGBA32(const unsigned char * data, static std::vector<unsigned char> loadFromMemoryRGBA32(const unsigned char* data,
const size_t size, size_t & width, size_t & height); const size_t size, size_t& width, size_t& height);
static void flipPixelsVert(unsigned char* imagePx, const size_t& width, const size_t& height); static void flipPixelsVert(unsigned char* imagePx, const size_t& width, const size_t& height);
}; };

View file

@ -16,6 +16,7 @@
#include "utils/StringUtil.h" #include "utils/StringUtil.h"
#include "Log.h" #include "Log.h"
#include <algorithm>
#include <pugixml.hpp> #include <pugixml.hpp>
#include <string.h> #include <string.h>
@ -171,19 +172,5 @@ const bool MameNames::isDevice(const std::string& _deviceName)
const bool MameNames::find(std::vector<std::string> devices, const std::string& name) const bool MameNames::find(std::vector<std::string> devices, const std::string& name)
{ {
size_t start = 0; return (std::find(devices.begin(), devices.end(), name) != devices.end());
size_t end = devices.size();
while (start < end) {
const size_t index = (start + end) / 2;
const int compare = strcmp(devices[index].c_str(), name.c_str());
if (compare < 0)
start = index + 1;
else if (compare > 0)
end = index;
else
return true;
}
return false;
} }

View file

@ -198,13 +198,13 @@ std::map<std::string, std::map<std::string,
#define CURRENT_THEME_FORMAT_VERSION 6 #define CURRENT_THEME_FORMAT_VERSION 6
// Helper. // Helper.
unsigned int getHexColor(const char* str) unsigned int getHexColor(const std::string& str)
{ {
ThemeException error; ThemeException error;
if (!str) if (str == "")
throw error << "Empty color"; throw error << "Empty color";
size_t len = strlen(str); size_t len = str.size();
if (len != 6 && len != 8) if (len != 6 && len != 8)
throw error << "Invalid color (bad length, \"" << str << "\" - must be 6 or 8)"; throw error << "Invalid color (bad length, \"" << str << "\" - must be 6 or 8)";
@ -221,22 +221,20 @@ unsigned int getHexColor(const char* str)
std::map<std::string, std::string> mVariables; std::map<std::string, std::string> mVariables;
std::string resolvePlaceholders(const char* in) std::string resolvePlaceholders(const std::string& in)
{ {
std::string inStr(in); if (in.empty())
return in;
if (inStr.empty()) const size_t variableBegin = in.find("${");
return inStr; const size_t variableEnd = in.find("}", variableBegin);
const size_t variableBegin = inStr.find("${");
const size_t variableEnd = inStr.find("}", variableBegin);
if ((variableBegin == std::string::npos) || (variableEnd == std::string::npos)) if ((variableBegin == std::string::npos) || (variableEnd == std::string::npos))
return inStr; return in;
std::string prefix = inStr.substr(0, variableBegin); std::string prefix = in.substr(0, variableBegin);
std::string replace = inStr.substr(variableBegin + 2, variableEnd - (variableBegin + 2)); std::string replace = in.substr(variableBegin + 2, variableEnd - (variableBegin + 2));
std::string suffix = resolvePlaceholders(inStr.substr(variableEnd + 1).c_str()); std::string suffix = resolvePlaceholders(in.substr(variableEnd + 1).c_str());
return prefix + mVariables[replace] + suffix; return prefix + mVariables[replace] + suffix;
} }
@ -377,7 +375,7 @@ void ThemeData::parseViews(const pugi::xml_node& root)
if (!node.attribute("name")) if (!node.attribute("name"))
throw error << "View missing \"name\" attribute!"; throw error << "View missing \"name\" attribute!";
const char* delim = " \t\r\n,"; const std::string delim = " \t\r\n,";
const std::string nameAttr = node.attribute("name").as_string(); const std::string nameAttr = node.attribute("name").as_string();
size_t prevOff = nameAttr.find_first_not_of(delim, 0); size_t prevOff = nameAttr.find_first_not_of(delim, 0);
size_t off = nameAttr.find_first_of(delim, prevOff); size_t off = nameAttr.find_first_of(delim, prevOff);
@ -410,7 +408,7 @@ void ThemeData::parseView(const pugi::xml_node& root, ThemeView& view)
if (elemTypeIt == sElementMap.cend()) if (elemTypeIt == sElementMap.cend())
throw error << "Unknown element of type \"" << node.name() << "\"!"; throw error << "Unknown element of type \"" << node.name() << "\"!";
const char* delim = " \t\r\n,"; const std::string delim = " \t\r\n,";
const std::string nameAttr = node.attribute("name").as_string(); const std::string nameAttr = node.attribute("name").as_string();
size_t prevOff = nameAttr.find_first_not_of(delim, 0); size_t prevOff = nameAttr.find_first_not_of(delim, 0);
size_t off = nameAttr.find_first_of(delim, prevOff); size_t off = nameAttr.find_first_of(delim, prevOff);
@ -502,7 +500,7 @@ void ThemeData::parseElement(const pugi::xml_node& root,
break; break;
} }
case COLOR: { case COLOR: {
element.properties[node.name()] = getHexColor(str.c_str()); element.properties[node.name()] = getHexColor(str);
break; break;
} }
case FLOAT: { case FLOAT: {

View file

@ -131,7 +131,7 @@ void Window::deinit()
Renderer::deinit(); Renderer::deinit();
} }
void Window::textInput(const char* text) void Window::textInput(const std::string& text)
{ {
if (peekGui()) if (peekGui())
peekGui()->textInput(text); peekGui()->textInput(text);
@ -530,19 +530,18 @@ void Window::setHelpPrompts(const std::vector<HelpPrompt>& prompts, const HelpSt
std::sort(addPrompts.begin(), addPrompts.end(), std::sort(addPrompts.begin(), addPrompts.end(),
[](const HelpPrompt& a, const HelpPrompt& b) -> bool { [](const HelpPrompt& a, const HelpPrompt& b) -> bool {
static const char* map[] = { static const std::vector<std::string> map = {
"up/down/left/right", "up/down/left/right",
"up/down", "up/down",
"left/right", "left/right",
"a", "b", "x", "y", "l", "r", "a", "b", "x", "y", "l", "r",
"start", "select", "start", "select"
nullptr
}; };
int i = 0; int i = 0;
int aVal = 0; int aVal = 0;
int bVal = 0; int bVal = 0;
while (map[i] != nullptr) { while (i < map.size()) {
if (a.first == map[i]) if (a.first == map[i])
aVal = i; aVal = i;
if (b.first == map[i]) if (b.first == map[i])

View file

@ -65,9 +65,9 @@ public:
GuiComponent* peekGui(); GuiComponent* peekGui();
inline int getGuiStackSize() { return static_cast<int>(mGuiStack.size()); } inline int getGuiStackSize() { return static_cast<int>(mGuiStack.size()); }
void textInput(const char* text); void textInput(const std::string& text);
void input(InputConfig* config, Input input); void input(InputConfig* config, Input input);
void logInput(InputConfig * config, Input input); void logInput(InputConfig* config, Input input);
void update(int deltaTime); void update(int deltaTime);
void render(); void render();

View file

@ -24,7 +24,7 @@ void AnimatedImageComponent::load(const AnimationDef* def)
assert(def->frameCount >= 1); assert(def->frameCount >= 1);
for (size_t i = 0; i < def->frameCount; i++) { for (size_t i = 0; i < def->frameCount; i++) {
if (def->frames[i].path != nullptr && if (def->frames[i].path != "" &&
!ResourceManager::getInstance()->fileExists(def->frames[i].path)) { !ResourceManager::getInstance()->fileExists(def->frames[i].path)) {
LOG(LogError) << "Missing animation frame " << i << LOG(LogError) << "Missing animation frame " << i <<
" (\"" << def->frames[i].path << "\")"; " (\"" << def->frames[i].path << "\")";

View file

@ -14,7 +14,7 @@
class ImageComponent; class ImageComponent;
struct AnimationFrame { struct AnimationFrame {
const char* path; std::string path;
int time; int time;
}; };

View file

@ -358,7 +358,7 @@ void ComponentGrid::render(const Transform4x4f& parentTrans)
} }
} }
void ComponentGrid::textInput(const char* text) void ComponentGrid::textInput(const std::string& text)
{ {
const GridEntry* selectedEntry = getCellAt(mCursor); const GridEntry* selectedEntry = getCellAt(mCursor);
if (selectedEntry != nullptr && selectedEntry->canFocus) if (selectedEntry != nullptr && selectedEntry->canFocus)

View file

@ -48,7 +48,7 @@ public:
unsigned int border = GridFlags::BORDER_NONE, unsigned int border = GridFlags::BORDER_NONE,
GridFlags::UpdateType updateType = GridFlags::UPDATE_ALWAYS); GridFlags::UpdateType updateType = GridFlags::UPDATE_ALWAYS);
void textInput(const char* text) override; void textInput(const std::string& text) override;
bool input(InputConfig* config, Input input) override; bool input(InputConfig* config, Input input) override;
void update(int deltaTime) override; void update(int deltaTime) override;
void render(const Transform4x4f& parentTrans) override; void render(const Transform4x4f& parentTrans) override;

View file

@ -357,7 +357,7 @@ void ComponentList::updateElementSize(const ComponentListRow& row)
(*it)->setSize(width, (*it)->getSize().y()); (*it)->setSize(width, (*it)->getSize().y());
} }
void ComponentList::textInput(const char* text) void ComponentList::textInput(const std::string& text)
{ {
if (!size()) if (!size())
return; return;

View file

@ -62,7 +62,7 @@ public:
void addRow(const ComponentListRow& row, bool setCursorHere = false); void addRow(const ComponentListRow& row, bool setCursorHere = false);
void textInput(const char* text) override; void textInput(const std::string& text) override;
bool input(InputConfig* config, Input input) override; bool input(InputConfig* config, Input input) override;
void update(int deltaTime) override; void update(int deltaTime) override;
void render(const Transform4x4f& parentTrans) override; void render(const Transform4x4f& parentTrans) override;

View file

@ -22,7 +22,7 @@
#define ICON_TEXT_SPACING 8 // Space between [icon] and [text] (px). #define ICON_TEXT_SPACING 8 // Space between [icon] and [text] (px).
#define ENTRY_SPACING 16 // Space between [text] and next [icon] (px). #define ENTRY_SPACING 16 // Space between [text] and next [icon] (px).
static const std::map<std::string, const char*> ICON_PATH_MAP { static const std::map<std::string, std::string> ICON_PATH_MAP {
{ "up/down", ":/help/dpad_updown.svg" }, { "up/down", ":/help/dpad_updown.svg" },
{ "left/right", ":/help/dpad_leftright.svg" }, { "left/right", ":/help/dpad_leftright.svg" },
{ "up/down/left/right", ":/help/dpad_all.svg" }, { "up/down/left/right", ":/help/dpad_all.svg" },

View file

@ -62,7 +62,7 @@ std::string TextEditComponent::getValue() const
return mText; return mText;
} }
void TextEditComponent::textInput(const char* text) void TextEditComponent::textInput(const std::string& text)
{ {
if (mEditing) { if (mEditing) {
mCursorRepeatDir = 0; mCursorRepeatDir = 0;
@ -75,7 +75,7 @@ void TextEditComponent::textInput(const char* text)
} }
else { else {
mText.insert(mCursor, text); mText.insert(mCursor, text);
mCursor += static_cast<unsigned int>(strlen(text)); mCursor += static_cast<unsigned int>(text.size());
} }
} }

View file

@ -21,7 +21,7 @@ class TextEditComponent : public GuiComponent
public: public:
TextEditComponent(Window* window); TextEditComponent(Window* window);
void textInput(const char* text) override; void textInput(const std::string& text) override;
bool input(InputConfig* config, Input input) override; bool input(InputConfig* config, Input input) override;
void update(int deltaTime) override; void update(int deltaTime) override;
void render(const Transform4x4f& parentTrans) override; void render(const Transform4x4f& parentTrans) override;

View file

@ -25,12 +25,12 @@ GuiComplexTextEditPopup::GuiComplexTextEditPopup(
const std::string& initValue, const std::string& initValue,
const std::function<void(const std::string&)>& okCallback, const std::function<void(const std::string&)>& okCallback,
bool multiLine, bool multiLine,
const char* acceptBtnText, const std::string& acceptBtnText,
const char* saveConfirmationText, const std::string& saveConfirmationText,
const char* loadBtnText, const std::string& loadBtnText,
const char* loadBtnHelpText, const std::string& loadBtnHelpText,
const char* clearBtnText, const std::string& clearBtnText,
const char* clearBtnHelpText, const std::string& clearBtnHelpText,
bool hideCancelButton) bool hideCancelButton)
: GuiComponent(window), : GuiComponent(window),
mHelpStyle(helpstyle), mHelpStyle(helpstyle),

View file

@ -30,12 +30,12 @@ public:
const std::string& initValue, const std::string& initValue,
const std::function<void(const std::string&)>& okCallback, const std::function<void(const std::string&)>& okCallback,
bool multiLine, bool multiLine,
const char* acceptBtnText = "OK", const std::string& acceptBtnText = "OK",
const char* saveConfirmationText = "SAVE CHANGES?", const std::string& saveConfirmationText = "SAVE CHANGES?",
const char* loadBtnText = "LOAD", const std::string& loadBtnText = "LOAD",
const char* loadBtnHelpText = "load default", const std::string& loadBtnHelpText = "load default",
const char* clearBtnText = "CLEAR", const std::string& clearBtnText = "CLEAR",
const char* clearBtnHelpText = "clear", const std::string& clearBtnHelpText = "clear",
bool hideCancelButton = false); bool hideCancelButton = false);
bool input(InputConfig* config, Input input) override; bool input(InputConfig* config, Input input) override;

View file

@ -66,7 +66,7 @@ GuiDetectDevice::GuiDetectDevice(
mGrid.setEntry(mMsg1, Vector2i(0, 2), false, true); mGrid.setEntry(mMsg1, Vector2i(0, 2), false, true);
const char* msg2str = firstRun ? const std::string msg2str = firstRun ?
"PRESS ESC TO SKIP (OR F4 TO QUIT AT ANY TIME)." : "PRESS ESC TO CANCEL."; "PRESS ESC TO SKIP (OR F4 TO QUIT AT ANY TIME)." : "PRESS ESC TO CANCEL.";
mMsg2 = std::make_shared<TextComponent>(mWindow, msg2str, mMsg2 = std::make_shared<TextComponent>(mWindow, msg2str,
Font::get(FONT_SIZE_SMALL), 0x777777FF, ALIGN_CENTER); Font::get(FONT_SIZE_SMALL), 0x777777FF, ALIGN_CENTER);

View file

@ -16,10 +16,10 @@
#include "Window.h" #include "Window.h"
struct InputConfigStructure { struct InputConfigStructure {
const char* name; std::string name;
const bool skippable; const bool skippable;
const char* dispName; std::string dispName;
const char* icon; std::string icon;
}; };
static const int inputCount = 22; static const int inputCount = 22;
@ -355,7 +355,7 @@ bool GuiInputConfig::assign(Input input, int inputId)
// generate an error. (If it's the same as what it was before, allow it.) // generate an error. (If it's the same as what it was before, allow it.)
if (mTargetConfig->getMappedTo(input).size() > 0 && if (mTargetConfig->getMappedTo(input).size() > 0 &&
!mTargetConfig->isMappedTo(GUI_INPUT_CONFIG_LIST[inputId].name, input) && !mTargetConfig->isMappedTo(GUI_INPUT_CONFIG_LIST[inputId].name, input) &&
strcmp(GUI_INPUT_CONFIG_LIST[inputId].name, "HotKeyEnable") != 0) { GUI_INPUT_CONFIG_LIST[inputId].name != "HotKeyEnable") {
error(mMappings.at(inputId), "Already mapped!"); error(mMappings.at(inputId), "Already mapped!");
return false; return false;
} }

View file

@ -21,8 +21,8 @@ GuiTextEditPopup::GuiTextEditPopup(
const std::string& initValue, const std::string& initValue,
const std::function<void(const std::string&)>& okCallback, const std::function<void(const std::string&)>& okCallback,
bool multiLine, bool multiLine,
const char* acceptBtnText, const std::string& acceptBtnText,
const char* saveConfirmationText) const std::string& saveConfirmationText)
: GuiComponent(window), : GuiComponent(window),
mHelpStyle(helpstyle), mHelpStyle(helpstyle),
mBackground(window, ":/graphics/frame.png"), mBackground(window, ":/graphics/frame.png"),

View file

@ -26,8 +26,8 @@ public:
const std::string& initValue, const std::string& initValue,
const std::function<void(const std::string&)>& okCallback, const std::function<void(const std::string&)>& okCallback,
bool multiLine, bool multiLine,
const char* acceptBtnText = "OK", const std::string& acceptBtnText = "OK",
const char* saveConfirmationText = "SAVE CHANGES?"); const std::string& saveConfirmationText = "SAVE CHANGES?");
bool input(InputConfig* config, Input input) override; bool input(InputConfig* config, Input input) override;
void onSizeChanged() override; void onSizeChanged() override;

View file

@ -55,7 +55,7 @@ namespace Renderer
#if !defined(NDEBUG) #if !defined(NDEBUG)
#define GL_CHECK_ERROR(Function) (Function, _GLCheckError(#Function)) #define GL_CHECK_ERROR(Function) (Function, _GLCheckError(#Function))
static void _GLCheckError(const char* _funcName) static void _GLCheckError(const std::string& _funcName)
{ {
const GLenum errorCode = glGetError(); const GLenum errorCode = glGetError();

View file

@ -569,7 +569,7 @@ TextCache* Font::buildTextCache(
if (character == '\n') { if (character == '\n') {
y += getHeight(lineSpacing); y += getHeight(lineSpacing);
x = offset[0] + (xLen != 0 ? getNewlineStartOffset(text, x = offset[0] + (xLen != 0 ? getNewlineStartOffset(text,
(const unsigned int)cursor /* cursor is already advanced */, static_cast<const unsigned int>(cursor) /* cursor is already advanced */,
xLen, alignment) : 0); xLen, alignment) : 0);
continue; continue;
} }

View file

@ -15,6 +15,7 @@
#include "renderers/Renderer.h" #include "renderers/Renderer.h"
#include "resources/ResourceManager.h" #include "resources/ResourceManager.h"
#include "ThemeData.h" #include "ThemeData.h"
#include <ft2build.h> #include <ft2build.h>
#include FT_FREETYPE_H #include FT_FREETYPE_H
#include <vector> #include <vector>
@ -82,7 +83,7 @@ public:
int getSize() const; int getSize() const;
inline const std::string& getPath() const { return mPath; } inline const std::string& getPath() const { return mPath; }
inline static const char* getDefaultPath() { return FONT_PATH_REGULAR; } inline static std::string getDefaultPath() { return FONT_PATH_REGULAR; }
static std::shared_ptr<Font> getFromTheme(const ThemeData::ThemeElement* elem, static std::shared_ptr<Font> getFromTheme(const ThemeData::ThemeElement* elem,
unsigned int properties, const std::shared_ptr<Font>& orig); unsigned int properties, const std::shared_ptr<Font>& orig);

View file

@ -81,7 +81,7 @@ void TextureResource::initFromMemory(const char* data, size_t length)
assert(mTextureData != nullptr); assert(mTextureData != nullptr);
mTextureData->releaseVRAM(); mTextureData->releaseVRAM();
mTextureData->releaseRAM(); mTextureData->releaseRAM();
mTextureData->initImageFromMemory((const unsigned char*)data, length); mTextureData->initImageFromMemory(reinterpret_cast<const unsigned char*>(data), length);
// Get the size from the texture data. // Get the size from the texture data.
mSize = Vector2i(static_cast<int>(mTextureData->width()), mSize = Vector2i(static_cast<int>(mTextureData->width()),
static_cast<int>(mTextureData->height())); static_cast<int>(mTextureData->height()));

View file

@ -208,7 +208,7 @@ namespace Utils
std::string removeParenthesis(const std::string& _string) std::string removeParenthesis(const std::string& _string)
{ {
static const char remove[4] = { '(', ')', '[', ']' }; static std::vector<char> remove = { '(', ')', '[', ']' };
std::string string = _string; std::string string = _string;
size_t start; size_t start;
size_t end; size_t end;
@ -217,9 +217,9 @@ namespace Utils
while (!done) { while (!done) {
done = true; done = true;
for (size_t i = 0; i < sizeof(remove); i += 2) { for (size_t i = 0; i < remove.size(); i += 2) {
end = string.find_first_of(remove[i + 1]); end = string.find_first_of(remove[i + 1]);
start = string.find_last_of( remove[i + 0], end); start = string.find_last_of(remove[i + 0], end);
if ((start != std::string::npos) && (end != std::string::npos)) { if ((start != std::string::npos) && (end != std::string::npos)) {
string.erase(start, end - start + 1); string.erase(start, end - start + 1);