File indexing completed on 2024-05-12 04:42:19

0001 /*
0002     SPDX-FileCopyrightText: 2023 Volker Krause <vkrause@kde.org>
0003     SPDX-License-Identifier: LGPL-2.0-or-later
0004 */
0005 
0006 #include <../src/map/loader/marblegeometryassembler_p.h>
0007 
0008 #include <osm/datasetmergebuffer.h>
0009 #include <osm/datatypes.h>
0010 #include <osm/io.h>
0011 
0012 #include <QCommandLineParser>
0013 #include <QCoreApplication>
0014 #include <QDebug>
0015 #include <QFile>
0016 #include <QtPlugin>
0017 
0018 Q_IMPORT_PLUGIN(OSM_XmlIOPlugin)
0019 #if HAVE_OSM_PBF_SUPPORT
0020 Q_IMPORT_PLUGIN(OSM_PbfIOPlugin)
0021 #endif
0022 
0023 int main(int argc, char **argv)
0024 {
0025     QCoreApplication app(argc, argv);
0026     QCommandLineParser parser;
0027     parser.addHelpOption();
0028     QCommandLineOption outOpt({QStringLiteral("o"), QStringLiteral("output")}, QStringLiteral("output file"), QStringLiteral("file"));
0029     parser.addOption(outOpt);
0030     parser.process(app);
0031 
0032     const auto fileNames = parser.positionalArguments();
0033     if (fileNames.isEmpty()) {
0034         parser.showHelp(1);
0035     }
0036 
0037     OSM::DataSet dataSet;
0038     OSM::DataSetMergeBuffer mergeBuffer;
0039     KOSMIndoorMap::MarbleGeometryAssembler marbleMerger;
0040     marbleMerger.setDataSet(&dataSet);
0041     auto reader = OSM::IO::readerForMimeType(u"application/vnd.openstreetmap.data+o5m", &dataSet);
0042     reader->setMergeBuffer(&mergeBuffer);
0043 
0044     for (const auto &fileName : fileNames) {
0045         QFile f(fileName);
0046         if (!f.open(QFile::ReadOnly)) {
0047             qCritical() << f.fileName() << f.errorString();
0048             return 1;
0049         }
0050         const auto data = f.map(0, f.size());
0051         reader->read(data, f.size());
0052         marbleMerger.merge(&mergeBuffer);
0053     }
0054 
0055     marbleMerger.finalize();
0056 
0057     QFile outputFile;
0058     std::unique_ptr<OSM::AbstractWriter> writer;
0059     if (parser.isSet(outOpt)) {
0060         outputFile.setFileName(parser.value(outOpt));
0061         outputFile.open(QFile::WriteOnly);
0062         writer = OSM::IO::writerForFileName(outputFile.fileName());
0063     } else {
0064         outputFile.open(stdout, QFile::WriteOnly);
0065         writer = OSM::IO::writerForMimeType(u"application/vnd.openstreetmap.data+xml");
0066     }
0067     if (!outputFile.isOpen()) {
0068         qCritical() << outputFile.errorString();
0069         return 1;
0070     }
0071 
0072     if (!writer) {
0073         qCritical() << "no file writer for requested format:" << outputFile.fileName();
0074         return 1;
0075     }
0076     writer->write(dataSet, &outputFile);
0077     return 0;
0078 }