222 lines
8.8 KiB
C++
Executable File
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
|