File indexing completed on 2024-12-01 10:29:53

0001 /*
0002     SPDX-FileCopyrightText: 2022 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #ifndef OSM_ABSTRACTREADER_H
0007 #define OSM_ABSTRACTREADER_H
0008 
0009 #include "kosm_export.h"
0010 
0011 #include <QString>
0012 
0013 #include <cstdint>
0014 #include <cstddef>
0015 
0016 class QIODevice;
0017 
0018 namespace OSM {
0019 
0020 class DataSet;
0021 class DataSetMergeBuffer;
0022 class Node;
0023 class Relation;
0024 class Way;
0025 
0026 /** Abstract base class for OSM file format readers. */
0027 class KOSM_EXPORT AbstractReader
0028 {
0029 public:
0030     virtual ~AbstractReader();
0031 
0032     /** Sets a merge buffer.
0033      *  When set, the parser will insert all elements into that buffer
0034      *  rather than in the OSM::DataSet specified in the constructor.
0035      *  It is then your responsibility to properly integrate those.
0036      *  @note The OSM::DataSet is used for generating tag keys and for memory
0037      *  managing strings in this case as well. So the generated elements are
0038      *  tied to the OSM::DataSet in any case.
0039      */
0040     void setMergeBuffer(OSM::DataSetMergeBuffer *buffer);
0041 
0042     /** Read the given data.
0043      *  Useful e.g. for working on memory-mapped data.
0044      */
0045     void read(const uint8_t *data, std::size_t len);
0046 
0047     /** Read data from the given QIODevice. */
0048     void read(QIODevice *io);
0049 
0050     /** Error message in case parsing failed for some reason. */
0051     QString errorString() const;
0052 
0053 protected:
0054     explicit AbstractReader(DataSet *dataSet);
0055 
0056     /** Implement for actual parsing.
0057      *  The default implementation convert into the respective other form,
0058      *  so implementing one is enough.
0059      */
0060     virtual void readFromData(const uint8_t *data, std::size_t len);
0061     virtual void readFromIODevice(QIODevice *io);
0062 
0063     /** Add read elements to the merge buffer if set, or the dataset otherwise. */
0064     void addNode(OSM::Node &&node);
0065     void addWay(OSM::Way &&way);
0066     void addRelation(OSM::Relation &&relation);
0067 
0068     DataSet *m_dataSet = nullptr;
0069     QString m_error;
0070 
0071 private:
0072     DataSetMergeBuffer *m_mergeBuffer = nullptr;
0073 };
0074 
0075 }
0076 
0077 #endif // OSM_ABSTRACTREADER_H