+ |
+ |
+ |
+
|
diff --git a/src/backend/generators.cpp b/src/backend/generators.cpp
index 9e1fb83e..4bdcf3bc 100644
--- a/src/backend/generators.cpp
+++ b/src/backend/generators.cpp
@@ -143,6 +143,18 @@ namespace YAML {
return out;
}
+ Emitter& operator << (Emitter& out, const loot::Location& rhs) {
+ if (rhs.Versions().empty())
+ out << rhs.URL();
+ else {
+ out << BeginMap
+ << Key << "link" << Value << rhs.URL()
+ << Key << "ver" << Value << rhs.Versions()
+ << EndMap;
+ }
+ return out;
+ }
+
Emitter& operator << (Emitter& out, const loot::Plugin& rhs) {
if (!rhs.HasNameOnly()) {
out << BeginMap
@@ -172,6 +184,9 @@ namespace YAML {
if (!rhs.DirtyInfo().empty())
out << Key << "dirty" << Value << rhs.DirtyInfo();
+ if (!rhs.Locations().empty())
+ out << Key << "url" << Value << rhs.Locations();
+
out << EndMap;
}
diff --git a/src/backend/generators.h b/src/backend/generators.h
index 6a1ab916..201c9d61 100644
--- a/src/backend/generators.h
+++ b/src/backend/generators.h
@@ -20,7 +20,7 @@
You should have received a copy of the GNU General Public License
along with LOOT. If not, see
.
-*/
+ */
#ifndef __LOOT_GENERATORS__
#define __LOOT_GENERATORS__
@@ -37,7 +37,7 @@ namespace YAML {
template
Emitter& operator << (Emitter& out, const std::set& rhs) {
out << BeginSeq;
- for (const auto &element: rhs) {
+ for (const auto &element : rhs) {
out << element;
}
out << EndSeq;
@@ -68,6 +68,8 @@ namespace YAML {
Emitter& operator << (Emitter& out, const loot::Tag& rhs);
+ Emitter& operator << (Emitter& out, const loot::Location& rhs);
+
Emitter& operator << (Emitter& out, const loot::Plugin& rhs);
}
diff --git a/src/backend/metadata.cpp b/src/backend/metadata.cpp
index 67985bbb..d7c22558 100644
--- a/src/backend/metadata.cpp
+++ b/src/backend/metadata.cpp
@@ -330,6 +330,24 @@ namespace loot {
return _name;
}
+ Location::Location() {}
+
+ Location::Location(const std::string& url) : _url(url) {}
+
+ Location::Location(const std::string& url, const std::vector& versions) : _url(url), _versions(versions) {}
+
+ bool Location::operator < (const Location& rhs) const {
+ return boost::ilexicographical_compare(_url, rhs.URL());
+ }
+
+ std::string Location::URL() const {
+ return _url;
+ }
+
+ std::vector Location::Versions() const {
+ return _versions;
+ }
+
Plugin::Plugin() : enabled(true), _isPriorityExplicit(false), priority(0), isMaster(false), crc(0), numOverrideRecords(0) {}
Plugin::Plugin(const std::string& n) : name(n), enabled(true), _isPriorityExplicit(false), priority(0), isMaster(false), crc(0), numOverrideRecords(0) {
//If the name passed ends in '.ghost', that should be trimmed.
@@ -465,6 +483,9 @@ namespace loot {
set dirtyInfo = plugin.DirtyInfo();
_dirtyInfo.insert(dirtyInfo.begin(), dirtyInfo.end());
+ set locations = plugin.Locations();
+ _locations.insert(locations.begin(), locations.end());
+
return;
}
@@ -511,6 +532,11 @@ namespace loot {
set_symmetric_difference(_dirtyInfo.begin(), _dirtyInfo.end(), dirtyInfo.begin(), dirtyInfo.end(), inserter(dirtDiff, dirtDiff.begin()));
p.DirtyInfo(dirtDiff);
+ set locations = plugin.Locations();
+ set locationsDiff;
+ set_symmetric_difference(_locations.begin(), _locations.end(), locations.begin(), locations.end(), inserter(locationsDiff, locationsDiff.begin()));
+ p.Locations(locationsDiff);
+
return p;
}
@@ -552,6 +578,11 @@ namespace loot {
set_difference(_dirtyInfo.begin(), _dirtyInfo.end(), dirtyInfo.begin(), dirtyInfo.end(), inserter(dirtDiff, dirtDiff.begin()));
p.DirtyInfo(dirtDiff);
+ set locations = plugin.Locations();
+ set locationsDiff;
+ set_difference(_locations.begin(), _locations.end(), locations.begin(), locations.end(), inserter(locationsDiff, locationsDiff.begin()));
+ p.Locations(locationsDiff);
+
return p;
}
@@ -591,6 +622,10 @@ namespace loot {
return _dirtyInfo;
}
+ std::set Plugin::Locations() const {
+ return _locations;
+ }
+
void Plugin::Name(const std::string& n) {
name = n;
}
@@ -631,6 +666,10 @@ namespace loot {
_dirtyInfo = dirtyInfo;
}
+ void Plugin::Locations(const std::set& locations) {
+ _locations = locations;
+ }
+
Plugin& Plugin::EvalAllConditions(Game& game, const unsigned int language) {
for (auto it = loadAfter.begin(); it != loadAfter.end();) {
if (!it->EvalCondition(game))
@@ -712,7 +751,7 @@ namespace loot {
}
bool Plugin::HasNameOnly() const {
- return !IsPriorityExplicit() && loadAfter.empty() && requirements.empty() && incompatibilities.empty() && messages.empty() && tags.empty() && _dirtyInfo.empty();
+ return !IsPriorityExplicit() && loadAfter.empty() && requirements.empty() && incompatibilities.empty() && messages.empty() && tags.empty() && _dirtyInfo.empty() && _locations.empty();
}
bool Plugin::IsRegexPlugin() const {
diff --git a/src/backend/metadata.h b/src/backend/metadata.h
index 00af7075..614a1700 100644
--- a/src/backend/metadata.h
+++ b/src/backend/metadata.h
@@ -161,6 +161,21 @@ namespace loot {
bool addTag;
};
+ class Location {
+ public:
+ Location();
+ Location(const std::string& url);
+ Location(const std::string& url, const std::vector& versions);
+
+ bool operator < (const Location& rhs) const;
+
+ std::string URL() const;
+ std::vector Versions() const;
+ private:
+ std::string _url;
+ std::vector _versions;
+ };
+
class Plugin {
public:
Plugin();
@@ -190,6 +205,7 @@ namespace loot {
std::list Messages() const;
std::set Tags() const;
std::set DirtyInfo() const;
+ std::set Locations() const;
const std::set& FormIDs() const;
std::vector Masters() const;
@@ -207,6 +223,7 @@ namespace loot {
void Messages(const std::list& messages);
void Tags(const std::set& tags);
void DirtyInfo(const std::set& info);
+ void Locations(const std::set& locations);
Plugin& EvalAllConditions(Game& game, const unsigned int language);
void ParseAllConditions(Game& game) const;
@@ -239,6 +256,7 @@ namespace loot {
std::list messages;
std::set tags;
std::set _dirtyInfo;
+ std::set _locations;
std::vector masters;
std::set formIDs;
diff --git a/src/backend/parsers.h b/src/backend/parsers.h
index 77520308..7b9b20ef 100644
--- a/src/backend/parsers.h
+++ b/src/backend/parsers.h
@@ -293,6 +293,36 @@ namespace YAML {
}
};
+ template<>
+ struct convert < loot::Location > {
+ static Node encode(const loot::Location& rhs) {
+ Node node;
+
+ node["link"] = rhs.URL();
+ node["ver"] = rhs.Versions();
+
+ return node;
+ }
+
+ static bool decode(const Node& node, loot::Location& rhs) {
+ std::string url;
+ std::vector versions;
+
+ if (node.IsMap()) {
+ if (node["link"])
+ url = node["link"].as();
+ if (node["ver"])
+ versions = node["ver"].as>();
+ }
+ else if (node.IsScalar())
+ url = node.as();
+
+ rhs = loot::Location(url, versions);
+
+ return true;
+ }
+ };
+
template
struct convert < std::set > {
static Node encode(const std::set& rhs) {
@@ -350,6 +380,7 @@ namespace YAML {
node["msg"] = rhs.Messages();
node["tag"] = rhs.Tags();
node["dirty"] = rhs.DirtyInfo();
+ node["url"] = rhs.Locations();
return node;
}
@@ -380,6 +411,8 @@ namespace YAML {
rhs.Tags(node["tag"].as< std::set >());
if (node["dirty"])
rhs.DirtyInfo(node["dirty"].as< std::set >());
+ if (node["url"])
+ rhs.Locations(node["url"].as< std::set >());
return true;
}
diff --git a/src/gui/handler.cpp b/src/gui/handler.cpp
index 72237cfc..0bde5e6f 100644
--- a/src/gui/handler.cpp
+++ b/src/gui/handler.cpp
@@ -484,8 +484,11 @@ namespace loot {
newUserlistEntry.Tags(pluginMetadata["userlist"]["tag"].as>());
if (pluginMetadata["userlist"]["dirty"])
newUserlistEntry.DirtyInfo(pluginMetadata["userlist"]["dirty"].as>());
+ if (pluginMetadata["userlist"]["url"])
+ newUserlistEntry.Locations(pluginMetadata["userlist"]["url"].as>());
// For cleanliness, only data that does not duplicate masterlist and plugin data should be retained, so diff that.
+ BOOST_LOG_TRIVIAL(trace) << "Removing any user metadata that duplicates masterlist metadata.";
auto pluginIt = g_app_state.CurrentGame().plugins.find(boost::locale::to_lower(newUserlistEntry.Name()));
if (pluginIt != g_app_state.CurrentGame().plugins.end()) {
Plugin tempPlugin(pluginIt->second);
@@ -689,6 +692,7 @@ namespace loot {
pluginNode["masterlist"]["msg"] = mlistPlugin.Messages();
pluginNode["masterlist"]["tag"] = mlistPlugin.Tags();
pluginNode["masterlist"]["dirty"] = mlistPlugin.DirtyInfo();
+ pluginNode["masterlist"]["url"] = mlistPlugin.Locations();
}
if (!ulistPlugin.HasNameOnly()) {
@@ -700,6 +704,7 @@ namespace loot {
pluginNode["userlist"]["msg"] = ulistPlugin.Messages();
pluginNode["userlist"]["tag"] = ulistPlugin.Tags();
pluginNode["userlist"]["dirty"] = ulistPlugin.DirtyInfo();
+ pluginNode["userlist"]["url"] = ulistPlugin.Locations();
}
}
@@ -812,6 +817,7 @@ namespace loot {
pluginNode["masterlist"]["msg"] = mlistPlugin.Messages();
pluginNode["masterlist"]["tag"] = mlistPlugin.Tags();
pluginNode["masterlist"]["dirty"] = mlistPlugin.DirtyInfo();
+ pluginNode["masterlist"]["url"] = mlistPlugin.Locations();
}
// Now merge masterlist and userlist metadata and evaluate,
| |