Files
qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Viewer/SituationMap/Symbology/sidc_codec.cpp
T

222 lines
8.8 KiB
C++
Executable File

/**
* @RDE_HEADER@
* SidcCodec for internal handling of SIDCs
* $Id$
* $HeadURL$
* $Author$
*/
// Own
#include "sidc_codec.h" // enbles highlighting and is harmless since 'pragma once'
#include "sidc_definitions.h"
#include <SymbologyXML/xml_symbol_codec.h>
// Qt
#include <QtCore/QRegularExpression>
namespace AdvancedSymbology
{
//
// SidcCodecHelper
//
namespace SidcCodecHelper
{
QString encode(SymbologyType symbologyType)
{
switch (symbologyType)
{
case SymbologyType::None: return QStringLiteral("NONE"); break;
case SymbologyType::APP6B: return QStringLiteral("AP6B"); break;
case SymbologyType::APP6D: return QStringLiteral("AP6D"); break;
case SymbologyType::MIL2525C: return QStringLiteral("M25C"); break;
case SymbologyType::MIL2525D: return QStringLiteral("M25D"); break;
};
return QLatin1String("EROR");
}
SymbologyType decodeSymbology(const QStringView &symbologyTypeStr)
{
SymbologyType symbologyType = SymbologyType::None;
if (symbologyTypeStr.compare(QLatin1String("NONE")) == 0) symbologyType = SymbologyType::None;
else if (symbologyTypeStr.compare(QLatin1String("AP6B")) == 0) symbologyType = SymbologyType::APP6B;
else if (symbologyTypeStr.compare(QLatin1String("AP6D")) == 0) symbologyType = SymbologyType::APP6D;
else if (symbologyTypeStr.compare(QLatin1String("M25C")) == 0) symbologyType = SymbologyType::MIL2525C;
else if (symbologyTypeStr.compare(QLatin1String("M25D")) == 0) symbologyType = SymbologyType::MIL2525D;
return symbologyType;
}
QString encode(SidcCodec::SidcType sidcType)
{
switch (sidcType)
{
case SidcCodec::SidcType::None: return QStringLiteral("NONE"); break;
case SidcCodec::SidcType::Base: return QStringLiteral("BASE"); break;
case SidcCodec::SidcType::Complete: return QStringLiteral("CMPL"); break;
case SidcCodec::SidcType::CivilEts: return QStringLiteral("CVLE"); break;
case SidcCodec::SidcType::CivilXml: return QStringLiteral("CVLX"); break;
}
return QLatin1String("EROR");
}
SidcCodec::SidcType decodeSidc(const QStringView &sidcTypeStr)
{
SidcCodec::SidcType symbologyType = SidcCodec::SidcType::None;
if ( sidcTypeStr.compare(QLatin1String("NONE")) == 0) symbologyType = SidcCodec::SidcType::None;
else if (sidcTypeStr.compare(QLatin1String("BASE")) == 0) symbologyType = SidcCodec::SidcType::Base;
else if (sidcTypeStr.compare(QLatin1String("CMPL")) == 0) symbologyType = SidcCodec::SidcType::Complete;
else if (sidcTypeStr.compare(QLatin1String("CVLE")) == 0) symbologyType = SidcCodec::SidcType::CivilEts;
else if (sidcTypeStr.compare(QLatin1String("CVLX")) == 0) symbologyType = SidcCodec::SidcType::CivilXml;
return symbologyType;
}
} // SidcCodecHelper
unsigned int SidcCodec::rawSidcOffset() { return 10; }
//
// isEncoded
//
bool SidcCodec::isEncoded(const QString &encodedSidc)
{
const QChar separator(QLatin1Char('|'));
return ((encodedSidc.size() > 9) && (encodedSidc.at(4) == separator) && (encodedSidc.at(9) == separator));
}
bool SidcCodec::checkSidcSyntax(const QString &encodedSidc)
{
if (!isEncoded(encodedSidc)) return false;
SidcCodec::SidcType sidcType = SidcCodecHelper::decodeSidc(QStringView(encodedSidc).slice(5, 4));
const QStringView symbologyTypeStr = QStringView(encodedSidc).slice(0, 4);
if (symbologyTypeStr.compare(QLatin1String("NONE")) == 0) return true;
else if (symbologyTypeStr.compare(QLatin1String("AP6B")) == 0) return true;
else if (symbologyTypeStr.compare(QLatin1String("AP6D")) == 0) return true;
else if (symbologyTypeStr.compare(QLatin1String("M25C")) == 0) return true;
else if ((symbologyTypeStr.compare(QLatin1String("M25D")) == 0) || (symbologyTypeStr.compare(QLatin1String("AP6D")) == 0))
{
const QString &rawSidcStr(encodedSidc.mid(10));
QRegularExpression isDigit(QStringLiteral("^[0..9]*$"));
if (isDigit.match(rawSidcStr).hasMatch())
{
switch (sidcType)
{
case SidcCodec::SidcType::Base : return (rawSidcStr.size() == 8); break;
case SidcCodec::SidcType::Complete : return (rawSidcStr.size() == 20); break;
default: break;
}
}
}
return false;
}
bool SidcCodec::isCivil(const QString &encodedSidc)
{
SidcCodec::SidcType sidcType = SidcCodec::decodeSidcType(encodedSidc);
return ((sidcType == SidcCodec::SidcType::CivilEts) || (sidcType == SidcCodec::SidcType::CivilXml));
}
//
// ENCODE
//
QString SidcCodec::encodeBaseSymbolCode(SymbologyType symbologyType, const QString &baseSymboCodeSidc)
{
return QStringLiteral("%1|BASE|%3").arg(SidcCodecHelper::encode(symbologyType), baseSymboCodeSidc);
}
QString SidcCodec::encodeComplete(SymbologyType symbologyType, const QString &completeSidc)
{
return QStringLiteral("%1|CMPL|%3").arg(SidcCodecHelper::encode(symbologyType), completeSidc);
}
QString SidcCodec::encodeCivilEts(const QString &civilSidc)
{
return QStringLiteral("NONE|CVLE|%1").arg(civilSidc);
}
QString SidcCodec::encodeCivilXml(const QString &civilSidc)
{
return QStringLiteral("NONE|CVLX|%1").arg(civilSidc);
}
int SidcCodec::decodeCivilXml(const QString &civilSidc)
{
return decodeRawSidc(civilSidc).toInt();
}
//
// DECODE
//
// QStringView(const QString &string, int position, int size);
// QString mid(int position, int n = -1) const Q_REQUIRED_RESULT;
//
SymbologyType SidcCodec::decodeSymbologyType(const QString &encodedSidc)
{
return SidcCodecHelper::decodeSymbology(QStringView(encodedSidc).slice(0, 4));
}
SidcCodec::SidcType SidcCodec::decodeSidcType(const QString &encodedSidc)
{
return SidcCodecHelper::decodeSidc(QStringView(encodedSidc).slice(5, 4));
}
QString SidcCodec::decodeRawSidc(const QString &encodedSidc)
{
return (isEncoded(encodedSidc)) ? encodedSidc.mid(rawSidcOffset()) : encodedSidc;
}
QString SidcCodec::encodeCivilXmlSymbolId( uint symbolId )
{
const QString &rawSidc = QString::number(symbolId);
return encodeCivilXml(rawSidc);
} // QString SidcCodec::encodeCivilXmlSymbolId( uint symbolId )
QString SidcCodec::encodeCivilXmlSymbolId( uint symbolId
, SymbologyXML::SymbolTypes::t_state state
, SymbologyXML::SymbolTypes::t_uncertainty uncertainty
, SymbologyXML::SymbolTypes::t_affil affil
, SymbologyXML::SymbolTypes::t_mob mob )
{
const QString &rawSidc = SymbologyXML::xmlSymbolEncodeId(symbolId,state,uncertainty,affil,mob);
return encodeCivilXml(rawSidc);
} // QString SidcCodec::encodeCivilXmlSymbolId(...)
QString SidcCodec::extractCivilXmlBaseSidc( const QString &sidc )
{
return SymbologyXML::xmlSymbolExtractBaseSidc(sidc);
} // QString SidcCodec::extractCivilXmlBaseSidc( const QString &sidc )
//
// Some convenience functions
QString SidcCodec::encodeBaseSymbolCode(SymbologyType symbologyType, const QStringView &baseSymboCodeSidc) { return encodeBaseSymbolCode(symbologyType, baseSymboCodeSidc.toString()); }
QString SidcCodec::encodeBaseSymbolCode(SymbologyType symbologyType, const std::string &baseSymboCodeSidc) { return encodeBaseSymbolCode(symbologyType, QString::fromStdString(baseSymboCodeSidc));}
QString SidcCodec::encodeBaseSymbolCode(SymbologyType symbologyType, const char *baseSymboCodeSidc) { return encodeBaseSymbolCode(symbologyType, QString::fromLatin1(baseSymboCodeSidc));}
QString SidcCodec::encodeComplete(SymbologyType symbologyType, const QStringView &completeSidc) { return encodeComplete(symbologyType, completeSidc.toString());}
QString SidcCodec::encodeComplete(SymbologyType symbologyType, const std::string &completeSidc) { return encodeComplete(symbologyType, QString::fromStdString(completeSidc)); }
QString SidcCodec::encodeComplete(SymbologyType symbologyType, const char *completeSidc) { return encodeComplete(symbologyType, QString::fromLatin1(completeSidc)); }
QString SidcCodec::encodeCivilEts(const QStringView &civilSidc) { return encodeCivilEts(civilSidc.toString());}
QString SidcCodec::encodeCivilEts(const std::string &civilSidc) { return encodeCivilEts(QString::fromStdString(civilSidc)); }
QString SidcCodec::encodeCivilEts(const char *civilSidc) { return encodeCivilEts(QString::fromLatin1(civilSidc)); }
QString SidcCodec::encodeCivilXml(const QStringView &civilSidc) { return encodeCivilXml(civilSidc.toString());}
QString SidcCodec::encodeCivilXml(const std::string &civilSidc) { return encodeCivilXml(QString::fromStdString(civilSidc)); }
QString SidcCodec::encodeCivilXml(const char *civilSidc) { return encodeCivilXml(QString::fromLatin1(civilSidc)); }
} // namespace AdvancedSymbology