/* SampleHive * Copyright (C) 2021 Apoorv Singh * A simple, modern audio sample browser/manager for GNU/Linux. * * This file is a part of SampleHive * * SampleHive is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * SampleHive is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "Utility/Serialize.hpp" #include "Utility/Log.hpp" #include "Utility/Paths.hpp" #include #include #include #include #include #include Serializer::Serializer() { std::ifstream ifstrm(static_cast(CONFIG_FILEPATH)); wxFont font = wxSystemSettings::GetFont(wxSYS_SYSTEM_FONT); std::string system_font_face = font.GetFaceName().ToStdString(); int system_font_size = font.GetPointSize(); wxColour colour = "#FE9647"; std::string dir = wxGetHomeDir().ToStdString(); // Initialize the logger // SampleHive::Log::InitLogger("Serializer"); if (!ifstrm) { SH_LOG_INFO("Genrating configuration file.."); m_Emitter << YAML::Comment("This is the configuration file for SampleHive," "feel free to edit the file as needed"); m_Emitter << YAML::Newline; m_Emitter << YAML::BeginMap; m_Emitter << YAML::Newline << YAML::Key << "Window"; m_Emitter << YAML::BeginMap; m_Emitter << YAML::Key << "Width" << YAML::Value << 1280; m_Emitter << YAML::Key << "Height" << YAML::Value << 720; m_Emitter << YAML::Key << "TopSplitterSashPos" << YAML::Value << 200; m_Emitter << YAML::Key << "BottomSplitterSashPos" << YAML::Value << 300; m_Emitter << YAML::Key << "ShowMenuBar" << YAML::Value << true; m_Emitter << YAML::Key << "ShowStatusBar" << YAML::Value << true; m_Emitter << YAML::EndMap << YAML::Newline; m_Emitter << YAML::Newline << YAML::Key << "Media"; m_Emitter << YAML::BeginMap; m_Emitter << YAML::Key << "Autoplay" << YAML::Value << false; m_Emitter << YAML::Key << "Loop" << YAML::Value << false; m_Emitter << YAML::Key << "Muted" << YAML::Value << false; m_Emitter << YAML::Key << "Volume" << YAML::Value << 100; m_Emitter << YAML::EndMap << YAML::Newline; m_Emitter << YAML::Newline << YAML::Key << "Display"; m_Emitter << YAML::BeginMap; m_Emitter << YAML::Key << "Font"; m_Emitter << YAML::BeginMap; m_Emitter << YAML::Key << "Family" << YAML::Value << system_font_face; m_Emitter << YAML::Key << "Size" << YAML::Value << system_font_size; m_Emitter << YAML::EndMap; m_Emitter << YAML::Key << "Waveform"; m_Emitter << YAML::BeginMap; m_Emitter << YAML::Key << "Colour" << YAML::Value << colour.GetAsString().ToStdString(); m_Emitter << YAML::EndMap; m_Emitter << YAML::EndMap << YAML::Newline; m_Emitter << YAML::Newline << YAML::Key << "Collection"; m_Emitter << YAML::BeginMap; m_Emitter << YAML::Key << "AutoImport" << YAML::Value << false; m_Emitter << YAML::Key << "Directory" << YAML::Value << dir; m_Emitter << YAML::Key << "FollowSymLink" << YAML::Value << false; m_Emitter << YAML::Key << "RecursiveImport" << YAML::Value << false; m_Emitter << YAML::Key << "ShowFileExtension" << YAML::Value << true; m_Emitter << YAML::EndMap << YAML::Newline; m_Emitter << YAML::EndMap; std::ofstream ofstrm(CONFIG_FILEPATH); ofstrm << m_Emitter.c_str(); SH_LOG_INFO("Generated {} successfully!", CONFIG_FILEPATH); } } Serializer::~Serializer() { } void Serializer::SerializeWinSize(int w, int h) { YAML::Emitter out; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto win = config["Window"]) { win["Width"] = w; win["Height"] = h; out << config; std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << out.c_str(); } else { SH_LOG_ERROR("Error! Cannot store window size values."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } } WindowSize Serializer::DeserializeWinSize() const { int width = 800, height = 600; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (!config["Window"]) { return { width, height }; } if (auto win = config["Window"]) { height = win["Height"].as(); width = win["Width"].as(); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } SH_LOG_INFO("Window size: {}, {}", width, height); return { width, height }; } void Serializer::SerializeShowMenuAndStatusBar(std::string key, bool value) { YAML::Emitter out; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto bar = config["Window"]) { if (key == "menubar") bar["ShowMenuBar"] = value; if (key == "statusbar") bar["ShowStatusBar"] = value; out << config; std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << out.c_str(); } else SH_LOG_ERROR("Error! Cannot store show bar values."); } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } } bool Serializer::DeserializeShowMenuAndStatusBar(std::string key) const { bool show = false; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto bar = config["Window"]) { if (key == "menubar") show = bar["ShowMenuBar"].as(); if (key == "statusbar") show = bar["ShowStatusBar"].as(); } else { SH_LOG_ERROR("Error! Cannot fetch show bar values."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } return show; } void Serializer::SerializeSplitterSashPos(std::string key, int pos) { YAML::Emitter out; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto sash = config["Window"]) { if (key == "top") sash["TopSplitterSashPos"] = pos; if (key == "bottom") sash["BottomSplitterSashPos"] = pos; out << config; std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << out.c_str(); } else SH_LOG_ERROR("Error! Cannot store sash pos values."); } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } } int Serializer::DeserializeSplitterSashPos(std::string key) const { int pos = 0; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto bar = config["Window"]) { if (key == "top") pos = bar["TopSplitterSashPos"].as(); if (key == "bottom") pos = bar["BottomSplitterSashPos"].as(); } else { SH_LOG_ERROR("Error! Cannot fetch sash pos values."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } return pos; } void Serializer::SerializeMediaOptions(std::string key, bool value) { YAML::Emitter out; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto media = config["Media"]) { if (key == "autoplay") media["Autoplay"] = value; if (key == "loop") media["Loop"] = value; if (key == "muted") media["Muted"] = value; out << config; std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << out.c_str(); } else SH_LOG_ERROR("Error! Cannot store media values."); } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } } bool Serializer::DeserializeMediaOptions(std::string key) const { bool control = false; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto media = config["Media"]) { if (key == "autoplay") control = media["Autoplay"].as(); if (key == "loop") control = media["Loop"].as(); if (key == "muted") control = media["Muted"].as(); } else SH_LOG_ERROR("Error! Cannot fetch media values."); } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } SH_LOG_INFO("{}: {}", key, control ? "enabled" : "disabled"); return control; } void Serializer::SerializeMediaVolume(int volume) { YAML::Emitter out; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto media = config["Media"]) { media["Volume"] = volume; out << config; std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << out.c_str(); } else SH_LOG_ERROR("Error! Cannot store volume values."); } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } } int Serializer::DeserializeMediaVolume() const { int volume = 0; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto media = config["Media"]) volume = media["Volume"].as(); else SH_LOG_ERROR("Error! Cannot fetch volume values."); } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } SH_LOG_INFO("Volume: {}", volume); return volume; } void Serializer::SerializeFontSettings(wxFont& font) { YAML::Emitter out; std::string font_face = font.GetFaceName().ToStdString(); int font_size = font.GetPointSize(); try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); auto display = config["Display"]; if (auto fontSetting = display["Font"]) { fontSetting["Family"] = font_face; fontSetting["Size"] = font_size; out << config; std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << out.c_str(); } else { SH_LOG_ERROR("Error! Cannot store font values."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } } wxFont Serializer::DeserializeFontSettings() const { wxFont font; wxString face; int size = 0 ; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); auto display = config["Display"]; if (auto font_setting = display["Font"]) { face = font_setting["Family"].as(); size = font_setting["Size"].as(); font.SetFaceName(face); font.SetPointSize(size); } else { SH_LOG_ERROR("Error! Cannot fetch font values."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } return font; } void Serializer::SerializeWaveformColour(wxColour& colour) { YAML::Emitter out; std::string colour_string = colour.GetAsString(wxC2S_HTML_SYNTAX).ToStdString(); try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); auto display = config["Display"]; if (auto waveform = display["Waveform"]) { waveform["Colour"] = colour_string; out << config; std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << out.c_str(); } else { SH_LOG_ERROR("Error! Cannot store waveform colour."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } } wxColour Serializer::DeserializeWaveformColour() const { std::string colour; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); auto display = config["Display"]; if (auto waveform = display["Waveform"]) { colour = waveform["Colour"].as(); } else { SH_LOG_ERROR("Error! Cannot fetch waveform colour."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } return static_cast(colour); } void Serializer::SerializeAutoImport(bool autoImport, const std::string& importDir) { YAML::Emitter out; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto autoImportInfo = config["Collection"]) { autoImportInfo["AutoImport"] = autoImport; autoImportInfo["Directory"] = importDir; out << config; std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << out.c_str(); } else { SH_LOG_ERROR("Error! Cannot store import dir values."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } } ImportDirInfo Serializer::DeserializeAutoImport() const { wxString dir; bool auto_import = false; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto autoImportInfo = config["Collection"]) { auto_import = autoImportInfo["AutoImport"].as(); dir = autoImportInfo["Directory"].as(); } else { SH_LOG_ERROR("Error! Cannot fetch import dir values."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } return { auto_import, dir }; } void Serializer::SerializeFollowSymLink(bool followSymLinks) { YAML::Emitter out; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto followSymLinks = config["Collection"]) { followSymLinks["FollowSymLink"] = followSymLinks; out << config; std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << out.c_str(); } else { SH_LOG_ERROR("Error! Cannot store follow symbolic links value."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } } bool Serializer::DeserializeFollowSymLink() const { bool follow_sym_links = false; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto followSymLinks = config["Collection"]) { follow_sym_links = followSymLinks["FollowSymLink"].as(); } else { SH_LOG_ERROR("Error! Cannot fetch follow symbolic links value."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } return follow_sym_links; } void Serializer::SerializeRecursiveImport(bool recursiveImport) { YAML::Emitter out; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto recursive = config["Collection"]) { recursive["RecursiveImport"] = recursiveImport; out << config; std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << out.c_str(); } else { SH_LOG_ERROR("Error! Cannot store recursive import value."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } } bool Serializer::DeserializeRecursiveImport() const { bool recursive_import = false; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto recursive = config["Collection"]) { recursive_import = recursive["RecursiveImport"].as(); } else { SH_LOG_ERROR("Error! Cannot fetch recursive import value."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } return recursive_import; } void Serializer::SerializeShowFileExtension(bool showExtension) { YAML::Emitter out; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto fileExtensionInfo = config["Collection"]) { fileExtensionInfo["ShowFileExtension"] = showExtension; out << config; std::ofstream ofstrm(static_cast(CONFIG_FILEPATH)); ofstrm << out.c_str(); } else { SH_LOG_ERROR("Error! Cannot store show file extension value."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } } bool Serializer::DeserializeShowFileExtension() const { bool show_extension = false; try { YAML::Node config = YAML::LoadFile(static_cast(CONFIG_FILEPATH)); if (auto fileExtensionInfo = config["Collection"]) { show_extension = fileExtensionInfo["ShowFileExtension"].as(); } else { SH_LOG_ERROR("Error! Cannot fetch show file extension value."); } } catch(const YAML::ParserException& ex) { SH_LOG_ERROR(ex.what()); } return show_extension; }