File indexing completed on 2024-04-14 03:48:52

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2011 Dennis Nienhüser <nienhueser@kde.org>
0004 //
0005 
0006 #include "jobmanager.h"
0007 
0008 #include <QTimer>
0009 #include <QFile>
0010 #include <QTextStream>
0011 #include <QDebug>
0012 #include <QDomDocument>
0013 
0014 JobManager::JobManager(QObject *parent) :
0015     QObject(parent)
0016 {   
0017     QDir temp = QDir(QDir::tempPath());
0018 
0019     m_monavSettings = QFileInfo(temp, "monav_settings.ini");
0020     QFile settingsFile(m_monavSettings.absoluteFilePath());
0021     settingsFile.open(QFile::WriteOnly | QFile::Truncate);
0022     QTextStream settingsStream(&settingsFile);
0023 
0024     settingsStream << "[General]\npackaging=false\ndictionarySize=16384\nblockSize=16384\n";
0025     settingsStream << "importer=OpenStreetMap Importer\nrouter=Contraction Hierarchies";
0026     settingsStream << "renderer=Mapnik Renderer\ngpsLookup=GPS Grid\naddressLookup=Unicode Tournament Trie\n\n";
0027     settingsStream << "[OSM%20Importer]\nlanguages=name\nspeedProfile=:/speed profiles/motorcar.spp\n\n";
0028     settingsStream << "[ContractionHierarchies]\nblockSize=12\n";
0029     settingsFile.close();
0030 }
0031 
0032 void JobManager::run()
0033 {
0034     update();
0035 }
0036 
0037 void JobManager::setRegionsFile(const QString &filename)
0038 {
0039     QFile file(filename);
0040     file.open(QFile::ReadOnly);
0041 
0042     QDomDocument xml;
0043     if ( !xml.setContent( &file ) ) {
0044         qDebug() << "Cannot parse xml file with regions.";
0045         return;
0046     }
0047 
0048     QDomElement root = xml.documentElement();
0049     QDomNodeList regions = root.elementsByTagName( "region" );
0050     for ( int i = 0; i < int(regions.length()); ++i ) {
0051         Region region;
0052         QDomNode node = regions.item( i );
0053         if (!node.namedItem("continent").isNull()) {
0054             region.setContinent(node.namedItem("continent").toElement().text());
0055         }
0056         if (!node.namedItem("country").isNull()) {
0057             region.setCountry(node.namedItem("country").toElement().text());
0058         }
0059         if (!node.namedItem("name").isNull()) {
0060             region.setName(node.namedItem("name").toElement().text());
0061         }
0062         if (!node.namedItem("id").isNull()) {
0063             region.setId(node.namedItem("id").toElement().text());
0064         }
0065         if (!node.namedItem("path").isNull()) {
0066             region.setPath(node.namedItem("path").toElement().text());
0067         }
0068         if (!node.namedItem("pbf").isNull()) {
0069             region.setPbfFile(node.namedItem("pbf").toElement().text());
0070         }
0071         if (!node.namedItem("transport").isNull()) {
0072             QStringList input = node.namedItem("transport").toElement().text().split(QLatin1Char(','), QString::SkipEmptyParts);
0073             for( const QString &value: input ) {
0074                 if (!region.continent().isEmpty() && !region.name().isEmpty()) {
0075                     PendingJob job;
0076                     job.m_region = region;
0077                     job.m_transport = value.trimmed();
0078                     if (job.m_transport == QLatin1String("Motorcar")) {
0079                         job.m_profile = "motorcar";
0080                         m_pendingJobs << job;
0081                     } else if (job.m_transport == QLatin1String("Bicycle")) {
0082                         job.m_profile = "bicycle";
0083                         m_pendingJobs << job;
0084                     } else if (job.m_transport == QLatin1String("Pedestrian")) {
0085                         job.m_profile = "foot";
0086                         m_pendingJobs << job;
0087                     } else {
0088                         qDebug() << "Invalid transport type " << job.m_transport
0089                                  << " in .xml file, ignoring. Valid types are Motorcar, Bicycle and Pedestrian.";
0090                     }
0091                 }
0092             }
0093         }
0094     }
0095 }
0096 
0097 void JobManager::setResumeId(const QString &resumeId)
0098 {
0099     m_resumeId = resumeId;
0100 }
0101 
0102 void JobManager::setJobParameters(const JobParameters &parameters)
0103 {
0104     m_jobParameters = parameters;
0105 }
0106 
0107 void JobManager::update()
0108 {
0109     bool resume = m_resumeId.isEmpty();
0110     for(const PendingJob &job: m_pendingJobs) {
0111         resume = resume || job.m_region.id() == m_resumeId;
0112         if (resume) {
0113             addJob(job);
0114         }
0115     }
0116 
0117     QTimer::singleShot(1000*60*60*24, this, SLOT(update()));
0118 }
0119 
0120 void JobManager::addJob(const PendingJob &job)
0121 {
0122     Job* countryJob = new Job(job.m_region, m_jobParameters);
0123     /** @todo: Support other transport types */
0124     countryJob->setTransport(job.m_transport);
0125     countryJob->setProfile(job.m_profile);
0126     countryJob->setMonavSettings(m_monavSettings.absoluteFilePath());
0127     m_queue.addJob(countryJob);
0128 }
0129 
0130 #include "moc_jobmanager.cpp"