finishing up gta5view 1.4.0

This commit is contained in:
Syping 2017-08-26 14:13:35 +02:00
parent 8ddd79d667
commit e047e1b44d
19 changed files with 340 additions and 110 deletions

View file

@ -17,22 +17,22 @@ install:
before_script: before_script:
- export INSTALL_ROOT=/usr - export INSTALL_ROOT=/usr
- if [ `git name-rev --tags --name-only $(git rev-parse HEAD)` == "undefined" ]; then export APPLICATION_VERSION="$PACKAGE_VERSION.$TRAVIS_BUILD_NUMBER"; else export APPLICATION_VERSION=`git name-rev --tags --name-only $(git rev-parse HEAD)`; fi - if [ `git name-rev --tags --name-only $(git rev-parse HEAD)` == "undefined" ]; then export APPLICATION_VERSION="$PACKAGE_VERSION.$TRAVIS_BUILD_NUMBER"; else export APPLICATION_VERSION=`git name-rev --tags --name-only $(git rev-parse HEAD)`; fi
- echo "gta5view build version is $PACKAGE_VERSION" - echo "gta5view build version is $APPLICATION_VERSION"
- mkdir build - mkdir build
- mkdir package - mkdir package
- cd build - cd build
- echo "Grand Theft Auto V Snapmatic and Savegame viewer" > ./description-pak - echo "Grand Theft Auto V Snapmatic and Savegame viewer" > ./description-pak
script: script:
- qmake -qt=5 "DEFINES+=GTA5SYNC_DAILYB=\\\\\\\"$PACKAGE_VERSION-rc2\\\\\\\"" ../gta5view.pro - qmake -qt=5 "DEFINES+=GTA5SYNC_BUILDTYPE=\\\\\\\"Release\\\\\\\"" "DEFINES+=GTA5SYNC_DAILYB=\\\\\\\"$APPLICATION_VERSION\\\\\\\"" ../gta5view.pro
- make -j 4 - make -j 4
- sudo checkinstall -D --default --nodoc --pkgname=gta5view --pkgversion=$PACKAGE_VERSION --pkgrelease=rc2 --pkggroup=utility --maintainer="Syping on Travis \<travisci@syping.de\>" --requires=libqt5core5a,libqt5gui5,libqt5network5,libqt5widgets5 --pakdir=../package - sudo checkinstall -D --default --nodoc --pkgname=gta5view --pkgversion=$APPLICATION_VERSION --pkgrelease=travis1 --pkggroup=utility --maintainer="Syping on Travis \<travisci@syping.de\>" --requires=libqt5core5a,libqt5gui5,libqt5network5,libqt5widgets5 --pakdir=../package
deploy: deploy:
provider: releases provider: releases
api_key: api_key:
secure: "o7VneEz1aHfdVwZvOZLfopf6uJWNrFsZaBvunTmXFzpmNFhlNS1qwqgMUkIA2yBRbZ3wIzVs4vfwIHv7W9yE/PqK+AYL+R8+AwKGrwlgT4HqJNuk6VM/LNJ6GwT/qkQuaoOVw29bUjmzzgIRdHmw53SlJv6Hh1VE8HphlTT//aex6nCfcFhUZ0BETdZDWz5FSHwL3NalUoqfKfQrJeky5RXzCyCANQC2tKt0bV46GaWIgWrDo2KCTNqPtRWWf5GDmnkXE5IYRMQ3mXvO9iYh0v5Y2jo4PiXGUiFUU6Z3aAWFAiPdGclrBO697cf3lCTzDMhuCETR153qFYsLShUlFf61ITAmCeHAWETjZDri0lmPONo3GoNB6alGfYEA51qw14kXakrTpICtTJj7gw/gtUYOabW6hrzmieNzMBIy62RikDPjyakFnuwW2qNHRlD65e0jYv+6nCpb6E+OV16Ysh1zhV2vTfpfzVmSuyu2J+ELqXD3OZCXRSPpDIih9UQ8335p8FBji6jHORcgym/TRgdgRmENibh8tLzWp+UjpWHuWfcpvZgOskjfwU0iDMCayMJ7tDpOhXHcAhDRnd6XRIiOJ5YZCzflj2nEwmt3YUd7DwXS/AU+WHOmcNQBjXBxF/FJa35XXcy3HKJM5TTKqtph3medo30us5yXHeG6NNg=" secure: "o7VneEz1aHfdVwZvOZLfopf6uJWNrFsZaBvunTmXFzpmNFhlNS1qwqgMUkIA2yBRbZ3wIzVs4vfwIHv7W9yE/PqK+AYL+R8+AwKGrwlgT4HqJNuk6VM/LNJ6GwT/qkQuaoOVw29bUjmzzgIRdHmw53SlJv6Hh1VE8HphlTT//aex6nCfcFhUZ0BETdZDWz5FSHwL3NalUoqfKfQrJeky5RXzCyCANQC2tKt0bV46GaWIgWrDo2KCTNqPtRWWf5GDmnkXE5IYRMQ3mXvO9iYh0v5Y2jo4PiXGUiFUU6Z3aAWFAiPdGclrBO697cf3lCTzDMhuCETR153qFYsLShUlFf61ITAmCeHAWETjZDri0lmPONo3GoNB6alGfYEA51qw14kXakrTpICtTJj7gw/gtUYOabW6hrzmieNzMBIy62RikDPjyakFnuwW2qNHRlD65e0jYv+6nCpb6E+OV16Ysh1zhV2vTfpfzVmSuyu2J+ELqXD3OZCXRSPpDIih9UQ8335p8FBji6jHORcgym/TRgdgRmENibh8tLzWp+UjpWHuWfcpvZgOskjfwU0iDMCayMJ7tDpOhXHcAhDRnd6XRIiOJ5YZCzflj2nEwmt3YUd7DwXS/AU+WHOmcNQBjXBxF/FJa35XXcy3HKJM5TTKqtph3medo30us5yXHeG6NNg="
file: "../package/gta5view_$PACKAGE_VERSION-rc2_amd64.deb" file: "../package/gta5view_$APPLICATION_VERSION-travis1_amd64.deb"
skip_cleanup: true skip_cleanup: true
on: on:
tags: true tags: true

View file

@ -56,11 +56,11 @@ QString AppEnv::getGameFolder(bool *ok)
QString GTAV_defaultFolder = StandardPaths::documentsLocation() + QDir::separator() + "Rockstar Games" + QDir::separator() + "GTA V"; QString GTAV_defaultFolder = StandardPaths::documentsLocation() + QDir::separator() + "Rockstar Games" + QDir::separator() + "GTA V";
QString GTAV_returnFolder = GTAV_defaultFolder; QString GTAV_returnFolder = GTAV_defaultFolder;
QSettings SyncSettings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR); QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
SyncSettings.beginGroup("dir"); settings.beginGroup("dir");
bool forceDir = SyncSettings.value("force", false).toBool(); bool forceDir = settings.value("force", false).toBool();
GTAV_returnFolder = SyncSettings.value("dir", GTAV_defaultFolder).toString(); GTAV_returnFolder = settings.value("dir", GTAV_defaultFolder).toString();
SyncSettings.endGroup(); settings.endGroup();
if (forceDir) if (forceDir)
{ {
@ -125,9 +125,14 @@ QByteArray AppEnv::getUserAgent()
return QString("Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0 %1/%2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER).toUtf8(); return QString("Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Firefox/45.0 %1/%2").arg(GTA5SYNC_APPSTR, GTA5SYNC_APPVER).toUtf8();
} }
// QUrl AppEnv::getCrewFetchingUrl(QString crewID)
// {
// return QUrl(QString("https://socialclub.rockstargames.com/reference/crewfeed/%1").arg(crewID));
// }
QUrl AppEnv::getCrewFetchingUrl(QString crewID) QUrl AppEnv::getCrewFetchingUrl(QString crewID)
{ {
return QUrl(QString("https://socialclub.rockstargames.com/reference/crewfeed/%1").arg(crewID)); return QUrl(QString("https://socialclub.rockstargames.com/crew/%1/%1").arg(crewID));
} }
QUrl AppEnv::getPlayerFetchingUrl(QString crewID, QString pageNumber) QUrl AppEnv::getPlayerFetchingUrl(QString crewID, QString pageNumber)

View file

@ -82,6 +82,80 @@ void DatabaseThread::run()
} }
} }
// void DatabaseThread::scanCrewReference(QStringList crewList, int requestDelay)
// {
// foreach (const QString &crewID, crewList)
// {
// if (threadRunning && crewID != "0")
// {
// QNetworkAccessManager *netManager = new QNetworkAccessManager();
// QNetworkRequest netRequest(AppEnv::getCrewFetchingUrl(crewID));
// netRequest.setRawHeader("User-Agent", AppEnv::getUserAgent());
// netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
// netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3");
// netRequest.setRawHeader("Connection", "keep-alive");
// QNetworkReply *netReply = netManager->get(netRequest);
// QEventLoop *downloadLoop = new QEventLoop();
// QObject::connect(netReply, SIGNAL(finished()), downloadLoop, SLOT(quit()));
// QObject::connect(this, SIGNAL(threadEndCommited()), downloadLoop, SLOT(quit()));
// QTimer::singleShot(30000, downloadLoop, SLOT(quit()));
// downloadLoop->exec();
// delete downloadLoop;
// if (netReply->isFinished())
// {
// QByteArray crewJson = netReply->readAll();
// QJsonDocument crewDocument = QJsonDocument::fromJson(crewJson);
// QJsonObject crewObject = crewDocument.object();
// QVariantMap crewMap = crewObject.toVariantMap();
// QString crewName;
// bool isFound = false;
// if (crewMap.contains("activities"))
// {
// QList<QVariant> activitiesList = crewMap["activities"].toList();
// foreach (const QVariant &activitiesVariant, activitiesList)
// {
// QMap<QString, QVariant> activityRootMap = activitiesVariant.toMap();
// foreach(const QVariant &activityRootVariant, activityRootMap)
// {
// QMap<QString, QVariant> activityMap = activityRootVariant.toMap();
// foreach(const QVariant &activityVariant, activityMap)
// {
// QMap<QString, QVariant> activityFinalMap = activityVariant.toMap();
// if (activityFinalMap.contains("id") && activityFinalMap["id"] == crewID)
// {
// if (activityFinalMap.contains("name") && isFound == false)
// {
// isFound = true;
// crewName = activityFinalMap["name"].toString();
// }
// }
// }
// }
// }
// }
// if (!crewName.isNull())
// {
// crewDB->setCrewName(crewID.toInt(), crewName);
// }
// }
// QEventLoop *waitingLoop = new QEventLoop();
// QTimer::singleShot(requestDelay, waitingLoop, SLOT(quit()));
// QObject::connect(this, SIGNAL(threadEndCommited()), waitingLoop, SLOT(quit()));
// waitingLoop->exec();
// delete waitingLoop;
// delete netReply;
// delete netManager;
// }
// }
// }
void DatabaseThread::scanCrewReference(QStringList crewList, int requestDelay) void DatabaseThread::scanCrewReference(QStringList crewList, int requestDelay)
{ {
foreach (const QString &crewID, crewList) foreach (const QString &crewID, crewList)
@ -91,6 +165,9 @@ void DatabaseThread::scanCrewReference(QStringList crewList, int requestDelay)
QNetworkAccessManager *netManager = new QNetworkAccessManager(); QNetworkAccessManager *netManager = new QNetworkAccessManager();
QNetworkRequest netRequest(AppEnv::getCrewFetchingUrl(crewID)); QNetworkRequest netRequest(AppEnv::getCrewFetchingUrl(crewID));
#if QT_VERSION >= 0x050600
netRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
#endif
netRequest.setRawHeader("User-Agent", AppEnv::getUserAgent()); netRequest.setRawHeader("User-Agent", AppEnv::getUserAgent());
netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3"); netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3");
@ -107,38 +184,18 @@ void DatabaseThread::scanCrewReference(QStringList crewList, int requestDelay)
if (netReply->isFinished()) if (netReply->isFinished())
{ {
QByteArray crewJson = netReply->readAll();
QJsonDocument crewDocument = QJsonDocument::fromJson(crewJson);
QJsonObject crewObject = crewDocument.object();
QVariantMap crewMap = crewObject.toVariantMap();
QString crewName; QString crewName;
bool isFound = false; QByteArray crewHtml = netReply->readAll();
QStringList crewHtmlSplit1 = QString::fromUtf8(crewHtml).split("<title>Rockstar Games Social Club - Crew : ");
if (crewMap.contains("activities")) if (crewHtmlSplit1.length() >= 2)
{ {
QList<QVariant> activitiesList = crewMap["activities"].toList(); QStringList crewHtmlSplit2 = QString(crewHtmlSplit1.at(1)).split("</title>");
foreach (const QVariant &activitiesVariant, activitiesList) if (crewHtmlSplit2.length() >= 1)
{ {
QMap<QString, QVariant> activityRootMap = activitiesVariant.toMap(); crewName = crewHtmlSplit2.at(0);
foreach(const QVariant &activityRootVariant, activityRootMap)
{
QMap<QString, QVariant> activityMap = activityRootVariant.toMap();
foreach(const QVariant &activityVariant, activityMap)
{
QMap<QString, QVariant> activityFinalMap = activityVariant.toMap();
if (activityFinalMap.contains("id") && activityFinalMap["id"] == crewID)
{
if (activityFinalMap.contains("name") && isFound == false)
{
isFound = true;
crewName = activityFinalMap["name"].toString();
}
}
}
}
} }
} }
if (!crewName.isNull()) if (!crewName.isEmpty())
{ {
crewDB->setCrewName(crewID.toInt(), crewName); crewDB->setCrewName(crewID.toInt(), crewName);
} }
@ -171,6 +228,9 @@ void DatabaseThread::scanCrewMembersList(QStringList crewList, int maxPages, int
QNetworkAccessManager *netManager = new QNetworkAccessManager(); QNetworkAccessManager *netManager = new QNetworkAccessManager();
QNetworkRequest netRequest(AppEnv::getPlayerFetchingUrl(crewID, QString::number(currentPage))); QNetworkRequest netRequest(AppEnv::getPlayerFetchingUrl(crewID, QString::number(currentPage)));
#if QT_VERSION >= 0x050600
netRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
#endif
netRequest.setRawHeader("User-Agent", AppEnv::getUserAgent()); netRequest.setRawHeader("User-Agent", AppEnv::getUserAgent());
netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"); netRequest.setRawHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3"); netRequest.setRawHeader("Accept-Language", "en-US;q=0.5,en;q=0.3");

View file

@ -91,3 +91,13 @@ void ProfileLoader::run()
crewDB->addCrew(crewID); crewDB->addCrew(crewID);
} }
} }
void ProfileLoader::preloaded()
{
}
void ProfileLoader::loaded()
{
}

View file

@ -39,6 +39,10 @@ private:
CrewDatabase *crewDB; CrewDatabase *crewDB;
ProfileLoader *profileLoader; ProfileLoader *profileLoader;
private slots:
void preloaded();
void loaded();
signals: signals:
void pictureLoaded(SnapmaticPicture *picture); void pictureLoaded(SnapmaticPicture *picture);
void savegameLoaded(SavegameData *savegame, QString savegamePath); void savegameLoaded(SavegameData *savegame, QString savegamePath);

View file

@ -40,6 +40,9 @@
<layout class="QHBoxLayout" name="hlSavegame"> <layout class="QHBoxLayout" name="hlSavegame">
<item> <item>
<widget class="QCheckBox" name="cbSelected"> <widget class="QCheckBox" name="cbSelected">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>

View file

@ -21,6 +21,7 @@
#include "SnapmaticPicture.h" #include "SnapmaticPicture.h"
#include "StringParser.h" #include "StringParser.h"
#include "AppEnv.h" #include "AppEnv.h"
#include <QStringBuilder>
#include <QTextDocument> #include <QTextDocument>
#include <QInputDialog> #include <QInputDialog>
#include <QMessageBox> #include <QMessageBox>
@ -230,7 +231,7 @@ void SnapmaticEditor::on_cmdApply_clicked()
{ {
adjustedFileName.remove(adjustedFileName.length() - 7, 7); adjustedFileName.remove(adjustedFileName.length() - 7, 7);
} }
QString backupFileName = adjustedFileName + ".bak"; QString backupFileName = adjustedFileName % ".bak";
if (!QFile::exists(backupFileName)) if (!QFile::exists(backupFileName))
{ {
QFile::copy(adjustedFileName, backupFileName); QFile::copy(adjustedFileName, backupFileName);
@ -307,6 +308,10 @@ void SnapmaticEditor::on_labCrew_linkActivated(const QString &link)
int indexNum = 0; int indexNum = 0;
QStringList itemList; QStringList itemList;
QStringList crewList = crewDB->getCrews(); QStringList crewList = crewDB->getCrews();
if (!crewList.contains(QLatin1String("0")))
{
crewList.append(QLatin1String("0"));
}
crewList.sort(); crewList.sort();
foreach(const QString &crew, crewList) foreach(const QString &crew, crewList)
{ {

View file

@ -18,6 +18,7 @@
#include "SnapmaticPicture.h" #include "SnapmaticPicture.h"
#include "StringParser.h" #include "StringParser.h"
#include <QStringBuilder>
#include <QJsonDocument> #include <QJsonDocument>
#include <QJsonObject> #include <QJsonObject>
#include <QStringList> #include <QStringList>
@ -73,6 +74,7 @@ void SnapmaticPicture::reset()
jpegRawContentSize = 0; jpegRawContentSize = 0;
picExportFileName = ""; picExportFileName = "";
isCustomFormat = 0; isCustomFormat = 0;
isLoadedInRAM = 0;
pictureHead = ""; pictureHead = "";
pictureStr = ""; pictureStr = "";
lowRamMode = 0; lowRamMode = 0;
@ -90,37 +92,26 @@ void SnapmaticPicture::reset()
localSpJson = {}; localSpJson = {};
} }
bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bool fastLoad, bool lowRamMode_) bool SnapmaticPicture::preloadFile()
{ {
// Start opening file
// lastStep is like currentStep
// Set boolean values
writeEnabled = writeEnabled_;
cacheEnabled = cacheEnabled_;
lowRamMode = lowRamMode_;
if (!writeEnabled) { lowRamMode = false; } // Low RAM Mode only works when writeEnabled is true
QFile *picFile = new QFile(picFilePath); QFile *picFile = new QFile(picFilePath);
picFileName = QFileInfo(picFilePath).fileName(); picFileName = QFileInfo(picFilePath).fileName();
QIODevice *picStream;
if (!picFile->open(QFile::ReadOnly)) if (!picFile->open(QFile::ReadOnly))
{ {
lastStep = "1;/1,OpenFile," + StringParser::convertDrawStringForLog(picFilePath); lastStep = "1;/1,OpenFile," % StringParser::convertDrawStringForLog(picFilePath);
delete picFile; delete picFile;
return false; return false;
} }
if (picFilePath.right(4) != QLatin1String(".g5e"))
if (picFilePath.right(4) != ".g5e")
{ {
rawPicContent = picFile->read(snapmaticFileMaxSize); rawPicContent = picFile->read(snapmaticFileMaxSize);
picFile->close(); picFile->close();
delete picFile; delete picFile;
// Set Custom Format // Setting is values
isCustomFormat = false; isCustomFormat = false;
isLoadedInRAM = true;
} }
else else
{ {
@ -133,57 +124,78 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bo
// Reading g5e Content // Reading g5e Content
g5eContent.remove(0, 1); g5eContent.remove(0, 1);
if (g5eContent.left(3) == "G5E") if (g5eContent.left(3) == QByteArray("G5E"))
{ {
g5eContent.remove(0, 3); g5eContent.remove(0, 3);
if (g5eContent.left(2).toHex() == "1000") if (g5eContent.left(2).toHex() == QByteArray("1000"))
{ {
g5eContent.remove(0, 2); g5eContent.remove(0, 2);
if (g5eContent.left(3) == "LEN") if (g5eContent.left(3) == QByteArray("LEN"))
{ {
g5eContent.remove(0, 3); g5eContent.remove(0, 3);
int fileNameLength = g5eContent.left(1).toHex().toInt(); int fileNameLength = g5eContent.left(1).toHex().toInt();
g5eContent.remove(0, 1); g5eContent.remove(0, 1);
if (g5eContent.left(3) == "FIL") if (g5eContent.left(3) == QByteArray("FIL"))
{ {
g5eContent.remove(0, 3); g5eContent.remove(0, 3);
picFileName = g5eContent.left(fileNameLength); picFileName = g5eContent.left(fileNameLength);
g5eContent.remove(0, fileNameLength); g5eContent.remove(0, fileNameLength);
if (g5eContent.left(3) == "COM") if (g5eContent.left(3) == QByteArray("COM"))
{ {
g5eContent.remove(0, 3); g5eContent.remove(0, 3);
rawPicContent = qUncompress(g5eContent); rawPicContent = qUncompress(g5eContent);
// Setting is values
isLoadedInRAM = true;
} }
else else
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",4,G5E_FORMATERROR"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",4,G5E_FORMATERROR";
return false; return false;
} }
} }
else else
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",3,G5E_FORMATERROR"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",3,G5E_FORMATERROR";
return false; return false;
} }
} }
else else
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",2,G5E_FORMATERROR"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,G5E_FORMATERROR";
return false; return false;
} }
} }
else else
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",1,G5E_NOTCOMPATIBLE"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",1,G5E_NOTCOMPATIBLE";
return false; return false;
} }
} }
else else
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",1,G5E_FORMATERROR"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",1,G5E_FORMATERROR";
return false; return false;
} }
} }
emit preloaded();
return true;
}
bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bool fastLoad, bool lowRamMode_)
{
// Start opening file
// lastStep is like currentStep
// Set boolean values
writeEnabled = writeEnabled_;
cacheEnabled = cacheEnabled_;
lowRamMode = lowRamMode_;
if (!writeEnabled) { lowRamMode = false; } // Low RAM Mode only works when writeEnabled is true
QIODevice *picStream;
if (!isLoadedInRAM) { preloadFile(); }
picStream = new QBuffer(&rawPicContent); picStream = new QBuffer(&rawPicContent);
picStream->open(QIODevice::ReadWrite); picStream->open(QIODevice::ReadWrite);
@ -191,7 +203,7 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bo
// Reading Snapmatic Header // Reading Snapmatic Header
if (!picStream->isReadable()) if (!picStream->isReadable())
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",1,NOHEADER"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",1,NOHEADER";
picStream->close(); picStream->close();
delete picStream; delete picStream;
return false; return false;
@ -202,7 +214,7 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bo
// Reading JPEG Header Line // Reading JPEG Header Line
if (!picStream->isReadable()) if (!picStream->isReadable())
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",2,NOHEADER"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,NOHEADER";
picStream->close(); picStream->close();
delete picStream; delete picStream;
return false; return false;
@ -211,9 +223,9 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bo
// Checking for JPEG // Checking for JPEG
jpegHeaderLine.remove(0, jpegHeaderLineDifStr); jpegHeaderLine.remove(0, jpegHeaderLineDifStr);
if (jpegHeaderLine.left(4) != "JPEG") if (jpegHeaderLine.left(4) != QByteArray("JPEG"))
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",2,NOJPEG"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,NOJPEG";
picStream->close(); picStream->close();
delete picStream; delete picStream;
return false; return false;
@ -222,7 +234,7 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bo
// Read JPEG Stream // Read JPEG Stream
if (!picStream->isReadable()) if (!picStream->isReadable())
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",2,NOPIC"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",2,NOPIC";
picStream->close(); picStream->close();
delete picStream; delete picStream;
return false; return false;
@ -265,14 +277,14 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bo
// Read JSON Stream // Read JSON Stream
if (!picStream->isReadable()) if (!picStream->isReadable())
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",3,NOJSON"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",3,NOJSON";
picStream->close(); picStream->close();
delete picStream; delete picStream;
return false; return false;
} }
else if (picStream->read(4) != "JSON") else if (picStream->read(4) != QByteArray("JSON"))
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",3,CTJSON"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",3,CTJSON";
picStream->close(); picStream->close();
delete picStream; delete picStream;
return false; return false;
@ -283,14 +295,14 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bo
if (!picStream->isReadable()) if (!picStream->isReadable())
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",4,NOTITL"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",4,NOTITL";
picStream->close(); picStream->close();
delete picStream; delete picStream;
return false; return false;
} }
else if (picStream->read(4) != "TITL") else if (picStream->read(4) != QByteArray("TITL"))
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",4,CTTITL"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",4,CTTITL";
picStream->close(); picStream->close();
delete picStream; delete picStream;
return false; return false;
@ -300,14 +312,14 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bo
if (!picStream->isReadable()) if (!picStream->isReadable())
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",5,NODESC"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",5,NODESC";
picStream->close(); picStream->close();
delete picStream; delete picStream;
return picOk; return picOk;
} }
else if (picStream->read(4) != "DESC") else if (picStream->read(4) != QByteArray("DESC"))
{ {
lastStep = "2;/3,ReadingFile," + StringParser::convertDrawStringForLog(picFilePath) + ",5,CTDESC"; lastStep = "2;/3,ReadingFile," % StringParser::convertDrawStringForLog(picFilePath) % ",5,CTDESC";
picStream->close(); picStream->close();
delete picStream; delete picStream;
return false; return false;
@ -319,8 +331,11 @@ bool SnapmaticPicture::readingPicture(bool writeEnabled_, bool cacheEnabled_, bo
picStream->close(); picStream->close();
delete picStream; delete picStream;
if (!writeEnabled) { rawPicContent.clear(); } if (!writeEnabled) { rawPicContent.clear(); }
else if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); } else if (lowRamMode) { rawPicContent = qCompress(rawPicContent, 9); }
emit loaded();
return picOk; return picOk;
} }
@ -352,26 +367,26 @@ QString SnapmaticPicture::getSnapmaticTIDEString(const QByteArray &tideBytes)
void SnapmaticPicture::updateStrings() void SnapmaticPicture::updateStrings()
{ {
QString cmpPicTitl = titlStr; QString cmpPicTitl = titlStr;
cmpPicTitl.replace("\"", "''"); cmpPicTitl.replace('\"', "''");
cmpPicTitl.replace(" ", "_"); cmpPicTitl.replace(' ', '_');
cmpPicTitl.replace(":", "-"); cmpPicTitl.replace(':', '-');
cmpPicTitl.replace("\\", ""); cmpPicTitl.remove('\\');
cmpPicTitl.replace("{", ""); cmpPicTitl.remove('{');
cmpPicTitl.replace("}", ""); cmpPicTitl.remove('}');
cmpPicTitl.replace("/", ""); cmpPicTitl.remove('/');
cmpPicTitl.replace("<", ""); cmpPicTitl.remove('<');
cmpPicTitl.replace(">", ""); cmpPicTitl.remove('>');
cmpPicTitl.replace("*", ""); cmpPicTitl.remove('*');
cmpPicTitl.replace("?", ""); cmpPicTitl.remove('?');
cmpPicTitl.replace(".", ""); cmpPicTitl.remove('.');
pictureStr = tr("PHOTO - %1").arg(localSpJson.createdDateTime.toString("MM/dd/yy HH:mm:ss")); pictureStr = tr("PHOTO - %1").arg(localSpJson.createdDateTime.toString("MM/dd/yy HH:mm:ss"));
sortStr = localSpJson.createdDateTime.toString("yyMMddHHmmss") + QString::number(localSpJson.uid); sortStr = localSpJson.createdDateTime.toString("yyMMddHHmmss") % QString::number(localSpJson.uid);
picExportFileName = sortStr + "_" + cmpPicTitl; picExportFileName = sortStr % "_" % cmpPicTitl;
} }
bool SnapmaticPicture::readingPictureFromFile(const QString &fileName, bool writeEnabled_, bool cacheEnabled_, bool fastLoad, bool lowRamMode_) bool SnapmaticPicture::readingPictureFromFile(const QString &fileName, bool writeEnabled_, bool cacheEnabled_, bool fastLoad, bool lowRamMode_)
{ {
if (fileName != "") if (!fileName.isEmpty())
{ {
picFilePath = fileName; picFilePath = fileName;
return readingPicture(writeEnabled_, cacheEnabled_, fastLoad, lowRamMode_); return readingPicture(writeEnabled_, cacheEnabled_, fastLoad, lowRamMode_);
@ -580,7 +595,7 @@ QImage SnapmaticPicture::getImage()
QFile *picFile = new QFile(picFilePath); QFile *picFile = new QFile(picFilePath);
if (!picFile->open(QFile::ReadOnly)) if (!picFile->open(QFile::ReadOnly))
{ {
lastStep = "1;/1,OpenFile," + StringParser::convertDrawStringForLog(picFilePath); lastStep = "1;/1,OpenFile," % StringParser::convertDrawStringForLog(picFilePath);
delete picFile; delete picFile;
return QImage(0, 0, QImage::Format_RGB888); return QImage(0, 0, QImage::Format_RGB888);
} }
@ -781,7 +796,7 @@ bool SnapmaticPicture::exportPicture(const QString &fileName, const QString form
QFile *picFile = new QFile(fileName); QFile *picFile = new QFile(fileName);
if (picFile->open(QIODevice::WriteOnly)) if (picFile->open(QIODevice::WriteOnly))
{ {
if (format == "G5E") if (format == QLatin1String("G5E"))
{ {
// Modern compressed export // Modern compressed export
QByteArray stockFileNameUTF8 = picFileName.toUtf8(); QByteArray stockFileNameUTF8 = picFileName.toUtf8();
@ -795,14 +810,15 @@ bool SnapmaticPicture::exportPicture(const QString &fileName, const QString form
numberLength = "00"; numberLength = "00";
} }
QByteArray g5eHeader; QByteArray g5eHeader;
g5eHeader.reserve(stockFileNameUTF8.length() + 16);
g5eHeader += '\x00'; // First Null Byte g5eHeader += '\x00'; // First Null Byte
g5eHeader += "G5E"; // GTA 5 Export g5eHeader += QByteArray("G5E"); // GTA 5 Export
g5eHeader += '\x10'; g5eHeader += '\x00'; // 2 byte GTA 5 Export Version g5eHeader += '\x10'; g5eHeader += '\x00'; // 2 byte GTA 5 Export Version
g5eHeader += "LEN"; // Before Length g5eHeader += QByteArray("LEN"); // Before Length
g5eHeader += QByteArray::fromHex(numberLength); // Length in HEX before Compressed g5eHeader += QByteArray::fromHex(numberLength); // Length in HEX before Compressed
g5eHeader += "FIL"; // Before File Name g5eHeader += QByteArray("FIL"); // Before File Name
g5eHeader += stockFileNameUTF8; // File Name g5eHeader += stockFileNameUTF8; // File Name
g5eHeader += "COM"; // Before Compressed g5eHeader += QByteArray("COM"); // Before Compressed
picFile->write(g5eHeader); picFile->write(g5eHeader);
if (!lowRamMode) if (!lowRamMode)
{ {
@ -815,7 +831,7 @@ bool SnapmaticPicture::exportPicture(const QString &fileName, const QString form
picFile->close(); picFile->close();
delete picFile; delete picFile;
} }
else if (format == "JPG") else if (format == QLatin1String("JPG"))
{ {
// JPEG export // JPEG export
QBuffer snapmaticStream(&rawPicContent); QBuffer snapmaticStream(&rawPicContent);
@ -876,7 +892,7 @@ bool SnapmaticPicture::deletePicFile()
bool SnapmaticPicture::isHidden() bool SnapmaticPicture::isHidden()
{ {
if (picFilePath.right(7) == ".hidden") if (picFilePath.right(7) == QLatin1String(".hidden"))
{ {
return true; return true;
} }
@ -891,7 +907,7 @@ bool SnapmaticPicture::setPictureHidden()
} }
if (!isHidden()) if (!isHidden())
{ {
QString newPicFilePath = QString(picFilePath + ".hidden"); QString newPicFilePath = QString(picFilePath % ".hidden");
if (QFile::rename(picFilePath, newPicFilePath)) if (QFile::rename(picFilePath, newPicFilePath))
{ {
picFilePath = newPicFilePath; picFilePath = newPicFilePath;

View file

@ -53,6 +53,7 @@ public:
explicit SnapmaticPicture(const QString &fileName = "", QObject *parent = 0); explicit SnapmaticPicture(const QString &fileName = "", QObject *parent = 0);
~SnapmaticPicture(); ~SnapmaticPicture();
void reset(); void reset();
bool preloadFile();
bool readingPictureFromFile(const QString &fileName, bool writeEnabled = true, bool cacheEnabled = false, bool fastLoad = true, bool lowRamMode = false); bool readingPictureFromFile(const QString &fileName, bool writeEnabled = true, bool cacheEnabled = false, bool fastLoad = true, bool lowRamMode = false);
bool readingPicture(bool writeEnabled = true, bool cacheEnabled = false, bool fastLoad = true, bool lowRamMode = false); bool readingPicture(bool writeEnabled = true, bool cacheEnabled = false, bool fastLoad = true, bool lowRamMode = false);
bool isPicOk(); bool isPicOk();
@ -121,6 +122,7 @@ private:
bool lowRamMode; bool lowRamMode;
bool writeEnabled; bool writeEnabled;
bool cacheEnabled; bool cacheEnabled;
bool isLoadedInRAM;
bool isCustomFormat; bool isCustomFormat;
int jpegRawContentSize; int jpegRawContentSize;
int jpegRawContentSizeE; int jpegRawContentSizeE;
@ -138,7 +140,9 @@ private:
static bool verifyTitleChar(const QChar &titleChar); static bool verifyTitleChar(const QChar &titleChar);
signals: signals:
void preloaded();
void updated(); void updated();
void loaded();
public slots: public slots:
}; };

View file

@ -40,6 +40,9 @@
<layout class="QHBoxLayout" name="hlSnapmatic"> <layout class="QHBoxLayout" name="hlSnapmatic">
<item> <item>
<widget class="QCheckBox" name="cbSelected"> <widget class="QCheckBox" name="cbSelected">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="text"> <property name="text">
<string/> <string/>
</property> </property>

View file

@ -38,7 +38,7 @@ QString StringParser::parseTitleString(const QByteArray &commitBytes, int maxLen
{ {
Q_UNUSED(maxLength) Q_UNUSED(maxLength)
QString retStr = QTextCodec::codecForName("UTF-16LE")->toUnicode(commitBytes).trimmed(); QString retStr = QTextCodec::codecForName("UTF-16LE")->toUnicode(commitBytes).trimmed();
retStr.remove(QChar((char)0x00)); retStr.remove(QChar('\x00'));
return retStr; return retStr;
} }

View file

@ -88,6 +88,9 @@ UserInterface::UserInterface(ProfileDatabase *profileDB, CrewDatabase *crewDB, D
void UserInterface::setupDirEnv() void UserInterface::setupDirEnv()
{ {
// settings init
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
bool folderExists; bool folderExists;
GTAV_Folder = AppEnv::getGameFolder(&folderExists); GTAV_Folder = AppEnv::getGameFolder(&folderExists);
if (folderExists) if (folderExists)
@ -102,11 +105,18 @@ void UserInterface::setupDirEnv()
folderExists = true; folderExists = true;
QDir::setCurrent(GTAV_Folder); QDir::setCurrent(GTAV_Folder);
AppEnv::setGameFolder(GTAV_Folder); AppEnv::setGameFolder(GTAV_Folder);
// First time folder selection save
settings.beginGroup("dir");
if (settings.value("dir", "").toString().isEmpty())
{
settings.setValue("dir", GTAV_Folder);
}
settings.endGroup();
} }
} }
// profiles init // profiles init
QSettings settings(GTA5SYNC_APPVENDOR, GTA5SYNC_APPSTR);
settings.beginGroup("Profile"); settings.beginGroup("Profile");
QString defaultProfile = settings.value("Default", "").toString(); QString defaultProfile = settings.value("Default", "").toString();

View file

@ -50,14 +50,14 @@
#ifndef GTA5SYNC_APPVER #ifndef GTA5SYNC_APPVER
#ifndef GTA5SYNC_DAILYB #ifndef GTA5SYNC_DAILYB
#define GTA5SYNC_APPVER "1.4.0-rc2" #define GTA5SYNC_APPVER "1.4.0"
#else #else
#define GTA5SYNC_APPVER QString("%1").arg(GTA5SYNC_DAILYB) #define GTA5SYNC_APPVER QString("%1").arg(GTA5SYNC_DAILYB)
#endif #endif
#endif #endif
#ifndef GTA5SYNC_BUILDTYPE #ifndef GTA5SYNC_BUILDTYPE
#define GTA5SYNC_BUILDTYPE "Release Candidate" #define GTA5SYNC_BUILDTYPE "Custom"
#endif #endif
#ifndef GTA5SYNC_SHARE #ifndef GTA5SYNC_SHARE

View file

@ -132,6 +132,9 @@ win32: RC_FILE += res/app.rc
win32: LIBS += -luser32 win32: LIBS += -luser32
win32: CONFIG -= embed_manifest_exe win32: CONFIG -= embed_manifest_exe
# MAC OS X ONLY
macx: ICON = res/5sync.icns
# QT4 ONLY STUFF # QT4 ONLY STUFF
isEqual(QT_MAJOR_VERSION, 4): INCLUDEPATH += ./qjson4 isEqual(QT_MAJOR_VERSION, 4): INCLUDEPATH += ./qjson4

BIN
res/5sync.icns Normal file

Binary file not shown.

View file

@ -31,10 +31,11 @@
<qresource prefix="/global"> <qresource prefix="/global">
<file>global.de.ini</file> <file>global.de.ini</file>
<file>global.en.ini</file> <file>global.en.ini</file>
<file>global.ja.ini</file>
<file>global.fr.ini</file>
<file>global.zh.ini</file>
<file>global.es.ini</file> <file>global.es.ini</file>
<file>global.fr.ini</file>
<file>global.ja.ini</file>
<file>global.ru.ini</file>
<file>global.zh.ini</file>
</qresource> </qresource>
<qresource prefix="/template"> <qresource prefix="/template">
<file>template.g5e</file> <file>template.g5e</file>

106
res/global.ru.ini Normal file
View file

@ -0,0 +1,106 @@
[Global]
AIRP="Международный аэропорт Лос-Сантос"
ALAMO="Аламо-Си"
ALTA="Альта"
ARMYB="Форт-Занкудо"
BANNING="Бэннинг"
BAYTRE="Каньон Бэйтри"
BEACH="Веспуччи-Бич"
BHAMCA="Каньон Бэнхэм"
BRADP="Перевал Брэддока"
BRADT="Тоннель Брэддока"
BURTON="Бертон"
CALAFB="Калафиа-Бридж"
CANNY="Каньон Ратон"
CCREAK="Кэссиди-Крик"
CHAMH="Чемберлен-Хиллз"
CHIL="Вайнвуд-Хиллз"
CHU="Чумаш"
CMSW="Заповедник горы Чилиад"
COSI="Загород"
CYPRE="Сайпрес-Флэтс"
DAVIS="Дэвис"
DELBE="Дель-Перро-Бич"
DELPE="Дель-Перро"
DELSOL="Ла-Пуэрта"
DESRT="Пустыня Гранд-Сенора"
DOWNT="Центр"
DTVINE="Центр Вайнвуда"
EAST_V="Восточный Вайнвуд"
EBURO="Эль-Бурро-Хайтс"
ECLIPS="Эклипс"
ELGORL="Маяк Эль-Гордо"
ELSANT="Восточный Лос-Сантос"
ELYSIAN="Элизиан-Айленд"
GALFISH="Галили"
GALLI="Галилео-Парк"
GOLF="Гольф-клуб"
GRAPES="Грейпсид"
GREATC="Грейт-Чапаррал"
HARMO="Хармони"
HAWICK="Хавик"
HEART="Харт-Аттакс-Бич"
HORS="Гоночная трасса Вайнвуда"
HUD_MG_TRI_ALA="Аламо-Си"
HUD_MG_TRI_VES="Веспуччи"
HUMLAB="Лаборатория Humane Labs and Research"
JAIL="Тюрьма Болингброук"
KOREAT="Маленький Сеул"
LACT="Лэнд-экт-резервуар"
LAGO="Лаго-Занкудо"
LDAM="Лэнд-экт-дэм"
LMESA="Ла-Меса"
LOSPFY="Шоссе Ла-Пуэрта"
LOSPUER="Ла-Пуэрта"
LOSSF="Шоссе Лос-Сантоса"
MGCR_1="Южный Лос-Сантос"
MGCR_6="Каналы Веспуччи"
MGSR_3="Каньон Ратон"
MIRR="Миррор-Парк"
MORN="Морнингвуд"
MOVIE="Richards Majestic"
MTCHIL="Гора Чилиад"
MTGORDO="Гора Гордо"
MTJOSE="Гора Джосайя"
MURRI="Мурьета-Хайтс"
NCHU="Северный Чумаш"
OBSERV="Обсерватория Галилео"
OCEANA="Тихий океан"
PALCOV="Бухта Палето"
PALETO="Палето-Бэй"
PALFOR="Лес Палето"
PALHIGH="Нагорья Паломино"
PALMPOW="Электростанция Палмер-Тэйлор"
PBLUFF="Пасифик-Блаффс"
PBOX="Пиллбокс-Хилл"
PROCOB="Прокопио-Бич"
PROL="Северный Янктон"
RANCHO="Ранчо"
RGLEN="Ричман-Глен"
RICHM="Ричман"
ROCKF="Рокфорд-Хиллз"
RTRAK="Трасса Redwood Lights"
SANAND="Сан-Андреас"
SANCHIA="Сан-Шаньский горный хребет"
SANDY="Сэнди-Шорс"
SENORA="Шоссе Сенора"
SKID="Мишн-Роу"
SLAB="Стэб-Сити"
SLSANT="Южный Лос-Сантос"
STAD="Арена Maze Bank"
STRAW="Строберри"
TATAMO="Татавиамские горы"
TERMINA="Терминал"
TEXTI="Текстайл-Сити"
TONGVAH="Тонгва-Хиллз"
TONGVAV="Долина Тонгва"
UTOPIAG="Утопия-Гарденс"
VCANA="Каналы Веспуччи"
VESP="Веспуччи"
VINE="Вайнвуд"
WINDF="Ветряная ферма Ron Alternates"
WMIRROR="Вест-Миррор-драйв"
WVINE="Западный Вайнвуд"
ZANCUDO="Река Занкудо"
ZENORA="Шоссе Сенора"
ZP_ORT="Порт Южного Лос-Сантоса"

Binary file not shown.

View file

@ -1496,7 +1496,7 @@ Press 1 for Default View</source>
<message> <message>
<location filename="../UserInterface.ui" line="247"/> <location filename="../UserInterface.ui" line="247"/>
<source>&amp;Settings</source> <source>&amp;Settings</source>
<translation>Оп&amp;ции</translation> <translation>&amp;Настройки</translation>
</message> </message>
<message> <message>
<location filename="../UserInterface.ui" line="282"/> <location filename="../UserInterface.ui" line="282"/>