File indexing completed on 2023-05-30 09:06:28
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 ¶meters) 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"