refs #930, utility conversion functions supporting compression

This commit is contained in:
Klaus Basan
2017-04-06 03:03:05 +02:00
committed by Mathew Sutcliffe
parent da59ff42a4
commit de80053c7c
3 changed files with 87 additions and 4 deletions

View File

@@ -11,6 +11,7 @@
#include "databaseutils.h"
#include "blackcore/webdataservices.h"
#include "blackmisc/logmessage.h"
#include "blackmisc/fileutils.h"
using namespace BlackMisc;
using namespace BlackMisc::Aviation;
@@ -239,6 +240,68 @@ namespace BlackCore
return stashModels;
}
QJsonDocument CDatabaseUtils::databaseJsonToQJsonDocument(const QString &content)
{
static const QString compressed("swift:");
if (content.isEmpty()) { return QJsonDocument(); }
QByteArray byteData;
if (Json::looksLikeJson(content))
{
// uncompressed
byteData = content.toUtf8();
}
else if (content.startsWith(compressed) && content.length() > compressed.length() + 3)
{
do
{
// "swift:1234:base64encoded
const int cl = compressed.length();
const int contentIndex = content.indexOf(':', cl);
if (contentIndex < cl) break; // should not happen, malformed
const QString ls = content.mid(cl, contentIndex - cl); // content length
bool ok;
const qint32 size = ls.toInt(&ok);
if (!ok) break; // malformed size
if (size < 1) break;
// Length header, unsigned, big-endian, 32-bit integer
QByteArray lengthHeader;
QDataStream stream(&lengthHeader, QIODevice::WriteOnly);
stream.setByteOrder(QDataStream::BigEndian);
stream << size;
QByteArray ba;
ba.append(content.mid(contentIndex));
ba = QByteArray::fromBase64(ba);
ba.insert(0, lengthHeader); // adding 4 bytes length header
byteData = qUncompress(ba);
}
while (false);
}
if (byteData.isEmpty()) { return QJsonDocument(); }
return QJsonDocument::fromJson(byteData);
}
QJsonDocument CDatabaseUtils::readQJsonDocumentFromDatabaseFile(const QString &filename)
{
const QString raw = CFileUtils::readFileToString(filename);
if (raw.isEmpty()) { return QJsonDocument(); }
return CDatabaseUtils::databaseJsonToQJsonDocument(raw);
}
QJsonObject CDatabaseUtils::readQJsonObjectFromDatabaseFile(const QString &filename)
{
const QString raw = CFileUtils::readFileToString(filename);
if (raw.isEmpty()) { return QJsonObject(); }
return BlackMisc::Json::jsonObjectFromString(raw);
}
QJsonObject CDatabaseUtils::readQJsonObjectFromDatabaseFile(const QString &directory, const QString &filename)
{
return CDatabaseUtils::readQJsonObjectFromDatabaseFile(CFileUtils::appendFilePaths(directory, filename));
}
bool CDatabaseUtils::hasDbAircraftData()
{
return sApp && sApp->hasWebDataServices() && sApp->getWebDataServices()->hasDbAircraftData();