summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'Swift/Controllers/Highlighting/HighlightAction.h')
-rw-r--r--Swift/Controllers/Highlighting/HighlightAction.h56
1 files changed, 50 insertions, 6 deletions
diff --git a/Swift/Controllers/Highlighting/HighlightAction.h b/Swift/Controllers/Highlighting/HighlightAction.h
index da92901..d11f3ec 100644
--- a/Swift/Controllers/Highlighting/HighlightAction.h
+++ b/Swift/Controllers/Highlighting/HighlightAction.h
@@ -12,11 +12,14 @@
#pragma once
+#include <map>
+#include <memory>
#include <string>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/optional.hpp>
+#include <boost/serialization/map.hpp>
#include <boost/serialization/optional.hpp>
namespace Swift {
@@ -57,12 +60,53 @@ namespace Swift {
bool operator ==(const HighlightAction& a, const HighlightAction& b);
bool operator !=(const HighlightAction& a, const HighlightAction& b);
+
template<class Archive>
- void HighlightAction::serialize(Archive& ar, const unsigned int /*version*/) {
- ar & frontColor_;
- ar & backColor_;
- ar & soundFilePath_;
- ar & systemNotificaitonEnabled_;
+ void HighlightAction::serialize(Archive& ar, const unsigned int version) {
+ auto inputStream = dynamic_cast<boost::archive::text_iarchive*>(&ar);
+ auto outputStream = dynamic_cast<boost::archive::text_oarchive*>(&ar);
+
+ if (version == 0) {
+ if (inputStream) {
+ const boost::archive::library_version_type BoostArchiveSkipVersion(15);
+ auto archiveLibraryVersion = boost::archive::BOOST_ARCHIVE_VERSION();
+ //Due to https://svn.boost.org/trac10/ticket/13050 the boost::optional fields may fail to load and crash the client. Therefore we skip loading the values from previous versions.
+ if (archiveLibraryVersion == BoostArchiveSkipVersion && archiveLibraryVersion > inputStream->get_library_version()) {
+ return;
+ }
+ }
+ ar & frontColor_;
+ ar & backColor_;
+ ar & soundFilePath_;
+ ar & systemNotificaitonEnabled_;
+ }
+ else if (version == 1) {
+ //Using a map instead of optional values that may cause a problems when serialised with boost::archive 15 version
+ std::map<std::string, std::string> properties;
+ if (outputStream) {
+ if (frontColor_.is_initialized()) {
+ properties["frontColor"] = frontColor_.get();
+ }
+ if (backColor_.is_initialized()) {
+ properties["backColor"] = backColor_.get();
+ }
+ if (soundFilePath_.is_initialized()) {
+ properties["soundFilePath"] = soundFilePath_.get();
+ }
+ }
+ ar & properties;
+ ar & systemNotificaitonEnabled_;
+ if (inputStream) {
+ if (properties.find("frontColor") != properties.end()) {
+ frontColor_ = properties["frontColor"];
+ }
+ if (properties.find("backColor") != properties.end()) {
+ backColor_ = properties["backColor"];
+ }
+ if (properties.find("soundFilePath") != properties.end()) {
+ soundFilePath_ = properties["soundFilePath"];
+ }
+ }
+ }
}
-
}