File indexing completed on 2024-06-23 05:13:12

0001 /*
0002     SPDX-FileCopyrightText: 2023 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #ifndef KITINERARY_PLISTDATA_P_H
0007 #define KITINERARY_PLISTDATA_P_H
0008 
0009 #include <QtEndian>
0010 
0011 #include <cstdint>
0012 
0013 namespace KItinerary {
0014 
0015 enum class PListObjectType {
0016     Null,
0017     Bool,
0018     Url,
0019     Uuid,
0020     Fill,
0021     Int,
0022     Real,
0023     Date,
0024     Data,
0025     String,
0026     Uid,
0027     Array,
0028     Ordset,
0029     Set,
0030     Dict,
0031     Unused
0032 };
0033 
0034 #pragma pack(push)
0035 #pragma pack(1)
0036 
0037 template <typename T>
0038 struct PListBigEndianNumber {
0039 public:
0040     operator T() const {
0041         if constexpr (std::is_same_v<T, uint64_t>)
0042             return qFromBigEndian((quint64)m_value);
0043         else
0044             return qFromBigEndian(m_value);
0045     }
0046 private:
0047     T m_value;
0048 };
0049 
0050 constexpr inline const char PListMagic[] = "bplist";
0051 constexpr inline std::size_t PListMagicSize = 6;
0052 
0053 struct PListHeader {
0054     uint8_t magic[PListMagicSize];
0055     uint8_t version[2];
0056 };
0057 
0058 constexpr inline uint8_t PListContainerTypeMask = 0b1111'0000;
0059 constexpr inline uint8_t PListContainerSizeMask = 0b0000'1111;
0060 
0061 constexpr inline uint8_t PListFalse = 0b000'1000;
0062 constexpr inline uint8_t PListTrue = 0b000'1001;
0063 
0064 struct PListTrailer {
0065     PListBigEndianNumber<uint8_t> offsetIntSize;
0066     PListBigEndianNumber<uint8_t> objectRefSize;
0067     PListBigEndianNumber<uint64_t> numObjects;
0068     PListBigEndianNumber<uint64_t> rootObjectIndex;
0069     PListBigEndianNumber<uint64_t> offsetTableOffset;
0070 };
0071 
0072 #pragma pack(pop)
0073 
0074 }
0075 
0076 #endif
0077