File indexing completed on 2024-05-05 16:49:21

0001 /*
0002  * SPDX-FileCopyrightText: 2021 Anjani Kumar <anjanik012@gmail.com>
0003  * SPDX-FileCopyrightText: 2021 Han Young <hanyoung@protonmail.com>
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #pragma once
0008 #include "alertentry.h"
0009 #include "alertinfo.h"
0010 
0011 #include <QObject>
0012 #include <QXmlStreamReader>
0013 #include <QHash>
0014 
0015 #include <memory>
0016 
0017 namespace KWeatherCore
0018 {
0019 class CAPParser
0020 {
0021 public:
0022     explicit CAPParser(const QByteArray &data = {});
0023     void setData(const QByteArray &data);
0024     std::unique_ptr<AlertEntry> parse();
0025 
0026 private:
0027     AlertInfo parseInfo();
0028     QXmlStreamReader m_xml;
0029     enum class Tags {
0030         ALERT,
0031         IDENTIFIER,
0032         SENDER,
0033         SENT_TIME,
0034         STATUS,
0035         MSG_TYPE,
0036         SCOPE,
0037         NOTE,
0038         INFO
0039     };
0040     inline const static QHash<QString, Tags> tags {
0041         {QStringLiteral("alert"), Tags::ALERT},
0042         {QStringLiteral("identifier"), Tags::IDENTIFIER},
0043         {QStringLiteral("sender"), Tags::SENDER},
0044         {QStringLiteral("sent"), Tags::SENT_TIME},
0045         {QStringLiteral("msgType"), Tags::MSG_TYPE},
0046         {QStringLiteral("status"), Tags::STATUS},
0047         {QStringLiteral("scope"), Tags::SCOPE},
0048         {QStringLiteral("note"), Tags::NOTE},
0049         {QStringLiteral("info"), Tags::INFO}};
0050 
0051     enum class InfoTags {
0052         HEADLINE,
0053         DESCRIPTION,
0054         EVENT,
0055         EFFECTIVE_TIME,
0056         ONSET_TIME,
0057         EXPIRE_TIME,
0058         CATEGORY,
0059         INSTRUCTION,
0060         URGENCY,
0061         SEVERITY,
0062         CERTAINITY,
0063         PARAMETER,
0064         AREA,
0065         SENDERNAME,
0066         LANGUAGE
0067     };
0068 
0069     inline const static QHash<QString, InfoTags> infoTags = {
0070         {QStringLiteral("category"), InfoTags::CATEGORY},
0071         {QStringLiteral("event"), InfoTags::EVENT},
0072         {QStringLiteral("urgency"), InfoTags::URGENCY},
0073         {QStringLiteral("severity"), InfoTags::SEVERITY},
0074         {QStringLiteral("certainty"), InfoTags::CERTAINITY},
0075         {QStringLiteral("effective"), InfoTags::EFFECTIVE_TIME},
0076         {QStringLiteral("onset"), InfoTags::ONSET_TIME},
0077         {QStringLiteral("expires"), InfoTags::EXPIRE_TIME},
0078         {QStringLiteral("headline"), InfoTags::HEADLINE},
0079         {QStringLiteral("description"), InfoTags::DESCRIPTION},
0080         {QStringLiteral("instruction"), InfoTags::INSTRUCTION},
0081         {QStringLiteral("area"), InfoTags::AREA},
0082         {QStringLiteral("senderName"), InfoTags::SENDERNAME},
0083         {QStringLiteral("language"), InfoTags::LANGUAGE}
0084     };
0085 
0086     // constexpr hashmap when?
0087     inline const static QHash<QString, AlertInfo::Category> categoryMap = {
0088         {QStringLiteral("Geo"), AlertInfo::Category::Geo},
0089         {QStringLiteral("Met"), AlertInfo::Category::Met},
0090         {QStringLiteral("Safety"), AlertInfo::Category::Safety},
0091         {QStringLiteral("Security"), AlertInfo::Category::Security},
0092         {QStringLiteral("Rescue"), AlertInfo::Category::Rescue},
0093         {QStringLiteral("Fire"), AlertInfo::Category::Fire},
0094         {QStringLiteral("Health"), AlertInfo::Category::Health},
0095         {QStringLiteral("Env"), AlertInfo::Category::Env},
0096         {QStringLiteral("Transport"), AlertInfo::Category::Transport},
0097         {QStringLiteral("Infra"), AlertInfo::Category::Infra},
0098         {QStringLiteral("CBRNE"), AlertInfo::Category::CBRNE},
0099         {QStringLiteral("Other"), AlertInfo::Category::Other}
0100     };
0101 };
0102 }