瀏覽代碼

Merge branch 'fix-duplicate-plugin-install'

Sascha Zelzer 14 年之前
父節點
當前提交
59beb44869

+ 8 - 0
Libs/PluginFramework/ctkPluginPrivate.cpp

@@ -222,6 +222,14 @@ void ctkPluginPrivate::checkManifestHeaders()
     }
   }
 
+  QSharedPointer<ctkPlugin> snp = fwCtx->plugins->getPlugin(symbolicName, version);
+  // TBD! Should we allow update to same version?
+  if (!snp.isNull() && snp->d_func() != this)
+  {
+    throw std::invalid_argument(std::string("Plugin with same symbolic name and version is already installed (")
+                                + symbolicName.toStdString() + ", " + version.toString().toStdString() + ")");
+  }
+
   QString ap = archive->getAttribute(ctkPluginConstants::PLUGIN_ACTIVATIONPOLICY);
   if (ctkPluginConstants::ACTIVATION_EAGER == ap)
   {

+ 7 - 8
Libs/PluginFramework/ctkPlugins.cpp

@@ -55,8 +55,9 @@ QSharedPointer<ctkPlugin> ctkPlugins::install(const QUrl& location, QIODevice* i
     throw std::logic_error("ctkPlugins::install(location, inputStream) called on closed plugins object.");
   }
 
+  QSharedPointer<ctkPlugin> res;
   {
-    QWriteLocker lock(&pluginsLock);
+    QMutexLocker lock(&objectLock);
 
     QHash<QString, QSharedPointer<ctkPlugin> >::const_iterator it = plugins.find(location.toString());
     if (it != plugins.end())
@@ -113,13 +114,9 @@ QSharedPointer<ctkPlugin> ctkPlugins::install(const QUrl& location, QIODevice* i
 
       pa = fwCtx->storage->insertPlugin(location, localPluginPath);
 
-      QSharedPointer<ctkPlugin> res(new ctkPlugin());
+      res = QSharedPointer<ctkPlugin>(new ctkPlugin());
       res->init(res, fwCtx, pa);
       plugins.insert(location.toString(), res);
-
-      fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::INSTALLED, res));
-
-      return res;
     }
     catch (const std::exception& e)
     {
@@ -138,6 +135,8 @@ QSharedPointer<ctkPlugin> ctkPlugins::install(const QUrl& location, QIODevice* i
     }
   }
 
+  fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::INSTALLED, res));
+  return res;
 }
 
 //----------------------------------------------------------------------------
@@ -306,7 +305,7 @@ void ctkPlugins::load()
   QListIterator<ctkPluginArchive*> it(pas);
 
   {
-    QWriteLocker lock(&pluginsLock);
+    QMutexLocker lock(&objectLock);
     while (it.hasNext())
     {
       ctkPluginArchive* pa = it.next();
@@ -325,7 +324,7 @@ void ctkPlugins::load()
             << pa->getPluginId()
             << " ("  << qPrintable(pa->getPluginLocation().toString())  << ")"
             << " uninstalled it!\n";
-        std::cerr << e.what();
+        std::cerr << e.what() << std::endl;
       }
     }
   }

+ 5 - 0
Libs/PluginFramework/ctkPlugins_p.h

@@ -25,6 +25,7 @@
 #include <QUrl>
 #include <QHash>
 #include <QReadWriteLock>
+#include <QMutex>
 #include <QSharedPointer>
 
 
@@ -61,6 +62,10 @@ private:
    */
   mutable QReadWriteLock pluginsLock;
 
+  /**
+   * Lock for protecting this object.
+   */
+  QMutex objectLock;
 
 public: