replace json serializer with boost, libragephoto upstream
This commit is contained in:
		
							parent
							
								
									aa4b2fc080
								
							
						
					
					
						commit
						557b999608
					
				
					 10 changed files with 308 additions and 104 deletions
				
			
		
							
								
								
									
										3
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitmodules
									
										
									
									
										vendored
									
									
								
							|  | @ -1,3 +1,6 @@ | ||||||
| [submodule "src/libragephoto"] | [submodule "src/libragephoto"] | ||||||
| path = src/libragephoto | path = src/libragephoto | ||||||
| url = https://github.com/Syping/libragephoto.git | url = https://github.com/Syping/libragephoto.git | ||||||
|  | [submodule "src/json"] | ||||||
|  | path = src/json | ||||||
|  | url = https://github.com/boostorg/json.git | ||||||
|  |  | ||||||
|  | @ -80,6 +80,7 @@ set(GTA5VIEW_SOURCES | ||||||
|     src/SavegameWidget.cpp |     src/SavegameWidget.cpp | ||||||
|     src/SidebarGenerator.cpp |     src/SidebarGenerator.cpp | ||||||
|     src/SnapmaticEditor.cpp |     src/SnapmaticEditor.cpp | ||||||
|  |     src/SnapmaticJson.cpp | ||||||
|     src/SnapmaticPicture.cpp |     src/SnapmaticPicture.cpp | ||||||
|     src/SnapmaticWidget.cpp |     src/SnapmaticWidget.cpp | ||||||
|     src/StandardPaths.cpp |     src/StandardPaths.cpp | ||||||
|  | @ -121,6 +122,7 @@ set(GTA5VIEW_HEADERS | ||||||
|     src/SavegameWidget.h |     src/SavegameWidget.h | ||||||
|     src/SidebarGenerator.h |     src/SidebarGenerator.h | ||||||
|     src/SnapmaticEditor.h |     src/SnapmaticEditor.h | ||||||
|  |     src/SnapmaticJson.h | ||||||
|     src/SnapmaticPicture.h |     src/SnapmaticPicture.h | ||||||
|     src/SnapmaticWidget.h |     src/SnapmaticWidget.h | ||||||
|     src/StandardPaths.h |     src/StandardPaths.h | ||||||
|  | @ -137,6 +139,7 @@ set(GTA5VIEW_HEADERS | ||||||
| set(GTA5VIEW_INCLUDEDIR | set(GTA5VIEW_INCLUDEDIR | ||||||
|     src |     src | ||||||
|     src/anpro |     src/anpro | ||||||
|  |     src/json/include | ||||||
|     src/pcg |     src/pcg | ||||||
|     src/uimod |     src/uimod | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | @ -19,6 +19,7 @@ | ||||||
| #include "JsonEditorDialog.h" | #include "JsonEditorDialog.h" | ||||||
| #include "ui_JsonEditorDialog.h" | #include "ui_JsonEditorDialog.h" | ||||||
| #include "SnapmaticEditor.h" | #include "SnapmaticEditor.h" | ||||||
|  | #include "SnapmaticJson.h" | ||||||
| #include "AppEnv.h" | #include "AppEnv.h" | ||||||
| #include "config.h" | #include "config.h" | ||||||
| #include <QStringBuilder> | #include <QStringBuilder> | ||||||
|  | @ -63,7 +64,7 @@ JsonEditorDialog::JsonEditorDialog(SnapmaticPicture *picture, QWidget *parent) : | ||||||
|         ui->cmdSave->setIcon(QIcon::fromTheme("gtk-save")); |         ui->cmdSave->setIcon(QIcon::fromTheme("gtk-save")); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     jsonCode = picture->getJsonStr(); |     jsonCode = picture->getJsonStdStr(); | ||||||
| 
 | 
 | ||||||
| #if QT_VERSION >= 0x050200 | #if QT_VERSION >= 0x050200 | ||||||
|     ui->txtJSON->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); |     ui->txtJSON->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); | ||||||
|  | @ -80,9 +81,9 @@ JsonEditorDialog::JsonEditorDialog(SnapmaticPicture *picture, QWidget *parent) : | ||||||
|     ui->txtJSON->setTabStopWidth(fontMetrics.width("    ")); |     ui->txtJSON->setTabStopWidth(fontMetrics.width("    ")); | ||||||
| #endif | #endif | ||||||
| 
 | 
 | ||||||
|     QJsonDocument jsonDocument = QJsonDocument::fromJson(jsonCode.toUtf8()); |     const boost::json::value jsonValue = boost::json::parse(jsonCode); | ||||||
|     ui->txtJSON->setStyleSheet("QPlainTextEdit{background-color: rgb(46, 47, 48); color: rgb(238, 231, 172);}"); |     ui->txtJSON->setStyleSheet("QPlainTextEdit{background-color: rgb(46, 47, 48); color: rgb(238, 231, 172);}"); | ||||||
|     ui->txtJSON->setPlainText(QString::fromUtf8(jsonDocument.toJson(QJsonDocument::Indented)).trimmed()); |     ui->txtJSON->setPlainText(QString::fromUtf8(SnapmaticJson::serialize(jsonValue, true).c_str())); | ||||||
|     jsonHl = new JSHighlighter(ui->txtJSON->document()); |     jsonHl = new JSHighlighter(ui->txtJSON->document()); | ||||||
| 
 | 
 | ||||||
|     // DPI calculation
 |     // DPI calculation
 | ||||||
|  | @ -112,11 +113,14 @@ JsonEditorDialog::~JsonEditorDialog() | ||||||
| 
 | 
 | ||||||
| void JsonEditorDialog::closeEvent(QCloseEvent *ev) | void JsonEditorDialog::closeEvent(QCloseEvent *ev) | ||||||
| { | { | ||||||
|     QString jsonPatched = QString(ui->txtJSON->toPlainText()).replace("\t", "    "); |     const QString jsonPatched = QString(ui->txtJSON->toPlainText()).replace("\t", ""); | ||||||
|     QJsonDocument jsonNew = QJsonDocument::fromJson(jsonPatched.toUtf8()); |     std::error_code ec; | ||||||
|     QJsonDocument jsonOriginal = QJsonDocument::fromJson(jsonCode.toUtf8()); |     const boost::json::value jsonNew = boost::json::parse(jsonPatched.toUtf8().constData(), ec); | ||||||
|     QString originalCode = QString::fromUtf8(jsonOriginal.toJson(QJsonDocument::Compact)); |     const boost::json::value jsonOriginal = boost::json::parse(jsonCode, ec); | ||||||
|     QString newCode = QString::fromUtf8(jsonNew.toJson(QJsonDocument::Compact)); |     const std::string newCode = SnapmaticJson::serialize(jsonNew); | ||||||
|  |     const std::string originalCode = SnapmaticJson::serialize(jsonOriginal); | ||||||
|  |     qDebug() << newCode.c_str(); | ||||||
|  |     qDebug() << originalCode.c_str(); | ||||||
|     if (newCode != originalCode) { |     if (newCode != originalCode) { | ||||||
|         QMessageBox::StandardButton button = QMessageBox::warning(this, SnapmaticEditor::tr("Snapmatic Properties"), SnapmaticEditor::tr("<h4>Unsaved changes detected</h4>You want to save the JSON content before you quit?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Cancel); |         QMessageBox::StandardButton button = QMessageBox::warning(this, SnapmaticEditor::tr("Snapmatic Properties"), SnapmaticEditor::tr("<h4>Unsaved changes detected</h4>You want to save the JSON content before you quit?"), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel, QMessageBox::Cancel); | ||||||
|         if (button == QMessageBox::Yes) { |         if (button == QMessageBox::Yes) { | ||||||
|  | @ -141,12 +145,13 @@ void JsonEditorDialog::closeEvent(QCloseEvent *ev) | ||||||
| 
 | 
 | ||||||
| bool JsonEditorDialog::saveJsonContent() | bool JsonEditorDialog::saveJsonContent() | ||||||
| { | { | ||||||
|     QString jsonPatched = QString(ui->txtJSON->toPlainText()).replace("\t", "    "); |     const QString jsonPatched = QString(ui->txtJSON->toPlainText()).replace("\t", ""); | ||||||
|     QJsonDocument jsonNew = QJsonDocument::fromJson(jsonPatched.toUtf8()); |     std::error_code ec; | ||||||
|     if (!jsonNew.isEmpty()) { |     const boost::json::value jsonNew = boost::json::parse(jsonPatched.toUtf8().constData(), ec); | ||||||
|         QJsonDocument jsonOriginal = QJsonDocument::fromJson(jsonCode.toUtf8()); |     if (jsonNew.is_object()) { | ||||||
|         QString originalCode = QString::fromUtf8(jsonOriginal.toJson(QJsonDocument::Compact)); |         const boost::json::value jsonOriginal = boost::json::parse(jsonCode, ec); | ||||||
|         QString newCode = QString::fromUtf8(jsonNew.toJson(QJsonDocument::Compact)); |         const std::string newCode = SnapmaticJson::serialize(jsonNew); | ||||||
|  |         const std::string originalCode = SnapmaticJson::serialize(jsonOriginal); | ||||||
|         if (newCode != originalCode) { |         if (newCode != originalCode) { | ||||||
|             QString currentFilePath = smpic->getPictureFilePath(); |             QString currentFilePath = smpic->getPictureFilePath(); | ||||||
|             QString originalFilePath = smpic->getOriginalPictureFilePath(); |             QString originalFilePath = smpic->getOriginalPictureFilePath(); | ||||||
|  |  | ||||||
|  | @ -47,7 +47,7 @@ signals: | ||||||
|     void codeUpdated(QString jsonCode); |     void codeUpdated(QString jsonCode); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     QString jsonCode; |     std::string jsonCode; | ||||||
|     JSHighlighter *jsonHl; |     JSHighlighter *jsonHl; | ||||||
|     SnapmaticPicture *smpic; |     SnapmaticPicture *smpic; | ||||||
|     Ui::JsonEditorDialog *ui; |     Ui::JsonEditorDialog *ui; | ||||||
|  |  | ||||||
							
								
								
									
										123
									
								
								src/SnapmaticJson.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								src/SnapmaticJson.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,123 @@ | ||||||
|  | /*****************************************************************************
 | ||||||
|  | * gta5view Grand Theft Auto V Profile Viewer | ||||||
|  | * Copyright (C) 2023 Syping | ||||||
|  | * | ||||||
|  | * This program 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. | ||||||
|  | * | ||||||
|  | * This program 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 <http://www.gnu.org/licenses/>.
 | ||||||
|  | *****************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #include <boost/json/src.hpp> | ||||||
|  | #include <sstream> | ||||||
|  | #include "SnapmaticJson.h" | ||||||
|  | 
 | ||||||
|  | void serializer(std::ostream &os, const boost::json::value &jv, std::string *indent, bool do_indent) | ||||||
|  | { | ||||||
|  |     std::string indent_; | ||||||
|  |     if (!indent) | ||||||
|  |         indent = &indent_; | ||||||
|  |     switch (jv.kind()) { | ||||||
|  |     case boost::json::kind::object: { | ||||||
|  |         if (do_indent) { | ||||||
|  |             os << "{\n"; | ||||||
|  |             indent->append(4, ' '); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |             os << "{"; | ||||||
|  |         auto const &obj = jv.get_object(); | ||||||
|  |         if (!obj.empty()) { | ||||||
|  |             auto it = obj.begin(); | ||||||
|  |             for (;;) { | ||||||
|  |                 if (do_indent) | ||||||
|  |                     os << *indent << boost::json::serialize(it->key()) << ": "; | ||||||
|  |                 else | ||||||
|  |                     os << boost::json::serialize(it->key()) << ":"; | ||||||
|  |                 serializer(os, it->value(), indent, do_indent); | ||||||
|  |                 if (++it == obj.end()) | ||||||
|  |                     break; | ||||||
|  |                 if (do_indent) | ||||||
|  |                     os << ",\n"; | ||||||
|  |                 else | ||||||
|  |                     os << ","; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (do_indent) { | ||||||
|  |             os << "\n"; | ||||||
|  |             indent->resize(indent->size() - 4); | ||||||
|  |             os << *indent << "}"; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |             os << "}"; | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case boost::json::kind::array: { | ||||||
|  |         if (do_indent) { | ||||||
|  |             os << "[\n"; | ||||||
|  |             indent->append(4, ' '); | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |             os << "["; | ||||||
|  |         auto const &arr = jv.get_array(); | ||||||
|  |         if (!arr.empty()) { | ||||||
|  |             auto it = arr.begin(); | ||||||
|  |             for (;;) { | ||||||
|  |                 if (do_indent) | ||||||
|  |                     os << *indent; | ||||||
|  |                 serializer(os, *it, indent, do_indent); | ||||||
|  |                 if (++it == arr.end()) | ||||||
|  |                     break; | ||||||
|  |                 if (do_indent) | ||||||
|  |                     os << ",\n"; | ||||||
|  |                 else | ||||||
|  |                     os << ","; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         if (do_indent) { | ||||||
|  |             os << "\n"; | ||||||
|  |             indent->resize(indent->size() - 4); | ||||||
|  |             os << *indent << "]"; | ||||||
|  |         } | ||||||
|  |         else | ||||||
|  |             os << "]"; | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case boost::json::kind::string: { | ||||||
|  |         os << boost::json::serialize(jv.get_string()); | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  |     case boost::json::kind::uint64: | ||||||
|  |         os << jv.get_uint64(); | ||||||
|  |         break; | ||||||
|  |     case boost::json::kind::int64: | ||||||
|  |         os << jv.get_int64(); | ||||||
|  |         break; | ||||||
|  |     case boost::json::kind::double_: | ||||||
|  |         os << jv.get_double(); | ||||||
|  |         break; | ||||||
|  |     case boost::json::kind::bool_: | ||||||
|  |         if (jv.get_bool()) | ||||||
|  |             os << "true"; | ||||||
|  |         else | ||||||
|  |             os << "false"; | ||||||
|  |         break; | ||||||
|  |     case boost::json::kind::null: | ||||||
|  |         os << "null"; | ||||||
|  |         break; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | std::string SnapmaticJson::serialize(const boost::json::value &jv, bool do_indent) | ||||||
|  | { | ||||||
|  |     std::ostringstream buffer; | ||||||
|  |     serializer(buffer, jv, nullptr, do_indent); | ||||||
|  |     return buffer.str(); | ||||||
|  | } | ||||||
							
								
								
									
										33
									
								
								src/SnapmaticJson.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/SnapmaticJson.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | ||||||
|  | /*****************************************************************************
 | ||||||
|  | * gta5view Grand Theft Auto V Profile Viewer | ||||||
|  | * Copyright (C) 2023 Syping | ||||||
|  | * | ||||||
|  | * This program 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. | ||||||
|  | * | ||||||
|  | * This program 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 <http://www.gnu.org/licenses/>.
 | ||||||
|  | *****************************************************************************/ | ||||||
|  | 
 | ||||||
|  | #ifndef SNAPMATICJSON_H | ||||||
|  | #define SNAPMATICJSON_H | ||||||
|  | #ifndef Q_MOC_RUN | ||||||
|  | 
 | ||||||
|  | #include <boost/json.hpp> | ||||||
|  | 
 | ||||||
|  | class SnapmaticJson | ||||||
|  | { | ||||||
|  | public: | ||||||
|  |     static std::string serialize(const boost::json::value &jv, bool do_indent = false); | ||||||
|  |     boost::json::object jsonObject; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif // Q_MOC_RUN
 | ||||||
|  | #endif // SNAPMATICJSON_H
 | ||||||
|  | @ -18,8 +18,6 @@ | ||||||
| 
 | 
 | ||||||
| #include "SnapmaticPicture.h" | #include "SnapmaticPicture.h" | ||||||
| #include <QStringBuilder> | #include <QStringBuilder> | ||||||
| #include <QJsonDocument> |  | ||||||
| #include <QJsonObject> |  | ||||||
| #include <QStringList> | #include <QStringList> | ||||||
| #include <QVariantMap> | #include <QVariantMap> | ||||||
| #include <QFileInfo> | #include <QFileInfo> | ||||||
|  | @ -449,8 +447,8 @@ void SnapmaticPicture::reset() | ||||||
|     // SNAPMATIC PROPERTIES
 |     // SNAPMATIC PROPERTIES
 | ||||||
|     localProperties = {}; |     localProperties = {}; | ||||||
| 
 | 
 | ||||||
|     // JSON OBJECT
 |     // JSON VALUE
 | ||||||
|     jsonObject = QJsonObject(); |     snapmaticJson.jsonObject = boost::json::object(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool SnapmaticPicture::preloadFile() | bool SnapmaticPicture::preloadFile() | ||||||
|  | @ -567,15 +565,17 @@ bool SnapmaticPicture::preloadFile() | ||||||
|         return false; |         return false; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const QJsonDocument t_jsonDocument = QJsonDocument::fromJson(p_ragePhoto.json()); |     if (!picFilePath.endsWith(".g5e", Qt::CaseInsensitive) && p_ragePhoto.format() == G5EPhotoFormat::G5EX) | ||||||
|     if (t_jsonDocument.isNull()) |         isFormatSwitch = true; | ||||||
|         return false; | 
 | ||||||
|     jsonObject = t_jsonDocument.object(); |     std::error_code ec; | ||||||
|  |     boost::json::value jsonValue = boost::json::parse(p_ragePhoto.json(), ec); | ||||||
|  |     if (ec) | ||||||
|  |         return false; | ||||||
|  |     if (!jsonValue.is_object()) | ||||||
|  |         return false; | ||||||
|  |     snapmaticJson.jsonObject = jsonValue.get_object(); | ||||||
| 
 | 
 | ||||||
|     if (!picFilePath.endsWith(".g5e", Qt::CaseInsensitive)) { |  | ||||||
|         if (p_ragePhoto.format() == G5EPhotoFormat::G5EX) |  | ||||||
|             isFormatSwitch = true; |  | ||||||
|     } |  | ||||||
|     isPreLoaded = true; |     isPreLoaded = true; | ||||||
|     emit preloaded(); |     emit preloaded(); | ||||||
|     return ok; |     return ok; | ||||||
|  | @ -867,6 +867,11 @@ const QString SnapmaticPicture::getJsonStr() | ||||||
|     return QString::fromUtf8(p_ragePhoto.json()); |     return QString::fromUtf8(p_ragePhoto.json()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const std::string SnapmaticPicture::getJsonStdStr() | ||||||
|  | { | ||||||
|  |     return std::string(p_ragePhoto.json()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| SnapmaticProperties SnapmaticPicture::getSnapmaticProperties() | SnapmaticProperties SnapmaticPicture::getSnapmaticProperties() | ||||||
| { | { | ||||||
|     return localProperties; |     return localProperties; | ||||||
|  | @ -875,25 +880,31 @@ SnapmaticProperties SnapmaticPicture::getSnapmaticProperties() | ||||||
| void SnapmaticPicture::parseJsonContent() | void SnapmaticPicture::parseJsonContent() | ||||||
| { | { | ||||||
|     const uint32_t format = p_ragePhoto.format(); |     const uint32_t format = p_ragePhoto.format(); | ||||||
|     QVariantMap jsonMap = jsonObject.toVariantMap(); |     const boost::json::object &t_jsonObject = snapmaticJson.jsonObject; | ||||||
| 
 | 
 | ||||||
|     bool jsonIncomplete = false; |     bool jsonIncomplete = false; | ||||||
|     bool jsonError = false; |     bool jsonError = false; | ||||||
|     if (jsonObject.contains("loc")) { |     if (t_jsonObject.contains("loc")) { | ||||||
|         if (jsonObject["loc"].isObject()) { |         if (t_jsonObject.at("loc").is_object()) { | ||||||
|             QJsonObject locObject = jsonObject["loc"].toObject(); |             const boost::json::object locObject = t_jsonObject.at("loc").get_object(); | ||||||
|             if (locObject.contains("x")) { |             if (locObject.contains("x")) { | ||||||
|                 if (locObject["x"].isDouble()) { localProperties.location.x = locObject["x"].toDouble(); } |                 if (locObject.at("x").is_double()) { localProperties.location.x = locObject.at("x").get_double(); } | ||||||
|  |                 else if (locObject.at("x").is_int64()) { localProperties.location.x = static_cast<double>(locObject.at("x").get_int64()); } | ||||||
|  |                 else if (locObject.at("x").is_uint64()) { localProperties.location.x = static_cast<double>(locObject.at("x").get_uint64()); } | ||||||
|                 else { jsonError = true; } |                 else { jsonError = true; } | ||||||
|             } |             } | ||||||
|             else { jsonIncomplete = true; } |             else { jsonIncomplete = true; } | ||||||
|             if (locObject.contains("y")) { |             if (locObject.contains("y")) { | ||||||
|                 if (locObject["y"].isDouble()) { localProperties.location.y = locObject["y"].toDouble(); } |                 if (locObject.at("y").is_double()) { localProperties.location.y = locObject.at("y").get_double(); } | ||||||
|  |                 else if (locObject.at("y").is_int64()) { localProperties.location.x = static_cast<double>(locObject.at("y").get_int64()); } | ||||||
|  |                 else if (locObject.at("y").is_uint64()) { localProperties.location.x = static_cast<double>(locObject.at("y").get_uint64()); } | ||||||
|                 else { jsonError = true; } |                 else { jsonError = true; } | ||||||
|             } |             } | ||||||
|             else { jsonIncomplete = true; } |             else { jsonIncomplete = true; } | ||||||
|             if (locObject.contains("z")) { |             if (locObject.contains("z")) { | ||||||
|                 if (locObject["z"].isDouble()) { localProperties.location.z = locObject["z"].toDouble(); } |                 if (locObject.at("z").is_double()) { localProperties.location.z = locObject.at("z").get_double(); } | ||||||
|  |                 else if (locObject.at("z").is_int64()) { localProperties.location.x = static_cast<double>(locObject.at("z").get_int64()); } | ||||||
|  |                 else if (locObject.at("z").is_uint64()) { localProperties.location.x = static_cast<double>(locObject.at("z").get_uint64()); } | ||||||
|                 else { jsonError = true; } |                 else { jsonError = true; } | ||||||
|             } |             } | ||||||
|             else { jsonIncomplete = true; } |             else { jsonIncomplete = true; } | ||||||
|  | @ -901,74 +912,87 @@ void SnapmaticPicture::parseJsonContent() | ||||||
|         else { jsonError = true; } |         else { jsonError = true; } | ||||||
|     } |     } | ||||||
|     else { jsonIncomplete = true; } |     else { jsonIncomplete = true; } | ||||||
|     if (jsonObject.contains("uid")) { |     if (t_jsonObject.contains("uid")) { | ||||||
|         bool uidOk; |         if (t_jsonObject.at("uid").is_uint64()) { localProperties.uid = t_jsonObject.at("uid").get_uint64(); } | ||||||
|         localProperties.uid = jsonMap["uid"].toInt(&uidOk); |         else if (t_jsonObject.at("uid").is_int64()) { localProperties.uid = static_cast<uint64_t>(t_jsonObject.at("uid").get_int64()); } | ||||||
|         if (!uidOk) { jsonError = true; } |         else { jsonError = true; } | ||||||
|     } |     } | ||||||
|     else { jsonIncomplete = true; } |     else { jsonIncomplete = true; } | ||||||
|     if (jsonObject.contains("area")) { |     if (t_jsonObject.contains("area")) { | ||||||
|         if (jsonObject["area"].isString()) { localProperties.location.area = jsonObject["area"].toString(); } |         if (t_jsonObject.at("area").is_string()) { | ||||||
|  |             localProperties.location.area = QString::fromUtf8(t_jsonObject.at("area").get_string().c_str()); | ||||||
|  |         } | ||||||
|         else { jsonError = true; } |         else { jsonError = true; } | ||||||
|     } |     } | ||||||
|     else if (gta5view_isGTAVFormat(format)) { jsonIncomplete = true; } |     else if (gta5view_isGTAVFormat(format)) { jsonIncomplete = true; } | ||||||
|     if (jsonObject.contains("crewid")) { |     if (t_jsonObject.contains("crewid")) { | ||||||
|         bool crewIDOk; |         if (t_jsonObject.at("crewid").is_uint64()) { localProperties.crewID = t_jsonObject.at("crewid").get_uint64(); } | ||||||
|         localProperties.crewID = jsonMap["crewid"].toInt(&crewIDOk); |         else if (t_jsonObject.at("crewid").is_int64()) { localProperties.crewID = static_cast<uint64_t>(t_jsonObject.at("crewid").get_int64()); } | ||||||
|         if (!crewIDOk) { jsonError = true; } |         else { jsonError = true; } | ||||||
|     } |     } | ||||||
|     else { jsonIncomplete = true; } |     else { jsonIncomplete = true; } | ||||||
|     if (jsonObject.contains("street")) { |     if (t_jsonObject.contains("street")) { | ||||||
|         bool streetIDOk; |         if (t_jsonObject.at("street").is_uint64()) { localProperties.streetID = t_jsonObject.at("street").get_uint64(); } | ||||||
|         localProperties.streetID = jsonMap["street"].toInt(&streetIDOk); |         else if (t_jsonObject.at("street").is_int64()) { localProperties.streetID = static_cast<uint64_t>(t_jsonObject.at("street").get_int64()); } | ||||||
|         if (!streetIDOk) { jsonError = true; } |         else { jsonError = true; } | ||||||
|     } |     } | ||||||
|     else if (gta5view_isGTAVFormat(format)) { jsonIncomplete = true; } |     else if (gta5view_isGTAVFormat(format)) { jsonIncomplete = true; } | ||||||
|     if (jsonObject.contains("creat")) { |     if (t_jsonObject.contains("creat")) { | ||||||
|         bool timestampOk; |         if (t_jsonObject.at("creat").is_int64()) { | ||||||
|         QDateTime createdTimestamp; |             QDateTime createdTimestamp; | ||||||
|         localProperties.createdTimestamp = jsonMap["creat"].toUInt(×tampOk); |             localProperties.createdTimestamp = t_jsonObject.at("creat").get_int64(); | ||||||
| #if QT_VERSION >= 0x060000 |             createdTimestamp.setSecsSinceEpoch(localProperties.createdTimestamp); | ||||||
|         createdTimestamp.setSecsSinceEpoch(localProperties.createdTimestamp); |             localProperties.createdDateTime = createdTimestamp; | ||||||
| #else |         } | ||||||
|         createdTimestamp.setTime_t(localProperties.createdTimestamp); |         else if (t_jsonObject.at("creat").is_uint64()) { | ||||||
| #endif |             QDateTime createdTimestamp; | ||||||
|         localProperties.createdDateTime = createdTimestamp; |             localProperties.createdTimestamp = static_cast<int64_t>(t_jsonObject.at("creat").get_uint64()); | ||||||
|         if (!timestampOk) { jsonError = true; } |             createdTimestamp.setSecsSinceEpoch(localProperties.createdTimestamp); | ||||||
|     } |             localProperties.createdDateTime = createdTimestamp; | ||||||
|     else { jsonIncomplete = true; } |         } | ||||||
|     if (jsonObject.contains("plyrs")) { |  | ||||||
|         if (jsonObject["plyrs"].isArray()) { localProperties.playersList = jsonMap["plyrs"].toStringList(); } |  | ||||||
|         else { jsonError = true; } |  | ||||||
|     } |  | ||||||
|     // else { jsonIncomplete = true; } // 2016 Snapmatic pictures left out plyrs when none are captured, so don't force exists on that one
 |  | ||||||
|     if (jsonObject.contains("meme")) { |  | ||||||
|         if (jsonObject["meme"].isBool()) { localProperties.isMeme = jsonObject["meme"].toBool(); } |  | ||||||
|         else { jsonError = true; } |         else { jsonError = true; } | ||||||
|     } |     } | ||||||
|     else { jsonIncomplete = true; } |     else { jsonIncomplete = true; } | ||||||
|     if (jsonObject.contains("mug")) { |     if (t_jsonObject.contains("plyrs")) { | ||||||
|         if (jsonObject["mug"].isBool()) { localProperties.isMug = jsonObject["mug"].toBool(); } |         if (t_jsonObject.at("plyrs").is_array()) { | ||||||
|  |             boost::json::array plyrsArray = t_jsonObject.at("plyrs").get_array(); | ||||||
|  |             QStringList playersList; | ||||||
|  |             for (const boost::json::value &plyrVal : plyrsArray) { | ||||||
|  |                 if (plyrVal.is_string()) { | ||||||
|  |                     playersList << QString::fromUtf8(plyrVal.get_string().c_str()); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             localProperties.playersList = playersList; | ||||||
|  |         } | ||||||
|  |         else { jsonError = true; } | ||||||
|  |     } | ||||||
|  |     if (t_jsonObject.contains("meme")) { | ||||||
|  |         if (t_jsonObject.at("meme").is_bool()) { localProperties.isMeme = t_jsonObject.at("meme").get_bool(); } | ||||||
|         else { jsonError = true; } |         else { jsonError = true; } | ||||||
|     } |     } | ||||||
|     else { jsonIncomplete = true; } |     else { jsonIncomplete = true; } | ||||||
|     if (jsonObject.contains("slf")) { |     if (t_jsonObject.contains("mug")) { | ||||||
|         if (jsonObject["slf"].isBool()) { localProperties.isSelfie = jsonObject["slf"].toBool(); } |         if (t_jsonObject.at("mug").is_bool()) { localProperties.isMug = t_jsonObject.at("mug").get_bool(); } | ||||||
|         else { jsonError = true; } |         else { jsonError = true; } | ||||||
|     } |     } | ||||||
|     else { jsonIncomplete = true; } |     else { jsonIncomplete = true; } | ||||||
|     if (jsonObject.contains("drctr")) { |     if (t_jsonObject.contains("slf")) { | ||||||
|         if (jsonObject["drctr"].isBool()) { localProperties.isFromDirector = jsonObject["drctr"].toBool(); } |         if (t_jsonObject.at("slf").is_bool()) { localProperties.isSelfie = t_jsonObject.at("slf").get_bool(); } | ||||||
|         else { jsonError = true; } |         else { jsonError = true; } | ||||||
|     } |     } | ||||||
|     else { jsonIncomplete = true; } |     else { jsonIncomplete = true; } | ||||||
|     if (jsonObject.contains("rsedtr")) { |     if (t_jsonObject.contains("drctr")) { | ||||||
|         if (jsonObject["rsedtr"].isBool()) { localProperties.isFromRSEditor = jsonObject["rsedtr"].toBool(); } |         if (t_jsonObject.at("drctr").is_bool()) { localProperties.isFromDirector = t_jsonObject.at("drctr").get_bool(); } | ||||||
|  |         else { jsonError = true; } | ||||||
|  |     } | ||||||
|  |     else { jsonIncomplete = true; } | ||||||
|  |     if (t_jsonObject.contains("rsedtr")) { | ||||||
|  |         if (t_jsonObject.at("rsedtr").is_bool()) { localProperties.isFromRSEditor = t_jsonObject.at("rsedtr").get_bool(); } | ||||||
|         else { jsonError = true; } |         else { jsonError = true; } | ||||||
|     } |     } | ||||||
|     else { localProperties.isFromRSEditor = false; } |     else { localProperties.isFromRSEditor = false; } | ||||||
|     if (jsonObject.contains("onislandx")) { |     if (t_jsonObject.contains("onislandx")) { | ||||||
|         if (jsonObject["onislandx"].isBool()) { localProperties.location.isCayoPerico = jsonObject["onislandx"].toBool(); } |         if (t_jsonObject.at("onislandx").is_bool()) { localProperties.location.isCayoPerico = t_jsonObject.at("onislandx").get_bool(); } | ||||||
|         else { jsonError = true; } |         else { jsonError = true; } | ||||||
|     } |     } | ||||||
|     else { localProperties.location.isCayoPerico = false; } |     else { localProperties.location.isCayoPerico = false; } | ||||||
|  | @ -992,46 +1016,59 @@ void SnapmaticPicture::parseJsonContent() | ||||||
| 
 | 
 | ||||||
| bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties properties) | bool SnapmaticPicture::setSnapmaticProperties(SnapmaticProperties properties) | ||||||
| { | { | ||||||
|     QJsonObject t_jsonObject = jsonObject; |     boost::json::object t_jsonObject = snapmaticJson.jsonObject; | ||||||
| 
 | 
 | ||||||
|     QJsonObject locObject; |     boost::json::object locObject; | ||||||
|     locObject["x"] = properties.location.x; |     locObject["x"] = properties.location.x; | ||||||
|     locObject["y"] = properties.location.y; |     locObject["y"] = properties.location.y; | ||||||
|     locObject["z"] = properties.location.z; |     locObject["z"] = properties.location.z; | ||||||
| 
 | 
 | ||||||
|  |     boost::json::array plyrsArray; | ||||||
|  |     for (const QString &player : properties.playersList) { | ||||||
|  |         plyrsArray.push_back(player.toUtf8().constData()); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     t_jsonObject["loc"] = locObject; |     t_jsonObject["loc"] = locObject; | ||||||
|     t_jsonObject["uid"] = properties.uid; |     t_jsonObject["uid"] = properties.uid; | ||||||
|     t_jsonObject["crewid"] = properties.crewID; |     t_jsonObject["crewid"] = properties.crewID; | ||||||
|     t_jsonObject["creat"] = QJsonValue::fromVariant(properties.createdTimestamp); |     t_jsonObject["creat"] = properties.createdTimestamp; | ||||||
|     t_jsonObject["plyrs"] = QJsonValue::fromVariant(properties.playersList); |     t_jsonObject["plyrs"] = plyrsArray; | ||||||
|     t_jsonObject["meme"] = properties.isMeme; |     t_jsonObject["meme"] = properties.isMeme; | ||||||
|     t_jsonObject["mug"] = properties.isMug; |     t_jsonObject["mug"] = properties.isMug; | ||||||
|     t_jsonObject["slf"] = properties.isSelfie; |     t_jsonObject["slf"] = properties.isSelfie; | ||||||
|     t_jsonObject["drctr"] = properties.isFromDirector; |     t_jsonObject["drctr"] = properties.isFromDirector; | ||||||
|     t_jsonObject["rsedtr"] = properties.isFromRSEditor; |     t_jsonObject["rsedtr"] = properties.isFromRSEditor; | ||||||
|     if (gta5view_isGTAVFormat(p_ragePhoto.format())) { |     if (gta5view_isGTAVFormat(p_ragePhoto.format())) { | ||||||
|         t_jsonObject["area"] = properties.location.area; |         t_jsonObject["area"] = properties.location.area.toUtf8().constData(); | ||||||
|         t_jsonObject["street"] = properties.streetID; |         t_jsonObject["street"] = properties.streetID; | ||||||
|         t_jsonObject["onislandx"] = properties.location.isCayoPerico; |         t_jsonObject["onislandx"] = properties.location.isCayoPerico; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     const QJsonDocument jsonDocument(t_jsonObject); |     const std::string json = SnapmaticJson::serialize(t_jsonObject); | ||||||
|     if (setJsonStr(QString::fromUtf8(jsonDocument.toJson(QJsonDocument::Compact)))) { |     if (setJsonStr(QString::fromUtf8(json.c_str(), json.size()))) { | ||||||
|         localProperties = properties; |         localProperties = properties; | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|     return false; |     return false; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| bool SnapmaticPicture::setJsonStr(const QString &newJsonStr, bool updateProperties) | bool SnapmaticPicture::setJsonStr(const QString &json, bool updateProperties) | ||||||
| { | { | ||||||
|     const QJsonDocument t_jsonDocument = QJsonDocument::fromJson(newJsonStr.toStdString().c_str()); |     return setJsonStr(json.toStdString(), updateProperties); | ||||||
|     if (t_jsonDocument.isNull()) | } | ||||||
|         return false; |  | ||||||
|     const QByteArray t_jsonData = t_jsonDocument.toJson(QJsonDocument::Compact); |  | ||||||
|     jsonObject = t_jsonDocument.object(); |  | ||||||
| 
 | 
 | ||||||
|     p_ragePhoto.setJson(t_jsonData.constData()); | bool SnapmaticPicture::setJsonStr(const std::string &json, bool updateProperties) | ||||||
|  | { | ||||||
|  |     std::error_code ec; | ||||||
|  |     const boost::json::value t_jsonValue = boost::json::parse(json, ec); | ||||||
|  |     if (ec) | ||||||
|  |         return false; | ||||||
|  |     if (!t_jsonValue.is_object()) | ||||||
|  |         return false; | ||||||
|  |     const std::string t_json = SnapmaticJson::serialize(t_jsonValue); | ||||||
|  |     snapmaticJson.jsonObject = t_jsonValue.get_object(); | ||||||
|  | 
 | ||||||
|  |     p_ragePhoto.setJson(t_json.c_str()); | ||||||
|     if (updateProperties) |     if (updateProperties) | ||||||
|         parseJsonContent(); |         parseJsonContent(); | ||||||
|     return true; |     return true; | ||||||
|  |  | ||||||
|  | @ -19,6 +19,7 @@ | ||||||
| #ifndef SNAPMATICPICTURE_H | #ifndef SNAPMATICPICTURE_H | ||||||
| #define SNAPMATICPICTURE_H | #define SNAPMATICPICTURE_H | ||||||
| 
 | 
 | ||||||
|  | #include "SnapmaticJson.h" | ||||||
| #ifdef RAGEPHOTO_USE_ABI_WRAPPER | #ifdef RAGEPHOTO_USE_ABI_WRAPPER | ||||||
| #include <RagePhotoA.h> | #include <RagePhotoA.h> | ||||||
| typedef RagePhotoA RagePhoto; | typedef RagePhotoA RagePhoto; | ||||||
|  | @ -26,7 +27,6 @@ typedef RagePhotoA RagePhoto; | ||||||
| #include <RagePhoto.h> | #include <RagePhoto.h> | ||||||
| #endif | #endif | ||||||
| #include <QStringList> | #include <QStringList> | ||||||
| #include <QJsonObject> |  | ||||||
| #include <QDateTime> | #include <QDateTime> | ||||||
| #include <QObject> | #include <QObject> | ||||||
| #include <QString> | #include <QString> | ||||||
|  | @ -52,11 +52,11 @@ struct SnapmaticProperties { | ||||||
|         double z; |         double z; | ||||||
|         bool isCayoPerico; |         bool isCayoPerico; | ||||||
|     }; |     }; | ||||||
|     int uid; |     uint64_t uid; | ||||||
|     int crewID; |     uint64_t crewID; | ||||||
|     int streetID; |     uint64_t streetID; | ||||||
|     QStringList playersList; |     QStringList playersList; | ||||||
|     uint createdTimestamp; |     int64_t createdTimestamp; | ||||||
|     QDateTime createdDateTime; |     QDateTime createdDateTime; | ||||||
|     bool isMeme; |     bool isMeme; | ||||||
|     bool isMug; |     bool isMug; | ||||||
|  | @ -105,9 +105,11 @@ public: | ||||||
|     // JSON
 |     // JSON
 | ||||||
|     bool isJsonOk(); |     bool isJsonOk(); | ||||||
|     const QString getJsonStr(); |     const QString getJsonStr(); | ||||||
|  |     const std::string getJsonStdStr(); | ||||||
|     SnapmaticProperties getSnapmaticProperties(); |     SnapmaticProperties getSnapmaticProperties(); | ||||||
|     bool setSnapmaticProperties(SnapmaticProperties properties); |     bool setSnapmaticProperties(SnapmaticProperties properties); | ||||||
|     bool setJsonStr(const QString &jsonStr, bool updateProperties = false); |     bool setJsonStr(const std::string &json, bool updateProperties = false); | ||||||
|  |     bool setJsonStr(const QString &json, bool updateProperties = false); | ||||||
| 
 | 
 | ||||||
|     // VISIBILITY
 |     // VISIBILITY
 | ||||||
|     bool isHidden(); |     bool isHidden(); | ||||||
|  | @ -116,12 +118,11 @@ public: | ||||||
|     bool setPictureVisible(); |     bool setPictureVisible(); | ||||||
| 
 | 
 | ||||||
|     // ALTERNATIVES (MORE DEVELOPER FRIENDLY FUNCTION CALLS)
 |     // ALTERNATIVES (MORE DEVELOPER FRIENDLY FUNCTION CALLS)
 | ||||||
|     inline QString getJsonString() { return getJsonStr(); } |  | ||||||
|     inline QString getPictureJson() { return getJsonStr(); } |     inline QString getPictureJson() { return getJsonStr(); } | ||||||
|     inline QString getPictureTitle() { return getPictureTitl(); } |     inline QString getPictureTitle() { return getPictureTitl(); } | ||||||
|     inline uint32_t getPictureSize() { return ragePhoto()->jpegSize(); } |     inline uint32_t getPictureSize() { return ragePhoto()->jpegSize(); } | ||||||
|     inline QString getPictureString() { return getPictureStr(); } |     inline QString getPictureString() { return getPictureStr(); } | ||||||
|     inline bool setJsonString(const QString &jsonString, bool updateProperties = false) { return setJsonStr(jsonString, updateProperties); } // Please use setPictureJson instead
 |     inline bool setPictureJson(const std::string &json, bool updateProperties = false) { return setJsonStr(json, updateProperties); } | ||||||
|     inline bool setPictureJson(const QString &json, bool updateProperties = false) { return setJsonStr(json, updateProperties); } |     inline bool setPictureJson(const QString &json, bool updateProperties = false) { return setJsonStr(json, updateProperties); } | ||||||
|     inline bool setPictureTitle(const QString &title) { return setPictureTitl(title); } |     inline bool setPictureTitle(const QString &title) { return setPictureTitl(title); } | ||||||
|     inline void setPictureFileName(const QString &fileName) { return setPicFileName(fileName); } |     inline void setPictureFileName(const QString &fileName) { return setPicFileName(fileName); } | ||||||
|  | @ -169,7 +170,7 @@ private: | ||||||
|     void parseJsonContent(); |     void parseJsonContent(); | ||||||
|     bool jsonOk; |     bool jsonOk; | ||||||
|     SnapmaticProperties localProperties; |     SnapmaticProperties localProperties; | ||||||
|     QJsonObject jsonObject; |     SnapmaticJson snapmaticJson; | ||||||
| 
 | 
 | ||||||
|     // VERIFY CONTENT
 |     // VERIFY CONTENT
 | ||||||
|     static bool verifyTitleChar(const QChar &titleChar); |     static bool verifyTitleChar(const QChar &titleChar); | ||||||
|  | @ -182,8 +183,6 @@ signals: | ||||||
|     void preloaded(); |     void preloaded(); | ||||||
|     void updated(); |     void updated(); | ||||||
|     void loaded(); |     void loaded(); | ||||||
| 
 |  | ||||||
| public slots: |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif // SNAPMATICPICTURE_H
 | #endif // SNAPMATICPICTURE_H
 | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								src/json
									
										
									
									
									
										Submodule
									
								
							
							
						
						
									
										1
									
								
								src/json
									
										
									
									
									
										Submodule
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | Subproject commit 31b10c1b70556dfee414ef12f83d85e7d6443508 | ||||||
|  | @ -1 +1 @@ | ||||||
| Subproject commit cac7fd221f08a11e984d9b47b4383af548b388aa | Subproject commit 302be665e2bdd6fb00628ad6310b161dcf8c834d | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue