Added missing files. Part of #2008

This commit is contained in:
f4exb 2024-03-07 15:28:31 +01:00
parent 56f3cfb769
commit 446e1a258a
8 changed files with 4520 additions and 0 deletions

View File

@ -0,0 +1,5 @@
<RCC>
<qresource prefix="/">
<file>data/cty.dat</file>
</qresource>
</RCC>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,21 @@
Copyright © 1994-
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
“Software”), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Proudly powered by WordPress

215
sdrbase/util/callsign.cpp Normal file
View File

@ -0,0 +1,215 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
// This source code file was last time modified by Arvo ES1JA on January 5th, 2019
// All changes are shown in the patch file coming together with the full JTDX source code.
#include "callsign.h"
const QRegularExpression Callsign::valid_callsign_regexp {R"([2,4-9]{1,1}[A-Z]{1,1}[0-9]{1,4}|[3]{1,1}[A-Z]{1,2}[0-9]{1,4}|[A-Z]{1,2}[0-9]{1,4})"};
const QRegularExpression Callsign::prefix_re {R"(^(?:(?<prefix>[2-9]{0,1}[A-Z]{1,2}[0-9]{1,4})?)?)"};
Q_GLOBAL_STATIC(Callsign, callsign)
Callsign *Callsign::instance()
{
return callsign;
}
Callsign::Callsign()
{
m_countryDat.init();
m_countryDat.load();
}
Callsign::~Callsign()
{}
bool Callsign::is_callsign (QString const& callsign)
{
if ((!callsign.at(1).isDigit() && callsign.size () == 2) || callsign == "F" || callsign == "G" || callsign == "I" || callsign == "K" || callsign == "W")
{
auto call = callsign + "0";
return call.contains (valid_callsign_regexp);
}
else
{
return callsign.contains (valid_callsign_regexp);
}
}
bool Callsign::is_compound_callsign (QString const& callsign)
{
return callsign.contains ('/');
}
// split on first '/' and return the larger portion or the whole if
// there is no '/'
QString Callsign::base_callsign (QString callsign)
{
auto slash_pos = callsign.indexOf('/');
if (slash_pos >= 0)
{
auto right_size = callsign.size () - slash_pos - 1;
if (right_size>= slash_pos) {
callsign = callsign.mid(slash_pos + 1);
} else {
callsign = callsign.left(slash_pos);
}
}
return callsign.toUpper();
}
// analyze the callsign and determine the effective prefix, returns
// the full call if no valid prefix (or prefix as a suffix) is specified
QString Callsign::effective_prefix(QString callsign)
{
QStringList parts = callsign.split('/');
if (parts.size() == 2 && (parts.at(1) == "P" || parts.at(1) == "A" || parts.at(1) == "MM")) {
return callsign;
}
auto prefix = parts.at(0);
int size = prefix.size();
int region = -1;
for (int i = 1; i < parts.size(); ++i)
{
if (parts.at(i) == "AM")
{
prefix="1B1ABCD";
size = prefix.size();
}
else if (is_callsign(parts.at(i)) && size > parts.at(i).size() && !((parts.at(i) == "LH" || parts.at(i) == "ND" || parts.at(i) == "AG" || parts.at(i) == "AE" || parts.at(i) == "KT") && i == (parts.size() -1)))
{
prefix = parts.at(i);
size = prefix.size();
}
else {
bool ok;
auto reg = parts.at(i).toInt(&ok);
if (ok) {
region = reg;
}
}
}
auto const& match = prefix_re.match (prefix);
auto shorted = match.captured ("prefix");
if (shorted.isEmpty() || region > -1)
{
if (shorted.isEmpty())
{
if (region > -1) {
shorted = prefix+"0";
} else {
shorted = prefix;
}
}
if (region > -1) {
shorted = shorted.left(shorted.size()-1) + QString::number(region);
}
return shorted.toUpper ();
}
else
{
return prefix;
}
}
QString Callsign::striped_prefix (QString callsign)
{
auto const& match = prefix_re.match(callsign);
return match.captured("prefix");
}
QString Callsign::getCountryData(QString const& callsign)
{
QString pf = callsign.toUpper();
while (!pf.isEmpty ())
{
QString country = "";
if (pf.length() == callsign.length())
{
country = m_countryDat.getData().value("="+pf, country);
if (!country.isEmpty ()) {
return country;
} else {
pf = effective_prefix(callsign);
}
}
if (pf == "KG4" && callsign.length() != 5) {
pf = "AA";
}
country = m_countryDat.getData().value(pf, country);
if (!country.isEmpty ()) {
return country;
}
pf = pf.left(pf.length()-1);
}
return " ,?,where?, , ";
}
CountryDat::CountryInfo Callsign::getCountryInfo(QString const& callsign)
{
QString pf = callsign.toUpper();
while (!pf.isEmpty ())
{
CountryDat::CountryInfo country = CountryDat::nullCountry;
if (pf.length() == callsign.length())
{
country = m_countryDat.getCountries().value("="+pf, country);
if (country.country == CountryDat::nullCountry.country) {
pf = effective_prefix(callsign);
} else {
return country;
}
}
if (pf == "KG4" && callsign.length() != 5) {
pf = "AA";
}
country = m_countryDat.getCountries().value(pf, country);
if (country.country != CountryDat::nullCountry.country) {
return country;
}
pf = pf.left(pf.length()-1);
}
return CountryDat::nullCountry;
}

52
sdrbase/util/callsign.h Normal file
View File

@ -0,0 +1,52 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
// This source code file was last time modified by Arvo ES1JA on January 5th, 2019
// All changes are shown in the patch file coming together with the full JTDX source code.
#ifndef INCLUDE_CALLSIGN_H
#define INCLUDE_CALLSIGN_H
#include <QObject>
#include <QRegularExpression>
#include "countrydat.h"
class Callsign : public QObject
{
Q_OBJECT
public:
static Callsign *instance();
Callsign();
~Callsign();
static bool is_callsign(QString const& callsign);
static bool is_compound_callsign(QString const&);
static QString base_callsign(QString);
static QString effective_prefix(QString);
static QString striped_prefix(QString);
QString getCountryData(QString const& callsign);
CountryDat::CountryInfo getCountryInfo(QString const& callsign);
private:
static const QRegularExpression valid_callsign_regexp;
static const QRegularExpression prefix_re;
CountryDat m_countryDat;
};
#endif

623
sdrbase/util/countrydat.cpp Normal file
View File

@ -0,0 +1,623 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
// This source code file was last time modified by Arvo ES1JA on 20190224
// All changes are shown in the patch file coming together with the full JTDX source code.
/*
#Sov Mil Order of Malta: 15: 28: EU: 41.90: -12.43: -1.0: 1A:
#1A;
#Spratly Islands: 26: 50: AS: 9.88: -114.23: -8.0: 1S:
#1S,9M0,BV9S;
#Monaco: 14: 27: EU: 43.73: -7.40: -1.0: 3A:
#3A;
#Heard Island: 39: 68: AF: -53.08: -73.50: -5.0: VK0H:
#=VK0IR;
#Macquarie Island: 30: 60: OC: -54.60: -158.88: -10.0: VK0M:
#=VK0KEV;
#Cocos-Keeling: 29: 54: OC: -12.15: -96.82: -6.5: VK9C:
#AX9C,AX9Y,VH9C,VH9Y,VI9C,VI9Y,VJ9C,VJ9Y,VK9C,VK9Y,VL9C,VL9Y,VM9C,VM9Y,
#VN9C,VN9Y,VZ9C,VZ9Y,=VK9AA;
*/
#include "countrydat.h"
#include <QFile>
#include <QTextStream>
const CountryDat::CountryInfo CountryDat::nullCountry = CountryDat::CountryInfo{"", "?", "where?", "", ""};
void CountryDat::init()
{
_data.clear();
_name.clear();
_name.insert("where?","where?");
_name.insert("Sov Mil Order of Malta","Sov Mil Order of Malta");
_name.insert("Spratly Islands","Spratly Is.");
_name.insert("Monaco","Monaco");
_name.insert("Agalega & St. Brandon","Agalega & St. Brandon");
_name.insert("Mauritius","Mauritius");
_name.insert("Rodriguez Island","Rodriguez Is.");
_name.insert("Equatorial Guinea","Equatorial Guinea");
_name.insert("Annobon Island","Annobon Is.");
_name.insert("Fiji","Fiji");
_name.insert("Conway Reef","Conway Reef");
_name.insert("Rotuma Island","Rotuma Is.");
_name.insert("Kingdom of Eswatini","Kingdom of Eswatini");
_name.insert("Tunisia","Tunisia");
_name.insert("Vietnam","Vietnam");
_name.insert("Guinea","Guinea");
_name.insert("Bouvet","Bouvet");
_name.insert("Peter 1 Island","Peter 1 Is.");
_name.insert("Azerbaijan","Azerbaijan");
_name.insert("Georgia","Georgia");
_name.insert("Montenegro","Montenegro");
_name.insert("Sri Lanka","Sri Lanka");
_name.insert("ITU HQ","ITU HQ");
_name.insert("United Nations HQ","United Nations HQ");
_name.insert("Vienna Intl Ctr","Vienna Intl Ctr");
_name.insert("Timor - Leste","Timor - Leste");
_name.insert("Israel","Israel");
_name.insert("Libya","Libya");
_name.insert("Cyprus","Cyprus");
_name.insert("Tanzania","Tanzania");
_name.insert("Nigeria","Nigeria");
_name.insert("Madagascar","Madagascar");
_name.insert("Mauritania","Mauritania");
_name.insert("Niger","Niger");
_name.insert("Togo","Togo");
_name.insert("Samoa","Samoa");
_name.insert("Uganda","Uganda");
_name.insert("Kenya","Kenya");
_name.insert("Senegal","Senegal");
_name.insert("Jamaica","Jamaica");
_name.insert("Yemen","Yemen");
_name.insert("Lesotho","Lesotho");
_name.insert("Malawi","Malawi");
_name.insert("Algeria","Algeria");
_name.insert("Barbados","Barbados");
_name.insert("Maldives","Maldives");
_name.insert("Guyana","Guyana");
_name.insert("Croatia","Croatia");
_name.insert("Ghana","Ghana");
_name.insert("Malta","Malta");
_name.insert("Zambia","Zambia");
_name.insert("Kuwait","Kuwait");
_name.insert("Sierra Leone","Sierra Leone");
_name.insert("West Malaysia","W. Malaysia");
_name.insert("East Malaysia","E. Malaysia");
_name.insert("Nepal","Nepal");
_name.insert("Dem. Rep. of the Congo","Dem. Rep. of the Congo");
_name.insert("Burundi","Burundi");
_name.insert("Singapore","Singapore");
_name.insert("Rwanda","Rwanda");
_name.insert("Trinidad & Tobago","Trinidad & Tobago");
_name.insert("Botswana","Botswana");
_name.insert("Tonga","Tonga");
_name.insert("Oman","Oman");
_name.insert("Bhutan","Bhutan");
_name.insert("United Arab Emirates","United Arab Emirates");
_name.insert("Qatar","Qatar");
_name.insert("Bahrain","Bahrain");
_name.insert("Pakistan","Pakistan");
_name.insert("Scarborough Reef","Scarborough Reef");
_name.insert("Taiwan","Taiwan");
_name.insert("Pratas Island","Pratas Is.");
_name.insert("China","China");
_name.insert("Nauru","Nauru");
_name.insert("Andorra","Andorra");
_name.insert("The Gambia","The Gambia");
_name.insert("Bahamas","Bahamas");
_name.insert("Mozambique","Mozambique");
_name.insert("Chile","Chile");
_name.insert("San Felix & San Ambrosio","San Felix & San Ambrosio");
_name.insert("Easter Island","Easter Is.");
_name.insert("Juan Fernandez Islands","Juan Fernandez Is.");
_name.insert("Antarctica","Antarctica");
_name.insert("Cuba","Cuba");
_name.insert("Morocco","Morocco");
_name.insert("Bolivia","Bolivia");
_name.insert("Portugal","Portugal");
_name.insert("Madeira Islands","Madeira Is.");
_name.insert("Azores","Azores");
_name.insert("Uruguay","Uruguay");
_name.insert("Sable Island","Sable Is.");
_name.insert("St. Paul Island","St. Paul Is.");
_name.insert("Angola","Angola");
_name.insert("Cape Verde","Cape Verde");
_name.insert("Comoros","Comoros");
_name.insert("Fed. Rep. of Germany","Germany");
_name.insert("Philippines","Philippines");
_name.insert("Eritrea","Eritrea");
_name.insert("Palestine","Palestine");
_name.insert("North Cook Islands","N. Cook Is.");
_name.insert("South Cook Islands","S. Cook Is.");
_name.insert("Niue","Niue");
_name.insert("Bosnia-Herzegovina","Bosnia-Herzegovina");
_name.insert("Spain","Spain");
_name.insert("Balearic Islands","Balearic Is.");
_name.insert("Canary Islands","Canary Is.");
_name.insert("Ceuta & Melilla","Ceuta & Melilla");
_name.insert("Ireland","Ireland");
_name.insert("Armenia","Armenia");
_name.insert("Liberia","Liberia");
_name.insert("Iran","Iran");
_name.insert("Moldova","Moldova");
_name.insert("Estonia","Estonia");
_name.insert("Ethiopia","Ethiopia");
_name.insert("Belarus","Belarus");
_name.insert("Kyrgyzstan","Kyrgyzstan");
_name.insert("Tajikistan","Tajikistan");
_name.insert("Turkmenistan","Turkmenistan");
_name.insert("France","France");
_name.insert("Guadeloupe","Guadeloupe");
_name.insert("Mayotte","Mayotte");
_name.insert("St. Barthelemy","St. Barthelemy");
_name.insert("New Caledonia","New Caledonia");
_name.insert("Chesterfield Islands","Chesterfield Is.");
_name.insert("Martinique","Martinique");
_name.insert("French Polynesia","Fr. Polynesia");
_name.insert("Austral Islands","Austral Is.");
_name.insert("Clipperton Island","Clipperton Is.");
_name.insert("Marquesas Islands","Marquesas Is.");
_name.insert("St. Pierre & Miquelo","St. Pierre & Miquelo");
_name.insert("Reunion Island","Reunion Is.");
_name.insert("St. Martin","St. Martin");
_name.insert("Glorioso Islands","Glorioso Is.");
_name.insert("Juan de Nova, Europa","Juan de Nova, Europa");
_name.insert("Tromelin Island","Tromelin Is.");
_name.insert("Crozet Island","Crozet Is.");
_name.insert("Kerguelen Islands","Kerguelen Is.");
_name.insert("Amsterdam & St. Paul Is.","Amsterdam & St. Paul Is.");
_name.insert("Wallis & Futuna Islands","Wallis & Futuna Is.");
_name.insert("French Guiana","Fr. Guiana");
_name.insert("England","England");
_name.insert("Isle of Man","Isle of Man");
_name.insert("Northern Ireland","N. Ireland");
_name.insert("Jersey","Jersey");
_name.insert("Shetland Islands","Shetland Is.");
_name.insert("Scotland","Scotland");
_name.insert("Guernsey","Guernsey");
_name.insert("Wales","Wales");
_name.insert("Solomon Islands","Solomon Is.");
_name.insert("Temotu Province","Temotu Province");
_name.insert("Hungary","Hungary");
_name.insert("Switzerland","Switzerland");
_name.insert("Liechtenstein","Liechtenstein");
_name.insert("Ecuador","Ecuador");
_name.insert("Galapagos Islands","Galapagos Is.");
_name.insert("Haiti","Haiti");
_name.insert("Dominican Republic","Dominican Rep.");
_name.insert("Colombia","Colombia");
_name.insert("San Andres & Providencia","San Andres & Providencia");
_name.insert("Malpelo Island","Malpelo Is.");
_name.insert("Republic of Korea","Rep. of Korea");
_name.insert("Panama","Panama");
_name.insert("Honduras","Honduras");
_name.insert("Thailand","Thailand");
_name.insert("Vatican City","Vatican City");
_name.insert("Saudi Arabia","Saudi Arabia");
_name.insert("Italy","Italy");
_name.insert("African Italy","AF Italy");
_name.insert("Sardinia","Sardinia");
_name.insert("Sicily","Sicily");
_name.insert("Djibouti","Djibouti");
_name.insert("Grenada","Grenada");
_name.insert("Guinea-Bissau","Guinea-Bissau");
_name.insert("St. Lucia","St. Lucia");
_name.insert("Dominica","Dominica");
_name.insert("St. Vincent","St. Vincent");
_name.insert("Japan","Japan");
_name.insert("Minami Torishima","Minami Torishima");
_name.insert("Ogasawara","Ogasawara");
_name.insert("Mongolia","Mongolia");
_name.insert("Svalbard","Svalbard");
_name.insert("Bear Island","Bear Is.");
_name.insert("Jan Mayen","Jan Mayen");
_name.insert("Jordan","Jordan");
_name.insert("United States","U.S.A.");
_name.insert("Guantanamo Bay","Guantanamo Bay");
_name.insert("Mariana Islands","Mariana Is.");
_name.insert("Baker & Howland Islands","Baker & Howland Is.");
_name.insert("Guam","Guam");
_name.insert("Johnston Island","Johnston Is.");
_name.insert("Midway Island","Midway Is.");
_name.insert("Palmyra & Jarvis Islands","Palmyra & Jarvis Is.");
_name.insert("Hawaii","Hawaii");
_name.insert("Kure Island","Kure Is.");
_name.insert("American Samoa","American Samoa");
_name.insert("Swains Island","Swains Is.");
_name.insert("Wake Island","Wake Is.");
_name.insert("Alaska","Alaska");
_name.insert("Navassa Island","Navassa Is.");
_name.insert("US Virgin Islands","US Virgin Is.");
_name.insert("Puerto Rico","Puerto Rico");
_name.insert("Desecheo Island","Desecheo Is.");
_name.insert("Norway","Norway");
_name.insert("Argentina","Argentina");
_name.insert("Luxembourg","Luxembourg");
_name.insert("Lithuania","Lithuania");
_name.insert("Bulgaria","Bulgaria");
_name.insert("Peru","Peru");
_name.insert("Lebanon","Lebanon");
_name.insert("Austria","Austria");
_name.insert("Finland","Finland");
_name.insert("Aland Islands","Aland Is.");
_name.insert("Market Reef","Market Reef");
_name.insert("Czech Republic","Czech Rep.");
_name.insert("Slovak Republic","Slovak Rep.");
_name.insert("Belgium","Belgium");
_name.insert("Greenland","Greenland");
_name.insert("Faroe Islands","Faroe Is.");
_name.insert("Denmark","Denmark");
_name.insert("Papua New Guinea","Papua New Guinea");
_name.insert("Aruba","Aruba");
_name.insert("DPR of Korea","DPR of Korea");
_name.insert("Netherlands","Netherlands");
_name.insert("Curacao","Curacao");
_name.insert("Bonaire","Bonaire");
_name.insert("Saba & St. Eustatius","Saba & St. Eustatius");
_name.insert("Sint Maarten","Sint Maarten");
_name.insert("Brazil","Brazil");
_name.insert("Fernando de Noronha","Fernando de Noronha");
_name.insert("St. Peter & St. Paul","St. Peter & St. Paul");
_name.insert("Trindade & Martim Vaz","Trindade & Martim Vaz");
_name.insert("Suriname","Suriname");
_name.insert("Franz Josef Land","Franz Josef Land");
_name.insert("Western Sahara","Western Sahara");
_name.insert("Bangladesh","Bangladesh");
_name.insert("Slovenia","Slovenia");
_name.insert("Seychelles","Seychelles");
_name.insert("Sao Tome & Principe","Sao Tome & Principe");
_name.insert("Sweden","Sweden");
_name.insert("Poland","Poland");
_name.insert("Sudan","Sudan");
_name.insert("Egypt","Egypt");
_name.insert("Greece","Greece");
_name.insert("Mount Athos","Mount Athos");
_name.insert("Dodecanese","Dodecanese");
_name.insert("Crete","Crete");
_name.insert("Tuvalu","Tuvalu");
_name.insert("Western Kiribati","W. Kiribati");
_name.insert("Central Kiribati","C. Kiribati");
_name.insert("Eastern Kiribati","E. Kiribati");
_name.insert("Banaba Island","Banaba Is.");
_name.insert("Somalia","Somalia");
_name.insert("San Marino","San Marino");
_name.insert("Palau","Palau");
_name.insert("Asiatic Turkey","AS Turkey");
_name.insert("European Turkey","EU Turkey");
_name.insert("Iceland","Iceland");
_name.insert("Guatemala","Guatemala");
_name.insert("Costa Rica","Costa Rica");
_name.insert("Cocos Island","Cocos Is.");
_name.insert("Cameroon","Cameroon");
_name.insert("Corsica","Corsica");
_name.insert("Central African Republic","C. African Rep.");
_name.insert("Republic of the Congo","Rep. of the Congo");
_name.insert("Gabon","Gabon");
_name.insert("Chad","Chad");
_name.insert("Cote d'Ivoire","Cote d'Ivoire");
_name.insert("Benin","Benin");
_name.insert("Mali","Mali");
_name.insert("European Russia","EU Russia");
_name.insert("Kaliningrad","Kaliningrad");
_name.insert("Asiatic Russia","AS Russia");
_name.insert("Uzbekistan","Uzbekistan");
_name.insert("Kazakhstan","Kazakhstan");
_name.insert("Ukraine","Ukraine");
_name.insert("Antigua & Barbuda","Antigua & Barbuda");
_name.insert("Belize","Belize");
_name.insert("St. Kitts & Nevis","St. Kitts & Nevis");
_name.insert("Namibia","Namibia");
_name.insert("Micronesia","Micronesia");
_name.insert("Marshall Islands","Marshall Is.");
_name.insert("Brunei Darussalam","Brunei Darussalam");
_name.insert("Canada","Canada");
_name.insert("Australia","Australia");
_name.insert("Heard Island","Heard Is.");
_name.insert("Macquarie Island","Macquarie Is.");
_name.insert("Cocos (Keeling) Islands","Cocos (Keeling) Is.");
_name.insert("Lord Howe Island","Lord Howe Is.");
_name.insert("Mellish Reef","Mellish Reef");
_name.insert("Norfolk Island","Norfolk Is.");
_name.insert("Willis Island","Willis Is.");
_name.insert("Christmas Island","Christmas Is.");
_name.insert("Anguilla","Anguilla");
_name.insert("Montserrat","Montserrat");
_name.insert("British Virgin Islands","British Virgin Is.");
_name.insert("Turks & Caicos Islands","Turks & Caicos Is.");
_name.insert("Pitcairn Island","Pitcairn Is.");
_name.insert("Ducie Island","Ducie Is.");
_name.insert("Falkland Islands","Falkland Is.");
_name.insert("South Georgia Island","S. Georgia Is.");
_name.insert("South Shetland Islands","S. Shetland Is.");
_name.insert("South Orkney Islands","S. Orkney Is.");
_name.insert("South Sandwich Islands","S. Sandwich Is.");
_name.insert("Bermuda","Bermuda");
_name.insert("Chagos Islands","Chagos Is.");
_name.insert("Hong Kong","Hong Kong");
_name.insert("India","India");
_name.insert("Andaman & Nicobar Is.","Andaman & Nicobar Is.");
_name.insert("Lakshadweep Islands","Lakshadweep Is.");
_name.insert("Mexico","Mexico");
_name.insert("Revillagigedo","Revillagigedo");
_name.insert("Burkina Faso","Burkina Faso");
_name.insert("Cambodia","Cambodia");
_name.insert("Laos","Laos");
_name.insert("Macao","Macao");
_name.insert("Myanmar","Myanmar");
_name.insert("Afghanistan","Afghanistan");
_name.insert("Indonesia","Indonesia");
_name.insert("Iraq","Iraq");
_name.insert("Vanuatu","Vanuatu");
_name.insert("Syria","Syria");
_name.insert("Latvia","Latvia");
_name.insert("Nicaragua","Nicaragua");
_name.insert("Romania","Romania");
_name.insert("El Salvador","El Salvador");
_name.insert("Serbia","Serbia");
_name.insert("Venezuela","Venezuela");
_name.insert("Aves Island","Aves Is.");
_name.insert("Zimbabwe","Zimbabwe");
_name.insert("North Macedonia","N. Macedonia");
_name.insert("Republic of Kosovo","Rep. of Kosovo");
_name.insert("Republic of South Sudan","Rep. of S. Sudan");
_name.insert("Albania","Albania");
_name.insert("Gibraltar","Gibraltar");
_name.insert("UK Base Areas on Cyprus","UK Base Areas on Cyprus");
_name.insert("St. Helena","St. Helena");
_name.insert("Ascension Island","Ascension Is.");
_name.insert("Tristan da Cunha & Gough","Tristan da Cunha & Gough");
_name.insert("Cayman Islands","Cayman Is.");
_name.insert("Tokelau Islands","Tokelau Is.");
_name.insert("New Zealand","New Zealand");
_name.insert("Chatham Islands","Chatham Is.");
_name.insert("Kermadec Islands","Kermadec Is.");
_name.insert("N.Z. Subantarctic Is.","N.Z. Subantarctic Is.");
_name.insert("Paraguay","Paraguay");
_name.insert("South Africa","S. Africa");
_name.insert("Pr. Edward & Marion Is.","Pr. Edward & Marion Is.");
}
QString CountryDat::_extractName(const QString line)
{
int s1 = line.indexOf(':');
if (s1>=0)
{
QString name = line.left(s1);
return _name.value(name,name);
}
return "";
}
QString CountryDat::_extractMasterPrefix(const QString line)
{
int s1 = line.lastIndexOf(' ');
int s2 = line.lastIndexOf(':');
if (s1 >= 0 && s1 < s2)
{
QString pfx = line.mid(s1, s2-s1);
return pfx.toUpper();
}
return "";
}
QString CountryDat::_extractContinent(const QString line)
{
int s1;
s1 = line.indexOf(':');
if (s1>=0)
{
s1 = line.indexOf(':',s1+1);
if (s1>=0)
{
s1 = line.indexOf(':',s1+1);
if (s1>=0)
{
s1 = line.indexOf(':',s1+1);
if (s1>=0)
{
QString cont = line.mid(s1-2, 2);
return cont;
}
}
}
}
return "";
}
QString CountryDat::_extractITUZ(const QString line)
{
int s1;
s1 = line.indexOf(':');
if (s1>=0)
{
s1 = line.indexOf(':',s1+1);
if (s1>=0)
{
s1 = line.indexOf(':',s1+1);
if (s1>=0)
{
QString cont = line.mid(s1-2, 2);
if (cont.size() == 1) {
cont = " " + cont;
}
return cont;
}
}
}
return "";
}
QString CountryDat::_extractCQZ(const QString line)
{
int s1;
s1 = line.indexOf(':');
if (s1>=0)
{
s1 = line.indexOf(':',s1+1);
if (s1>=0)
{
QString cont = line.mid(s1-2, 2);
if (cont.size() == 1) {
cont = " " + cont;
}
return cont;
}
}
return "";
}
QString CountryDat::_removeBrackets(QString &line, const QString a, const QString b)
{
QString res = "";
int s1 = line.indexOf(a);
while (s1 >= 0)
{
int s2 = line.indexOf(b);
res += line.mid(s1+1,s2-s1-1);
line = line.left(s1) + line.mid(s2+1,-1);
s1 = line.indexOf(a);
}
return res;
}
QStringList CountryDat::_extractPrefix(QString &line, bool &more)
{
QString a;
line = line.remove(" \n");
line = line.replace(" ","");
a = _removeBrackets(line,"<",">");
a = _removeBrackets(line,"~","~");
int s1 = line.indexOf(';');
more = true;
if (s1 >= 0)
{
line = line.left(s1);
more = false;
}
QStringList r = line.split(',');
return r;
}
void CountryDat::load()
{
_data.clear();
QFile inputFile(":/data/cty.dat");
if (inputFile.open(QIODevice::ReadOnly))
{
QTextStream in(&inputFile);
while (!in.atEnd())
{
QString line1 = in.readLine();
if (!in.atEnd())
{
QString line2 = in.readLine();
QString masterPrefix, country, cqz, ituz, continent;
cqz = _extractCQZ(line1);
ituz = _extractITUZ(line1);
continent = _extractContinent(line1);
masterPrefix = _extractMasterPrefix(line1).trimmed();
country = _extractName(line1).trimmed();
if (!masterPrefix.isEmpty() || !country.isEmpty())
{
bool more = true;
QStringList prefixs;
while (more)
{
QStringList p = _extractPrefix(line2,more);
prefixs += p;
if (more) {
line2 = in.readLine();
}
}
QString p,_cqz,_ituz,_continent;
foreach(p,prefixs)
{
if (!p.isEmpty())
{
_cqz = _removeBrackets(p,"(",")");
if (_cqz.isEmpty()) {
_cqz = cqz;
}
if (_cqz.size() == 1) {
_cqz = "0" + _cqz;
}
_ituz = _removeBrackets(p,"[","]");
if (_ituz.isEmpty()) {
_ituz = ituz;
}
if (_ituz.size() == 1) {
_ituz = "0" + _ituz;
}
_continent = _removeBrackets(p,"{","}");
if (_continent.isEmpty()) {
_continent = continent;
}
_data.insert(p, _continent + ',' + masterPrefix + ',' + country + ',' + _cqz + ',' + _ituz);
_countries.insert(p, CountryInfo{_continent, masterPrefix, country, _cqz, _ituz});
}
}
}
}
}
inputFile.close();
}
}

69
sdrbase/util/countrydat.h Normal file
View File

@ -0,0 +1,69 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
// This source code file was last time modified by Arvo ES1JA on January 5th, 2019
// All changes are shown in the patch file coming together with the full JTDX source code.
/*
* Reads cty.dat file
* Establishes a map between prefixes and their country names
* VK3ACF July 2013
*/
#ifndef INCLUDE_COUNTRYDAT_H
#define INCLUDE_COUNTRYDAT_H
#include <QCoreApplication>
#include <QString>
#include <QStringList>
#include <QHash>
#include <QDate>
class CountryDat
{
public:
struct CountryInfo {
QString continent;
QString masterPrefix;
QString country;
QString cqZone;
QString ituZone;
};
void init();
void load();
const QHash<QString, QString>& getData() const { return _data; }
const QHash<QString, CountryInfo>& getCountries() const { return _countries; }
static const CountryInfo nullCountry;
private:
QString _extractName(const QString line);
QString _extractMasterPrefix(const QString line);
QString _extractContinent(const QString line);
QString _extractCQZ(const QString line);
QString _extractITUZ(const QString line);
QString _removeBrackets(QString &line, const QString a, const QString b);
QStringList _extractPrefix(QString &line, bool &more);
QString _filename;
QHash<QString, QString> _data;
QHash<QString, QString> _name;
QHash<QString, CountryInfo> _countries;
};
#endif

View File

@ -0,0 +1,48 @@
///////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2024 Edouard Griffiths, F4EXB <f4exb06@gmail.com> //
// //
// This program is free software; you can redistribute it and/or modify //
// it under the terms of the GNU General Public License as published by //
// the Free Software Foundation as version 3 of the License, or //
// (at your option) any later version. //
// //
// This program is distributed in the hope that it will be useful, //
// but WITHOUT ANY WARRANTY; without even the implied warranty of //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //
// GNU General Public License V3 for more details. //
// //
// You should have received a copy of the GNU General Public License //
// along with this program. If not, see <http://www.gnu.org/licenses/>. //
///////////////////////////////////////////////////////////////////////////////////
#include "util/callsign.h"
#include "mainbench.h"
// Give the callsign in argument
void MainBench::testCallsign(const QString& argsStr)
{
qDebug("MainBench::testCallsign: %s", qPrintable(argsStr));
if (Callsign::is_callsign(argsStr)) {
qInfo("MainBench::testCallsign: %s is a valid callsign", qPrintable(argsStr));
} else {
qInfo("MainBench::testCallsign: %s is mot a valid callsign", qPrintable(argsStr));
}
if (Callsign::is_compound_callsign(argsStr)) {
qInfo("MainBench::testCallsign: %s is a compound callsign", qPrintable(argsStr));
} else {
qInfo("MainBench::testCallsign: %s is mot a compound callsign", qPrintable(argsStr));
}
qInfo("%s is the base callsign of %s", qPrintable(Callsign::base_callsign(argsStr)), qPrintable(argsStr));
qInfo("%s is the effective prefix of %s", qPrintable(Callsign::effective_prefix(argsStr)), qPrintable(argsStr));
qInfo("%s is the striped prefix of %s", qPrintable(Callsign::striped_prefix(argsStr)), qPrintable(argsStr));
qInfo("%s is the country data for callsign %s", qPrintable(Callsign::instance()->getCountryData(argsStr)), qPrintable(argsStr));
CountryDat::CountryInfo countryInfo = Callsign::instance()->getCountryInfo(argsStr);
qInfo("%s is the continent", qPrintable(countryInfo.continent));
qInfo("%s is the country", qPrintable(countryInfo.country));
qInfo("%s is the master prefix", qPrintable(countryInfo.masterPrefix));
qInfo("%s is the cq zone", qPrintable(countryInfo.cqZone));
qInfo("%s is the ITU zone", qPrintable(countryInfo.ituZone));
}