Browse Source

Add ability to replace CLI backend

Matt Clarkson 11 years ago
parent
commit
019d677f41

+ 36 - 0
Libs/CommandLineModules/Core/ctkCmdLineModuleManager.cpp

@@ -140,6 +140,42 @@ void ctkCmdLineModuleManager::registerBackend(ctkCmdLineModuleBackend *backend)
   }
 }
 
+
+//----------------------------------------------------------------------------
+void ctkCmdLineModuleManager::replaceBackend(ctkCmdLineModuleBackend* backend)
+{
+  if (d->SchemeToBackend.size() == 0)
+  {
+    this->registerBackend(backend);
+  }
+
+  // Check if new backend has exactly matching list of schemes to an existing backend.
+  ctkCmdLineModuleBackend* matchingBackend = NULL;
+  QList<QString> supportedSchemes = backend->schemes();
+  QList<ctkCmdLineModuleBackend*> existingBackends = d->SchemeToBackend.values();
+  foreach (ctkCmdLineModuleBackend* existingBackend, existingBackends)
+  {
+    QList<QString> schemes = existingBackend->schemes();
+    if (schemes == supportedSchemes)
+    {
+      matchingBackend = existingBackend;
+    }
+  }
+
+  if (matchingBackend != NULL)
+  {
+    foreach (QString scheme, supportedSchemes)
+    {
+      d->SchemeToBackend[scheme] = backend;
+    }
+  }
+  else
+  {
+    this->registerBackend(backend);
+  }
+}
+
+
 //----------------------------------------------------------------------------
 ctkCmdLineModuleReference
 ctkCmdLineModuleManager::registerModule(const QUrl &location)

+ 8 - 0
Libs/CommandLineModules/Core/ctkCmdLineModuleManager.h

@@ -119,6 +119,14 @@ public:
   void registerBackend(ctkCmdLineModuleBackend* backend);
 
   /**
+   * @brief Replaces an existing back-end.
+   * @param backend The new back-end.
+   *
+   * If no backend exists, calls registerBackend.
+   */
+  void replaceBackend(ctkCmdLineModuleBackend* backend);
+
+  /**
    * @brief Registers a module, identified by the given URL.
    * @param location The URL for the new module.
    * @return A module reference.