Ver código fonte

Added plugin startlevel and autostart persistence.

Sascha Zelzer 14 anos atrás
pai
commit
9f43445ac8

+ 9 - 14
Libs/PluginFramework/ctkPluginArchive.cpp

@@ -35,7 +35,7 @@ const QString ctkPluginArchive::AUTOSTART_SETTING_ACTIVATION_POLICY("activation_
 ctkPluginArchive::ctkPluginArchive(ctkPluginStorage* pluginStorage,
                                    const QUrl& pluginLocation, const QString& localPluginPath,
                                    int pluginId)
-                                     : autostartSetting(-1), id(pluginId),
+                                     : autostartSetting(-1), id(pluginId), startLevel(-1),
                                      location(pluginLocation), localPluginPath(localPluginPath),
                                      storage(pluginStorage)
 {
@@ -84,19 +84,16 @@ QStringList ctkPluginArchive::findResourcesPath(const QString& path) const
 
 int ctkPluginArchive::getStartLevel() const
 {
-  //TODO
-  return 0;
+  return startLevel;
 }
 
 void ctkPluginArchive::setStartLevel(int level)
 {
-  Q_UNUSED(level)
-  //TODO
-  //    if (startLevel != level)
-  //    {
-  //      startLevel = level;
-  //      putContent(...);
-  //    }
+  if (startLevel != level)
+  {
+    startLevel = level;
+    storage->setStartLevel(this);
+  }
 }
 
 QDateTime ctkPluginArchive::getLastModified() const
@@ -107,8 +104,7 @@ QDateTime ctkPluginArchive::getLastModified() const
 void ctkPluginArchive::setLastModified(const QDateTime& dateTime)
 {
   lastModified = dateTime;
-  //TDOO
-  //putContent(...)
+  storage->setLastModified(this);
 }
 
 int ctkPluginArchive::getAutostartSetting() const
@@ -121,8 +117,7 @@ void ctkPluginArchive::setAutostartSetting(int setting)
   if (autostartSetting != setting)
   {
     autostartSetting = setting;
-    //TODO
-    //putContent(...)
+    storage->setAutostartSetting(this);
   }
 }
 

+ 1 - 0
Libs/PluginFramework/ctkPluginArchive_p.h

@@ -66,6 +66,7 @@ private:
 
   int autostartSetting;
   int id;
+  int startLevel;
   QDateTime lastModified;
   QUrl location;
   QString localPluginPath;

+ 82 - 5
Libs/PluginFramework/ctkPluginDatabase.cpp

@@ -161,10 +161,35 @@ void ctkPluginDatabase::open()
     }
   }
 
+  removeUninstalledPlugins();
+
   //Update database based on the recorded timestamps
   updateDB();
 }
 
+void ctkPluginDatabase::removeUninstalledPlugins()
+{
+  checkConnection();
+
+  QSqlDatabase database = QSqlDatabase::database(m_connectionName);
+  QSqlQuery query(database);
+
+  beginTransaction(&query, Write);
+
+  try
+  {
+    QString statement = "DELETE FROM Plugins WHERE StartLevel==-2";
+    executeQuery(&query, statement);
+  }
+  catch (...)
+  {
+    rollbackTransaction(&query);
+    throw;
+  }
+
+  commitTransaction(&query);
+}
+
 void ctkPluginDatabase::updateDB()
 {
   checkConnection();
@@ -188,7 +213,7 @@ void ctkPluginDatabase::updateDB()
     while (query.next())
     {
       QFileInfo pluginInfo(query.value(EBindIndex2).toString());
-      if (pluginInfo.lastModified() > QDateTime::fromString(query.value(EBindIndex3).toString(), Qt::ISODate))
+      if (pluginInfo.lastModified() > getQDateTimeFromString(query.value(EBindIndex3).toString()))
       {
         outdatedIds.append(query.value(EBindIndex).toLongLong());
         outdatedPlugins.append(qMakePair(query.value(EBindIndex1).toString(), query.value(EBindIndex2).toString()));
@@ -243,7 +268,7 @@ ctkPluginArchive* ctkPluginDatabase::insertPlugin(const QUrl& location, const QS
     throw std::invalid_argument((localPath + " does not exist").toStdString());
   }
 
-  const QString lastModified = fileInfo.lastModified().toString(Qt::ISODate);
+  const QString libTimestamp = getStringFromQDateTime(fileInfo.lastModified());
 
   QString resourcePrefix = fileInfo.baseName();
   if (resourcePrefix.startsWith("lib"))
@@ -259,7 +284,8 @@ ctkPluginArchive* ctkPluginDatabase::insertPlugin(const QUrl& location, const QS
 
   beginTransaction(&query, Write);
 
-  QString statement = "INSERT INTO Plugins(Location,LocalPath,SymbolicName,Version,State,Timestamp) VALUES(?,?,?,?,?,?)";
+  QString statement = "INSERT INTO Plugins(Location,LocalPath,SymbolicName,Version,State,LastModified,Timestamp,StartLevel,AutoStart)"
+      "VALUES(?,?,?,?,?,'',?,-1,-1)";
 
   QList<QVariant> bindValues;
   bindValues.append(location.toString());
@@ -267,7 +293,7 @@ ctkPluginArchive* ctkPluginDatabase::insertPlugin(const QUrl& location, const QS
   bindValues.append(QString("na"));
   bindValues.append(QString("na"));
   bindValues.append(ctkPlugin::INSTALLED);
-  bindValues.append(lastModified);
+  bindValues.append(libTimestamp);
 
   qlonglong pluginId = -1;
   try
@@ -358,6 +384,45 @@ ctkPluginArchive* ctkPluginDatabase::insertPlugin(const QUrl& location, const QS
 
 }
 
+void ctkPluginDatabase::setStartLevel(long pluginId, int startLevel)
+{
+  QSqlDatabase database = QSqlDatabase::database(m_connectionName);
+  QSqlQuery query(database);
+
+  QString statement = "UPDATE Plugins SET StartLevel=? WHERE ID=?";
+  QList<QVariant> bindValues;
+  bindValues.append(startLevel);
+  bindValues.append(QVariant::fromValue(pluginId));
+
+  executeQuery(&query, statement, bindValues);
+}
+
+void ctkPluginDatabase::setLastModified(long pluginId, const QDateTime& lastModified)
+{
+  QSqlDatabase database = QSqlDatabase::database(m_connectionName);
+  QSqlQuery query(database);
+
+  QString statement = "UPDATE Plugins SET LastModified=? WHERE ID=?";
+  QList<QVariant> bindValues;
+  bindValues.append(getStringFromQDateTime(lastModified));
+  bindValues.append(QVariant::fromValue(pluginId));
+
+  executeQuery(&query, statement, bindValues);
+}
+
+void ctkPluginDatabase::setAutostartSetting(long pluginId, int autostart)
+{
+  QSqlDatabase database = QSqlDatabase::database(m_connectionName);
+  QSqlQuery query(database);
+
+  QString statement = "UPDATE Plugins SET AutoStart=? WHERE ID=?";
+  QList<QVariant> bindValues;
+  bindValues.append(autostart);
+  bindValues.append(QVariant::fromValue(pluginId));
+
+  executeQuery(&query, statement, bindValues);
+}
+
 QStringList ctkPluginDatabase::findResourcesPath(long pluginId, const QString& path) const
 {
   checkConnection();
@@ -553,7 +618,10 @@ void ctkPluginDatabase::createTables()
                       "SymbolicName TEXT NOT NULL,"
                       "Version TEXT NOT NULL,"
                       "State INTEGER NOT NULL,"
-                      "Timestamp TEXT NOT NULL)");
+                      "LastModified TEXT NOT NULL,"
+                      "Timestamp TEXT NOT NULL,"
+                      "StartLevel INTEGER NOT NULL,"
+                      "AutoStart INTEGER NOT NULL)");
     try
     {
       executeQuery(&query, statement);
@@ -758,5 +826,14 @@ QList<ctkPluginArchive*> ctkPluginDatabase::getPluginArchives() const
   }
 
   return archives;
+}
+
+QString ctkPluginDatabase::getStringFromQDateTime(const QDateTime& dateTime) const
+{
+  return dateTime.toString(Qt::ISODate);
+}
 
+QDateTime ctkPluginDatabase::getQDateTimeFromString(const QString& dateTimeString) const
+{
+  return QDateTime::fromString(dateTimeString, Qt::ISODate);
 }

+ 40 - 0
Libs/PluginFramework/ctkPluginDatabase_p.h

@@ -118,6 +118,30 @@ public:
   void removeArchive(const ctkPluginArchive* pa);
 
   /**
+   * Persist the start level
+   *
+   * @param pluginId The Plugin id
+   * @param startLevel The new start level
+   */
+  void setStartLevel(long pluginId, int startLevel);
+
+  /**
+   * Persist the last modification (state change) time
+   *
+   * @param pluginId The Plugin id
+   * @param lastModified The modification time
+   */
+  void setLastModified(long pluginId, const QDateTime& lastModified);
+
+  /**
+   * Persist the auto start setting.
+   *
+   * @param pluginId The Plugin id
+   * @param autostart The new auto start setting
+   */
+  void setAutostartSetting(long pluginId, int autostart);
+
+  /**
    * Reads the persisted plugin data and returns a ctkPluginArchive object
    * for each plugin which is not in state UNINSTALLED.
    *
@@ -139,6 +163,12 @@ private:
   bool dropTables();
 
   /**
+   * Remove all plugins which have been marked as uninstalled
+   * (startLevel == -2).
+   */
+  void removeUninstalledPlugins();
+
+  /**
    * Helper method that checks if all the expected tables exist in the database.
    *
    * Returns true if they all exist and false if any of them don't
@@ -195,6 +225,16 @@ private:
    */
   void rollbackTransaction(QSqlQuery* query);
 
+  /**
+   * Returns a string representation of a QDateTime instance.
+   */
+  QString getStringFromQDateTime(const QDateTime& dateTime) const;
+
+  /**
+   * Returns a QDateTime from a string representation.
+   */
+  QDateTime getQDateTimeFromString(const QString& dateTimeString) const;
+
 
   QString m_databasePath;
   QString m_connectionName;

+ 17 - 0
Libs/PluginFramework/ctkPluginStorage.cpp

@@ -55,6 +55,7 @@ ctkPluginArchive* ctkPluginStorage::updatePluginArchive(ctkPluginArchive* old, c
 {
   Q_UNUSED(old)
   Q_UNUSED(localPath)
+  //TODO: updatePluginArchive
   //return new BundleArchiveImpl((BundleArchiveImpl)old, is);
   return 0;
 }
@@ -63,6 +64,7 @@ void ctkPluginStorage::replacePluginArchive(ctkPluginArchive* oldPA, ctkPluginAr
 {
   Q_UNUSED(oldPA)
   Q_UNUSED(newPA)
+  //TODO: replacePluginArchive
   //    int pos;
   //    long id = oldBA.getBundleId();
   //    synchronized (archives) {
@@ -74,6 +76,21 @@ void ctkPluginStorage::replacePluginArchive(ctkPluginArchive* oldPA, ctkPluginAr
   //    }
 }
 
+void ctkPluginStorage::setStartLevel(ctkPluginArchive* pa)
+{
+  pluginDatabase.setStartLevel(pa->getPluginId(), pa->getStartLevel());
+}
+
+void ctkPluginStorage::setLastModified(ctkPluginArchive* pa)
+{
+  pluginDatabase.setLastModified(pa->getPluginId(), pa->getLastModified());
+}
+
+void ctkPluginStorage::setAutostartSetting(ctkPluginArchive* pa)
+{
+  pluginDatabase.setAutostartSetting(pa->getPluginId(), pa->getAutostartSetting());
+}
+
 QList<ctkPluginArchive*> ctkPluginStorage::getAllPluginArchives() const
 {
   return archives;

+ 21 - 0
Libs/PluginFramework/ctkPluginStorage_p.h

@@ -103,6 +103,27 @@ public:
   void replacePluginArchive(ctkPluginArchive* oldPA, ctkPluginArchive* newPA);
 
   /**
+   * Persist the plugin start level.
+   *
+   * @param Plugin archive object
+   */
+  void setStartLevel(ctkPluginArchive* pa);
+
+  /**
+   * Persist the last modification (state change) time
+   *
+   * @param Plugin archive object
+   */
+  void setLastModified(ctkPluginArchive* pa);
+
+  /**
+   * Persist the auto start setting.
+   *
+   * @param Plugin archive object
+   */
+  void setAutostartSetting(ctkPluginArchive* pa);
+
+  /**
    * Remove plugin archive from archives list and persistent storage.
    * The plugin archive is deleted and must not be used afterwards, if
    * this method returns \a true.