diff --git a/.gitmodules b/.gitmodules index c9b93ef..e54a7a8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -28,3 +28,9 @@ [submodule "deps/traypp"] path = deps/traypp url = https://github.com/Soundux/traypp.git +[submodule "deps/fifo_map"] + path = deps/fifo_map + url = git@github.com:nlohmann/fifo_map.git +[submodule "deps/Shortcuts_VDF"] + path = deps/Shortcuts_VDF + url = git@github.com:Alia5/Shortcuts_VDF.git diff --git a/GlosSIConfig/GlosSIConfig.vcxproj b/GlosSIConfig/GlosSIConfig.vcxproj index f98cfdc..2033835 100644 --- a/GlosSIConfig/GlosSIConfig.vcxproj +++ b/GlosSIConfig/GlosSIConfig.vcxproj @@ -63,12 +63,12 @@ - stdcpp17 + stdcpp20 %(AdditionalUsingDirectories) /Zc:__cplusplus /Zc:twoPhase- %(AdditionalOptions) false NOMINMAX;%(PreprocessorDefinitions) - ..\deps\WinReg;%(AdditionalIncludeDirectories) + ..\deps\WinReg;..\deps\fifo_map\src;..\deps\Shortcuts_VDF\include;%(AdditionalIncludeDirectories) true @@ -85,12 +85,12 @@ - stdcpp17 + stdcpp20 %(AdditionalUsingDirectories) /Zc:__cplusplus /Zc:zwoPhase- /permissive- %(AdditionalOptions) false NOMINMAX;%(PreprocessorDefinitions) - ..\deps\WinReg;%(AdditionalIncludeDirectories) + ..\deps\WinReg;..\deps\fifo_map\src;..\deps\Shortcuts_VDF\include;%(AdditionalIncludeDirectories) true @@ -154,7 +154,6 @@ - diff --git a/GlosSIConfig/GlosSIConfig.vcxproj.DotSettings b/GlosSIConfig/GlosSIConfig.vcxproj.DotSettings index 21022da..9da00c9 100644 --- a/GlosSIConfig/GlosSIConfig.vcxproj.DotSettings +++ b/GlosSIConfig/GlosSIConfig.vcxproj.DotSettings @@ -1,2 +1,2 @@  - Cpp17 \ No newline at end of file + Cpp20 \ No newline at end of file diff --git a/GlosSIConfig/GlosSIConfig.vcxproj.filters b/GlosSIConfig/GlosSIConfig.vcxproj.filters index 58136fc..e1d59d1 100644 --- a/GlosSIConfig/GlosSIConfig.vcxproj.filters +++ b/GlosSIConfig/GlosSIConfig.vcxproj.filters @@ -75,9 +75,6 @@ Header Files - - Header Files - Header Files @@ -100,7 +97,7 @@ - Resource Files + Resource Files \ No newline at end of file diff --git a/GlosSIConfig/Resource.rc b/GlosSIConfig/Resource.rc index 3049894..ee15a05 100644 --- a/GlosSIConfig/Resource.rc +++ b/GlosSIConfig/Resource.rc @@ -51,8 +51,8 @@ END // VS_VERSION_INFO VERSIONINFO - FILEVERSION 0,0,7,1021003100876 - PRODUCTVERSION 0,0,7,1021003100876 + FILEVERSION 0,0,8,003002880001 + PRODUCTVERSION 0,0,8,003002880001 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -69,12 +69,12 @@ BEGIN BEGIN VALUE "CompanyName", "Peter Repukat - FlatspotSoftware" VALUE "FileDescription", "GlosSI - Config" - VALUE "FileVersion", "0.0.7.1-21-g31ee876" + VALUE "FileVersion", "0.0.8.0-3-g288bba1" VALUE "InternalName", "GlosSIConfig" VALUE "LegalCopyright", "Copyright (C) 2021 Peter Repukat - FlatspotSoftware" VALUE "OriginalFilename", "GlosSIConfig.exe" VALUE "ProductName", "GlosSI" - VALUE "ProductVersion", "0.0.7.1-21-g31ee876" + VALUE "ProductVersion", "0.0.8.0-3-g288bba1" END END BLOCK "VarFileInfo" @@ -308,6 +308,454 @@ IDI_ICON1 ICON "..\GloSC_Icon.ico" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GlosSIConfig/UIModel.cpp b/GlosSIConfig/UIModel.cpp index a79162b..a1c2451 100644 --- a/GlosSIConfig/UIModel.cpp +++ b/GlosSIConfig/UIModel.cpp @@ -141,9 +141,9 @@ void UIModel::deleteTarget(int index) bool UIModel::isInSteam(QVariant shortcut) { const auto map = shortcut.toMap(); - for (auto& steam_shortcut : shortcuts_vdf_.shortcuts) { - if (map["name"].toString() == QString::fromStdString(steam_shortcut.appName.value)) { - if (QString::fromStdString(steam_shortcut.exe.value).toLower().contains("glossitarget.exe")) { + for (auto& steam_shortcut : shortcuts_vdf_) { + if (map["name"].toString() == QString::fromStdString(steam_shortcut.appname)) { + if (QString::fromStdString(steam_shortcut.exe).toLower().contains("glossitarget.exe")) { return true; } } @@ -161,15 +161,13 @@ bool UIModel::addToSteam(QVariant shortcut, const QString& shortcutspath, bool f const auto launch = map["launch"].toBool(); VDFParser::Shortcut vdfshortcut; - vdfshortcut.idx = shortcuts_vdf_.shortcuts.size(); - vdfshortcut.appName.value = name.toStdString(); - vdfshortcut.exe.value = ("\"" + appDir.absolutePath() + "/GlosSITarget.exe" + "\"").toStdString(); - vdfshortcut.StartDir.value = (launch && !maybeLaunchPath.isEmpty() + vdfshortcut.appname = name.toStdString(); + vdfshortcut.exe = ("\"" + appDir.absolutePath() + "/GlosSITarget.exe" + "\"").toStdString(); + vdfshortcut.StartDir = (launch && !maybeLaunchPath.isEmpty() ? (std::string("\"") + std::filesystem::path(maybeLaunchPath.toStdString()).parent_path().string() + "\"") : ("\"" + appDir.absolutePath() + "\"").toStdString()); - vdfshortcut.appId.value = VDFParser::Parser::calculateAppId(vdfshortcut); // ShortcutPath; default - vdfshortcut.LaunchOptions.value = (QString(name).replace(QRegularExpression("[\\\\/:*?\"<>|]"), "") + ".json").toStdString(); + vdfshortcut.LaunchOptions = (QString(name).replace(QRegularExpression("[\\\\/:*?\"<>|]"), "") + ".json").toStdString(); // IsHidden; default // AllowDesktopConfig; default // AllowOverlay; default @@ -181,25 +179,18 @@ bool UIModel::addToSteam(QVariant shortcut, const QString& shortcutspath, bool f auto maybeIcon = map["icon"].toString(); if (maybeIcon.isEmpty()) { if (launch && !maybeLaunchPath.isEmpty()) - vdfshortcut.icon.value = + vdfshortcut.icon = "\"" + (is_windows_ ? QString(maybeLaunchPath).replace(QRegularExpression("\\/"), "\\").toStdString() : maybeLaunchPath.toStdString()) + "\""; } else { - vdfshortcut.icon.value = + vdfshortcut.icon = "\"" + (is_windows_ ? QString(maybeIcon).replace(QRegularExpression("\\/"), "\\").toStdString() : maybeIcon.toStdString()) + "\""; } // Add installed locally and GlosSI tag - VDFParser::ShortcutTag locallyTag; - locallyTag.idx = 0; - locallyTag.value = "Installed locally"; - vdfshortcut.tags.value.push_back(locallyTag); + vdfshortcut.tags.push_back("Installed locally"); + vdfshortcut.tags.push_back("GlosSI"); - VDFParser::ShortcutTag glossitag; - glossitag.idx = 1; - glossitag.value = "GlosSI"; - vdfshortcut.tags.value.push_back(glossitag); - - shortcuts_vdf_.shortcuts.push_back(vdfshortcut); + shortcuts_vdf_.push_back(vdfshortcut); return writeShortcutsVDF(L"add", name.toStdWString(), shortcutspath.toStdWString(), from_cmd); } @@ -220,16 +211,10 @@ bool UIModel::addToSteam(const QString& name, const QString& shortcutspath, bool bool UIModel::removeFromSteam(const QString& name, const QString& shortcutspath, bool from_cmd) { qDebug() << "trying to remove " << name << " from steam"; - auto& scuts = shortcuts_vdf_.shortcuts; - scuts.erase(std::remove_if(scuts.begin(), scuts.end(), [&name](const auto& shortcut) { - return shortcut.appName.value == name.toStdString(); - }), - scuts.end()); - for (int i = 0; i < scuts.size(); i++) { - if (scuts[i].idx != i) { - scuts[i].idx = i; - } - } + shortcuts_vdf_.erase(std::ranges::remove_if(shortcuts_vdf_, [&name](const auto& shortcut) { + return shortcut.appname == name.toStdString(); + }).begin(), + shortcuts_vdf_.end()); return writeShortcutsVDF(L"remove", name.toStdWString(), shortcutspath.toStdWString(), from_cmd); } @@ -271,7 +256,7 @@ bool UIModel::writeShortcutsVDF(const std::wstring& mode, const std::wstring& na bool write_res; try { - write_res = VDFParser::Parser::writeShortcuts(config_path, shortcuts_vdf_); + write_res = VDFParser::Parser::writeShortcuts(config_path, shortcuts_vdf_, qDebug()); } catch (const std::exception& e) { qDebug() << "Couldn't backup shortcuts file: " << e.what(); @@ -413,7 +398,7 @@ void UIModel::parseShortcutVDF() { const std::filesystem::path config_path = std::wstring(getSteamPath()) + user_data_path_.toStdWString() + getSteamUserId() + shortcutsfile_.toStdWString(); try { - shortcuts_vdf_ = VDFParser::Parser::parseShortcuts(config_path); + shortcuts_vdf_ = VDFParser::Parser::parseShortcuts(config_path, qDebug()); } catch (const std::exception& e) { qDebug() << "Error parsing VDF: " << e.what(); diff --git a/GlosSIConfig/UIModel.h b/GlosSIConfig/UIModel.h index 42f8a12..d9c1595 100644 --- a/GlosSIConfig/UIModel.h +++ b/GlosSIConfig/UIModel.h @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ #pragma once -#include "VDFParser.h" +#include #include #include #include @@ -74,7 +74,7 @@ class UIModel : public QObject { QVariantList targets_; - VDFParser::VDFFile shortcuts_vdf_; + std::vector shortcuts_vdf_; #ifdef _WIN32 bool is_windows_ = true; diff --git a/GlosSIConfig/VDFParser.h b/GlosSIConfig/VDFParser.h deleted file mode 100644 index b4c4a93..0000000 --- a/GlosSIConfig/VDFParser.h +++ /dev/null @@ -1,593 +0,0 @@ -/* -Copyright 2021-2022 Peter Repukat - FlatspotSoftware - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// "Shitty shortcuts.vdf Parser"� - -#pragma once -#include -#include -#include -#include -#include -#include - -#include - -namespace VDFParser { -namespace crc { -template -uint32_t calculate_crc(CONT container) -{ - uint32_t crc32_table[256]; - for (uint32_t i = 0; i < 256; i++) { - uint32_t ch = i; - uint32_t crc = 0; - for (size_t j = 0; j < 8; j++) { - uint32_t b = (ch ^ crc) & 1; - crc >>= 1; - if (b) - crc = crc ^ 0xEDB88320; - ch >>= 1; - } - crc32_table[i] = crc; - } - uint32_t crc = 0xFFFFFFFF; - for (size_t i = 0; i < container.size(); i++) { - char ch = container.data()[i]; - uint32_t t = (ch ^ crc) & 0xFF; - crc = (crc >> 8) ^ crc32_table[t]; - } - return ~crc; -} -} // namespace crc - -static constexpr const char k_appid[] = {"appid"}; -static constexpr const char k_appname[] = {"appname"}; -static constexpr const char k_exe[] = {"exe"}; -static constexpr const char k_StartDir[] = {"StartDir"}; -static constexpr const char k_icon[] = {"icon"}; -static constexpr const char k_ShortcutPath[] = {"ShortcutPath"}; -static constexpr const char k_LaunchOptions[] = {"LaunchOptions"}; -static constexpr const char k_IsHidden[] = {"IsHidden"}; -static constexpr const char k_AllowDesktopConfig[] = {"AllowDesktopConfig"}; -static constexpr const char k_AllowOverlay[] = {"AllowOverlay"}; -static constexpr const char k_openvr[] = {"openvr"}; -static constexpr const char k_Devkit[] = {"Devkit"}; -static constexpr const char k_DevkitGameID[] = {"DevkitGameID"}; -static constexpr const char k_DevkitOverrideAppID[] = {"DevkitOverrideAppID"}; -static constexpr const char k_LastPlayTime[] = {"LastPlayTime"}; -static constexpr const char k_FlatpakAppID[] = {"FlatpakAppID"}; -static constexpr const char k_tags[] = {"tags"}; - -enum VDFTypeId { - StringList = 0, - String, - Number, -}; - -template -struct VDFKeyPair { - VDFKeyPair() {} - explicit VDFKeyPair(type _value) : value(_value) {} - static constexpr uint8_t _TID = _type_id; - static constexpr const char* const _KEY = keyname; - const uint8_t type_id = _TID; - const char* const key = _KEY; - type value; - VDFKeyPair(const VDFKeyPair& other) - { - value = other.value; - }; - VDFKeyPair(VDFKeyPair&& other) - { - value = std::move(other.value); - }; - VDFKeyPair& operator=(const VDFKeyPair& other) - { - value = other.value; - return *this; - } - VDFKeyPair& operator=(VDFKeyPair&& other) - { - value = std::move(other.value); - return *this; - } -}; - -struct VDFIdx { - VDFIdx(){}; - VDFIdx(const VDFIdx& other) - { - data = other.data; - }; - VDFIdx(VDFIdx&& other) - { - data = std::move(other.data); - }; - VDFIdx(int idx) - { - data = std::to_string(idx); - } - std::string data; - operator int() const - { - int res = 0; - std::from_chars(data.data(), data.data() + data.size(), res); - return res; - } - - VDFIdx& operator=(const VDFIdx& other) - { - data = other.data; - - return *this; - } - VDFIdx& operator=(VDFIdx&& other) - { - data = std::move(other.data); - return *this; - } -}; - -struct ShortcutTag { - ShortcutTag(){}; - ShortcutTag(const ShortcutTag& other) - { - idx = other.idx; - value = other.value; - }; - ShortcutTag(ShortcutTag&& other) - { - idx = std::move(other.idx); - value = std::move(other.value); - }; - VDFIdx idx; - std::string value; - const uint16_t end_marker = 0x0808; - - ShortcutTag& operator=(const ShortcutTag& other) - { - idx = other.idx; - value = other.value; - return *this; - } - ShortcutTag& operator=(ShortcutTag&& other) - { - idx = std::move(other.idx); - value = std::move(other.value); - return *this; - } -}; - -struct Shortcut { - VDFIdx idx; - VDFKeyPair appId{0x000000}; - VDFKeyPair appName{""}; - VDFKeyPair exe{"\"\""}; // Qouted - VDFKeyPair StartDir{"\"\""}; // Qouted - VDFKeyPair icon{""}; // Qouted or empty - VDFKeyPair ShortcutPath{""}; // Qouted or empty? - VDFKeyPair LaunchOptions{""}; // UNQOUTED or empty - VDFKeyPair IsHidden{0}; - VDFKeyPair AllowDesktopConfig{1}; - VDFKeyPair AllowOverlay{1}; - VDFKeyPair openvr{0}; - VDFKeyPair Devkit{0}; - VDFKeyPair DevkitGameID{""}; - VDFKeyPair DevkitOverrideAppID{0}; // - VDFKeyPair LastPlayTime{0}; // - VDFKeyPair FlatpakAppID{""}; // - VDFKeyPair, VDFTypeId::StringList> tags{}; - Shortcut& operator=(const Shortcut& other) - { - idx = other.idx; - appId = other.appId; - appName = other.appName; - exe = other.exe; - StartDir = other.StartDir; - icon = other.icon; - ShortcutPath = other.ShortcutPath; - LaunchOptions = other.LaunchOptions; - LaunchOptions = other.LaunchOptions; - IsHidden = other.IsHidden; - AllowDesktopConfig = other.AllowDesktopConfig; - AllowOverlay = other.AllowOverlay; - openvr = other.openvr; - Devkit = other.Devkit; - DevkitGameID = other.DevkitGameID; - DevkitOverrideAppID = other.DevkitOverrideAppID; - LastPlayTime = other.LastPlayTime; - FlatpakAppID = other.FlatpakAppID; - tags = other.tags; - return *this; - } - //std::wstring to_json() - //{ - // std::wstring res = L"{"; - // res += L"idx: " + std::to_wstring(idx.operator int()) + L",\n"; - // res += L"appId: " + std::to_wstring(appId.value) + L",\n"; - // res += L"appName: " + std::filesystem::path(appName.value).wstring() + L",\n"; - // res += L"StartDir: " + std::filesystem::path(StartDir.value).wstring() + L",\n"; - // res += L"ShortcutPath: " + std::filesystem::path(ShortcutPath.value).wstring() + L",\n"; - // res += L"LaunchOptions: " + std::filesystem::path(LaunchOptions.value).wstring() + L",\n"; - // res += L"IsHidden: " + (IsHidden.value ? L"true" : L"false") + L",\n"; - // res += L"AllowDesktopConfig: " + (AllowDesktopConfig.value ? L"true" : L"false") + L",\n"; - // res += L"idx: " + std::to_wstring(appId.value) + L",\n"; - // res += L"}"; - // return res; - //} -}; - -struct VDFFile { - VDFFile(){}; - VDFFile(const VDFFile& other) - { - shortcuts = other.shortcuts; - }; - VDFFile(VDFFile&& other) - { - shortcuts = std::move(other.shortcuts); - }; - const uint8_t first_byte = 0x00; - const std::string identifier = "shortcuts"; - std::vector shortcuts; - const uint16_t end_marker = 0x0808; - VDFFile& operator=(const VDFFile& other) - { - shortcuts = other.shortcuts; - return *this; - } - VDFFile& operator=(VDFFile&& other) - { - shortcuts = std::move(other.shortcuts); - return *this; - } - //std::wstring to_json() - //{ - // std::wstring res = L"["; - - // res += L"]"; - // return res; - //} -}; - -class Parser { - private: - static inline std::ifstream ifile; - static inline std::ofstream ofile; - - template - static inline auto readVDFBuffer(typ* buff, size sz) - { - if (ifile.eof()) { - - return; - } - ifile.read((char*)buff, sz); - } - - template - static inline auto readVDFValue() - { - uint8_t buff[sizeof(typ)]; - ifile.read((char*)buff, sizeof(typ)); - return *reinterpret_cast(buff); - } - - static inline std::string readVDFString() - { - std::string str; - char ch = '\x0'; - do { - if (ifile.eof()) { - return str; - } - ifile.read(&ch, sizeof(char)); - if (ch != '\x0') - str.push_back(ch); - } while (ch != '\x0'); - return str; - } - - public: - static inline uint32_t calculateAppId(const Shortcut& shortcut) - { - std::string buff = shortcut.exe.value + shortcut.appName.value; - auto checksum = crc::calculate_crc(buff); - return checksum | 0x80000000; - } - - static inline VDFFile parseShortcuts(std::filesystem::path path) - { - VDFFile vdffile; - - ifile.open(path, std::ios::binary | std::ios::in); - if (!ifile.is_open()) { - return {}; - } - - auto firsty = readVDFValue(); - if (vdffile.first_byte != firsty) { - // TODO: invalid - ifile.close(); - throw std::exception("First byte is invalid in vdf"); - } - - auto headername = readVDFString(); - if (vdffile.identifier != headername) { - // TODO: invalid - ifile.close(); - throw std::exception("VDF header is invalid"); - } - - while (true) { - std::vector buff; - if (ifile.eof()) { - break; - } - char b = '\x0'; - readVDFBuffer(&b, 1); // skip 0 byte - Shortcut shortcut; - shortcut.idx.data = readVDFString(); - if (shortcut.idx.data == "\x08\x08") { - break; - } - while (true) // TODO; - { - if (ifile.eof()) { - break; - } - const auto tid = static_cast(readVDFValue()); - if (tid == 0x08) { - auto nextbyte = readVDFValue(); - if (nextbyte == 0x08) { - break; - } - else { - // WTF?! - // TODO: - throw std::exception("VDF: WTF"); - } - } - auto key = readVDFString(); - if ((tid == 0x08 && key[0] == 0x08) || key == "\x08\x08") { - break; - } - if (key == shortcut.appId.key) { - shortcut.appId.value = readVDFValue(); - continue; - } - if (key == shortcut.appName.key) { - shortcut.appName.value = readVDFString(); - continue; - } - if (key == shortcut.exe.key) { - shortcut.exe.value = readVDFString(); - continue; - } - if (key == shortcut.StartDir.key) { - shortcut.StartDir.value = readVDFString(); - continue; - } - if (key == shortcut.icon.key) { - shortcut.icon.value = readVDFString(); - continue; - } - if (key == shortcut.ShortcutPath.key) { - shortcut.ShortcutPath.value = readVDFString(); - continue; - } - if (key == shortcut.LaunchOptions.key) { - shortcut.LaunchOptions.value = readVDFString(); - continue; - } - if (key == shortcut.IsHidden.key) { - shortcut.IsHidden.value = readVDFValue(); - continue; - } - if (key == shortcut.AllowDesktopConfig.key) { - shortcut.AllowDesktopConfig.value = readVDFValue(); - continue; - } - if (key == shortcut.AllowOverlay.key) { - shortcut.AllowOverlay.value = readVDFValue(); - continue; - } - if (key == shortcut.openvr.key) { - shortcut.openvr.value = readVDFValue(); - continue; - } - if (key == shortcut.Devkit.key) { - shortcut.Devkit.value = readVDFValue(); - continue; - } - if (key == shortcut.DevkitGameID.key) { - shortcut.DevkitGameID.value = readVDFString(); - continue; - } - if (key == shortcut.DevkitOverrideAppID.key) { - shortcut.DevkitOverrideAppID.value = readVDFValue(); - continue; - } - if (key == shortcut.LastPlayTime.key) { - shortcut.LastPlayTime.value = readVDFValue(); - continue; - } - if (key == shortcut.FlatpakAppID.key) { - shortcut.FlatpakAppID.value = readVDFString(); - continue; - } - if (key == shortcut.tags.key) { - ShortcutTag tag; - while (true) { - if (ifile.eof()) { - break; - } - char tbuff[2]; - readVDFBuffer(tbuff, 2); // 2 bytes POSSIBLE end marker - ifile.seekg(-1, std::ios_base::cur); // go one back, skip typeId - if (tbuff[0] == 0x08 && tbuff[1] == 0x08) { - ifile.seekg(-1, std::ios_base::cur); // another back - break; - } - tag.idx.data = readVDFString(); - if (tag.idx.data == "\x08\x08") { - ifile.seekg(-2, std::ios_base::cur); - break; - } - tag.value = readVDFString(); - shortcut.tags.value.push_back(tag); - } - continue; - } - } - if (!(shortcut.idx.data == "\x00\x00")) { - vdffile.shortcuts.push_back(shortcut); - } - } - - ifile.close(); - - return vdffile; - } - - static inline bool writeShortcuts(std::filesystem::path path, const VDFFile& vdffile) - { - const auto backupFileName = path.wstring() + L".bak"; - if (std::filesystem::exists(path) && !std::filesystem::exists(backupFileName)) { - qDebug() << "No shortcuts backup detected... Creating now..."; - const auto copied = std::filesystem::copy_file(path, backupFileName, std::filesystem::copy_options::update_existing); - if (!copied) { - qDebug() << "failed to copy shortcuts.vdf to backup!"; - } - } - - ofile.open(path.wstring(), std::ios::binary | std::ios::out); - if (!ofile.is_open()) { - return false; - } - ofile.write((char*)&vdffile.first_byte, 1); - ofile.write(vdffile.identifier.data(), vdffile.identifier.length()); - ofile.write("\x00", 1); - for (auto& shortcut : vdffile.shortcuts) { - ofile.write("\x00", 1); - ofile.write(shortcut.idx.data.data(), shortcut.idx.data.length()); - ofile.write("\x00", 1); - // - ofile.write((char*)&shortcut.appId.type_id, 1); - ofile.write(shortcut.appId.key, 6); - ofile.write((char*)&shortcut.appId.value, 4); - - // - ofile.write((char*)&shortcut.appName.type_id, 1); - ofile.write(shortcut.appName.key, 8); - ofile.write(shortcut.appName.value.data(), shortcut.appName.value.length()); - ofile.write("\x00", 1); - - // - ofile.write((char*)&shortcut.exe.type_id, 1); - ofile.write(shortcut.exe.key, 4); - ofile.write(shortcut.exe.value.data(), shortcut.exe.value.length()); - ofile.write("\x00", 1); - - // - ofile.write((char*)&shortcut.StartDir.type_id, 1); - ofile.write(shortcut.StartDir.key, 9); - ofile.write(shortcut.StartDir.value.data(), shortcut.StartDir.value.length()); - ofile.write("\x00", 1); - - // - ofile.write((char*)&shortcut.icon.type_id, 1); - ofile.write(shortcut.icon.key, 5); - ofile.write(shortcut.icon.value.data(), shortcut.icon.value.length()); - ofile.write("\x00", 1); - - // - ofile.write((char*)&shortcut.ShortcutPath.type_id, 1); - ofile.write(shortcut.ShortcutPath.key, 13); - ofile.write(shortcut.ShortcutPath.value.data(), shortcut.ShortcutPath.value.length()); - ofile.write("\x00", 1); - - // - ofile.write((char*)&shortcut.LaunchOptions.type_id, 1); - ofile.write(shortcut.LaunchOptions.key, 14); - ofile.write(shortcut.LaunchOptions.value.data(), shortcut.LaunchOptions.value.length()); - ofile.write("\x00", 1); - - // - ofile.write((char*)&shortcut.IsHidden.type_id, 1); - ofile.write(shortcut.IsHidden.key, 9); - ofile.write((char*)&shortcut.IsHidden.value, 4); - - // - ofile.write((char*)&shortcut.AllowDesktopConfig.type_id, 1); - ofile.write(shortcut.AllowDesktopConfig.key, 19); - ofile.write((char*)&shortcut.AllowDesktopConfig.value, 4); - - // - ofile.write((char*)&shortcut.AllowOverlay.type_id, 1); - ofile.write(shortcut.AllowOverlay.key, 13); - ofile.write((char*)&shortcut.AllowOverlay.value, 4); - - // - ofile.write((char*)&shortcut.openvr.type_id, 1); - ofile.write(shortcut.openvr.key, 7); - ofile.write((char*)&shortcut.openvr.value, 4); - - // - ofile.write((char*)&shortcut.Devkit.type_id, 1); - ofile.write(shortcut.Devkit.key, 7); - ofile.write((char*)&shortcut.Devkit.value, 4); - - // - ofile.write((char*)&shortcut.DevkitGameID.type_id, 1); - ofile.write(shortcut.DevkitGameID.key, 13); - ofile.write(shortcut.DevkitGameID.value.data(), shortcut.DevkitGameID.value.length()); - ofile.write("\x00", 1); - - // - ofile.write((char*)&shortcut.DevkitOverrideAppID.type_id, 1); - ofile.write(shortcut.DevkitOverrideAppID.key, 20); - ofile.write((char*)&shortcut.DevkitOverrideAppID.value, 4); - - // - ofile.write((char*)&shortcut.LastPlayTime.type_id, 1); - ofile.write(shortcut.LastPlayTime.key, 13); - ofile.write((char*)&shortcut.LastPlayTime.value, 4); - - // - ofile.write((char*)&shortcut.FlatpakAppID.type_id, 1); - ofile.write(shortcut.FlatpakAppID.key, 13); - ofile.write(shortcut.FlatpakAppID.value.data(), shortcut.FlatpakAppID.value.length()); - ofile.write("\x00", 1); - - // - ofile.write((char*)&shortcut.tags.type_id, 1); - ofile.write(shortcut.tags.key, 5); - for (auto& tag : shortcut.tags.value) { - ofile.write(tag.idx.data.data(), tag.idx.data.length()); - ofile.write("\x00", 1); - ofile.write(tag.value.data(), tag.value.length()); - ofile.write("\x00", 1); - } - ofile.write("\x08\x08", 2); - } - ofile.write("\x08\x08", 2); - ofile.close(); - return true; - } -}; -} // namespace VDFParser diff --git a/build.ps1 b/build.ps1 index 94ec4fa..0dcaa40 100644 --- a/build.ps1 +++ b/build.ps1 @@ -20,8 +20,8 @@ Copy-Item "..\..\deps\SFML\out\Release\lib\RelWithDebInfo\sfml-graphics-2.dll" - Copy-Item "..\..\deps\SFML\out\Release\lib\RelWithDebInfo\sfml-system-2.dll" -Destination "." Copy-Item "..\..\deps\SFML\out\Release\lib\RelWithDebInfo\sfml-window-2.dll" -Destination "." Copy-Item "..\..\GlosSIConfig\GetAUMIDs.ps1" -Destination "." -Copy-Item "..\..\HidHideMSI.msi" -Destination "." -Copy-Item "..\..\ViGEmBusSetup_x64.msi" -Destination "." +Copy-Item "..\..\HidHideSetup.exe" -Destination "." +Copy-Item "..\..\ViGEmBusSetup_x64.exe" -Destination "." Copy-Item "..\..\vc_redist.x64.exe" -Destination "." Copy-Item "..\..\LICENSE" -Destination "./LICENSE" Copy-Item "..\..\QT_License" -Destination "./QT_License" diff --git a/deps/Shortcuts_VDF b/deps/Shortcuts_VDF new file mode 160000 index 0000000..2816b31 --- /dev/null +++ b/deps/Shortcuts_VDF @@ -0,0 +1 @@ +Subproject commit 2816b31c8e777c2920e1f0881ce10c5c66e30c63 diff --git a/deps/fifo_map b/deps/fifo_map new file mode 160000 index 0000000..d732aaf --- /dev/null +++ b/deps/fifo_map @@ -0,0 +1 @@ +Subproject commit d732aaf9a315415ae8fd7eb11e3a4c1f80e42a48