196 lines
4.9 KiB
C++
Executable File
196 lines
4.9 KiB
C++
Executable File
/**
|
|
* @RDE_HEADER@
|
|
* Class SidcBuilderBase
|
|
* $Id$
|
|
* $HeadURL$
|
|
* $Author$
|
|
*/
|
|
|
|
// Own
|
|
#include "sidc_builder_base.h"
|
|
#include "sidc_codec.h"
|
|
|
|
// ESRI
|
|
|
|
|
|
// Qt
|
|
#include <QtCore/QDebug>
|
|
|
|
|
|
namespace AdvancedSymbology
|
|
{
|
|
|
|
|
|
SidcBuilderBase::SidcBuilderBase(SymbolDictionary *symbolDictionary, const char *loggerName)
|
|
: SidcDefinitions(symbolDictionary, loggerName)
|
|
{
|
|
}
|
|
|
|
|
|
QString SidcBuilderBase::baseSymbolCodeToSidc(const QString &baseSymbolCodeCodec)
|
|
{
|
|
if (!SidcCodec::isEncoded(baseSymbolCodeCodec))
|
|
{
|
|
qCritical() << LOGFUNCTION << " baseSymbolCodeCodec input parameter isn't encoded: " << baseSymbolCodeCodec;
|
|
return QString();
|
|
}
|
|
|
|
switch (SidcCodec::decodeSidcType(baseSymbolCodeCodec))
|
|
{
|
|
case SidcCodec::SidcType::CivilEts:
|
|
case SidcCodec::SidcType::CivilXml:
|
|
return baseSymbolCodeCodec;
|
|
case SidcCodec::SidcType::Base:
|
|
break;
|
|
default :
|
|
{
|
|
qCritical() << LOGFUNCTION << " baseSymbolCodeCodec is not a base symbol code: " << baseSymbolCodeCodec;
|
|
return QString();
|
|
}
|
|
} // switch
|
|
|
|
QString sidc;
|
|
QString baseSymbolCode = SidcCodec::decodeRawSidc(baseSymbolCodeCodec);
|
|
SymbologyType symbologyType = SidcCodec::decodeSymbologyType(baseSymbolCodeCodec);
|
|
|
|
if ((SymbologyType::MIL2525D == symbologyType) || (SymbologyType::APP6D == symbologyType))
|
|
{
|
|
//
|
|
// its MIL2525D or APP6D
|
|
//
|
|
|
|
if ((baseSymbolCode.size() != 8) && (baseSymbolCode.size() != 10))
|
|
{
|
|
return QString(); // failure !!
|
|
}
|
|
|
|
QRegExp sidcTemplate(QStringLiteral("^[0-9]{8}(_[0-9])?$"));
|
|
|
|
if (!sidcTemplate.exactMatch(baseSymbolCode))
|
|
{
|
|
return QString(); // Failure
|
|
}
|
|
|
|
// Version
|
|
sidc += QLatin1Char('1');
|
|
sidc += QLatin1Char('0');
|
|
|
|
// Standard Identity
|
|
sidc += QLatin1Char('0');
|
|
if (baseSymbolCode.size() == 10) sidc += baseSymbolCode[9];
|
|
else sidc += QLatin1Char('1');
|
|
|
|
// SymbolSet
|
|
sidc += baseSymbolCode[0];
|
|
sidc += baseSymbolCode[1];
|
|
|
|
// Status
|
|
sidc += QLatin1Char('0');
|
|
|
|
// HeadQuarter, TaskForce, Dummy
|
|
sidc += QLatin1Char('0');
|
|
|
|
// Amplifier/Descriptor
|
|
sidc += QLatin1Char('0');
|
|
sidc += QLatin1Char('0');
|
|
|
|
sidc += baseSymbolCode[2];
|
|
sidc += baseSymbolCode[3];
|
|
sidc += baseSymbolCode[4];
|
|
sidc += baseSymbolCode[5];
|
|
sidc += baseSymbolCode[6];
|
|
sidc += baseSymbolCode[7];
|
|
|
|
sidc = sidc.leftJustified(20, QLatin1Char('0'));
|
|
|
|
return SidcCodec::encodeComplete(symbologyType, sidc);
|
|
}
|
|
|
|
if (SymbologyType::APP6B == symbologyType)
|
|
{
|
|
sidc = baseSymbolCode;
|
|
sidc[1] = QLatin1Char('U');
|
|
sidc[3] = QLatin1Char('P');
|
|
|
|
return SidcCodec::encodeComplete(symbologyType, sidc);
|
|
}
|
|
|
|
return QString();
|
|
} // QString SidcBuilderBase::baseSymbolCodeToSidc(const QString &baseSymbolCodeCodec)
|
|
|
|
|
|
QString SidcBuilderBase::concreteSidcToBaseSymbolCode(const QString &sidcCodec)
|
|
{
|
|
if (!SidcCodec::isEncoded(sidcCodec))
|
|
{
|
|
qCritical() << LOGFUNCTION << " sidcCodec is not a complete sidc: " << sidcCodec;
|
|
return QString();
|
|
}
|
|
|
|
switch (SidcCodec::decodeSidcType(sidcCodec))
|
|
{
|
|
case SidcCodec::SidcType::CivilEts:
|
|
case SidcCodec::SidcType::CivilXml:
|
|
return sidcCodec;
|
|
break;
|
|
case SidcCodec::SidcType::Complete:
|
|
break;
|
|
default :
|
|
{
|
|
qCritical() << LOGFUNCTION << " sidcCodec is not a complete sidc: " << sidcCodec;
|
|
return QString();
|
|
}
|
|
} // switch
|
|
|
|
const QString &rawSidc = SidcCodec::decodeRawSidc(sidcCodec);
|
|
SymbologyType symbologyType = SidcCodec::decodeSymbologyType(sidcCodec);
|
|
|
|
switch (symbologyType)
|
|
{
|
|
case SymbologyType::APP6B :
|
|
{
|
|
const QString & baseSymbolCode = normalizeAPP6BaseSymbolCode(rawSidc);
|
|
|
|
return SidcCodec::encodeBaseSymbolCode(symbologyType, baseSymbolCode);
|
|
}
|
|
case SymbologyType::MIL2525C : return QString();
|
|
case SymbologyType::APP6D : // it's same as MIL2525D
|
|
case SymbologyType::MIL2525D :
|
|
{
|
|
if (rawSidc.count() != 20)
|
|
return QString();
|
|
|
|
QString baseSymbolCode(
|
|
QStringRef(&rawSidc, 4, 2).toString() +
|
|
QStringRef(&rawSidc, 10, 6).toString());
|
|
return SidcCodec::encodeBaseSymbolCode(symbologyType, baseSymbolCode);
|
|
} break;
|
|
|
|
case SymbologyType::None: return QString();
|
|
}
|
|
return QString();
|
|
|
|
} // QString SidcBuilderBase::concreteSidcToBaseSymbolCode(const QString &sidcCodec)
|
|
|
|
|
|
QString SidcBuilderBase::normalizeAPP6BaseSymbolCode(const QString & baseSymbolCode)
|
|
{
|
|
QString baseNorm = baseSymbolCode;
|
|
|
|
baseNorm.resize(15, QLatin1Char('*'));
|
|
|
|
baseNorm[1] = QLatin1Char('*');
|
|
baseNorm[3] = QLatin1Char('*');
|
|
|
|
if (QLatin1Char('*') != baseNorm[10]) baseNorm[10] = QLatin1Char('-');
|
|
if (QLatin1Char('*') != baseNorm[11]) baseNorm[11] = QLatin1Char('-');
|
|
if (QLatin1Char('*') != baseNorm[14]) baseNorm[14] = QLatin1Char('-');
|
|
|
|
return baseNorm;
|
|
|
|
} // QString SidcBuilderBase::normalizeAPP6BaseSymbolCode(const QString & baseSymbolCode)
|
|
|
|
|
|
|
|
} // namespace AdvancedSymbology
|