mirror of
				https://github.com/f4exb/sdrangel.git
				synced 2025-10-31 13:00:26 -04:00 
			
		
		
		
	
		
			
	
	
		
			423 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			423 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
|  | ///////////////////////////////////////////////////////////////////////////////////
 | ||
|  | // Copyright (C) 2021 Jon Beniston, M7RCE                                        //
 | ||
|  | //                                                                               //
 | ||
|  | // 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 "openaip.h"
 | ||
|  | 
 | ||
|  | const QStringList OpenAIP::m_countryCodes = { | ||
|  |     "ad", | ||
|  |     "ae", | ||
|  |     "af", | ||
|  |     "ag", | ||
|  |     "ai", | ||
|  |     "al", | ||
|  |     "am", | ||
|  |     "an", | ||
|  |     "ao", | ||
|  |     "aq", | ||
|  |     "ar", | ||
|  |     "as", | ||
|  |     "at", | ||
|  |     "au", | ||
|  |     "aw", | ||
|  |     "ax", | ||
|  |     "az", | ||
|  |     "ba", | ||
|  |     "bb", | ||
|  |     "bd", | ||
|  |     "be", | ||
|  |     "bf", | ||
|  |     "bg", | ||
|  |     "bh", | ||
|  |     "bi", | ||
|  |     "bj", | ||
|  |     "bl", | ||
|  |     "bm", | ||
|  |     "bn", | ||
|  |     "bo", | ||
|  |     "bq", | ||
|  |     "br", | ||
|  |     "bs", | ||
|  |     "bt", | ||
|  |     "bv", | ||
|  |     "bw", | ||
|  |     "by", | ||
|  |     "bz", | ||
|  |     "ca", | ||
|  |     "cc", | ||
|  |     "cd", | ||
|  |     "cf", | ||
|  |     "cg", | ||
|  |     "ch", | ||
|  |     "ci", | ||
|  |     "ck", | ||
|  |     "cl", | ||
|  |     "cm", | ||
|  |     "cn", | ||
|  |     "co", | ||
|  |     "cr", | ||
|  |     "cu", | ||
|  |     "cv", | ||
|  |     "cw", | ||
|  |     "cx", | ||
|  |     "cy", | ||
|  |     "cz", | ||
|  |     "de", | ||
|  |     "dj", | ||
|  |     "dk", | ||
|  |     "dm", | ||
|  |     "do", | ||
|  |     "dz", | ||
|  |     "ec", | ||
|  |     "ee", | ||
|  |     "eg", | ||
|  |     "eh", | ||
|  |     "er", | ||
|  |     "es", | ||
|  |     "et", | ||
|  |     "fi", | ||
|  |     "fj", | ||
|  |     "fk", | ||
|  |     "fm", | ||
|  |     "fo", | ||
|  |     "fr", | ||
|  |     "ga", | ||
|  |     "gb", | ||
|  |     "ge", | ||
|  |     "gf", | ||
|  |     "gg", | ||
|  |     "gh", | ||
|  |     "gi", | ||
|  |     "gl", | ||
|  |     "gm", | ||
|  |     "gn", | ||
|  |     "gp", | ||
|  |     "gq", | ||
|  |     "gr", | ||
|  |     "gs", | ||
|  |     "gt", | ||
|  |     "gu", | ||
|  |     "gw", | ||
|  |     "gy", | ||
|  |     "hk", | ||
|  |     "hm", | ||
|  |     "hn", | ||
|  |     "hr", | ||
|  |     "hu", | ||
|  |     "id", | ||
|  |     "ie", | ||
|  |     "il", | ||
|  |     "im", | ||
|  |     "in", | ||
|  |     "io", | ||
|  |     "iq", | ||
|  |     "ir", | ||
|  |     "is", | ||
|  |     "it", | ||
|  |     "je", | ||
|  |     "jm", | ||
|  |     "jo", | ||
|  |     "jp", | ||
|  |     "ke", | ||
|  |     "kg", | ||
|  |     "kh", | ||
|  |     "ki", | ||
|  |     "km", | ||
|  |     "kn", | ||
|  |     "kp", | ||
|  |     "kr", | ||
|  |     "kw", | ||
|  |     "ky", | ||
|  |     "kz", | ||
|  |     "la", | ||
|  |     "lb", | ||
|  |     "lc", | ||
|  |     "li", | ||
|  |     "lk", | ||
|  |     "lr", | ||
|  |     "ls", | ||
|  |     "lt", | ||
|  |     "lu", | ||
|  |     "lv", | ||
|  |     "ly", | ||
|  |     "ma", | ||
|  |     "mc", | ||
|  |     "md", | ||
|  |     "me", | ||
|  |     "mf", | ||
|  |     "mg", | ||
|  |     "mh", | ||
|  |     "mk", | ||
|  |     "ml", | ||
|  |     "mm", | ||
|  |     "mn", | ||
|  |     "mo", | ||
|  |     "mp", | ||
|  |     "mq", | ||
|  |     "mr", | ||
|  |     "ms", | ||
|  |     "mt", | ||
|  |     "mu", | ||
|  |     "mv", | ||
|  |     "mw", | ||
|  |     "mx", | ||
|  |     "my", | ||
|  |     "mz", | ||
|  |     "na", | ||
|  |     "nc", | ||
|  |     "ne", | ||
|  |     "nf", | ||
|  |     "ng", | ||
|  |     "ni", | ||
|  |     "nl", | ||
|  |     "no", | ||
|  |     "np", | ||
|  |     "nr", | ||
|  |     "nu", | ||
|  |     "nz", | ||
|  |     "om", | ||
|  |     "pa", | ||
|  |     "pe", | ||
|  |     "pf", | ||
|  |     "pg", | ||
|  |     "ph", | ||
|  |     "pk", | ||
|  |     "pl", | ||
|  |     "pm", | ||
|  |     "pn", | ||
|  |     "pr", | ||
|  |     "ps", | ||
|  |     "pt", | ||
|  |     "pw", | ||
|  |     "py", | ||
|  |     "qa", | ||
|  |     "re", | ||
|  |     "ro", | ||
|  |     "rs", | ||
|  |     "ru", | ||
|  |     "rw", | ||
|  |     "sa", | ||
|  |     "sb", | ||
|  |     "sc", | ||
|  |     "sd", | ||
|  |     "se", | ||
|  |     "sg", | ||
|  |     "sh", | ||
|  |     "si", | ||
|  |     "sj", | ||
|  |     "sk", | ||
|  |     "sl", | ||
|  |     "sm", | ||
|  |     "sn", | ||
|  |     "so", | ||
|  |     "sr", | ||
|  |     "ss", | ||
|  |     "st", | ||
|  |     "sv", | ||
|  |     "sx", | ||
|  |     "sy", | ||
|  |     "sz", | ||
|  |     "tc", | ||
|  |     "td", | ||
|  |     "tf", | ||
|  |     "tg", | ||
|  |     "th", | ||
|  |     "tj", | ||
|  |     "tk", | ||
|  |     "tl", | ||
|  |     "tm", | ||
|  |     "tn", | ||
|  |     "to", | ||
|  |     "tr", | ||
|  |     "tt", | ||
|  |     "tv", | ||
|  |     "tw", | ||
|  |     "tz", | ||
|  |     "ua", | ||
|  |     "ug", | ||
|  |     "um", | ||
|  |     "us", | ||
|  |     "uy", | ||
|  |     "uz", | ||
|  |     "va", | ||
|  |     "vc", | ||
|  |     "ve", | ||
|  |     "vg", | ||
|  |     "vi", | ||
|  |     "vn", | ||
|  |     "vu", | ||
|  |     "wf", | ||
|  |     "ws", | ||
|  |     "ye", | ||
|  |     "yt", | ||
|  |     "za", | ||
|  |     "zm", | ||
|  |     "zw" | ||
|  | }; | ||
|  | 
 | ||
|  | OpenAIP::OpenAIP(QObject *parent) : | ||
|  |     QObject(parent) | ||
|  | { | ||
|  |     connect(&m_dlm, &HttpDownloadManager::downloadComplete, this, &OpenAIP::downloadFinished); | ||
|  | } | ||
|  | 
 | ||
|  | OpenAIP::~OpenAIP() | ||
|  | { | ||
|  |     disconnect(&m_dlm, &HttpDownloadManager::downloadComplete, this, &OpenAIP::downloadFinished); | ||
|  | } | ||
|  | 
 | ||
|  | QString OpenAIP::getDataDir() | ||
|  | { | ||
|  |     // Get directory to store app data in
 | ||
|  |     QStringList locations = QStandardPaths::standardLocations(QStandardPaths::AppDataLocation); | ||
|  |     // First dir is writable
 | ||
|  |     return locations[0]; | ||
|  | } | ||
|  | 
 | ||
|  | QString OpenAIP::getAirspaceFilename(int i) | ||
|  | { | ||
|  |     return getAirspaceFilename(m_countryCodes[i]); | ||
|  | } | ||
|  | 
 | ||
|  | QString OpenAIP::getAirspaceFilename(const QString& countryCode) | ||
|  | { | ||
|  |     return getDataDir() + "/" + countryCode + "_asp.xml"; | ||
|  | } | ||
|  | 
 | ||
|  | QString OpenAIP::getAirspaceURL(int i) | ||
|  | { | ||
|  |     if (i < m_countryCodes.size()) { | ||
|  |         return QString(OPENAIP_AIRSPACE_URL).arg(m_countryCodes[i]); | ||
|  |     } else { | ||
|  |         return QString(); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | void OpenAIP::downloadAirspaces() | ||
|  | { | ||
|  |     m_countryIndex = 0; | ||
|  |     downloadAirspace(); | ||
|  | } | ||
|  | 
 | ||
|  | void OpenAIP::downloadAirspace() | ||
|  | { | ||
|  |     QString filename = getAirspaceFilename(m_countryIndex); | ||
|  |     QString urlString = getAirspaceURL(m_countryIndex); | ||
|  |     QUrl dbURL(urlString); | ||
|  |     qDebug() << "OpenAIP::downloadAirspace: Downloading " << urlString; | ||
|  |     emit downloadingURL(urlString); | ||
|  |     m_dlm.download(dbURL, filename); | ||
|  | } | ||
|  | 
 | ||
|  | QString OpenAIP::getNavAidsFilename(int i) | ||
|  | { | ||
|  |     return getNavAidsFilename(m_countryCodes[i]); | ||
|  | } | ||
|  | 
 | ||
|  | QString OpenAIP::getNavAidsFilename(const QString& countryCode) | ||
|  | { | ||
|  |     return getDataDir() + "/" + countryCode + "_nav.xml"; | ||
|  | } | ||
|  | 
 | ||
|  | QString OpenAIP::getNavAidsURL(int i) | ||
|  | { | ||
|  |     if (i < m_countryCodes.size()) { | ||
|  |         return QString(OPENAIP_NAVAIDS_URL).arg(m_countryCodes[i]); | ||
|  |     } else { | ||
|  |         return QString(); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | void OpenAIP::downloadNavAids() | ||
|  | { | ||
|  |     m_countryIndex = 0; | ||
|  |     downloadNavAid(); | ||
|  | } | ||
|  | 
 | ||
|  | void OpenAIP::downloadNavAid() | ||
|  | { | ||
|  |     QString filename = getNavAidsFilename(m_countryIndex); | ||
|  |     QString urlString = getNavAidsURL(m_countryIndex); | ||
|  |     QUrl dbURL(urlString); | ||
|  |     qDebug() << "OpenAIP::downloadNavAid: Downloading " << urlString; | ||
|  |     emit downloadingURL(urlString); | ||
|  |     m_dlm.download(dbURL, filename); | ||
|  | } | ||
|  | 
 | ||
|  | void OpenAIP::downloadFinished(const QString& filename, bool success) | ||
|  | { | ||
|  |     // Not all countries have corresponding files, so we should expect some errors
 | ||
|  |     if (!success) { | ||
|  |         qDebug() << "OpenAIP::downloadFinished: Failed: " << filename; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (filename == getNavAidsFilename(m_countryIndex)) | ||
|  |     { | ||
|  |         m_countryIndex++; | ||
|  |         if (m_countryIndex < m_countryCodes.size()) { | ||
|  |             downloadNavAid(); | ||
|  |         } else { | ||
|  |             emit downloadNavAidsFinished(); | ||
|  |         } | ||
|  |     } | ||
|  |     else if (filename == getAirspaceFilename(m_countryIndex)) | ||
|  |     { | ||
|  |         m_countryIndex++; | ||
|  |         if (m_countryIndex < m_countryCodes.size()) { | ||
|  |             downloadAirspace(); | ||
|  |         } else { | ||
|  |             emit downloadAirspaceFinished(); | ||
|  |         } | ||
|  |     } | ||
|  |     else | ||
|  |     { | ||
|  |         qDebug() << "OpenAIP::downloadFinished: Unexpected filename: " << filename; | ||
|  |         emit downloadError(QString("Unexpected filename: %1").arg(filename)); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | // Read airspaces for all countries
 | ||
|  | QList<Airspace *> OpenAIP::readAirspaces() | ||
|  | { | ||
|  |     QList<Airspace *> airspaces; | ||
|  |     for (const auto& countryCode : m_countryCodes) { | ||
|  |         airspaces.append(readAirspaces(countryCode)); | ||
|  |     } | ||
|  |     return airspaces; | ||
|  | } | ||
|  | 
 | ||
|  | // Read airspaces for a single country
 | ||
|  | QList<Airspace *> OpenAIP::readAirspaces(const QString& countryCode) | ||
|  | { | ||
|  |     return Airspace::readXML(getAirspaceFilename(countryCode)); | ||
|  | } | ||
|  | 
 | ||
|  | // Read NavAids for all countries
 | ||
|  | QList<NavAid *> OpenAIP::readNavAids() | ||
|  | { | ||
|  |     QList<NavAid *> navAids; | ||
|  |     for (const auto& countryCode : m_countryCodes) { | ||
|  |         navAids.append(readNavAids(countryCode)); | ||
|  |     } | ||
|  |     return navAids; | ||
|  | } | ||
|  | 
 | ||
|  | // Read NavAids for a single country
 | ||
|  | QList<NavAid *> OpenAIP::readNavAids(const QString& countryCode) | ||
|  | { | ||
|  |     return NavAid::readXML(getNavAidsFilename(countryCode)); | ||
|  | } |