소스 검색

Use delayed member initialization in the PluginFramwork.

Sascha Zelzer 14 년 전
부모
커밋
b6ab15d81e

+ 2 - 1
Libs/PluginFramework/ctkPlugin.cpp

@@ -24,6 +24,7 @@
 #include "ctkPluginPrivate_p.h"
 #include "ctkPluginArchive_p.h"
 #include "ctkPluginFrameworkContext_p.h"
+#include "ctkServices_p.h"
 
 #include <QStringList>
 
@@ -105,7 +106,7 @@ void ctkPlugin::start(const StartOptions& options)
     QByteArray serviceDescriptor = getResource("servicedescriptor.xml");
     if (!serviceDescriptor.isEmpty())
     {
-      d->fwCtx->services.registerService(d, serviceDescriptor);
+      d->fwCtx->services->registerService(d, serviceDescriptor);
     }
   }
 

+ 4 - 3
Libs/PluginFramework/ctkPluginContext.cpp

@@ -24,6 +24,7 @@
 
 #include "ctkPluginPrivate_p.h"
 #include "ctkPluginFrameworkContext_p.h"
+#include "ctkServices_p.h"
 #include "ctkServiceRegistration.h"
 #include "ctkServiceReference.h"
 #include "ctkServiceReferencePrivate.h"
@@ -96,21 +97,21 @@ ctkServiceRegistration* ctkPluginContext::registerService(const QStringList& cla
 {
   Q_D(ctkPluginContext);
   d->isPluginContextValid();
-  return d->plugin->fwCtx->services.registerService(d->plugin, clazzes, service, properties);
+  return d->plugin->fwCtx->services->registerService(d->plugin, clazzes, service, properties);
 }
 
 QList<ctkServiceReference> ctkPluginContext::getServiceReferences(const QString& clazz, const QString& filter)
 {
   Q_D(ctkPluginContext);
   d->isPluginContextValid();
-  return d->plugin->fwCtx->services.get(clazz, filter);
+  return d->plugin->fwCtx->services->get(clazz, filter);
 }
 
 ctkServiceReference ctkPluginContext::getServiceReference(const QString& clazz)
 {
   Q_D(ctkPluginContext);
   d->isPluginContextValid();
-  return d->plugin->fwCtx->services.get(d->plugin, clazz);
+  return d->plugin->fwCtx->services->get(d->plugin, clazz);
 }
 
 QObject* ctkPluginContext::getService(ctkServiceReference reference)

+ 1 - 1
Libs/PluginFramework/ctkPluginFramework.cpp

@@ -81,7 +81,7 @@
         throw std::logic_error("INTERNAL ERROR, Illegal state");
       }
 
-      pluginsToStart = d->fwCtx->storage.getStartOnLaunchPlugins();
+      pluginsToStart = d->fwCtx->storage->getStartOnLaunchPlugins();
     }
 
     // Start plugins according to their autostart setting.

+ 11 - 4
Libs/PluginFramework/ctkPluginFrameworkContext.cpp

@@ -24,6 +24,7 @@
 #include "ctkPluginFrameworkPrivate_p.h"
 #include "ctkPluginArchive_p.h"
 #include "ctkPluginConstants.h"
+#include "ctkServices_p.h"
 
 
   QMutex ctkPluginFrameworkContext::globalFwLock;
@@ -32,8 +33,8 @@
 
   ctkPluginFrameworkContext::ctkPluginFrameworkContext(
       const ctkProperties& initProps)
-        : plugins(0), services(this), systemPlugin(this),
-        storage(this), props(initProps)
+        : plugins(0), services(0), systemPlugin(this),
+        storage(0), props(initProps)
   {
 
     {
@@ -60,6 +61,8 @@
     ctkPluginFrameworkPrivate* const systemPluginPrivate = systemPlugin.d_func();
     systemPluginPrivate->initSystemPlugin();
 
+    storage = new ctkPluginStorage(this);
+    services = new ctkServices(this);
     plugins = new ctkPlugins(this);
 
     plugins->load();
@@ -68,7 +71,7 @@
 
     log() << "Installed plugins:";
     // Use the ordering in the plugin storage to get a sorted list of plugins.
-    QList<ctkPluginArchive*> allPAs = storage.getAllPluginArchives();
+    QList<ctkPluginArchive*> allPAs = storage->getAllPluginArchives();
     for (int i = 0; i < allPAs.size(); ++i)
     {
       ctkPluginArchive* pa = allPAs[i];
@@ -89,8 +92,12 @@
     delete plugins;
     plugins = 0;
 
-    storage.close();
+    storage->close();
+    delete storage;
+    storage = 0;
 
+    delete services;
+    services = 0;
   }
 
   int ctkPluginFrameworkContext::getId() const

+ 4 - 3
Libs/PluginFramework/ctkPluginFrameworkContext_p.h

@@ -30,10 +30,11 @@
 #include "ctkPluginStorage_p.h"
 #include "ctkPlugins_p.h"
 #include "ctkPluginFrameworkListeners_p.h"
-#include "ctkServices_p.h"
 
 
   class ctkPlugin;
+  class ctkPluginStorage;
+  class ctkServices;
 
   class ctkPluginFrameworkContext {
 
@@ -52,7 +53,7 @@
       /**
        * All registered services in this framework.
        */
-      ctkServices services;
+      ctkServices* services;
 
       /**
        * System plugin
@@ -62,7 +63,7 @@
       /**
        * ctkPlugin storage
        */
-      ctkPluginStorage storage;
+      ctkPluginStorage* storage;
 
       /**
        * Framework id.

+ 20 - 19
Libs/PluginFramework/ctkPluginFrameworkPrivate.cpp

@@ -23,29 +23,30 @@
 
 #include "ctkPluginFramework.h"
 #include "ctkPluginConstants.h"
-
+#include "ctkPluginContext_p.h"
 #include "ctkPluginFrameworkContext_p.h"
 
 
-  ctkPluginFrameworkPrivate::ctkPluginFrameworkPrivate(ctkPluginFramework& qq, ctkPluginFrameworkContext* fw)
-    : ctkPluginPrivate(qq, fw, 0, ctkPluginConstants::SYSTEM_PLUGIN_LOCATION,
-                    ctkPluginConstants::SYSTEM_PLUGIN_SYMBOLICNAME,
-                    // TODO: read version from the manifest resource
-                    ctkVersion(0, 9, 0))
-  {
-    systemHeaders.insert(ctkPluginConstants::PLUGIN_SYMBOLICNAME, symbolicName);
-    systemHeaders.insert(ctkPluginConstants::PLUGIN_NAME, location);
-    systemHeaders.insert(ctkPluginConstants::PLUGIN_VERSION, version.toString());
-  }
+ctkPluginFrameworkPrivate::ctkPluginFrameworkPrivate(ctkPluginFramework& qq, ctkPluginFrameworkContext* fw)
+  : ctkPluginPrivate(qq, fw, 0, ctkPluginConstants::SYSTEM_PLUGIN_LOCATION,
+                     ctkPluginConstants::SYSTEM_PLUGIN_SYMBOLICNAME,
+                     // TODO: read version from the manifest resource
+                     ctkVersion(0, 9, 0))
+{
+  systemHeaders.insert(ctkPluginConstants::PLUGIN_SYMBOLICNAME, symbolicName);
+  systemHeaders.insert(ctkPluginConstants::PLUGIN_NAME, location);
+  systemHeaders.insert(ctkPluginConstants::PLUGIN_VERSION, version.toString());
+}
 
-  void ctkPluginFrameworkPrivate::init()
-  {
-    this->state = ctkPlugin::STARTING;
-    this->fwCtx->init();
-  }
+void ctkPluginFrameworkPrivate::init()
+{
+  this->state = ctkPlugin::STARTING;
+  this->fwCtx->init();
+}
 
-  void ctkPluginFrameworkPrivate::initSystemPlugin()
-  {
-    this->pluginContext = new ctkPluginContext(this);
+void ctkPluginFrameworkPrivate::initSystemPlugin()
+{
+  this->pluginContext = new ctkPluginContext(this);
 
 }
+

+ 4 - 2
Libs/PluginFramework/ctkPluginPrivate.cpp

@@ -29,7 +29,9 @@
 #include "ctkPluginActivator.h"
 #include "ctkPluginContext_p.h"
 
+#include "ctkServices_p.h"
 #include "ctkServiceReferencePrivate.h"
+#include "ctkServiceRegistration.h"
 
 const ctkPlugin::States ctkPluginPrivate::RESOLVED_FLAGS = ctkPlugin::RESOLVED | ctkPlugin::STARTING | ctkPlugin::ACTIVE | ctkPlugin::STOPPING;
 
@@ -358,7 +360,7 @@ void ctkPluginPrivate::removePluginResources()
   // automatic disconnect due to Qt signal slot
   //fwCtx->listeners.removeAllListeners(this);
 
-  QList<ctkServiceRegistration*> srs = fwCtx->services.getRegisteredByPlugin(this);
+  QList<ctkServiceRegistration*> srs = fwCtx->services->getRegisteredByPlugin(this);
   QListIterator<ctkServiceRegistration*> i(srs);
   while (i.hasNext())
   {
@@ -374,7 +376,7 @@ void ctkPluginPrivate::removePluginResources()
     }
   }
 
-  QList<ctkServiceRegistration*> s = fwCtx->services.getUsedByPlugin(q_func());
+  QList<ctkServiceRegistration*> s = fwCtx->services->getUsedByPlugin(q_func());
   QListIterator<ctkServiceRegistration*> i2(s);
   while (i2.hasNext())
   {

+ 2 - 2
Libs/PluginFramework/ctkPlugins.cpp

@@ -105,7 +105,7 @@
           //TODO copy the QIODevice to a local cache
         }
 
-        pa = fwCtx->storage.insertPlugin(location, localPluginPath);
+        pa = fwCtx->storage->insertPlugin(location, localPluginPath);
 
         ctkPlugin* res = new ctkPlugin(fwCtx, pa);
         plugins.insert(location.toString(), res);
@@ -281,7 +281,7 @@
   }
 
   void ctkPlugins::load() {
-    QList<ctkPluginArchive*> pas = fwCtx->storage.getAllPluginArchives();
+    QList<ctkPluginArchive*> pas = fwCtx->storage->getAllPluginArchives();
     QListIterator<ctkPluginArchive*> it(pas);
 
     {

+ 3 - 1
Libs/PluginFramework/ctkQtServiceRegistrationPrivate.cpp

@@ -23,6 +23,8 @@
 
 #include "ctkPluginPrivate_p.h"
 #include "ctkPluginFrameworkContext_p.h"
+
+#include "ctkServices_p.h"
 #include "ctkQtServiceRegistration_p.h"
 
 
@@ -50,5 +52,5 @@ QObject* ctkQtServiceRegistrationPrivate::getService()
       throw;
     }
   }
-  return this->plugin->fwCtx->services.qServiceManager.loadInterface(serviceDescriptor);
+  return this->plugin->fwCtx->services->qServiceManager.loadInterface(serviceDescriptor);
 }

+ 3 - 1
Libs/PluginFramework/ctkServiceReferencePrivate.cpp

@@ -28,6 +28,8 @@
 #include "ctkServiceFactory.h"
 #include "ctkServiceException.h"
 #include "ctkPluginPrivate_p.h"
+
+#include "ctkServices_p.h"
 #include "ctkServiceRegistrationPrivate.h"
 #include "ctkPluginFrameworkContext_p.h"
 
@@ -74,7 +76,7 @@ QObject* ctkServiceReferencePrivate::getService(ctkPlugin* plugin)
           for (QStringListIterator i(classes); i.hasNext(); )
           {
             QString cls = i.next();
-            if (!registration->plugin->fwCtx->services.checkServiceClass(s, cls))
+            if (!registration->plugin->fwCtx->services->checkServiceClass(s, cls))
             {
               ctkServiceException se(QString("ctkServiceFactory produced an object ") +
                                      "that did not implement: " + cls,

+ 4 - 2
Libs/PluginFramework/ctkServiceRegistration.cpp

@@ -24,6 +24,8 @@
 #include "ctkPluginFrameworkContext_p.h"
 #include "ctkPluginPrivate_p.h"
 #include "ctkPluginConstants.h"
+
+#include "ctkServices_p.h"
 #include "ctkServiceFactory.h"
 #include "ctkServiceSlotEntry_p.h"
 
@@ -76,7 +78,7 @@ void ctkServiceRegistration::setProperties(const ServiceProperties& props)
       int new_rank = d->properties.value(ctkPluginConstants::SERVICE_RANKING).toInt();
       if (old_rank != new_rank)
       {
-        d->plugin->fwCtx->services.updateServiceRegistrationOrder(this, classes);
+        d->plugin->fwCtx->services->updateServiceRegistrationOrder(this, classes);
       }
     }
     else
@@ -107,7 +109,7 @@ void ctkServiceRegistration::unregister()
     {
       if (d->plugin)
       {
-        d->plugin->fwCtx->services.removeServiceRegistration(this);
+        d->plugin->fwCtx->services->removeServiceRegistration(this);
       }
     }
     else