瀏覽代碼

Start plugin dependencies.

If a plugin is started, its dependencies are now also started.
Sascha Zelzer 14 年之前
父節點
當前提交
0c5b01962e
共有 2 個文件被更改,包括 32 次插入0 次删除
  1. 30 0
      Libs/PluginFramework/ctkPluginPrivate.cpp
  2. 2 0
      Libs/PluginFramework/ctkPluginPrivate_p.h

+ 30 - 0
Libs/PluginFramework/ctkPluginPrivate.cpp

@@ -192,6 +192,8 @@ void ctkPluginPrivate::finalizeActivation()
     }
     try
     {
+      // start dependencies
+      startDependencies();
       //TODO maybe call this in its own thread
       start0();
     }
@@ -285,6 +287,34 @@ void ctkPluginPrivate::stop0(bool wasStarted)
   }
 }
 
+void ctkPluginPrivate::startDependencies()
+{
+  QListIterator<ctkRequirePlugin*> i(this->require);
+  while (i.hasNext())
+  {
+    ctkRequirePlugin* pr = i.next();
+    QList<ctkPlugin*> pl = fwCtx->plugins->getPlugins(pr->name, pr->pluginRange);
+    if (pl.isEmpty())
+    {
+      if (pr->resolution == ctkPluginConstants::RESOLUTION_MANDATORY)
+      {
+        // We should never get here, since the plugin can only be
+        // started if all its dependencies could be resolved.
+        throw ctkPluginException(
+            QString("Internal error: dependent plugin %1 inside version range %2 is not installed.").
+            arg(pr->name).arg(pr->pluginRange.toString()));
+      }
+      else
+      {
+        continue;
+      }
+    }
+
+    // We take the first plugin in the list (highest version number)
+    pl.front()->start();
+  }
+}
+
 void ctkPluginPrivate::start0()
 {
   fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::STARTING, this->q_func()));

+ 2 - 0
Libs/PluginFramework/ctkPluginPrivate_p.h

@@ -194,6 +194,8 @@ private:
   // parallelizing plugin activations
   void start0();
 
+  void startDependencies();
+
   /**
    * Remove a plugins registered listeners, registered services and
    * used services.