Skip to content

Commit

Permalink
Merge pull request #125 from ea4k/Issue-8
Browse files Browse the repository at this point in the history
Fixes issue 8
  • Loading branch information
ea4k authored Apr 29, 2021
2 parents 7d57c86 + c05f7ac commit 7447578
Show file tree
Hide file tree
Showing 5 changed files with 155 additions and 56 deletions.
1 change: 1 addition & 0 deletions src/Changelog
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ TBD - 1.5.x
- Improvements on call identification management on user input.
- Bugfix: Editing removes QTH and name (Closes issue #113)
- Bugfix: Some complex calls (i.e. F/EA4K) were causing a crash unders some conditions.
- Bugfix: DX Entity of some complex calls where not properly identified. (Closes issue #8).

March 2021 - 1.5
- Added the 8M & 5M bands.
Expand Down
18 changes: 14 additions & 4 deletions src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3318,8 +3318,7 @@ bool MainWindow::validCharactersInCall(const QString &_qrz)

void MainWindow::slotQRZTextChanged(QString _qrz)
{
//qDebug()<< "MainWindow::slotQRZTextChanged: " << _qrz << "/" << _qrz<< endl;

//qDebug()<< "MainWindow::slotQRZTextChanged: " << _qrz << endl;

logEvent(Q_FUNC_INFO, "Start", logSeverity);
if (_qrz.length()<1)
Expand Down Expand Up @@ -3363,10 +3362,21 @@ void MainWindow::slotQRZTextChanged(QString _qrz)
int dx_ITUz = -1;
int dxE_ITUz = -1;
cleanQRZCOMreceivedDataFromUI();
//qDebug() << "MainWindow::slotQRZTextChanged: currentQRZ: " << endl;
//qDebug() << "MainWindow::slotQRZTextChanged: currentQRZ: " <<_qrz << endl;
QString pref = util->getPrefixFromCall(_qrz);
//qDebug() << "MainWindow::slotQRZTextChanged: pref: " << pref << endl;

if (pref.length ()>0)
{
currentEntity = world->getQRZARRLId(pref);
}
else
{
currentEntity = world->getQRZARRLId(_qrz);
}

//currentEntity = world->getQRZARRLId(util->getPrefixFromCall(_qrz));
currentEntity = world->getQRZARRLId(_qrz);
//currentEntity = world->getQRZARRLId(_qrz);
//selectCorrectComboBoxEntity(currentEntity);
//qDebug() << "MainWindow::slotQRZTextChanged: currentEntity: " << QString::number(currentEntity) << endl;
othersTabWidget->setEntity(currentEntity);
Expand Down
117 changes: 98 additions & 19 deletions src/utilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -650,13 +650,16 @@ int Utilities::isAPrefix (const QString &_c)
int pref = -1;
if (call.count(QRegularExpression("\\d")) >0) // Does it has any digit?
{
//qDebug() << "Utilities::isAPrefix: It has digits: " << call << endl;
bool done = false;
int i = -1;
while ((i < length) && !done)
while ((i < length-1) && !done)
{
//qDebug() << "Utilities::isAPrefix: in the while: " << QString::number(i) << endl;
i++;
if (call.at(i).isLetter ())
{
//qDebug() << "Utilities::isAPrefix: in the while: is a Letter: " << call.at(i) << endl;
if (pref>0)
{
pref = i;
Expand All @@ -665,24 +668,27 @@ int Utilities::isAPrefix (const QString &_c)
}
else
{
//qDebug() << "Utilities::isAPrefix: in the while: is NOT a Letter: " << call.at(i) << endl;
if (i > 0)
{
pref = i;
}
}
}
} // end of while
}

//qDebug() << "Utilities::isAPrefix: After the while: " << QString::number(pref) << endl;

QString prefix;
if (pref>0)
{
//qDebug() << "Utilities::isAPrefix: pref>0 =>: " << call.left (pref) << endl;
prefix = call.left (pref);
}
else
{
prefix = call;
//qDebug() << "Utilities::isAPrefix: pref<=0 =>: " << call << endl;
}

length = prefix.length();
Expand Down Expand Up @@ -854,42 +860,115 @@ bool Utilities::isValidCall(const QString &_c)
parts << call.split('/');
call = parts.at(0)+parts.at(1);
}
QString prefix = QString();
//QString prefix = QString();

if (call.count('/') == 1)
{ // Complex calls (like F/EA4K or EA4K/F OR /p OR /qrp
// We are just checking the call format not if it belongs to a country or whatever.
// It may return true for wrong calls like "ABC/EA4K"
// TODO: Add a check just for prefixes to fix the previous

QStringList parts;
parts.clear();
parts << call.split ('/');
if (parts.at(0).length ()>parts.at(1).length ())
{
return isValidSubCall (parts.at(0));
}
else if(parts.at(0).length ()>parts.at(1).length ())

//return ( ((isAPrefix (parts.at (0)))>0) || ((isAPrefix (parts.at (1)))>0) || (isValidSubCall (parts.at(0)) ) || (isValidSubCall (parts.at(1)) ));


if (parts.at(0).length ()<parts.at(1).length ())
{
return isValidSubCall (parts.at(1));
return ( ((isAPrefix (parts.at (0)))>0) && (isValidSubCall (parts.at(1)) ) );
}
else
{ //Both lenght are just the same, we need to check both parts and return true if one is valid
return (isValidSubCall (parts.at(0)) ) | (isValidSubCall (parts.at(1)) );
{ //Both lenght are just the same or the second is showter, we need to check both parts and return true if one is valid
// It may happen that we have a EA4K/QRP or EA4K/F or EA4K/TTT
return isValidSubCall (parts.at(0));
}
}
return isValidSubCall (call);
}
/*

QString Utilities::getPrefixFromCall(const QString &_c)
{
QPair<QString, QString> pair;
pair = getCallParts (_c);
if (pair.second.isEmpty ())
{
return QString();
}
//qDebug() << "Utilities::getPrefixFromCall: " << _c << endl;

fallar
QString call = _c;
call.replace('\\', '/');

if (call.count('/') == 2)
{ //Things like F/EA4K/P will become F/EA4K
QStringList parts;
parts.clear();
parts << call.split('/');
call = parts.at(0)+parts.at(1);
}

QString prefix = QString();
int pref = -1;
if (call.count('/') == 1)
{ // Complex calls (like F/EA4K or EA4K/F OR /p OR /qrp

QStringList parts;
parts.clear();
parts << call.split ('/');
if (parts.at(0).length ()<parts.at(1).length ())
{ // First one is shorter
//qDebug() << "Utilities::getPrefixFromCall: First one is shorter: " << endl;
int pref = isAPrefix (parts.at(0));
if (pref>0)
{
//qDebug() << "Utilities::getPrefixFromCall: R1=" << call.left (pref) << endl;
return parts.at(0);
}
else
{
//qDebug() << "Utilities::getPrefixFromCall: EMPTY-2" << endl;
return QString();
}
}
else if(parts.at(0).length ()>parts.at(1).length ())
{ // Second one is shorter
//qDebug() << "Utilities::getPrefixFromCall: Second one is shorter: " << endl;
pref = isAPrefix (parts.at(1));
if (pref>0)
{
//qDebug() << "Utilities::getPrefixFromCall: R2=" << parts.at(1) << endl;

return parts.at(1);
}
else
{
pref = isAPrefix (parts.at(0));
if (pref>0)
{
//qDebug() << "Utilities::getPrefixFromCall: R3=" << parts.at(0).left (pref) << endl;
return parts.at(0).left (pref);
}
else
{
//qDebug() << "Utilities::getPrefixFromCall: EMPTY-3" << endl;
return QString();
}
}

}
else
{ //Both lenght are just the same, we need to check both parts and return true if one is valid
//qDebug() << "Utilities::getPrefixFromCall: Same length, we shoudl consider the first one if valid, if not the second one " << endl;
}
}

pref = isAPrefix (call);
if (pref>0)
{
//qDebug() << "Utilities::getPrefixFromCall: R4=" << call.left (pref) << endl;
return call.left (pref);
}
//qDebug() << "Utilities::getPrefixFromCall: EMPTY-4" << endl;
return QString();
}

/*
QPair<QString, QString> Utilities::getCallParts(const QString &_c)
{ // DXCC prefix, if different from original, full call
Expand Down
2 changes: 1 addition & 1 deletion src/utilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ class Utilities
bool isValidDXCC(const int _d);
QStringList getValidADIFFieldAndData(const QString &_b);
QString getAValidCall (const QString &_wrongCall);
//QString getPrefixFromCall(const QString &_c);
QString getPrefixFromCall(const QString &_c);
//QString getPrefixFromFullCall(const QString &_c);

// Write DATE/TIME to DB
Expand Down
73 changes: 41 additions & 32 deletions tests/utilities/tst_utilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,11 +146,12 @@ void tst_Utilities::test_isValidCall()
// and a single digit,
// followed by a group of not more than four characters,
// the last of which shall be a letter,
QVERIFY(util->isValidCall("B1A") == true);
QVERIFY(util->isValidCall("B1AA") == true);
QVERIFY(util->isValidCall("B1AAA") == true);
QVERIFY(util->isValidCall("B1AAAA") == true);
QVERIFY(util->isValidCall("B11") == false);
//qDebug() << Q_FUNC_INFO << " 1 Letter" << endl;
QVERIFY2(util->isValidCall("B1A") == true, "B1A");
QVERIFY2(util->isValidCall("B1AA") == true, "B1AA");
QVERIFY2(util->isValidCall("B1AAA") == true, "B1AAA");
QVERIFY2(util->isValidCall("B1AAAA") == true, "B1AAAA");
QVERIFY2(util->isValidCall("B11") == false, "B11");
// TODO: FIX the isValidCall to cover these cases
//QVERIFY(util->isValidCall("B1A1") == false);
//QVERIFY(util->isValidCall("B1AA1") == false);
Expand All @@ -165,32 +166,33 @@ void tst_Utilities::test_isValidCall()

//2) or–two characters and a single digit,
// followed by a group of not more than four characters, the last of which shall be a letter.
QVERIFY(util->isValidCall("EA4K") == true);
QVERIFY(util->isValidCall("EA4KK") == true);
QVERIFY(util->isValidCall("EA4KKK") == true);
QVERIFY(util->isValidCall("EA4KKKK") == true);

QVERIFY(util->isValidCall("2E1A") == true);
QVERIFY(util->isValidCall("E73E") == true);
QVERIFY(util->isValidCall("EA5666K") == true);
//qDebug() << Q_FUNC_INFO << " 2 Letters" << endl;
QVERIFY2(util->isValidCall("EA4K") == true, "EA4K");
QVERIFY2(util->isValidCall("EA4KK") == true, "EA4KK");
QVERIFY2(util->isValidCall("EA4KKK") == true, "EA4KKK");
QVERIFY2(util->isValidCall("EA4KKKK") == true, "EA4KKKK");

QVERIFY2(util->isValidCall("2E1A") == true, "2E1A");
QVERIFY2(util->isValidCall("E33E") == true, "E33E");
QVERIFY2(util->isValidCall("EA5666K") == true, "EA5666K");

// 5(WRC-03)19.68A1A) On special occasions, for temporary use, administrations may authorize
// use of call signs with more than the four characters referred to in No. 19.68.(WRC-03

QVERIFY(util->isValidCall("EA4K") == true);
QVERIFY(util->isValidCall("EA4K/P") == true);
QVERIFY(util->isValidCall("EA4K/F") == true);
QVERIFY(util->isValidCall("EA4K/1") == true);
QVERIFY(util->isValidCall("EA4K/K1") == true);
QVERIFY(util->isValidCall("K1/EA4K") == true);
QVERIFY(util->isValidCall("K/EA4K") == true);
//qDebug() << Q_FUNC_INFO << " Complex" << endl;
QVERIFY2(util->isValidCall("EA4K/P") == true, "EA4K/P");
QVERIFY2(util->isValidCall("EA4K/F") == true, "EA4K/F");
QVERIFY2(util->isValidCall("EA4K/1") == true, "EA4K/1");
QVERIFY2(util->isValidCall("EA4K/K1") == true, "EA4K/K1");
QVERIFY2(util->isValidCall("K1/EA4K") == true, "K1/EA4K");
QVERIFY2(util->isValidCall("K/EA4K") == true, "K/EA4K");
// TODO: FIX the isValidCall to cover this case
//QVERIFY(util->isValidCall("1/EA4K") == false);
QVERIFY(util->isValidCall("EA") == false);
QVERIFY(util->isValidCall("EA4") == false);
QVERIFY(util->isValidCall("-") == false);
QVERIFY(util->isValidCall("EAK4") == false);
//qDebug() << Q_FUNC_INFO << " Wrong calls" << endl;
QVERIFY2(util->isValidCall("EA") == false, "EA");
QVERIFY2(util->isValidCall("EA4") == false, "EA4");
QVERIFY2(util->isValidCall("-") == false, "-");
QVERIFY2(util->isValidCall("EAK4") == false, "EAK4");
QVERIFY2(util->isValidCall("QQQ/EA4K") == false, "QQQ/EA4K");

}

Expand Down Expand Up @@ -236,17 +238,24 @@ void tst_Utilities::test_isValidADIFField()
{ //Test the full ADIF suite
QVERIFY(util->isValidADIFField("<CALL:4>EA4K") == true);
QVERIFY(util->isValidADIFField("<CALL:5>EA4K") == false);

}

void tst_Utilities::test_getPrefixFromCall()
{
//QVERIFY2(util->getPrefixFromCall ("K1AA") == QString("K"), "Wrong prefix 1" );
//QVERIFY2(util->getPrefixFromCall ("EA4K") == QString("EA"), "Wrong prefix 2" );
//QVERIFY2(util->getPrefixFromCall ("2E1AA") == QString("2E"), "Wrong prefix 2 Numb" );
//QVERIFY2(util->getPrefixFromCall ("E73E") == QString("E7"), "Wrong prefix 2 Letter/Numb");
//QVERIFY2(util->getPrefixFromCall ("AM200A") == QString("AM"), "Wrong prefix 2 Letter/Numb");

//qDebug() << Q_FUNC_INFO << " - K1AA: " << util->getPrefixFromCall ("K1AA") << endl;
QVERIFY2(util->getPrefixFromCall("K1AA") == "K1", "Wrong prefix 1" );
QVERIFY2(util->getPrefixFromCall("EA4K") == "EA4", "Wrong prefix 2" );
QVERIFY2(util->getPrefixFromCall("2E1AA") == "2E1", "Wrong prefix 2 Numb" );
QVERIFY2(util->getPrefixFromCall("E73E") == "E73", "Wrong prefix 2 Letter/Numb");
QVERIFY2(util->getPrefixFromCall("AM200A") == "AM200", "Wrong prefix 2 Letter/Numb");
QVERIFY2(util->getPrefixFromCall("EA4K/F") == "F", "Wrong prefix on complex 1" );
QVERIFY2(util->getPrefixFromCall("F/EA4K") == "F", "Wrong prefix on complex 2" );
QVERIFY2(util->getPrefixFromCall("EA4K/EA6") == "EA6", "Wrong prefix on complex 3" );
QVERIFY2(util->getPrefixFromCall("EA6/EA4K") == "EA6", "Wrong prefix on complex 4" );
QVERIFY2(util->getPrefixFromCall("EA6/EA4K/P") == "EA6", "Wrong prefix on complex 5" );
QVERIFY2(util->getPrefixFromCall("EA6/EA4K/QRP") == "EA6", "Wrong prefix on complex 6" );
//QVERIFY2(util->getPrefixFromCall("EA4K/VK9X") == "VK9X", "Wrong prefix on complex 7" );
QVERIFY2(util->getPrefixFromCall("VK9X/EA4K") == "VK9X", "Wrong prefix on complex 8" );
}

QTEST_APPLESS_MAIN(tst_Utilities)
Expand Down

0 comments on commit 7447578

Please sign in to comment.