[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [publictransport] engine: Require provider plugin format 1.1
From:       Friedrich_Karl_Tilman_Pülz <fpuelz () gmx ! de>
Date:       2012-11-30 20:36:57
Message-ID: 20121130203657.C57FAA60E1 () git ! kde ! org
[Download RAW message or body]

Git commit cb53e7b0a05da22c71cbd28cdea6617a4920e64c by Friedrich Karl Tilman Pülz.
Committed on 29/11/2012 at 06:15.
Pushed by fkpulz into branch 'master'.

Require provider plugin format 1.1

Expand the meaning of the version to the whole plugin format,
not only the .pts file, eg. also the script API. Scripts for 1.0
are no longer supported and GTFS providers were not supported
at all in 1.0, therefore 1.1 is required now.

Add possibility to ServiceProviderDataReader to get an error
message without raiseError() when using ReadErroneousFiles.
This gets used in TimetableMate, error messages are now shown
also when loading the project and also for inactive projects
(warnings, info messages still only for active projects).

ProjectSettingsDialog now automatically updates to "1.1",
the user gets informed in a KMessageBox. The KLineEdit to
manually edit the plugin format version has been removed.

Update documentation, error messages

M  +8    -1    engine/publictransportdataengine.cpp
M  +9    -12   engine/publictransportdataengine.h
M  +5    -3    engine/serviceproviderdata.cpp
M  +6    -5    engine/serviceproviderdata.h
M  +61   -24   engine/serviceproviderdatareader.cpp
M  +7    -3    engine/serviceproviderdatareader.h
M  +9    -2    engine/timetablemate/src/project.cpp
M  +15   -9    engine/timetablemate/src/projectsettingsdialog.cpp
M  +8    -7    engine/timetablemate/src/serviceproviderdatatester.cpp
M  +8    -1    engine/timetablemate/src/timetablemate.cpp
M  +10   -49   engine/timetablemate/src/timetablemateview_base.ui

http://commits.kde.org/publictransport/cb53e7b0a05da22c71cbd28cdea6617a4920e64c

diff --git a/engine/publictransportdataengine.cpp \
b/engine/publictransportdataengine.cpp index cb75792..b38a8ea 100644
--- a/engine/publictransportdataengine.cpp
+++ b/engine/publictransportdataengine.cpp
@@ -263,7 +263,7 @@ QStringList PublicTransportEngine::sources() const
 void PublicTransportEngine::networkStateChanged( uint state )
 {
     if ( state != 4 ) {
-        // 4 => Connected
+        // 4 => Connected, see Solid::Networking::Status
         return;
     }
 
@@ -2203,6 +2203,13 @@ ServiceProvider *PublicTransportEngine::createProviderForData( \
const ServiceProv  return 0;
     }
 
+    // Warn if the format of the provider plugin is unsupported
+    if ( data->fileFormatVersion() != QLatin1String("1.1") ) {
+        kWarning() << "The Provider" << data->id() << "was designed for an \
unsupported " +                "provider plugin format version, update to version \
1.1"; +        return 0;
+    }
+
     switch ( data->type() ) {
 #ifdef BUILD_PROVIDER_TYPE_SCRIPT
     case Enums::ScriptedProvider:
diff --git a/engine/publictransportdataengine.h b/engine/publictransportdataengine.h
index d1567b5..83d2a31 100644
--- a/engine/publictransportdataengine.h
+++ b/engine/publictransportdataengine.h
@@ -281,7 +281,7 @@ protected slots:
      * @brief The network state has changed, eg. was connected or disconnected.
      *
      * This slot is connected with the @c networkstatus module of @c kded through \
                DBus.
-     * @p state The new network state.
+     * @p state The new network state. See Solid::Networking::Status.
      **/
     void networkStateChanged( uint state );
 
@@ -1462,14 +1462,15 @@ tag are <span style="background-color: \
#ffdddd;">highlighted</span>):  <td>Optional?</td> <td>Description</td></tr>
 
 <tr style="background-color: #ffdddd;">
-<td><b>\<serviceProvider\> </b></td>
-<td>Root</td> <td>Required</td> <td>This is the root item.</td></tr>
+<td><b>\<?xml version="1.0" encoding="UTF-8"?\></b></td>
+<td>Root</td> <td>Required</td><td>XML declaration.</td></tr>
 
-<tr><td><b>\<xml_file_version type="publictransport" version="1.0" /\> </b></td>
-<td>\<serviceProvider\> </td> <td>Not used</td>
-<td>This is currently not used by the data engine. But to be sure that the xml is \
                parsed correctly
-you should add this tag. The version is the version of the xml file structure,
-current version is 1.0.</td></tr>
+<tr style="background-color: #ffdddd;">
+<td><b>\<serviceProvider fileVersion="1.1" version=@em "plugin-version" type=@em \
"provider-type" \> </b></td> +<td>Root</td> <td>Required</td> <td>This is the root \
item. The only currently supported provider +plugin format version is 1.1 and gets \
written as 'fileVersion' attribute. The 'version' attribute +contains the version of \
the plugin itself and the 'type' attribute specifies the type of the +plugin, which \
can currently be either @em "script" or @em "gtfs".</td></tr>  
 <tr style="background-color: #ffdddd;">
 <td><b>\<name\> </b></td><td>\<serviceProvider\></td> <td>Required</td>
@@ -1504,10 +1505,6 @@ The email address of the author of the service provider \
plugin.</td></tr>  <td>The version of the service provider plugin, should start with \
"1.0".</td></tr>  
 <tr style="background-color: #ffdddd;">
-<td><b>\<type\> </b></td><td>\<serviceProvider\></td> <td>Required</td>
-<td>Can be either HTML or XML.</td></tr>
-
-<tr style="background-color: #ffdddd;">
 <td><b>\<url\> </b></td><td>\<serviceProvider\></td> <td>Required</td>
 <td>An url to the service provider home page.</td></tr>
 
diff --git a/engine/serviceproviderdata.cpp b/engine/serviceproviderdata.cpp
index e7453af..02d404a 100644
--- a/engine/serviceproviderdata.cpp
+++ b/engine/serviceproviderdata.cpp
@@ -50,8 +50,8 @@ ServiceProviderData::ServiceProviderData( const \
Enums::ServiceProviderType& type  {
     m_serviceProviderType = type;
     m_id = id;
-    m_version = "1.0";
-    m_fileFormatVersion = "1.1";
+    m_version = "1.0"; // Initial version of new provider plugins
+    m_fileFormatVersion = "1.1"; // Current version of the file structure of the \
.pts-file  m_useSeparateCityValue = false;
     m_onlyUseCitiesInList = false;
     m_defaultVehicleType = Enums::UnknownVehicleType;
@@ -265,7 +265,9 @@ int ServiceProviderData::compareVersions( const QString \
                &version1, const QString
             return 1; // No more version numbers in version2, but in version1, which \
is therefore bigger  }
 
-        // pos1 and pos2 are both >= 0 here
+        // pos1 and pos2 are both >= 0 here,
+        // they are set behind the '.' after the just read version numbers,
+        // this makes the next iteration read the next version number
     }
 
     return 0;
diff --git a/engine/serviceproviderdata.h b/engine/serviceproviderdata.h
index 843af67..1ac73a9 100644
--- a/engine/serviceproviderdata.h
+++ b/engine/serviceproviderdata.h
@@ -411,11 +411,12 @@ public:
      * The "file version" names the used version of the PublicTransport engine \
                plugin interface.
      * Currently only version 1.1 is supported.
      *
-     * @note Service provider plugins written for version 1.0 need to be updated. \
                But that mostly
-     *   means adding a 'getTimetable()' function to download a timetable document \
                and calling the
-     *   old 'parseTimetable()' function if the download is finished. The same can \
                be done with
-     *   'getStopsuggestions()' and 'getJourneys()'. The return values now need to \
                be JavaScript
-     *   objects containing properties named after the enumerables in \
TimetableInformation. +     * @note Service provider plugin scripts written for \
version 1.0 need to be updated. But that +     *   mostly means adding a \
'getTimetable()' function to download a timetable document and +     *   calling the \
old 'parseTimetable()' function when the download is finished. The same can be +     \
*   done with 'getStopsuggestions()' and 'getJourneys()'. The return values now need \
to be +     *   JavaScript objects containing properties named after the enumerables \
in  +     *   TimetableInformation.
      *
      * @param fileFormatVersion The file format version of this service provider \
                plugin.
      **/
diff --git a/engine/serviceproviderdatareader.cpp \
b/engine/serviceproviderdatareader.cpp index 5781a83..4d77beb 100644
--- a/engine/serviceproviderdatareader.cpp
+++ b/engine/serviceproviderdatareader.cpp
@@ -99,7 +99,7 @@ ServiceProviderData *ServiceProviderDataReader::read( const QString \
&providerId,  }
 
 ServiceProviderData *ServiceProviderDataReader::read( QIODevice *device, const \
                QString &fileName,
-        ErrorAcceptance errorAcceptance, QObject *parent, QString *comments )
+        ErrorAcceptance errorAcceptance, QObject *parent, QString *comments, QString \
*errorMessage )  {
     const QString serviceProvider = ServiceProviderGlobal::idFromFileName( fileName \
);  
@@ -114,19 +114,38 @@ ServiceProviderData *ServiceProviderDataReader::read( QIODevice \
*device, const Q  country = "international";
     }
 
-    return read( device, serviceProvider, fileName, country, errorAcceptance, \
parent, comments ); +    return read( device, serviceProvider, fileName, country,
+                 errorAcceptance, parent, comments, errorMessage );
+}
+
+bool ServiceProviderDataReader::handleError( const QString &errorMessage,
+                                             ErrorAcceptance errorAcceptance,
+                                             QString *errorMessageOutput )
+{
+    if ( errorMessageOutput ) {
+        *errorMessageOutput = errorMessage;
+    }
+    if ( errorAcceptance == OnlyReadCorrectFiles ) {
+        raiseError( errorMessage );
+        return false;
+    } else {
+        return true;
+    }
 }
 
 ServiceProviderData* ServiceProviderDataReader::read( QIODevice* device,
         const QString &serviceProvider, const QString &fileName, const QString \
                &country,
-        ErrorAcceptance errorAcceptance, QObject *parent, QString *comments )
+        ErrorAcceptance errorAcceptance, QObject *parent, QString *comments, QString \
*errorMessage )  {
     Q_ASSERT( device );
 
     bool closeAfterRead; // Only close after reading if it wasn't open before
     if ( (closeAfterRead = !device->isOpen()) && !device->open(QIODevice::ReadOnly) \
                ) {
-        raiseError( "Couldn't read the file \"" + fileName + "\"." );
-        return 0;
+        if ( !handleError("Couldn't read the file \"" + fileName + "\".",
+                          errorAcceptance, errorMessage) ) 
+        {
+            return 0;
+        }
     }
     setDevice( device );
 
@@ -140,16 +159,27 @@ ServiceProviderData* ServiceProviderDataReader::read( \
QIODevice* device,  }
         } else if ( isStartElement() ) {
             if ( name().compare("serviceProvider", Qt::CaseInsensitive) != 0 ) {
-                raiseError( QString("Wrong root element, should be \
                <serviceProvider>, is <%1>.")
-                            .arg(name().toString()) );
-            } else if ( attributes().value("fileVersion") != QLatin1String("1.0") ) \
                {
-                raiseError( "The file is not a public transport service provider \
                plugin "
-                            "version 1.0 file." );
-            } else {
-                data = readProviderData( serviceProvider, fileName, country, \
                errorAcceptance,
-                                         parent, comments );
-                break;
+                if ( !handleError(QString("Wrong root element for %1, should be \
<serviceProvider>, " +                                  "is \
<%2>.").arg(serviceProvider, name().toString()), +                                  \
errorAcceptance, errorMessage) ) +                {
+                    return 0;
+                }
+            } else if ( attributes().value("fileVersion") != QLatin1String("1.1") ) \
{ +                const QString message = QString("Service provider plugin format \
version '%1' " +                        "specified by %2 is not supported. Currently \
only 1.1 is supported. " +                        "Please make sure the plugin \
complies with that version and update the " +                        "'fileVersion' \
attribute of the root <serviceProvider> tag.") +                        \
.arg(attributes().value("fileVersion").toString(), serviceProvider); +                \
if ( !handleError(message, errorAcceptance, errorMessage) ) +                {
+                    return 0;
+                }
             }
+
+            data = readProviderData( serviceProvider, fileName, country, \
errorAcceptance, +                                     parent, comments, errorMessage \
); +            break;
         }
     }
 
@@ -233,7 +263,7 @@ void ServiceProviderDataReader::addComments( QString *comments, \
const QString &n  
 ServiceProviderData *ServiceProviderDataReader::readProviderData( const QString \
                &serviceProviderId,
         const QString &fileName, const QString &country, ErrorAcceptance \
                errorAcceptance,
-        QObject *parent, QString *comments )
+        QObject *parent, QString *comments, QString *errorMessage )
 {
     const QString lang = KGlobal::locale()->country();
     QString langRead, url, shortUrl;
@@ -246,9 +276,13 @@ ServiceProviderData \
                *ServiceProviderDataReader::readProviderData( const QString
         serviceProviderTypeString = attributes().value( QLatin1String("type") \
                ).toString();
         serviceProviderType = ServiceProviderGlobal::typeFromString( \
                serviceProviderTypeString );
         if ( serviceProviderType == Enums::InvalidProvider && errorAcceptance == \
                OnlyReadCorrectFiles ) {
-            raiseError( QString("The service provider type %1 is invalid. "
-                                "Currently there are two values allowed: Script or \
                GTFS.")
-                        .arg(serviceProviderTypeString) );
+            if ( !handleError(QString("The service provider type %1 used for %2 is \
invalid. " +                              "Currently there are two values allowed: \
Script or GTFS.") +                              .arg(serviceProviderTypeString, \
serviceProviderId), +                              errorAcceptance, errorMessage) )
+            {
+                return 0;
+            }
             return 0;
         }
     } else {
@@ -345,12 +379,15 @@ ServiceProviderData \
                *ServiceProviderDataReader::readProviderData( const QString
                 const QStringList extensions = attributes().value( \
                QLatin1String("extensions") )
                         .toString().split( ',', QString::SkipEmptyParts );
                 const QString scriptFile = QFileInfo( fileName ).path() + '/' + \
                readElementText();
-                if ( !QFile::exists(scriptFile) && errorAcceptance == \
                OnlyReadCorrectFiles ) {
-                    raiseError( QString("The script file %1 referenced by the \
                service provider "
-                                        "information XML named %2 wasn't found")
-                                .arg(scriptFile).arg(names["en"]) );
-                    delete serviceProviderData;
-                    return 0; // TODO
+                if ( !QFile::exists(scriptFile) ) {
+                    if ( !handleError(QString("The script file %1 referenced by the \
service " +                                      "provider plugin %2 was not found")
+                                      .arg(scriptFile, serviceProviderId),
+                                      errorAcceptance, errorMessage) )
+                    {
+                        delete serviceProviderData;
+                        return 0;
+                    }
                 }
                 serviceProviderData->setScriptFile( scriptFile, extensions );
 #endif
diff --git a/engine/serviceproviderdatareader.h b/engine/serviceproviderdatareader.h
index 4568760..299bce5 100644
--- a/engine/serviceproviderdatareader.h
+++ b/engine/serviceproviderdatareader.h
@@ -105,17 +105,19 @@ public:
     ServiceProviderData* read( QIODevice *device, const QString &serviceProvider,
                                const QString &fileName, const QString &country,
                                ErrorAcceptance errorAcceptance = \
                OnlyReadCorrectFiles,
-                               QObject *parent = 0, QString *comments = 0 );
+                               QObject *parent = 0, QString *comments = 0,
+                               QString *errorMessage = 0 );
 
     ServiceProviderData* read( QIODevice *device, const QString &fileName,
                                ErrorAcceptance errorAcceptance = \
                OnlyReadCorrectFiles,
-                               QObject *parent = 0, QString *comments = 0 );
+                               QObject *parent = 0, QString *comments = 0,
+                               QString *errorMessage = 0 );
 
 private:
     void readUnknownElement( QString *comments = 0 );
     ServiceProviderData *readProviderData( const QString &serviceProvider,
             const QString &fileName, const QString &country, ErrorAcceptance \
                errorAcceptance,
-            QObject *parent, QString *comments = 0 );
+            QObject *parent, QString *comments = 0, QString *errorMessage = 0 );
     QString readLocalizedTextElement( QString *lang );
     bool readBooleanElement();
     void readAuthor( QString *fullname, QString *shortName, QString *email, QString \
*comments = 0 ); @@ -129,6 +131,8 @@ private:
     inline void addComments( QString *comments, const QStringRef &newComments, bool \
newLine = true ) {  addComments( comments, newComments.toString(), newLine );
     };
+    bool handleError( const QString &errorMessage, ErrorAcceptance errorAcceptance,
+                      QString *errorMessageOutput );
 };
 
 #endif // Multiple inclusion guard
diff --git a/engine/timetablemate/src/project.cpp \
b/engine/timetablemate/src/project.cpp index 67dcfa7..9fa771b 100644
--- a/engine/timetablemate/src/project.cpp
+++ b/engine/timetablemate/src/project.cpp
@@ -841,8 +841,10 @@ public:
         xmlComments.clear();
 
         ServiceProviderDataReader reader;
+        QString errorMessage;
         ServiceProviderData *readData = reader.read(
-                device, fileName, ServiceProviderDataReader::ReadErrorneousFiles, q, \
&xmlComments ); +                device, fileName, \
ServiceProviderDataReader::ReadErrorneousFiles, +                q, &xmlComments, \
&errorMessage );  if ( readData ) {
             Enums::ServiceProviderType oldType = provider ? provider->type() : \
Enums::InvalidProvider;  #ifdef BUILD_PROVIDER_TYPE_SCRIPT
@@ -858,6 +860,11 @@ public:
             if ( provider->type() != oldType ) {
                 q->emit providerTypeChanged( provider->type(), oldType );
             }
+
+            if ( !errorMessage.isEmpty() ) {
+                kDebug() << "Service provider plugin has errors" << errorMessage << \
fileName; +                errorHappened( Project::ErrorWhileLoadingProject, \
errorMessage ); +            }
         } else {
             kDebug() << "Service provider plugin is invalid" << reader.errorString() \
<< fileName;  provider = ServiceProvider::createInvalidProvider( q );
@@ -1080,7 +1087,7 @@ public:
 
         kDebug() << "Error:" << error << errorString;
         state = Project::ProjectError;
-        q->emitInformationMessage( errorString, KMessageWidget::Error, 10000 );
+        q->emitInformationMessage( errorString, KMessageWidget::Error, -1 );
     };
 
     void connectTab( AbstractTab *tab )
diff --git a/engine/timetablemate/src/projectsettingsdialog.cpp \
b/engine/timetablemate/src/projectsettingsdialog.cpp index 2a8d803..e661d55 100644
--- a/engine/timetablemate/src/projectsettingsdialog.cpp
+++ b/engine/timetablemate/src/projectsettingsdialog.cpp
@@ -182,7 +182,6 @@ ProjectSettingsDialog::ProjectSettingsDialog( QWidget *parent )
     QRegExpValidator *versionValidator =
             new QRegExpValidator( QRegExp("\\d+(\\.\\d+)?(\\.\\d+)?"), this );
     ui_provider->version->setValidator( versionValidator );
-    ui_provider->fileVersion->setValidator( versionValidator );
 
     // Set a validator for the email line edit
     // The reg exp is "inspired" by http://www.regular-expressions.info/email.html
@@ -194,7 +193,6 @@ ProjectSettingsDialog::ProjectSettingsDialog( QWidget *parent )
     // Install event filters to filter out focus out events
     // if the line edit's text cannot be validated
     ui_provider->version->installEventFilter( this );
-    ui_provider->fileVersion->installEventFilter( this );
     ui_provider->name->installEventFilter( this );
     ui_provider->description->installEventFilter( this );
     ui_provider->author->installEventFilter( this );
@@ -314,7 +312,6 @@ ProjectSettingsDialog::ProjectSettingsDialog( QWidget *parent )
     connect( ui_provider->shortAuthor, SIGNAL(textChanged(QString)), m_mapper, \
                SLOT(map()) );
     connect( ui_provider->email, SIGNAL(textChanged(QString)), m_mapper, SLOT(map()) \
                );
     connect( ui_provider->defaultVehicleType, SIGNAL(currentIndexChanged(int)), \
                m_mapper, SLOT(map()) );
-    connect( ui_provider->fileVersion, SIGNAL(textChanged(QString)), m_mapper, \
                SLOT(map()) );
     connect( ui_provider->predefinedCities, SIGNAL(changed()), m_mapper, SLOT(map()) \
                );
     connect( ui_provider->sampleStopNames, SIGNAL(changed()), m_mapper, SLOT(map()) \
                );
     connect( ui_provider->sampleCity, SIGNAL(textChanged(QString)), m_mapper, \
SLOT(map()) ); @@ -336,7 +333,6 @@ ProjectSettingsDialog::ProjectSettingsDialog( \
                QWidget *parent )
     m_mapper->setMapping( ui_provider->shortAuthor, ui_provider->shortAuthor );
     m_mapper->setMapping( ui_provider->email, ui_provider->email );
     m_mapper->setMapping( ui_provider->defaultVehicleType, \
                ui_provider->defaultVehicleType );
-    m_mapper->setMapping( ui_provider->fileVersion, ui_provider->fileVersion );
     m_mapper->setMapping( ui_provider->predefinedCities, \
                ui_provider->predefinedCities );
     m_mapper->setMapping( ui_provider->sampleStopNames, ui_provider->sampleStopNames \
                );
     m_mapper->setMapping( ui_provider->sampleCity, ui_provider->sampleCity );
@@ -379,7 +375,6 @@ bool ProjectSettingsDialog::check()
 {
     bool result = testWidget( ui_provider->email );
     result = testWidget( ui_provider->version ) && result;
-    result = testWidget( ui_provider->fileVersion ) && result;
     result = testWidget( ui_provider->name ) && result;
     result = testWidget( ui_provider->description ) && result;
     result = testWidget( ui_provider->author ) && result;
@@ -444,8 +439,6 @@ TestModel::Test testFromWidget( Ui::timetablemateview_base *ui, \
QWidget *widget  return TestModel::ServiceProviderDataNameTest;
     } else if ( widget == ui->version ) {
         return TestModel::ServiceProviderDataVersionTest;
-    } else if ( widget == ui->fileVersion ) {
-        return TestModel::ServiceProviderDataFileFormatVersionTest;
     } else if ( widget == ui->author ) {
         return TestModel::ServiceProviderDataAuthorNameTest;
     } else if ( widget == ui->shortAuthor ) {
@@ -581,7 +574,7 @@ void ProjectSettingsDialog::fillValuesFromWidgets()
     m_providerData->setNames( names );
     m_providerData->setDescriptions( descriptions );
     m_providerData->setVersion( ui_provider->version->text() );
-    m_providerData->setFileFormatVersion( ui_provider->fileVersion->text() );
+    m_providerData->setFileFormatVersion( "1.1" ); // Update to current format \
                version
     m_providerData->setUseSeparateCityValue( ui_provider->useCityValue->isChecked() \
                );
     m_providerData->setOnlyUseCitiesInList( \
                ui_provider->onlyAllowPredefinedCities->isChecked() );
     m_providerData->setUrl( ui_provider->url->text(), ui_provider->shortUrl->text() \
); @@ -895,6 +888,20 @@ void ProjectSettingsDialog::setProviderData( const \
ServiceProviderData *data,  m_providerData = data->clone( data->parent() );
     m_openedPath = fileName;
     ui_provider->type->setCurrentIndex( providerTypeToComboBoxIndex(data->type()) );
+
+    if ( data->fileFormatVersion() != QLatin1String("1.1") ) {
+        KMessageBox::information( this, i18nc("@info",
+                "<title>Invalid Provider Plugin Format Version</title>"
+                "<para>The provider plugin format version has been set to "
+                "<emphasize strong='1'>1.1</emphasize>, because the specified \
version " +                "<emphasize strong='1'>%1</emphasize> is not \
supported.</para>" +                "<para>Please make sure that the plugin complies \
with that version " +                "and update it if neccessary.</para>"
+                "<para><note>You can cancel the settings dialog to not change \
anything." +                "</note></para>",
+                data->fileFormatVersion()) );
+    }
+
 #ifdef BUILD_PROVIDER_TYPE_SCRIPT
     ui_provider->scriptFile->setText( data->scriptFileName() );
     checkScriptExtensionsInWidget( data->scriptExtensions() );
@@ -934,7 +941,6 @@ void ProjectSettingsDialog::setProviderData( const \
                ServiceProviderData *data,
             ui_provider->defaultVehicleType->findData( \
Enums::toString(data->defaultVehicleType()) );  \
ui_provider->defaultVehicleType->setCurrentIndex(  defaultVehicleTypeIndex > 0 ? \
                defaultVehicleTypeIndex : 0 );
-    ui_provider->fileVersion->setText( data->fileFormatVersion() );
     m_changelog->clear();
     m_changelog->addChangelog( data->changelog(), data->shortAuthor() );
 
diff --git a/engine/timetablemate/src/serviceproviderdatatester.cpp \
b/engine/timetablemate/src/serviceproviderdatatester.cpp index c021fae..a649c05 \
                100644
--- a/engine/timetablemate/src/serviceproviderdatatester.cpp
+++ b/engine/timetablemate/src/serviceproviderdatatester.cpp
@@ -191,17 +191,18 @@ TestModel::TestState \
ServiceProviderDataTester::isFileVersionValid( const QStrin  QList< \
TimetableDataRequestMessage > *childrenExplanations )  {
     Q_UNUSED( childrenExplanations )
-    if ( fileVersion.isEmpty() || fileVersion != "1.0" ) {
+
+    // Only file format version 1.1 is currently supported
+    if ( fileVersion.isEmpty() || fileVersion != QLatin1String("1.1") ) {
         if ( errorMessage ) {
             if ( errorMessage ) {
-                *errorMessage = i18nc("@info/plain", "The PublicTransport data \
                engine currently "
-                        "only supports version '1.0'");
+                *errorMessage = i18nc("@info/plain", "Only provider plugin format \
version 1.1 is " +                                      "currently supported.");
             }
             if ( tooltip ) {
-                *tooltip = i18nc("@info",
-                        "<title>The PublicTransport data engine currently only \
                supports version '1.0'</title>"
-                        "<para>Specify version '1.0' as <interface>File Type \
                Version</interface> "
-                        "in the project settings.</para>");
+                *tooltip = i18nc("@info", "<title>Unsupported Plugin Format \
Version</title>" +                        "<para>The only currently supported \
provider plugin format version is 1.1." +                        "</para>");
             }
         }
         return TestModel::TestFinishedWithErrors;
diff --git a/engine/timetablemate/src/timetablemate.cpp \
b/engine/timetablemate/src/timetablemate.cpp index 837188d..3e4bdf8 100644
--- a/engine/timetablemate/src/timetablemate.cpp
+++ b/engine/timetablemate/src/timetablemate.cpp
@@ -1683,8 +1683,9 @@ void TimetableMate::removeAllMessageWidgets()
 void TimetableMate::infoMessage( const QString &message, KMessageWidget::MessageType \
type,  int timeout, QList<QAction*> actions )
 {
+    // Do not show messages from inactive projects, except for error messages
     Project *project = qobject_cast< Project* >( sender() );
-    if ( project && !project->isActiveProject() ) {
+    if ( project && !project->isActiveProject() && type != KMessageWidget::Error ) {
         return;
     }
 
@@ -1827,8 +1828,14 @@ Project *TimetableMate::openProject( const QString &filePath )
         return openedProject;
     }
 
+    // Create project and try to load it,
+    // before loading it connect to the info message signal for error messages while \
reading  Project *project = new Project( m_projectModel->weaver(), this );
+    connect( project, \
SIGNAL(informationMessage(QString,KMessageWidget::MessageType,int,QList<QAction*>)), \
+             this, SLOT(infoMessage(QString,KMessageWidget::MessageType,int,QList<QAction*>)) \
);  project->loadProject( filePath );
+    disconnect( project, \
SIGNAL(informationMessage(QString,KMessageWidget::MessageType,int,QList<QAction*>)), \
+                this, \
SLOT(infoMessage(QString,KMessageWidget::MessageType,int,QList<QAction*>)) );  if ( \
project->state() == Project::ProjectSuccessfullyLoaded ) {  if ( \
!project->filePath().isEmpty() ) {  m_recentFilesAction->addUrl( project->filePath() \
                );
diff --git a/engine/timetablemate/src/timetablemateview_base.ui \
b/engine/timetablemate/src/timetablemateview_base.ui index f613bf2..c5feeb6 100644
--- a/engine/timetablemate/src/timetablemateview_base.ui
+++ b/engine/timetablemate/src/timetablemateview_base.ui
@@ -699,45 +699,7 @@
        <property name="fieldGrowthPolicy">
         <enum>QFormLayout::ExpandingFieldsGrow</enum>
        </property>
-       <item row="0" column="0">
-        <widget class="QLabel" name="lblFileVersion">
-         <property name="text">
-          <string>File Type &amp;Version:</string>
-         </property>
-         <property name="buddy">
-          <cstring>fileVersion</cstring>
-         </property>
-        </widget>
-       </item>
-       <item row="0" column="1">
-        <widget class="KLineEdit" name="fileVersion">
-         <property name="enabled">
-          <bool>true</bool>
-         </property>
-         <property name="sizePolicy">
-          <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
-           <horstretch>0</horstretch>
-           <verstretch>0</verstretch>
-          </sizepolicy>
-         </property>
-         <property name="toolTip">
-          <string comment="@info:tooltip">The version of the PublicTransport service \
provider plugin file type.&lt;nl/&gt;The PublicTransport data engine currently only \
                accepts 1.0 as version</string>
-         </property>
-         <property name="inputMask">
-          <string/>
-         </property>
-         <property name="maxLength">
-          <number>64</number>
-         </property>
-         <property name="showClearButton" stdset="0">
-          <bool>true</bool>
-         </property>
-        </widget>
-       </item>
-       <item row="2" column="0" colspan="2">
-        <widget class="KSeparator" name="kseparator_2"/>
-       </item>
-       <item row="3" column="0">
+       <item row="1" column="0">
         <widget class="QLabel" name="lblDefaultVehicleType">
          <property name="text">
           <string>Default &amp;Vehicle Type:</string>
@@ -747,15 +709,15 @@
          </property>
         </widget>
        </item>
-       <item row="3" column="1">
+       <item row="1" column="1">
         <widget class="KComboBox" name="defaultVehicleType">
          <property name="toolTip">
           <string comment="@info:tooltip">The vehicle type to be used if it could \
not be determined from the parsed document.</string>  </property>
         </widget>
        </item>
-       <item row="4" column="0">
-        <widget class="QLabel" name="lblRawStopSuggestionsUrl_2">
+       <item row="2" column="0">
+        <widget class="QLabel" name="lblMinFetchWait">
          <property name="text">
           <string>Min. Fetch &amp;Wait:</string>
          </property>
@@ -764,7 +726,7 @@
          </property>
         </widget>
        </item>
-       <item row="4" column="1">
+       <item row="2" column="1">
         <widget class="QSpinBox" name="minFetchWait">
          <property name="toolTip">
           <string comment="@info:tooltip">The minimum time in minutes to wait \
between fetches of the same URL. @@ -790,10 +752,10 @@
          </property>
         </widget>
        </item>
-       <item row="5" column="0" colspan="2">
+       <item row="3" column="0" colspan="2">
         <widget class="KSeparator" name="kseparator"/>
        </item>
-       <item row="6" column="0">
+       <item row="4" column="0">
         <widget class="QLabel" name="lblUseCityValue">
          <property name="text">
           <string>&amp;Use City Value:</string>
@@ -803,15 +765,15 @@
          </property>
         </widget>
        </item>
-       <item row="6" column="1">
+       <item row="4" column="1">
         <widget class="QCheckBox" name="useCityValue">
          <property name="text">
           <string/>
          </property>
         </widget>
        </item>
-       <item row="7" column="0" colspan="2">
-        <widget class="QGroupBox" name="groupBox">
+       <item row="5" column="0" colspan="2">
+        <widget class="QGroupBox" name="grpPredefinedCities">
          <property name="title">
           <string>Predefined &amp;Cities</string>
          </property>
@@ -996,7 +958,6 @@
   <tabstop>gtfsTripUpdates</tabstop>
   <tabstop>gtfsAlerts</tabstop>
   <tabstop>timeZone</tabstop>
-  <tabstop>fileVersion</tabstop>
   <tabstop>defaultVehicleType</tabstop>
   <tabstop>minFetchWait</tabstop>
   <tabstop>useCityValue</tabstop>


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic