Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions src/dataproxy_sqlite.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7800,6 +7800,87 @@ QStringList DataProxy_SQLite::getSpecialCallsigns()
return qs;
}

QList<DataProxy_SQLite::SpecialCallsignInfo> DataProxy_SQLite::getSpecialCallsignPairs()
{
QList<SpecialCallsignInfo> result;
QSqlQuery query;
query.setForwardOnly(true);
if (query.exec("SELECT substr(prefix, 2), dxcc, cqz, ituz FROM prefixesofentity WHERE prefix LIKE '=%' ORDER BY prefix"))
{
while (query.next())
{
SpecialCallsignInfo info;
info.callsign = query.value(0).toString();
info.dxcc = query.value(1).toInt();
info.cqz = query.value(2).toInt();
info.ituz = query.value(3).toInt();
result.append(info);
}
}
else
{
emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery());
}
return result;
}

bool DataProxy_SQLite::addSpecialCallsign(const QString &callsign, int dxccId, int cqz, int ituz)
{
// If a zone is not provided (< 1), fall back to the entity's default
if (cqz < 1) cqz = getCQzFromEntity(dxccId);
if (ituz < 1) ituz = getITUzFromEntity(dxccId);
if (cqz < 0 || ituz < 0)
return false;

const QString prefix = "=" + callsign.toUpper();
QSqlQuery query;
query.prepare("INSERT OR REPLACE INTO prefixesofentity (prefix, dxcc, cqz, ituz) VALUES (?, ?, ?, ?)");
query.addBindValue(prefix);
query.addBindValue(dxccId);
query.addBindValue(cqz);
query.addBindValue(ituz);
if (!query.exec())
{
emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery());
return false;
}
return true;
}

bool DataProxy_SQLite::removeSpecialCallsign(const QString &callsign)
{
const QString prefix = "=" + callsign.toUpper();
QSqlQuery query;
query.prepare("DELETE FROM prefixesofentity WHERE prefix = ?");
query.addBindValue(prefix);
if (!query.exec())
{
emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().text(), query.lastQuery());
return false;
}
return query.numRowsAffected() > 0;
}

int DataProxy_SQLite::getKLogSubEntityForCallsign(const QString &callsign, int baseDxcc)
{
// Inverse of the +1000 loop in World::readCTYCSV(): given the ARRL DXCC
// (e.g. 248 for Italy), find the longest prefix in prefixesofentity whose
// dxcc is a KLog sub-entity (>= 1000 and % 1000 == baseDxcc) and which the
// callsign begins with. Returns 0 if no sub-entity applies.
if (callsign.isEmpty() || baseDxcc <= 0 || baseDxcc >= 1000)
return 0;
QSqlQuery q;
q.prepare("SELECT dxcc FROM prefixesofentity "
"WHERE dxcc >= 1000 AND dxcc % 1000 = :base "
"AND :call LIKE prefix || '%' "
"ORDER BY length(prefix) DESC LIMIT 1");
q.bindValue(":base", baseDxcc);
q.bindValue(":call", callsign.toUpper());
if (q.exec() && q.next())
return q.value(0).toInt();
return 0;
}

/*
bool DataProxy_SQLite::getFreqHashData()
{
Expand Down Expand Up @@ -8345,6 +8426,15 @@ QString DataProxy_SQLite::getADIFFromQSOQuery(QSqlRecord rec, ExportMode _em, bo
qso.setDXCC((getADIFValueFromRec(rec, "dxcc")).toInt());
//qDebug() << Q_FUNC_INFO << ": - 100";

// For QSOs stored with the base DXCC (e.g. 248 for Italy), check whether
// the callsign prefix maps to a KLog sub-entity (e.g. 1248 for Sicily)
// so that APP_KLOG_DXCC can be emitted on export.
{
int sub = getKLogSubEntityForCallsign(qso.getCall(), qso.getDXCC());
if (sub > 0)
qso.setKlogDxcc(sub);
}

qso.setAddress(getADIFValueFromRec(rec, "address"));
qso.setAge((getADIFValueFromRec(rec, "age")).toDouble());

Expand Down
14 changes: 14 additions & 0 deletions src/dataproxy_sqlite.h
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,20 @@ class DataProxy_SQLite : public QObject
QString getEntityPrefixes(const int _enti);
QStringList getLongPrefixes();
QStringList getSpecialCallsigns();

struct SpecialCallsignInfo {
QString callsign;
int dxcc;
int cqz;
int ituz;
};
QList<SpecialCallsignInfo> getSpecialCallsignPairs();
bool addSpecialCallsign(const QString &callsign, int dxccId, int cqz = -1, int ituz = -1);
bool removeSpecialCallsign(const QString &callsign);
// Mirror of the +1000 logic in World::readCTYCSV(): given a callsign and its
// base ARRL DXCC, look up prefixesofentity to find the KLog sub-entity
// (id >= 1000 whose id % 1000 matches the base). Returns 0 if none found.
int getKLogSubEntityForCallsign(const QString &callsign, int baseDxcc);
QHash<QString, int> getWorldData();
//bool getFreqHashData();

Expand Down
9 changes: 9 additions & 0 deletions src/filemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -996,6 +996,15 @@ int FileManager::processQSO(QSO& qso, const QString& _stationCallsign)
if (qso.getDXCC() < 1)
qso.setDXCC(world->getQRZARRLId(qso.getCall()));

// Restore KLog sub-entity (e.g. 1248 for Sicily) from APP_KLOG_DXCC if the
// value is consistent with the standard DXCC and matches the callsign prefix.
{
int kd = qso.getKlogDxcc();
int d = qso.getDXCC();
if (kd >= 1000 && d > 0 && kd % 1000 == d && world->getQRZARRLId(qso.getCall()) == kd)
qso.setDXCC(kd);
}

// 4. LoTW path: quirurgical UPDATE of only LoTW fields, no full SELECT+UPDATE
if (qso.getLoTWUpdating())
{
Expand Down
2 changes: 1 addition & 1 deletion src/inputwidgets/mainwindowinputothers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ QSO MainWindowInputOthers::getQSOData(QSO _qso)
{
QSO qso = _qso;

qso.setDXCC(getEntity() % 1000);
qso.setDXCC(getEntity());
//qDebug() << Q_FUNC_INFO << " - DXCC: " << qso.getDXCC();
qso.setState(getState());
// qso.setCounty() //TODO: Related to entitySecDivComboBox when implemented
Expand Down
5 changes: 1 addition & 4 deletions src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5623,11 +5623,8 @@ void MainWindow::slotShowQSOsFromDXCCWidget(QList<int> _qsos)
//qDebug() << Q_FUNC_INFO << "Call: " << q.getCall();
//qDebug() << Q_FUNC_INFO << "Mode: " << q.getMode();

int dxcc = world->getQRZARRLId(q.getCall());
//qDebug() << Q_FUNC_INFO << "040";
dxcc = util->getNormalizedDXCCValue (dxcc);
q.setDXCC(world->getQRZARRLId(q.getCall()));
//qDebug() << Q_FUNC_INFO << "050";
q.setDXCC(dxcc);
q.setClubLogStatus(clublogSentDefault);
q.setLoTWQSL_SENT(lotwSentDefault);
q.setEQSLQSL_SENT(eqslSentDefault);
Expand Down
42 changes: 38 additions & 4 deletions src/qso.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@
darc_dok = other.darc_dok;
distance = other.distance;
dxcc = other.dxcc;
klogDxcc = other.klogDxcc;

Check warning on line 101 in src/qso.cpp

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Do not assign data members in a constructor. Initialize member "klogDxcc" in an initialization list.

See more on https://sonarcloud.io/project/issues?id=ea4k_klog&issues=AZ2_1bxXqwavNoKBjqjo&open=AZ2_1bxXqwavNoKBjqjo&pullRequest=991
email = other.email;
ownerCall = other.ownerCall;
contacted_owner = other.contacted_owner;
Expand Down Expand Up @@ -234,6 +235,7 @@
qsoId = _other.qsoId;
logId = _other.logId;
dxcc = _other.dxcc;
klogDxcc = _other.klogDxcc;
a_index = _other.a_index;
k_index = _other.k_index;
cqz = _other.cqz;
Expand Down Expand Up @@ -446,6 +448,7 @@
setDarcDok(other.darc_dok);
setDistance(other.distance);
setDXCC(other.dxcc);
klogDxcc = other.klogDxcc;
setEmail(other.email);
setOwnerCallsign(other.ownerCall);
setContactedOperator(other.contacted_op);
Expand Down Expand Up @@ -672,6 +675,7 @@
darc_dok = QString();
distance = -1.0;
dxcc = 0;
klogDxcc = 0;
email = QString();
ownerCall = QString();
contacted_owner = QString();
Expand Down Expand Up @@ -1761,6 +1765,23 @@
return dxcc;
}

bool QSO::setKlogDxcc(const int _i)
{
if (_i >= 1000 && _i % 1000 > 0)
klogDxcc = _i;
return true;
}

bool QSO::setKlogDxcc(const QString &data)
{
return setKlogDxcc(data.toInt());
}

int QSO::getKlogDxcc() const
{
return klogDxcc;
}

bool QSO::setPropMode(const QString &_c)
{
//qDebug() << Q_FUNC_INFO << _c;
Expand Down Expand Up @@ -3580,6 +3601,7 @@
{"DARC_DOK", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDarcDok)},
{"DISTANCE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDistance)},
{"DXCC", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setDXCC)},
{"APP_KLOG_DXCC", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setKlogDxcc)},
{"EMAIL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEmail)},
{"EQ_CALL", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setOwnerCallsign)},
{"EQSL_QSLRDATE", decltype(std::mem_fn(&QSO::decltype_function))(&QSO::setEQSLQSLRDate)},
Expand Down Expand Up @@ -3913,8 +3935,14 @@
if (adif->isValidITUz(itu_zone))
adifStr.append(adif->getADIFField ("ITUZ", QString::number(itu_zone) ));

if (adif->isValidDXCC(dxcc) && (dxcc>0))
adifStr.append(adif->getADIFField ("DXCC", QString::number(dxcc)));
{
int adifDxcc = (dxcc >= 1000) ? (dxcc % 1000) : dxcc;
int klogExport = (dxcc >= 1000) ? dxcc : klogDxcc;
if (adif->isValidDXCC(adifDxcc) && adifDxcc > 0)
adifStr.append(adif->getADIFField("DXCC", QString::number(adifDxcc)));
if (klogExport >= 1000)
adifStr.append(adif->getADIFField("APP_KLOG_DXCC", QString::number(klogExport)));
}
adifStr.append(adif->getADIFField ("ADDRESS", address));
if (age>0.0) //Only relevant if Age >0
adifStr.append(adif->getADIFField ("AGE", QString::number(age)));
Expand Down Expand Up @@ -4209,8 +4237,14 @@
//Utilities util(Q_FUNC_INFO);
adifStr.append(adif->getADIFField ("QSO_DATE", util->getADIFDateFromQDateTime(qso_dateTime)));
adifStr.append(adif->getADIFField ("TIME_ON", util->getADIFTimeFromQDateTime(qso_dateTime)));
if (adif->isValidDXCC(dxcc) && (dxcc>0))
adifStr.append(adif->getADIFField ("DXCC", QString::number(dxcc)));
{
int adifDxcc = (dxcc >= 1000) ? (dxcc % 1000) : dxcc;
int klogExport = (dxcc >= 1000) ? dxcc : klogDxcc;
if (adif->isValidDXCC(adifDxcc) && adifDxcc > 0)
adifStr.append(adif->getADIFField("DXCC", QString::number(adifDxcc)));
if (klogExport >= 1000)
adifStr.append(adif->getADIFField("APP_KLOG_DXCC", QString::number(klogExport)));
}
adifStr.append(adif->getADIFField ("credit_granted", credit_granted ));
adifStr.append(adif->getADIFField ("lotw_qsl_rcvd", lotw_qsl_rcvd));
adifStr.append(adif->getADIFField ("qsl_rcvd", getQSL_RCVD()));
Expand Down
5 changes: 4 additions & 1 deletion src/qso.h
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,9 @@
// Others Tab
bool setDXCC(const int _i);
int getDXCC() const;
bool setKlogDxcc(const int _i);
bool setKlogDxcc(const QString &data);
int getKlogDxcc() const;
bool setPropMode(const QString &_c);
QString getPropMode() const;
bool setSOTA_REF(const QString &_c);
Expand Down Expand Up @@ -498,7 +501,7 @@
void logEvent(const QString &_func, const QString &_msg, DebugLogLevel _level);
void cleanMode(); // Cleans mode & submode

int qsoId, logId, dxcc, k_index, cqz, fists, fists_cc, my_fists, iota_ID, itu_zone, nr_bursts, max_bursts, nr_pings, my_cqz, my_itu_zone, my_dxcc, my_iota_ID, srx, stx, uksmg;
int qsoId, logId, dxcc, klogDxcc, k_index, cqz, fists, fists_cc, my_fists, iota_ID, itu_zone, nr_bursts, max_bursts, nr_pings, my_cqz, my_itu_zone, my_dxcc, my_iota_ID, srx, stx, uksmg;

Check warning on line 504 in src/qso.h

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Define each identifier in a dedicated statement.

See more on https://sonarcloud.io/project/issues?id=ea4k_klog&issues=AZ2_1b0uqwavNoKBjqjp&open=AZ2_1b0uqwavNoKBjqjp&pullRequest=991
int ten_ten, sfi;
double pwr_rx, pwr_tx, age, ant_el, ant_az, distance, altitude, my_altitude, a_index;
Frequency freq_tx, freq_rx;
Expand Down
Loading
Loading