#include "OlympicsAPI.h" #include #include // networking #include #include #include #include #include #include // json parsing #include #include #include #include #include #include using namespace std; /** * @brief OlympicsAPI::getSportData Requests the current data from the Olympics API of a certain discipline. * @param sport The discipline to request. * @return The current information provided by the API endpoint. */ QJsonObject OlympicsAPI::getSportData(OlympicsAPI::Disciplines sport) { string shortName = this->getDisciplineShort(sport); if (USE_API_REQUEST) { // create custom temporary event loop on stack QEventLoop eventLoop; // "quit()" the event-loop, when the network request "finished()" QNetworkAccessManager mgr; QObject::connect(&mgr, SIGNAL(finished(QNetworkReply*)), &eventLoop, SLOT(quit())); QString endpoint = (API_LINK + shortName).c_str(); // the HTTP request QNetworkRequest req( (QUrl( endpoint )) ); QNetworkReply *reply = mgr.get(req); eventLoop.exec(); // blocks stack until "finished()" has been called if (reply->error() == QNetworkReply::NoError) { //success QString strReply = (QString)reply->readAll(); //parse json QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8()); QJsonObject jsonObj = jsonResponse.object(); delete reply; return jsonObj; } else { //failure delete reply; throw invalid_argument("API request failed."); } } // if API is not used, open locally stored data QString filePath = ("../../res/mock/" + shortName + ".json").c_str(); QFile file( filePath ); if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) { throw invalid_argument("Could not open file to read data of the given discipline."); } else { QString text = file.readAll(); file.close(); return (QJsonDocument::fromJson(text.toUtf8())).object(); } } /** * @brief OlympicsAPI::getDisciplineShort Get the discipline's short name defined by the IOC (International Olympic Committee) * @param sport The sport you want to get the name from. * @return The short name as a string. */ string OlympicsAPI::getDisciplineShort(OlympicsAPI::Disciplines sport) { switch (sport) { case OlympicsAPI::Disciplines::AquaticsArtisticSwimming: return "SWA"; case OlympicsAPI::Disciplines::AquaticsDiving: return "DIV"; case OlympicsAPI::Disciplines::AquaticsMarathonSwimming: return "OWS"; case OlympicsAPI::Disciplines::AquaticsSwimming: return "SWM"; case OlympicsAPI::Disciplines::AquaticsWaterPolo: return "WPO"; case OlympicsAPI::Disciplines::Archery: return "ARC"; case OlympicsAPI::Disciplines::Athletics: return "ATH"; case OlympicsAPI::Disciplines::Badminton: return "BDM"; case OlympicsAPI::Disciplines::Basketball3v3: return "BK3"; case OlympicsAPI::Disciplines::Basketball: return "BKB"; case OlympicsAPI::Disciplines::Boxing: return "BOX"; case OlympicsAPI::Disciplines::Breaking: return "BKG"; case OlympicsAPI::Disciplines::CanoeingSprint: return "CSP"; case OlympicsAPI::Disciplines::CanoeingSlalom: return "CSL"; case OlympicsAPI::Disciplines::CyclingBMXFreestyle: return "BMF"; case OlympicsAPI::Disciplines::CyclingBMXRacing: return "BMX"; case OlympicsAPI::Disciplines::CyclingMaountainBike: return "MTB"; case OlympicsAPI::Disciplines::CyclingRoad: return "CRD"; case OlympicsAPI::Disciplines::CyclingTrack: return "CTR"; case OlympicsAPI::Disciplines::EquestrianDressage: return "EDR"; case OlympicsAPI::Disciplines::EquestrianEventing: return "EVE"; case OlympicsAPI::Disciplines::EquestrianJumping: return "EJP"; case OlympicsAPI::Disciplines::Fencing: return "FEN"; case OlympicsAPI::Disciplines::FieldHockey: return "HOC"; case OlympicsAPI::Disciplines::Football: return "FBL"; case OlympicsAPI::Disciplines::Golf: return "GLF"; case OlympicsAPI::Disciplines::GymnasticsArtistic: return "GAR"; case OlympicsAPI::Disciplines::GymnasticsRhythmic: return "GRY"; case OlympicsAPI::Disciplines::GymnasticsTrampoline: return "GTR"; case OlympicsAPI::Disciplines::HandballIndoor: return "HBL"; case OlympicsAPI::Disciplines::Judo: return "JUD"; case OlympicsAPI::Disciplines::ModernPentathlon: return "MPN"; case OlympicsAPI::Disciplines::Rowing: return "ROW"; case OlympicsAPI::Disciplines::Rugby7: return "RU7"; case OlympicsAPI::Disciplines::Sailing: return "SAL"; break; case OlympicsAPI::Disciplines::Shooting: return "SHO"; break; case OlympicsAPI::Disciplines::Skateboarding: return "SKB"; break; case OlympicsAPI::Disciplines::SportClimbing: return "CLB"; break; case OlympicsAPI::Disciplines::Surfing: return "SRF"; break; case OlympicsAPI::Disciplines::TableTennis: return "TTE"; break; case OlympicsAPI::Disciplines::Taekwondo: return "TKW"; break; case OlympicsAPI::Disciplines::Tennis: return "TEN"; break; case OlympicsAPI::Disciplines::Triathlon: return "TRI"; break; case OlympicsAPI::Disciplines::VolleyballBeach: return "VBV"; break; case OlympicsAPI::Disciplines::VolleyballIndoor: return "VVO"; break; case OlympicsAPI::Disciplines::Weightlifting: return "WLF"; break; case OlympicsAPI::Disciplines::WrestlingFreestyle: return "WRE"; break; case OlympicsAPI::Disciplines::WrestlingGrecoRoman: return "WRG"; break; default: return "ARC"; // default, which should not be possible, because of enum } }