28 #include <QDirIterator>
30 #include <QLocalSocket>
32 #include <QTextStream>
38 class MonavWaiter :
private QThread
41 static void msleep(
unsigned long milliSeconds ) {
42 QThread::msleep( milliSeconds );
47 Q_DISABLE_COPY( MonavWaiter )
50 class MonavPluginPrivate
55 QVector<MonavMap> m_maps;
59 QString m_monavDaemonProcess;
65 ~MonavPluginPrivate();
71 bool isDaemonRunning()
const;
73 bool isDaemonInstalled()
const;
79 static bool areaLessThan(
const MonavMap &first,
const MonavMap &second );
82 void loadMap(
const QString &path );
87 MonavPluginPrivate::MonavPluginPrivate() : m_ownsServer( false ),
88 m_monavDaemonProcess(
"monav-daemon"), m_monavVersion( MonavPlugin::Monav_0_3 ),
89 m_initialized( false )
94 MonavPluginPrivate::~MonavPluginPrivate()
99 bool MonavPluginPrivate::isDaemonRunning()
const
102 socket.connectToServer(
"MoNavD" );
103 return socket.waitForConnected();
106 bool MonavPluginPrivate::isDaemonInstalled()
const
108 QString path = QProcessEnvironment::systemEnvironment().value(
"PATH",
"/usr/local/bin:/usr/bin:/bin" );
109 foreach(
const QString &application, QStringList() <<
"monav-daemon" <<
"MoNavD" ) {
110 foreach(
const QString &dir, path.split( QLatin1Char(
':' ) ) ) {
111 QFileInfo executable( QDir( dir ), application );
112 if ( executable.exists() ) {
121 bool MonavPluginPrivate::startDaemon()
123 if ( !isDaemonRunning() ) {
125 if ( process.startDetached( m_monavDaemonProcess ) ) {
128 if ( process.startDetached(
"MoNavD" ) ) {
130 m_monavDaemonProcess =
"MoNavD";
139 for (
int i = 0; i < 10; ++i ) {
140 if ( isDaemonRunning() ) {
143 MonavWaiter::msleep( 100 );
152 void MonavPluginPrivate::stopDaemon()
161 if ( smallScreen || m_ownsServer ) {
162 m_ownsServer =
false;
164 process.startDetached( m_monavDaemonProcess, QStringList() <<
"-t" );
168 void MonavPluginPrivate::loadMaps()
170 if ( m_maps.isEmpty() ) {
172 foreach (
const QString &baseDir, baseDirs ) {
173 QString base = baseDir +
"/maps/earth/monav/";
175 QDir::Filters filters = QDir::AllDirs | QDir::Readable | QDir::NoDotAndDotDot;
176 QDirIterator::IteratorFlags flags = QDirIterator::Subdirectories | QDirIterator::FollowSymlinks;
177 QDirIterator iter( base, filters, flags );
178 while ( iter.hasNext() ) {
180 loadMap( iter.filePath() );
188 void MonavPluginPrivate::loadMap(
const QString &path )
191 QFileInfo pluginsFile( mapDir,
"plugins.ini" );
192 QFileInfo moduleFile( mapDir,
"Module.ini" );
193 if ( pluginsFile.exists() && !moduleFile.exists() ) {
194 qDebug() <<
"Migrating" << mapDir.dirName() <<
"from monav-0.2";
195 QFile file( moduleFile.absoluteFilePath() );
196 file.open( QIODevice::WriteOnly );
197 QTextStream stream( &file );
198 stream <<
"[General]\nconfigVersion=2\n";
199 stream <<
"router=Contraction Hierarchies\ngpsLookup=GPS Grid\n";
200 stream <<
"routerFileFormatVersion=1\ngpsLookupFileFormatVersion=1\n";
203 moduleFile.refresh();
206 if ( moduleFile.exists() ) {
208 map.setDirectory( mapDir );
209 m_maps.append( map );
213 void MonavPluginPrivate::initialize()
215 if ( !m_initialized ) {
216 m_initialized =
true;
223 d( new MonavPluginPrivate )
228 if ( d->isDaemonInstalled() ) {
230 if ( d->m_maps.isEmpty() ) {
234 setStatusMessage( tr (
"The monav routing daemon does not seem to be installed on your system." ) );
237 connect( qApp, SIGNAL(aboutToQuit()),
this, SLOT(stopDaemon()) );
247 return tr(
"Monav Routing" );
252 return tr(
"Monav" );
267 return tr(
"Offline routing using the monav daemon" );
277 return QList<PluginAuthor>()
278 <<
PluginAuthor( QString::fromUtf8(
"Dennis Nienhüser" ),
"earthwings@gentoo.org" );
284 if ( !d->startDaemon() ) {
285 mDebug() <<
"Failed to start the monav routing daemon";
296 QString transport = settings[
"transport"].toString();
298 for (
int j=0; j<d->m_maps.size(); ++j ) {
300 if ( transport.isEmpty() || transport == d->m_maps[j].transport() ) {
301 for (
int i = 0; i < request->
size(); ++i ) {
303 if ( !d->m_maps[j].containsPoint( via ) ) {
315 qSwap( d->m_maps[0], d->m_maps[j] );
318 return d->m_maps.first().directory().absolutePath();
330 QString transport = settings[
"transport"].toString();
332 for (
int j=0; j<d->m_maps.size(); ++j ) {
334 if ( transport.isEmpty() || transport == d->m_maps[j].transport() ) {
335 for (
int i = 0; i < request->
size(); ++i ) {
337 if ( !d->m_maps[j].containsPoint( via ) ) {
347 result << d->m_maps[j].directory().absolutePath();
374 return !d->m_maps.isEmpty();
386 QHash<QString, QVariant> result;
387 switch ( profileTemplate ) {
389 result[
"transport"] =
"Motorcar";
392 result[
"transport"] =
"Motorcar";
397 result[
"transport"] =
"Bicycle";
400 result[
"transport"] =
"Pedestrian";
411 return d->m_monavVersion;
418 #include "MonavPlugin.moc"
int size() const
Number of points in the route.
QList< PluginAuthor > pluginAuthors() const
A 3d point representation.
virtual QHash< QString, QVariant > templateSettings(RoutingProfilesModel::ProfileTemplate profileTemplate) const
Settings for the given routing profile template.
MonavPlugin(QObject *parent=0)
MonavRoutingDaemonVersion monavVersion() const
static QString localPath()
virtual bool supportsTemplate(RoutingProfilesModel::ProfileTemplate profileTemplate) const
True if the plugin supports the given routing profile template.
Points to be included in a route.
QString description() const
Returns a user description of the plugin.
static bool areaLessThan(const MonavMap &first, const MonavMap &second)
RoutingProfile routingProfile() const
QString name() const
Returns the user-visible name of the plugin.
QString nameId() const
Returns the unique name of the plugin.
QString mapDirectoryForRequest(const RouteRequest *request) const
QString guiString() const
Returns the string that should appear in the user interface.
QStringList mapDirectoriesForRequest(const RouteRequest *request) const
#define Q_EXPORT_PLUGIN2(a, b)
virtual ConfigWidget * configWidget()
Method for getting a pointer to the configuration widget of the plugin.
static MarbleGlobal * getInstance()
const QHash< QString, QHash< QString, QVariant > > & pluginSettings() const
QString copyrightYears() const
void setSupportedCelestialBodies(const QStringList &celestialBodies)
void setCanWorkOffline(bool canWorkOffline)
virtual RoutingRunner * newRunner() const
Plugin factory method to create a new runner instance.
A plugin for Marble to execute a routing task.
void setStatusMessage(const QString &message)
int process(const QDir &input, const QDir &output, const QString &xml)
Profiles profiles() const
MonavRoutingDaemonVersion
MonavMapsModel * installedMapsModel()
static QString systemPath()
virtual bool canWork() const
Returns.
QDebug mDebug()
a function to replace qDebug() in Marble library code
GeoDataCoordinates at(int index) const
Accessor for the n-th position.