Initial commit
This commit is contained in:
commit
b7d90b9afe
16245 files changed
+3396666
No files matched your search
@@ -0,0 +1,128 @@
|
||||
/**
|
||||
* @RDE_HEADER@
|
||||
* $Id$
|
||||
* $HeadURL$
|
||||
* $Author$
|
||||
* Created by Philipp Last, SLSE, 2017-12-01
|
||||
*/
|
||||
|
||||
#include "participant_dis_helper.h"
|
||||
|
||||
|
||||
namespace ParticipantManagement
|
||||
{
|
||||
namespace DIS
|
||||
{
|
||||
const QRegularExpression gRegExValidDIS(QStringLiteral("\\b([0-9])\\." // 8 Bit: Kind Field, exact values between 0 and 9
|
||||
"(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\." // 8 bit unspecified: Domain Field
|
||||
"(26[0-6]|2[0-5][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\." // 16 bit but highest value is 266 which is 'Uzbekistan'
|
||||
"(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.){3}" // 4x 8 bit unspecified: Category, Subcategory, Specific, Extra
|
||||
"(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\b")); // Disable leading zeros
|
||||
|
||||
/*
|
||||
* Converts a given integer to a MSDL QString which has 21 characters.
|
||||
* Adds leading zeros if missing.
|
||||
*
|
||||
* E.g: 3001222001246001000 (integer) becomes 003001222001246001000 (QString)
|
||||
*/
|
||||
QString convertDISTypeInteger2MSDLString(int64_t distype)
|
||||
{
|
||||
QString strDisType = QString::number(distype);
|
||||
|
||||
// Two leading zeros might be missing if the dis entity kind is small than 10 (-> [0, 255] i spossible]
|
||||
while (strDisType.size() < 21)
|
||||
strDisType.insert(0, QLatin1Char('0'));
|
||||
|
||||
return strDisType;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Converts a DIS type QString to an integer.
|
||||
* Adds leading zeros (if missing) to each dis attribute.
|
||||
*
|
||||
* Example: 3.1.222.1.246.1.0 -> 3001222001246001000
|
||||
*/
|
||||
int64_t convertDISTypeString2Integer(const QString &strDisType)
|
||||
{
|
||||
const QStringList list = strDisType.split(QLatin1Char('.'));
|
||||
|
||||
if (list.size() != 7)
|
||||
return -1;
|
||||
|
||||
QString strNumber(list[0]); // Prevent leading zeros
|
||||
|
||||
for (int i = 1; i < list.size(); ++i)
|
||||
{
|
||||
QString attribute = list[i];
|
||||
while (attribute.size() < 3)
|
||||
attribute.insert(0, QLatin1Char('0'));
|
||||
|
||||
strNumber += attribute;
|
||||
}
|
||||
|
||||
bool ok;
|
||||
int64_t number = strNumber.toLongLong(&ok, 10);
|
||||
|
||||
if (!ok)
|
||||
return -1;
|
||||
|
||||
return number;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Converts a DIS type integer to a QString which can be correct (according to the DIS standard) visualized to the user.
|
||||
* E.g. 3001222001246001000 (int) becomes 3.1.222.1.246.1.0 (QString)
|
||||
*/
|
||||
QString convertDISTypeInteger2DISString(int64_t distype)
|
||||
{
|
||||
QString strMSDL = convertDISTypeInteger2MSDLString(distype);
|
||||
QString strDis;
|
||||
|
||||
if (strMSDL.size() != 21)
|
||||
return strDis;
|
||||
|
||||
int index = 0;
|
||||
|
||||
for (int i = 0; i < 7; ++i)
|
||||
{
|
||||
QString part = strMSDL.mid(index, 3);
|
||||
part.remove(QRegularExpression(QStringLiteral("^[0]*")));
|
||||
|
||||
// It may be possible that a part is "000" which would be completely erased
|
||||
if (!part.size())
|
||||
part = QStringLiteral("0");
|
||||
|
||||
strDis += part;
|
||||
|
||||
if (i != 6)
|
||||
strDis += QLatin1Char('.');
|
||||
|
||||
index += 3;
|
||||
}
|
||||
|
||||
return strDis;
|
||||
}
|
||||
|
||||
|
||||
int64_t convertMSDLString2Integer(const QString &strMSDL, bool *ok)
|
||||
{
|
||||
int64_t number = strMSDL.toLongLong(ok, 10);
|
||||
return number;
|
||||
}
|
||||
|
||||
|
||||
QString convertMSDLString2DISString(const QString &strMSDL)
|
||||
{
|
||||
bool ok;
|
||||
int64_t number = convertMSDLString2Integer(strMSDL, &ok);
|
||||
|
||||
if (!ok)
|
||||
return QString();
|
||||
|
||||
return convertDISTypeInteger2DISString(number);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user