From 98cfa7c5deac5a124eef194cb9d56fafbe4459f8 Mon Sep 17 00:00:00 2001 From: Syping Date: Mon, 22 Mar 2021 05:54:46 +0100 Subject: [PATCH] gta5view 1.9.2 --- .ci/app.rc | 2 +- .ci/gta5view.nsi | 4 +- RagePhoto.cpp | 114 ++++++++++++++++++++-------- config.h | 4 +- res/app.rc | 10 +-- res/de.syping.gta5view.metainfo.xml | 3 +- res/gta5sync_fr.qm | Bin 47993 -> 47995 bytes res/gta5sync_fr.ts | 2 +- 8 files changed, 95 insertions(+), 44 deletions(-) diff --git a/.ci/app.rc b/.ci/app.rc index ec976d2..92f6518 100644 --- a/.ci/app.rc +++ b/.ci/app.rc @@ -24,7 +24,7 @@ BEGIN VALUE "FileDescription", "gta5view" VALUE "FileVersion", "MAJOR_VER.MINOR_VER.PATCH_VERSTR_BUILD_VER" VALUE "InternalName", "gta5view" - VALUE "LegalCopyright", "Copyright © 2016-2020 Syping" + VALUE "LegalCopyright", "Copyright © 2016-2021 Syping" VALUE "OriginalFilename", "gta5view.exe" VALUE "ProductName", "gta5view" VALUE "ProductVersion", "MAJOR_VER.MINOR_VER.PATCH_VERSTR_BUILD_VER" diff --git a/.ci/gta5view.nsi b/.ci/gta5view.nsi index 2b586d7..9b16d1b 100644 --- a/.ci/gta5view.nsi +++ b/.ci/gta5view.nsi @@ -3,8 +3,8 @@ !define APP_NAME "gta5view" !define COMP_NAME "Syping" !define WEB_SITE "https://gta5view.syping.de/" -!define VERSION "1.9.1.0" -!define COPYRIGHT "Copyright © 2016-2020 Syping" +!define VERSION "1.9.2.0" +!define COPYRIGHT "Copyright © 2016-2021 Syping" !define DESCRIPTION "Grand Theft Auto V Savegame and Snapmatic Viewer/Editor" !define INSTALLER_NAME "gta5view_setup.exe" !define MAIN_APP_EXE "gta5view.exe" diff --git a/RagePhoto.cpp b/RagePhoto.cpp index 9ddda87..5ea3c11 100644 --- a/RagePhoto.cpp +++ b/RagePhoto.cpp @@ -1,6 +1,6 @@ /***************************************************************************** * gta5view Grand Theft Auto V Profile Viewer -* Copyright (C) 2020 Syping +* Copyright (C) 2020-2021 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 @@ -90,15 +90,20 @@ bool RagePhoto::load() quint32 format = charToUInt32LE(uInt32Buffer); if (format == static_cast(PhotoFormat::GTA5)) { - char photoHeader[256]; - size = dataBuffer.read(photoHeader, 256); - if (size != 256) + char *photoHeader = static_cast(malloc(256)); + if (!photoHeader) return false; + size = dataBuffer.read(photoHeader, 256); + if (size != 256) { + free(photoHeader); + return false; + } for (const QChar &photoChar : utf16LEToString(photoHeader, 256)) { if (photoChar.isNull()) break; p_photoString += photoChar; } + free(photoHeader); size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) @@ -142,11 +147,16 @@ bool RagePhoto::load() return false; quint32 t_photoSize = charToUInt32LE(uInt32Buffer); - char photoData[t_photoSize]; - size = dataBuffer.read(photoData, t_photoSize); - if (size != t_photoSize) + char *photoData = static_cast(malloc(t_photoSize)); + if (!photoData) return false; + size = dataBuffer.read(photoData, t_photoSize); + if (size != t_photoSize) { + free(photoData); + return false; + } p_photoData = QByteArray(photoData, t_photoSize); + free(photoData); dataBuffer.seek(p_jsonOffset + 264); size = dataBuffer.read(markerBuffer, 4); @@ -160,15 +170,20 @@ bool RagePhoto::load() return false; p_jsonBuffer = charToUInt32LE(uInt32Buffer); - char jsonBytes[p_jsonBuffer]; - size = dataBuffer.read(jsonBytes, p_jsonBuffer); - if (size != p_jsonBuffer) + char *jsonBytes = static_cast(malloc(p_jsonBuffer)); + if (!jsonBytes) return false; + size = dataBuffer.read(jsonBytes, p_jsonBuffer); + if (size != p_jsonBuffer) { + free(jsonBytes); + return false; + } for (quint32 i = 0; i != p_jsonBuffer; i++) { if (jsonBytes[i] == '\x00') break; p_jsonData += jsonBytes[i]; } + free(jsonBytes); QJsonDocument t_jsonDocument = QJsonDocument::fromJson(p_jsonData); if (t_jsonDocument.isNull()) return false; @@ -186,15 +201,20 @@ bool RagePhoto::load() return false; p_titlBuffer = charToUInt32LE(uInt32Buffer); - char titlBytes[p_titlBuffer]; - size = dataBuffer.read(titlBytes, p_titlBuffer); - if (size != p_titlBuffer) + char *titlBytes = static_cast(malloc(p_titlBuffer)); + if (!titlBytes) return false; + size = dataBuffer.read(titlBytes, p_titlBuffer); + if (size != p_titlBuffer){ + free(titlBytes); + return false; + } for (const QChar &titlChar : QString::fromUtf8(titlBytes, p_titlBuffer)) { if (titlChar.isNull()) break; p_titleString += titlChar; } + free(titlBytes); dataBuffer.seek(p_descOffset + 264); size = dataBuffer.read(markerBuffer, 4); @@ -208,15 +228,20 @@ bool RagePhoto::load() return false; p_descBuffer = charToUInt32LE(uInt32Buffer); - char descBytes[p_descBuffer]; - size = dataBuffer.read(descBytes, p_descBuffer); - if (size != p_descBuffer) + char *descBytes = static_cast(malloc(p_descBuffer)); + if (!descBytes) return false; + size = dataBuffer.read(descBytes, p_descBuffer); + if (size != p_descBuffer) { + free(descBytes); + return false; + } for (const QChar &descChar : QString::fromUtf8(descBytes, p_descBuffer)) { if (descChar.isNull()) break; p_descriptionString += descChar; } + free(descBytes); dataBuffer.seek(p_endOfFile + 260); size = dataBuffer.read(markerBuffer, 4); @@ -243,12 +268,17 @@ bool RagePhoto::load() return false; quint32 compressedSize = charToUInt32LE(uInt32Buffer); - char compressedPhotoHeader[compressedSize]; - size = dataBuffer.read(compressedPhotoHeader, compressedSize); - if (size != compressedSize) + char *compressedPhotoHeader = static_cast(malloc(compressedSize)); + if (!compressedPhotoHeader) return false; + size = dataBuffer.read(compressedPhotoHeader, compressedSize); + if (size != compressedSize) { + free(compressedPhotoHeader); + return false; + } QByteArray t_photoHeader = QByteArray::fromRawData(compressedPhotoHeader, compressedSize); t_photoHeader = qUncompress(t_photoHeader); + free(compressedPhotoHeader); if (t_photoHeader.isEmpty()) return false; p_photoString = QString::fromUtf8(t_photoHeader); @@ -268,12 +298,17 @@ bool RagePhoto::load() return false; compressedSize = charToUInt32LE(uInt32Buffer); - char compressedPhoto[compressedSize]; - size = dataBuffer.read(compressedPhoto, compressedSize); - if (size != compressedSize) + char *compressedPhoto = static_cast(malloc(compressedSize)); + if (!compressedPhoto) return false; + size = dataBuffer.read(compressedPhoto, compressedSize); + if (size != compressedSize) { + free(compressedPhoto); + return false; + } QByteArray t_photoData = QByteArray::fromRawData(compressedPhoto, compressedSize); p_photoData = qUncompress(t_photoData); + free(compressedPhoto); size = dataBuffer.read(uInt32Buffer, 4); if (size != 4) @@ -290,12 +325,17 @@ bool RagePhoto::load() return false; compressedSize = charToUInt32LE(uInt32Buffer); - char compressedJson[compressedSize]; - size = dataBuffer.read(compressedJson, compressedSize); - if (size != compressedSize) + char *compressedJson = static_cast(malloc(compressedSize)); + if (!compressedJson) return false; + size = dataBuffer.read(compressedJson, compressedSize); + if (size != compressedSize) { + free(compressedJson); + return false; + } QByteArray t_jsonBytes = QByteArray::fromRawData(compressedJson, compressedSize); p_jsonData = qUncompress(t_jsonBytes); + free(compressedJson); if (p_jsonData.isEmpty()) return false; QJsonDocument t_jsonDocument = QJsonDocument::fromJson(p_jsonData); @@ -318,12 +358,17 @@ bool RagePhoto::load() return false; compressedSize = charToUInt32LE(uInt32Buffer); - char compressedTitl[compressedSize]; - size = dataBuffer.read(compressedTitl, compressedSize); - if (size != compressedSize) + char *compressedTitl = static_cast(malloc(compressedSize)); + if (!compressedTitl) return false; + size = dataBuffer.read(compressedTitl, compressedSize); + if (size != compressedSize) { + free(compressedTitl); + return false; + } QByteArray t_titlBytes = QByteArray::fromRawData(compressedTitl, compressedSize); t_titlBytes = qUncompress(t_titlBytes); + free(compressedTitl); p_titleString = QString::fromUtf8(t_titlBytes); size = dataBuffer.read(uInt32Buffer, 4); @@ -341,12 +386,17 @@ bool RagePhoto::load() return false; compressedSize = charToUInt32LE(uInt32Buffer); - char compressedDesc[compressedSize]; - size = dataBuffer.read(compressedDesc, compressedSize); - if (size != compressedSize) + char *compressedDesc = static_cast(malloc(compressedSize)); + if (!compressedDesc) return false; + size = dataBuffer.read(compressedDesc, compressedSize); + if (size != compressedSize) { + free(compressedDesc); + return false; + } QByteArray t_descBytes = QByteArray::fromRawData(compressedDesc, compressedSize); t_descBytes = qUncompress(t_descBytes); + free(compressedDesc); p_descriptionString = QString::fromUtf8(t_descBytes); size = dataBuffer.read(uInt32Buffer, 4); @@ -382,7 +432,7 @@ bool RagePhoto::load() size = dataBuffer.read(length, 1); if (size != 1) return false; - int i_length = QByteArray::number((int)length[0], 16).toInt() + 6; + int i_length = QByteArray::number(static_cast(length[0]), 16).toInt() + 6; #if QT_VERSION >= 0x050A00 size = dataBuffer.skip(i_length); diff --git a/config.h b/config.h index 98a7897..d3d59d2 100644 --- a/config.h +++ b/config.h @@ -40,11 +40,11 @@ #endif #ifndef GTA5SYNC_COPYRIGHT -#define GTA5SYNC_COPYRIGHT "2016-2020" +#define GTA5SYNC_COPYRIGHT "2016-2021" #endif #ifndef GTA5SYNC_APPVER -#define GTA5SYNC_APPVER "1.9.1" +#define GTA5SYNC_APPVER "1.9.2" #endif #if __cplusplus diff --git a/res/app.rc b/res/app.rc index 849660a..9eb654c 100644 --- a/res/app.rc +++ b/res/app.rc @@ -4,8 +4,8 @@ IDI_ICON1 ICON DISCARDABLE "5sync.ico" CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "gta5view.exe.manifest" #include VS_VERSION_INFO VERSIONINFO -FILEVERSION 1, 9, 1, 0 -PRODUCTVERSION 1, 9, 1, 0 +FILEVERSION 1, 9, 2, 0 +PRODUCTVERSION 1, 9, 2, 0 FILEFLAGSMASK 0x3fL FILEFLAGS 0 FILEOS VOS_NT_WINDOWS32 @@ -22,12 +22,12 @@ BEGIN BEGIN VALUE "CompanyName", "Syping" VALUE "FileDescription", "gta5view" - VALUE "FileVersion", "1.9.1" + VALUE "FileVersion", "1.9.2" VALUE "InternalName", "gta5view" - VALUE "LegalCopyright", "Copyright © 2016-2020 Syping" + VALUE "LegalCopyright", "Copyright © 2016-2021 Syping" VALUE "OriginalFilename", "gta5view.exe" VALUE "ProductName", "gta5view" - VALUE "ProductVersion", "1.9.1" + VALUE "ProductVersion", "1.9.2" END END END diff --git a/res/de.syping.gta5view.metainfo.xml b/res/de.syping.gta5view.metainfo.xml index 95daf20..aa82124 100644 --- a/res/de.syping.gta5view.metainfo.xml +++ b/res/de.syping.gta5view.metainfo.xml @@ -1,5 +1,5 @@ - + de.syping.gta5view de.syping.gta5view.desktop @@ -32,6 +32,7 @@ Syping + diff --git a/res/gta5sync_fr.qm b/res/gta5sync_fr.qm index d638131027f37c2c39ca25abc33b572d3113d9c6..9c8386dd6817e68fb6a743e63d02b895e75c66d6 100644 GIT binary patch delta 3340 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 diff --git a/res/gta5sync_fr.ts b/res/gta5sync_fr.ts index ce395c9..5d5c39f 100644 --- a/res/gta5sync_fr.ts +++ b/res/gta5sync_fr.ts @@ -305,7 +305,7 @@ et les fichiers de sauvegarde de Grand Theft Auto V Resolution: - Résolution: + Résolution :