File indexing completed on 2024-04-21 03:54:29

0001 /*
0002     SPDX-FileCopyrightText: 2021 Volker Krause <vkrause@kde.org>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #ifndef ISOCODESCACHE_P_H
0008 #define ISOCODESCACHE_P_H
0009 
0010 #include "mapentry_p.h"
0011 
0012 #include <QByteArray>
0013 #include <QStringView>
0014 
0015 #include <cstdint>
0016 #include <memory>
0017 #include <vector>
0018 
0019 class QFile;
0020 
0021 /** Cache for iso-codes JSON data. */
0022 class IsoCodesCache
0023 {
0024 public:
0025     ~IsoCodesCache();
0026 
0027     static IsoCodesCache *instance();
0028 
0029     void loadIso3166_1();
0030     void loadIso3166_2();
0031 
0032     uint32_t countryCount() const;
0033     const MapEntry<uint16_t> *countryNameMapBegin() const;
0034     inline const MapEntry<uint16_t> *countryNameMapEnd() const
0035     {
0036         return countryNameMapBegin() + countryCount();
0037     }
0038     const MapEntry<uint16_t> *countryAlpha3MapBegin() const;
0039     inline const MapEntry<uint16_t> *countryAlpha3MapEnd() const
0040     {
0041         return countryAlpha3MapBegin() + countryCount();
0042     }
0043     const char *countryStringTableLookup(uint16_t offset) const;
0044 
0045     uint32_t subdivisionCount() const;
0046     const MapEntry<uint32_t> *subdivisionNameMapBegin() const;
0047     inline const MapEntry<uint32_t> *subdivisionNameMapEnd() const
0048     {
0049         return subdivisionNameMapBegin() + subdivisionCount();
0050     }
0051     uint32_t subdivisionHierachyMapSize() const;
0052     const MapEntry<uint32_t> *subdivisionParentMapBegin() const;
0053     inline const MapEntry<uint32_t> *subdivisionParentMapEnd() const
0054     {
0055         return subdivisionParentMapBegin() + subdivisionHierachyMapSize();
0056     }
0057     const char *subdivisionStringTableLookup(uint16_t offset) const;
0058 
0059     static void createIso3166_1Cache(const QString &isoCodesPath, const QString &cacheFilePath);
0060     static void createIso3166_2Cache(const QString &isoCodesPath, const QString &cacheFilePath);
0061 
0062 private:
0063     bool loadIso3166_1Cache();
0064     bool loadIso3166_2Cache();
0065 
0066     std::unique_ptr<QFile> m_iso3166_1CacheFile;
0067     const uint8_t *m_iso3166_1CacheData = nullptr;
0068     std::size_t m_iso3166_1CacheSize = 0;
0069     std::unique_ptr<QFile> m_iso3166_2CacheFile;
0070     const uint8_t *m_iso3166_2CacheData = nullptr;
0071     std::size_t m_iso3166_2CacheSize = 0;
0072 };
0073 
0074 #endif // ISOCODESCACHE_H