diff --git a/PowerEditor/src/WinControls/PluginsAdmin/pluginsAdmin.cpp b/PowerEditor/src/WinControls/PluginsAdmin/pluginsAdmin.cpp index f469e19c..84308320 100644 --- a/PowerEditor/src/WinControls/PluginsAdmin/pluginsAdmin.cpp +++ b/PowerEditor/src/WinControls/PluginsAdmin/pluginsAdmin.cpp @@ -45,6 +45,36 @@ using namespace std; using nlohmann::json; +Version::Version(const generic_string& versionStr) +{ + try { + auto ss = tokenizeString(versionStr, '.'); + + if (ss.size() > 4) + throw generic_string(TEXT("The string to parse is not a valid version format. Let's make it default value in catch block.")); + + int i = 0; + vector v = {&_major, &_minor, &_patch, &_build}; + for (const auto& s : ss) + { + if (!isNumber(s)) + { + throw generic_string(TEXT("The string to parse is not a valid version format. Let's make it default value in catch block.")); + } + *(v[i]) = std::stoi(s); + + ++i; + } + } + catch (...) + { + _major = 0; + _minor = 0; + _patch = 0; + _build = 0; + } +} + void Version::setVersionFrom(generic_string filePath) { if (not filePath.empty() && ::PathFileExists(filePath.c_str())) @@ -110,6 +140,39 @@ generic_string Version::toString() return ver; } +int Version::compareTo(const Version& v2c) const +{ + if (_major > v2c._major) + return 1; + else if (_major < v2c._major) + return -1; + else // (_major == v2c._major) + { + if (_minor > v2c._minor) + return 1; + else if (_minor < v2c._minor) + return -1; + else // (_minor == v2c._minor) + { + if (_patch > v2c._patch) + return 1; + else if (_patch < v2c._patch) + return -1; + else // (_patch == v2c._patch) + { + if (_build > v2c._build) + return 1; + else if (_build < v2c._build) + return -1; + else // (_build == v2c._build) + { + return 0; + } + } + } + } +} + generic_string PluginUpdateInfo::describe() { generic_string desc; @@ -460,6 +523,7 @@ bool PluginsAdminDlg::exitToUpdateRemovePlugins(bool isUpdate, const vector(); pi->_description = wmc->char2wchar(valStr.c_str(), CP_ACP); + valStr = i.at("version").get(); + generic_string newValStr(valStr.begin(), valStr.end()); + pi->_version = Version(newValStr); + valStr = i.at("repository").get(); pi->_repository = wmc->char2wchar(valStr.c_str(), CP_ACP); @@ -737,6 +805,8 @@ bool PluginsAdminDlg::loadFromPluginInfos() if (!_pPluginsManager) return false; + // Search from loaded plugins, if loaded plugins are in the available list, + // add them into installed plugins list, and hide them from the available list for (const auto& i : _pPluginsManager->_loadedDlls) { if (i._fileName.length() >= MAX_PATH) @@ -764,6 +834,14 @@ bool PluginsAdminDlg::loadFromPluginInfos() // Hide it from the available list _availableList.hideFromListIndex(listIndex); + + // if the installed plugin version is smaller than the one on the available list, + // put it in the update list as well. + if (pui->_version < foundInfo->_version) + { + PluginUpdateInfo* pui2 = new PluginUpdateInfo(*foundInfo); + _updateList.pushBack(pui2); + } } } diff --git a/PowerEditor/src/WinControls/PluginsAdmin/pluginsAdmin.h b/PowerEditor/src/WinControls/PluginsAdmin/pluginsAdmin.h index ee11ed96..53dc4ed0 100644 --- a/PowerEditor/src/WinControls/PluginsAdmin/pluginsAdmin.h +++ b/PowerEditor/src/WinControls/PluginsAdmin/pluginsAdmin.h @@ -27,6 +27,8 @@ #pragma once +#include +#include #include "StaticDialog.h" #include "pluginsAdminRes.h" #include "TabBar.h" @@ -41,8 +43,34 @@ struct Version unsigned long _minor = 0; unsigned long _patch = 0; unsigned long _build = 0; + + Version() {}; + Version(const generic_string& versionStr); + void setVersionFrom(generic_string filePath); generic_string toString(); + bool isNumber(const generic_string& s) const { + return !s.empty() && + find_if(s.begin(), s.end(), [](char c) { return !isdigit(c); }) == s.end(); + }; + + int compareTo(const Version& v2c) const; + + bool operator < (const Version& v2c) const { + return compareTo(v2c) == -1; + }; + + bool operator > (const Version& v2c) const { + return compareTo(v2c) == 1; + }; + + bool operator == (const Version& v2c) const { + return compareTo(v2c) == 0; + }; + + bool operator != (const Version& v2c) const { + return compareTo(v2c) != 0; + }; }; struct PluginUpdateInfo