replace json serializer with boost, libragephoto upstream

This commit is contained in:
Syping 2023-03-29 17:12:32 +02:00
parent aa4b2fc080
commit 557b999608
10 changed files with 308 additions and 104 deletions

3
.gitmodules vendored
View file

@ -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

View file

@ -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
) )

View file

@ -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();

View file

@ -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
View 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
View 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

View file

@ -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(&timestampOk); 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;

View file

@ -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

@ -0,0 +1 @@
Subproject commit 31b10c1b70556dfee414ef12f83d85e7d6443508

@ -1 +1 @@
Subproject commit cac7fd221f08a11e984d9b47b4383af548b388aa Subproject commit 302be665e2bdd6fb00628ad6310b161dcf8c834d