• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • lib
  • marble
ParsingRunnerManager.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2008 Henry de Valence <hdevalence@gmail.com>
9 // Copyright 2010 Dennis Nienhüser <earthwings@gentoo.org>
10 // Copyright 2010-2013 Bernhard Beschow <bbeschow@cs.tu-berlin.de>
11 // Copyright 2011 Thibaut Gridel <tgridel@free.fr>
12 
13 #include "ParsingRunnerManager.h"
14 
15 #include "MarbleDebug.h"
16 #include "GeoDataDocument.h"
17 #include "GeoDataPlacemark.h"
18 #include "PluginManager.h"
19 #include "ParseRunnerPlugin.h"
20 #include "RunnerTask.h"
21 
22 #include <QFileInfo>
23 #include <QList>
24 #include <QThreadPool>
25 #include <QTimer>
26 
27 namespace Marble
28 {
29 
30 class MarbleModel;
31 
32 class ParsingRunnerManager::Private
33 {
34 public:
35  Private( ParsingRunnerManager *parent, const PluginManager *pluginManager );
36 
37  ~Private();
38 
39  void addParsingResult( GeoDataDocument *document, const QString &error = QString() );
40  void cleanupParsingTask( ParsingTask *task );
41 
42  ParsingRunnerManager *const q;
43  const PluginManager *const m_pluginManager;
44  QList<ParsingTask *> m_parsingTasks;
45  GeoDataDocument *m_fileResult;
46 };
47 
48 ParsingRunnerManager::Private::Private( ParsingRunnerManager *parent, const PluginManager *pluginManager ) :
49  q( parent ),
50  m_pluginManager( pluginManager ),
51  m_fileResult( 0 )
52 {
53  qRegisterMetaType<GeoDataDocument*>( "GeoDataDocument*" );
54 }
55 
56 ParsingRunnerManager::Private::~Private()
57 {
58  // nothing to do
59 }
60 
61 void ParsingRunnerManager::Private::addParsingResult( GeoDataDocument *document, const QString &error )
62 {
63  if ( document || !error.isEmpty() ) {
64  if (document) {
65  m_fileResult = document;
66  }
67  emit q->parsingFinished( document, error );
68  }
69 }
70 
71 void ParsingRunnerManager::Private::cleanupParsingTask( ParsingTask *task )
72 {
73  m_parsingTasks.removeAll( task );
74  mDebug() << "removing task" << m_parsingTasks.size() << " " << (quintptr)task;
75 
76  if ( m_parsingTasks.isEmpty() ) {
77  emit q->parsingFinished();
78  }
79 }
80 
81 ParsingRunnerManager::ParsingRunnerManager( const PluginManager *pluginManager, QObject *parent ) :
82  QObject( parent ),
83  d( new Private( this, pluginManager ) )
84 {
85  if ( QThreadPool::globalInstance()->maxThreadCount() < 4 ) {
86  QThreadPool::globalInstance()->setMaxThreadCount( 4 );
87  }
88 }
89 
90 ParsingRunnerManager::~ParsingRunnerManager()
91 {
92  delete d;
93 }
94 
95 void ParsingRunnerManager::parseFile( const QString &fileName, DocumentRole role )
96 {
97  QList<const ParseRunnerPlugin*> plugins = d->m_pluginManager->parsingRunnerPlugins();
98  const QFileInfo fileInfo( fileName );
99  const QString suffix = fileInfo.suffix().toLower();
100  const QString completeSuffix = fileInfo.completeSuffix().toLower();
101 
102  foreach( const ParseRunnerPlugin *plugin, plugins ) {
103  QStringList const extensions = plugin->fileExtensions();
104  if ( extensions.isEmpty() || extensions.contains( suffix ) || extensions.contains( completeSuffix ) ) {
105  ParsingTask *task = new ParsingTask( plugin->newRunner(), this, fileName, role );
106  connect( task, SIGNAL(finished(ParsingTask*)), this, SLOT(cleanupParsingTask(ParsingTask*)) );
107  mDebug() << "parse task " << plugin->nameId() << " " << (quintptr)task;
108  d->m_parsingTasks << task;
109  }
110  }
111 
112  foreach ( ParsingTask *task, d->m_parsingTasks ) {
113  QThreadPool::globalInstance()->start( task );
114  }
115 
116  if ( d->m_parsingTasks.isEmpty() ) {
117  d->cleanupParsingTask( 0 );
118  }
119 }
120 
121 GeoDataDocument *ParsingRunnerManager::openFile( const QString &fileName, DocumentRole role, int timeout ) {
122  QEventLoop localEventLoop;
123  QTimer watchdog;
124  watchdog.setSingleShot(true);
125  connect( &watchdog, SIGNAL(timeout()),
126  &localEventLoop, SLOT(quit()));
127  connect(this, SIGNAL(parsingFinished()),
128  &localEventLoop, SLOT(quit()), Qt::QueuedConnection );
129 
130  watchdog.start( timeout );
131  parseFile( fileName, role);
132  localEventLoop.exec();
133  return d->m_fileResult;
134 }
135 
136 }
137 
138 #include "ParsingRunnerManager.moc"
QFileInfo::completeSuffix
QString completeSuffix() const
GeoDataDocument.h
Marble::PluginManager
The class that handles Marble's plugins.
Definition: PluginManager.h:45
Marble::GeoDataDocument
A container for Features, Styles and in the future Schemas.
Definition: GeoDataDocument.h:65
QEventLoop
RunnerTask.h
QThreadPool::globalInstance
QThreadPool * globalInstance()
QStringList::contains
bool contains(const QString &str, Qt::CaseSensitivity cs) const
Marble::ParsingTask
A RunnerTask that executes a file Parsing.
Definition: RunnerTask.h:101
MarbleDebug.h
ParsingRunnerManager.h
Marble::ParsingRunnerManager::~ParsingRunnerManager
~ParsingRunnerManager()
Definition: ParsingRunnerManager.cpp:90
Marble::ParsingRunnerManager::Private
friend class Private
Definition: ParsingRunnerManager.h:71
QTimer
QThreadPool::setMaxThreadCount
void setMaxThreadCount(int maxThreadCount)
QEventLoop::exec
int exec(QFlags< QEventLoop::ProcessEventsFlag > flags)
QObject
Marble::ParsingRunnerManager::openFile
GeoDataDocument * openFile(const QString &fileName, DocumentRole role=UserDocument, int timeout=30000)
Definition: ParsingRunnerManager.cpp:121
QList::isEmpty
bool isEmpty() const
QString::isEmpty
bool isEmpty() const
QString
QList
Marble::ParseRunnerPlugin::fileExtensions
virtual QStringList fileExtensions() const =0
Returns the file extensions associated with the file format.
GeoDataPlacemark.h
Marble::PluginInterface::nameId
virtual QString nameId() const =0
Returns the unique name of the plugin.
QStringList
QFileInfo
QString::toLower
QString toLower() const
ParseRunnerPlugin.h
Marble::ParseRunnerPlugin
A plugin for Marble to execute a parsing task.
Definition: ParseRunnerPlugin.h:27
Marble::ParsingRunnerManager::ParsingRunnerManager
ParsingRunnerManager(const PluginManager *pluginManager, QObject *parent=0)
Constructor.
Definition: ParsingRunnerManager.cpp:81
QFileInfo::suffix
QString suffix() const
PluginManager.h
QTimer::start
void start(int msec)
Marble::ParsingRunnerManager::parseFile
void parseFile(const QString &fileName, DocumentRole role=UserDocument)
Parse the file using the runners for various formats.
Definition: ParsingRunnerManager.cpp:95
QThreadPool::start
void start(QRunnable *runnable, int priority)
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::parent
QObject * parent() const
Marble::ParsingRunnerManager::parsingFinished
void parsingFinished()
Emitted whenever all runners are finished for the query.
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
Marble::DocumentRole
DocumentRole
Definition: GeoDataDocument.h:39
Marble::ParseRunnerPlugin::newRunner
virtual ParsingRunner * newRunner() const =0
Plugin factory method to create a new runner instance.
QTimer::setSingleShot
void setSingleShot(bool singleShot)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:41 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal