Просмотр исходного кода

Use QSharedPointer<ctkPlugin> consistently in public API

Sascha Zelzer лет назад: 15
Родитель
Сommit
a622c6cc08
42 измененных файлов с 171 добавлено и 162 удалено
  1. 7 7
      Applications/ctkPluginBrowser/ctkPluginBrowser.cpp
  2. 1 1
      Applications/ctkPluginBrowser/ctkPluginBrowser.h
  3. 4 4
      Applications/ctkPluginBrowser/ctkPluginResourcesTreeModel.cpp
  4. 3 2
      Applications/ctkPluginBrowser/ctkPluginResourcesTreeModel.h
  5. 1 1
      Applications/ctkPluginBrowser/ctkPluginTableModel.cpp
  6. 1 1
      Applications/ctkPluginBrowser/ctkPluginTableModel.h
  7. 5 5
      Libs/PluginFramework/Testing/FrameworkTest/ctkPluginFrameworkTestSuite.cpp
  8. 1 1
      Libs/PluginFramework/Testing/FrameworkTest/ctkPluginFrameworkTestSuite_p.h
  9. 3 3
      Libs/PluginFramework/Testing/FrameworkTest/ctkServiceListenerTestSuite.cpp
  10. 14 10
      Libs/PluginFramework/ctkPlugin.cpp
  11. 7 3
      Libs/PluginFramework/ctkPlugin.h
  12. 16 16
      Libs/PluginFramework/ctkPluginAbstractTracked.cpp
  13. 1 1
      Libs/PluginFramework/ctkPluginAbstractTracked_p.h
  14. 5 5
      Libs/PluginFramework/ctkPluginContext.cpp
  15. 3 3
      Libs/PluginFramework/ctkPluginContext.h
  16. 5 5
      Libs/PluginFramework/ctkPluginEvent.cpp
  17. 3 2
      Libs/PluginFramework/ctkPluginEvent.h
  18. 2 2
      Libs/PluginFramework/ctkPluginFramework.cpp
  19. 1 1
      Libs/PluginFramework/ctkPluginFramework.h
  20. 3 2
      Libs/PluginFramework/ctkPluginFrameworkContext.cpp
  21. 1 1
      Libs/PluginFramework/ctkPluginFrameworkPrivate.cpp
  22. 1 1
      Libs/PluginFramework/ctkPluginFrameworkPrivate_p.h
  23. 7 10
      Libs/PluginFramework/ctkPluginPrivate.cpp
  24. 6 4
      Libs/PluginFramework/ctkPluginPrivate_p.h
  25. 12 12
      Libs/PluginFramework/ctkPluginTracker.cpp
  26. 6 6
      Libs/PluginFramework/ctkPluginTracker.h
  27. 3 3
      Libs/PluginFramework/ctkPluginTrackerCustomizer.h
  28. 10 14
      Libs/PluginFramework/ctkPlugins.cpp
  29. 2 2
      Libs/PluginFramework/ctkPlugins_p.h
  30. 1 1
      Libs/PluginFramework/ctkQtServiceRegistrationPrivate.cpp
  31. 2 2
      Libs/PluginFramework/ctkServiceFactory.h
  32. 3 3
      Libs/PluginFramework/ctkServiceReference.cpp
  33. 2 2
      Libs/PluginFramework/ctkServiceReference.h
  34. 6 6
      Libs/PluginFramework/ctkServiceReferencePrivate.cpp
  35. 3 2
      Libs/PluginFramework/ctkServiceReferencePrivate.h
  36. 2 2
      Libs/PluginFramework/ctkServiceRegistration.cpp
  37. 2 2
      Libs/PluginFramework/ctkServiceRegistrationPrivate.cpp
  38. 3 3
      Libs/PluginFramework/ctkServiceRegistrationPrivate.h
  39. 1 1
      Libs/PluginFramework/ctkServices.cpp
  40. 1 1
      Libs/PluginFramework/ctkServices_p.h
  41. 4 4
      Libs/PluginFramework/ctkTrackedPlugin.cpp
  42. 7 5
      Libs/PluginFramework/ctkTrackedPlugin_p.h

+ 7 - 7
Applications/ctkPluginBrowser/ctkPluginBrowser.cpp

@@ -141,7 +141,7 @@ void ctkPluginBrowser::pluginSelected(const QModelIndex &index)
 {
   QVariant v = index.data(Qt::UserRole);
 
-  ctkPlugin* plugin = framework->getPluginContext()->getPlugin(v.toLongLong());
+  QSharedPointer<ctkPlugin> plugin = framework->getPluginContext()->getPlugin(v.toLongLong());
   if (!plugin) return;  
   updatePluginToolbar(plugin);
 
@@ -150,7 +150,7 @@ void ctkPluginBrowser::pluginSelected(const QModelIndex &index)
   if (oldModel) oldModel->deleteLater();;
 }
 
-void ctkPluginBrowser::updatePluginToolbar(ctkPlugin* plugin)
+void ctkPluginBrowser::updatePluginToolbar(QSharedPointer<ctkPlugin> plugin)
 {
   startPluginNowAction->setEnabled(false);
   startPluginAction->setEnabled(false);
@@ -175,7 +175,7 @@ void ctkPluginBrowser::updatePluginToolbar(ctkPlugin* plugin)
 void ctkPluginBrowser::pluginDoubleClicked(const QModelIndex& index)
 {
   long pluginId = index.data(Qt::UserRole).toLongLong();
-  ctkPlugin* plugin = framework->getPluginContext()->getPlugin(pluginId);
+  QSharedPointer<ctkPlugin> plugin = framework->getPluginContext()->getPlugin(pluginId);
 
   QByteArray mfContent = plugin->getResource("/META-INF/MANIFEST.MF");
   QString location = QString("/") + plugin->getSymbolicName() + "/META-INF/MANIFEST.MF";
@@ -219,7 +219,7 @@ void ctkPluginBrowser::dbResourceDoubleClicked(const QModelIndex& index)
   QModelIndex pluginIndex = ui.pluginsTableView->selectionModel()->selectedIndexes().first();
   long pluginId = pluginIndex.data(Qt::UserRole).toLongLong();
 
-  ctkPlugin* plugin = framework->getPluginContext()->getPlugin(pluginId);
+  QSharedPointer<ctkPlugin> plugin = framework->getPluginContext()->getPlugin(pluginId);
 
   QByteArray resContent = plugin->getResource(resPath);
   QString location = QString("/") + plugin->getSymbolicName() + resPath;
@@ -235,7 +235,7 @@ void ctkPluginBrowser::pluginEvent(const ctkPluginEvent& event)
 {
   qDebug() << "PluginEvent: [" << event.getPlugin()->getSymbolicName() << "]" << pluginEventTypeToString[event.getType()];
 
-  ctkPlugin* plugin = event.getPlugin();
+  QSharedPointer<ctkPlugin> plugin = event.getPlugin();
   QModelIndexList selection = ui.pluginsTableView->selectionModel()->selectedIndexes();
   if (!selection.isEmpty() && selection.first().data(Qt::UserRole).toLongLong() == plugin->getPluginId())
   {
@@ -263,7 +263,7 @@ void ctkPluginBrowser::startPlugin(ctkPlugin::StartOptions options)
   QModelIndex selection = ui.pluginsTableView->selectionModel()->currentIndex();
   QVariant v = selection.data(Qt::UserRole);
 
-  ctkPlugin* plugin = framework->getPluginContext()->getPlugin(v.toLongLong());
+  QSharedPointer<ctkPlugin> plugin = framework->getPluginContext()->getPlugin(v.toLongLong());
   plugin->start(options);
 }
 
@@ -272,7 +272,7 @@ void ctkPluginBrowser::stopPlugin()
   QModelIndex selection = ui.pluginsTableView->selectionModel()->currentIndex();
   QVariant v = selection.data(Qt::UserRole);
 
-  ctkPlugin* plugin = framework->getPluginContext()->getPlugin(v.toLongLong());
+  QSharedPointer<ctkPlugin> plugin = framework->getPluginContext()->getPlugin(v.toLongLong());
   plugin->stop();
 }
 

+ 1 - 1
Applications/ctkPluginBrowser/ctkPluginBrowser.h

@@ -63,7 +63,7 @@ private:
 
   void closeEvent(QCloseEvent* closeEvent);
 
-  void updatePluginToolbar(ctkPlugin* plugin);
+  void updatePluginToolbar(QSharedPointer<ctkPlugin> plugin);
   void startPlugin(ctkPlugin::StartOptions options);
 
   QMap<ctkPluginEvent::Type, QString> pluginEventTypeToString;

+ 4 - 4
Applications/ctkPluginBrowser/ctkPluginResourcesTreeModel.cpp

@@ -52,7 +52,7 @@ class ctkPluginResourceTreeNode : public ctkPluginResourceTreeItem
 {
 public:
 
-  ctkPluginResourceTreeNode(const ctkPlugin* plugin, const QString& path, ctkPluginResourceTreeNode* parent = 0);
+  ctkPluginResourceTreeNode(QSharedPointer<const ctkPlugin> plugin, const QString& path, ctkPluginResourceTreeNode* parent = 0);
 
   ~ctkPluginResourceTreeNode();
 
@@ -64,7 +64,7 @@ public:
 
 private:
 
-  const ctkPlugin* plugin;
+  QSharedPointer<const ctkPlugin> plugin;
   QList<ctkPluginResourceTreeItem*> children;
 
 };
@@ -136,7 +136,7 @@ ctkPluginResourceTreeNode* ctkPluginResourceTreeItem::parent() const
 }
 
 
-ctkPluginResourceTreeNode::ctkPluginResourceTreeNode(const ctkPlugin* plugin, const QString& path, ctkPluginResourceTreeNode* parent)
+ctkPluginResourceTreeNode::ctkPluginResourceTreeNode(QSharedPointer<const ctkPlugin> plugin, const QString& path, ctkPluginResourceTreeNode* parent)
   : ctkPluginResourceTreeItem(path, parent), plugin(plugin)
 {
   QStringList pathEntries = plugin->getResourceList(path);
@@ -176,7 +176,7 @@ int ctkPluginResourceTreeNode::indexOf(ctkPluginResourceTreeItem* child) const
 }
 
 
-ctkPluginResourcesTreeModel::ctkPluginResourcesTreeModel(const ctkPlugin* plugin, QObject* parent)
+ctkPluginResourcesTreeModel::ctkPluginResourcesTreeModel(QSharedPointer<const ctkPlugin> plugin, QObject* parent)
   : QAbstractItemModel(parent), plugin(plugin)
 {
   rootItem = new ctkPluginResourceTreeNode(plugin, "/");

+ 3 - 2
Applications/ctkPluginBrowser/ctkPluginResourcesTreeModel.h

@@ -24,6 +24,7 @@
 
 #include <QAbstractItemModel>
 #include <QDir>
+#include <QSharedPointer>
 
 class ctkPlugin;
 class ctkPluginResourceTreeItem;
@@ -32,7 +33,7 @@ class ctkPluginResourcesTreeModel : public QAbstractItemModel
 {
 public:
 
-  ctkPluginResourcesTreeModel(const ctkPlugin* plugin, QObject* parent = 0);
+  ctkPluginResourcesTreeModel(QSharedPointer<const ctkPlugin> plugin, QObject* parent = 0);
   ~ctkPluginResourcesTreeModel();
 
   QVariant data(const QModelIndex &index, int role) const;
@@ -47,7 +48,7 @@ public:
 
 private:
 
-  const ctkPlugin* plugin;
+  QSharedPointer<const ctkPlugin> plugin;
   ctkPluginResourceTreeItem* rootItem;
 
 };

+ 1 - 1
Applications/ctkPluginBrowser/ctkPluginTableModel.cpp

@@ -35,7 +35,7 @@ QVariant ctkPluginTableModel::data(const QModelIndex& index, int role) const
 {
   if (!index.isValid()) return QVariant();
 
-  ctkPlugin* plugin = plugins.at(index.row());
+  QSharedPointer<ctkPlugin> plugin = plugins.at(index.row());
   if (role == Qt::DisplayRole)
   {
     int col = index.column();

+ 1 - 1
Applications/ctkPluginBrowser/ctkPluginTableModel.h

@@ -54,7 +54,7 @@ private:
 
   QString getStringForState(const ctkPlugin::State state) const;
 
-  QList<ctkPlugin*> plugins;
+  QList<QSharedPointer<ctkPlugin> > plugins;
 };
 
 #endif // CTKPLUGINTABLEMODEL_H

+ 5 - 5
Libs/PluginFramework/Testing/FrameworkTest/ctkPluginFrameworkTestSuite.cpp

@@ -222,8 +222,8 @@ void ctkPluginFrameworkTestSuite::frame025b()
 
     // check the listeners for events
     QList<ctkPluginEvent> pEvts;
-    pEvts.push_back(ctkPluginEvent(ctkPluginEvent::RESOLVED, pA.data()));
-    pEvts.push_back(ctkPluginEvent(ctkPluginEvent::STARTED, pA.data()));
+    pEvts.push_back(ctkPluginEvent(ctkPluginEvent::RESOLVED, pA));
+    pEvts.push_back(ctkPluginEvent(ctkPluginEvent::STARTED, pA));
 
     QList<ctkServiceEvent> seEvts;
     seEvts.push_back(ctkServiceEvent(ctkServiceEvent::REGISTERED, sr1));
@@ -232,7 +232,7 @@ void ctkPluginFrameworkTestSuite::frame025b()
              "Unexpected events");
 
     QList<ctkPluginEvent> syncPEvts;
-    syncPEvts.push_back(ctkPluginEvent(ctkPluginEvent::STARTING, pA.data()));
+    syncPEvts.push_back(ctkPluginEvent(ctkPluginEvent::STARTING, pA));
 
     QVERIFY2(checkSyncListenerEvents(syncPEvts), "Unexpected events");
   }
@@ -317,7 +317,7 @@ bool ctkPluginFrameworkTestSuite::checkListenerEvents(
   QList<ctkServiceEvent> seEvts;
 
   if (fwexp) fwEvts << ctkPluginFrameworkEvent(fwtype, pluginX.data());
-  if (pexp) pEvts << ctkPluginEvent(ptype, pluginX.data());
+  if (pexp) pEvts << ctkPluginEvent(ptype, pluginX);
   if (sexp) seEvts << ctkServiceEvent(stype, *servX);
 
   return checkListenerEvents(fwEvts, pEvts, seEvts);
@@ -436,7 +436,7 @@ bool ctkPluginFrameworkTestSuite::checkListenerEvents(
 // Check that the expected events have reached the listeners and
 // reset the events
 bool ctkPluginFrameworkTestSuite::checkSyncListenerEvents(
-    bool pexp, ctkPluginEvent::Type ptype, ctkPlugin* pX,
+    bool pexp, ctkPluginEvent::Type ptype, QSharedPointer<ctkPlugin> pX,
     ctkServiceReference servX)
 {
   Q_UNUSED(servX)

+ 1 - 1
Libs/PluginFramework/Testing/FrameworkTest/ctkPluginFrameworkTestSuite_p.h

@@ -83,7 +83,7 @@ private:
   // Check that the expected events have reached the listeners and
   // reset the events
   bool checkSyncListenerEvents(
-      bool pexp, ctkPluginEvent::Type ptype, ctkPlugin* pX,
+      bool pexp, ctkPluginEvent::Type ptype, QSharedPointer<ctkPlugin> pX,
       ctkServiceReference servX);
 
   // Check that the expected events have reached the listeners and

+ 3 - 3
Libs/PluginFramework/Testing/FrameworkTest/ctkServiceListenerTestSuite.cpp

@@ -183,7 +183,7 @@ void ctkServiceListener::serviceChanged(const ctkServiceEvent& evt)
     ctkServiceReference sr = evt.getServiceReference();
 
     // Validate that no bundle is marked as using the service
-    QList<ctkPlugin*> usingPlugins = sr.getUsingPlugins();
+    QList<QSharedPointer<ctkPlugin> > usingPlugins = sr.getUsingPlugins();
     if (checkUsingBundles && !usingPlugins.isEmpty())
     {
       teststatus = false;
@@ -270,10 +270,10 @@ void ctkServiceListener::serviceChanged(const ctkServiceEvent& evt)
 void ctkServiceListener::printUsingPlugins(const ctkServiceReference& sr,
                                            const QString& caption)
 {
-  QList<ctkPlugin*> usingPlugins = sr.getUsingPlugins();
+  QList<QSharedPointer<ctkPlugin> > usingPlugins = sr.getUsingPlugins();
 
   qDebug() << (caption.isEmpty() ? "Using plugins: " : caption);
-  foreach(ctkPlugin* plugin, usingPlugins)
+  foreach(QSharedPointer<ctkPlugin> plugin, usingPlugins)
   {
     qDebug() << "  -" << plugin;
   }

+ 14 - 10
Libs/PluginFramework/ctkPlugin.cpp

@@ -29,22 +29,26 @@
 #include <QStringList>
 
 
-ctkPlugin::ctkPlugin(ctkPluginFrameworkContext* fw,
-                     ctkPluginArchive* pa)
-                       : d_ptr(new ctkPluginPrivate(*this, fw, pa))
+ctkPlugin::ctkPlugin()
 {
 
 }
 
-ctkPlugin::ctkPlugin(ctkPluginPrivate& dd)
-  : d_ptr(&dd)
+void ctkPlugin::init(ctkPluginPrivate* dd)
 {
+  d_ptr.reset(dd);
+}
 
+void ctkPlugin::init(const QWeakPointer<ctkPlugin>& self,
+                     ctkPluginFrameworkContext* fw,
+                     ctkPluginArchive* pa)
+{
+  d_ptr.reset(new ctkPluginPrivate(self, fw, pa));
 }
 
 ctkPlugin::~ctkPlugin()
 {
-  delete d_ptr;
+
 }
 
 ctkPlugin::State ctkPlugin::getState() const
@@ -90,7 +94,7 @@ void ctkPlugin::start(const StartOptions& options)
     if (STARTING == d->state) return;
     d->state = STARTING;
     d->pluginContext.reset(new ctkPluginContext(this->d_func()));
-    ctkPluginEvent pluginEvent(ctkPluginEvent::LAZY_ACTIVATION, this);
+    ctkPluginEvent pluginEvent(ctkPluginEvent::LAZY_ACTIVATION, d->q_ptr);
     d->fwCtx->listeners.emitPluginChanged(pluginEvent);
   }
   else
@@ -160,7 +164,7 @@ void ctkPlugin::stop(const StopOptions& options)
 
   if (d->state != UNINSTALLED)
   {
-    d->fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::STOPPED, this));
+    d->fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::STOPPED, d->q_ptr));
   }
   if (savedException)
   {
@@ -266,11 +270,11 @@ void ctkPlugin::uninstall()
     // Broadcast events
     if (wasResolved)
     {
-      d->fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::UNRESOLVED, this));
+      d->fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::UNRESOLVED, d->q_ptr));
     }
 
     d->state = UNINSTALLED;
-    d->fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::UNINSTALLED, this));
+    d->fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::UNINSTALLED, d->q_ptr));
 
     break;
   }

+ 7 - 3
Libs/PluginFramework/ctkPlugin.h

@@ -650,13 +650,17 @@ protected:
   friend class ctkPlugins;
   friend class ctkServiceReferencePrivate;
 
-  ctkPluginPrivate * const d_ptr;
+  QScopedPointer<ctkPluginPrivate> d_ptr;
 
-  ctkPlugin(ctkPluginFrameworkContext* fw, ctkPluginArchive* ba);
-  ctkPlugin(ctkPluginPrivate& dd);
+  Q_DISABLE_COPY(ctkPlugin)
+
+  ctkPlugin();
+  void init(ctkPluginPrivate* dd);
+  void init(const QWeakPointer<ctkPlugin>& self, ctkPluginFrameworkContext* fw, ctkPluginArchive* ba);
 };
 
 Q_DECLARE_METATYPE(ctkPlugin*)
+Q_DECLARE_METATYPE(QSharedPointer<ctkPlugin>)
 
 Q_DECLARE_OPERATORS_FOR_FLAGS(ctkPlugin::States)
 Q_DECLARE_OPERATORS_FOR_FLAGS(ctkPlugin::StartOptions)

+ 16 - 16
Libs/PluginFramework/ctkPluginAbstractTracked.cpp

@@ -64,22 +64,22 @@ void ctkPluginAbstractTracked<Item,Related>::setInitial(const QList<Item>& list)
   }
 }
 
-template<class Item, class Related>
-void ctkPluginAbstractTracked<Item,Related>::setInitial(const QList<Item*>& list)
-{
-  foreach (Item* item, list)
-  {
-    if (item == 0)
-    {
-      continue;
-    }
-    if (DEBUG)
-    {
-      qDebug() << "ctkPluginAbstractTracked::setInitial:" << item;
-    }
-    initial.push_back(item);
-  }
-}
+//template<class Item, class Related>
+//void ctkPluginAbstractTracked<Item,Related>::setInitial(const QList<QSharedPointer<Item> >& list)
+//{
+//  foreach (Item* item, list)
+//  {
+//    if (item == 0)
+//    {
+//      continue;
+//    }
+//    if (DEBUG)
+//    {
+//      qDebug() << "ctkPluginAbstractTracked::setInitial:" << item;
+//    }
+//    initial.push_back(item);
+//  }
+//}
 
 template<class Item, class Related>
 void ctkPluginAbstractTracked<Item,Related>::trackInitial()

+ 1 - 1
Libs/PluginFramework/ctkPluginAbstractTracked_p.h

@@ -70,7 +70,7 @@ public:
    * @GuardedBy this
    */
   void setInitial(const QList<Item>& list);
-  void setInitial(const QList<Item*>& list);
+  //void setInitial(const QList<Item*>& list);
 
   /**
    * Track the initial list of items. This is called after events can begin to

+ 5 - 5
Libs/PluginFramework/ctkPluginContext.cpp

@@ -66,20 +66,20 @@ QVariant ctkPluginContext::getProperty(const QString& key) const
   return d->plugin->fwCtx->props.value(key);
 }
 
-ctkPlugin* ctkPluginContext::getPlugin() const
+QSharedPointer<ctkPlugin> ctkPluginContext::getPlugin() const
 {
   Q_D(const ctkPluginContext);
   d->isPluginContextValid();
   return d->plugin->q_func();
 }
 
-ctkPlugin* ctkPluginContext::getPlugin(long id) const
+QSharedPointer<ctkPlugin> ctkPluginContext::getPlugin(long id) const
 {
   Q_D(const ctkPluginContext);
   return d->plugin->fwCtx->plugins->getPlugin(id);
 }
 
-QList<ctkPlugin*> ctkPluginContext::getPlugins() const
+QList<QSharedPointer<ctkPlugin> > ctkPluginContext::getPlugins() const
 {
   Q_D(const ctkPluginContext);
   d->isPluginContextValid();
@@ -162,7 +162,7 @@ void ctkPluginContext::connectServiceListener(QObject* receiver, const char* slo
 {
   Q_D(ctkPluginContext);
   d->isPluginContextValid();
-  d->plugin->fwCtx->listeners.addServiceSlot(getPlugin(), receiver, slot, filter);
+  d->plugin->fwCtx->listeners.addServiceSlot(getPlugin().data(), receiver, slot, filter);
 }
 
 void ctkPluginContext::disconnectServiceListener(QObject* receiver,
@@ -170,5 +170,5 @@ void ctkPluginContext::disconnectServiceListener(QObject* receiver,
 {
   Q_D(ctkPluginContext);
   d->isPluginContextValid();
-  d->plugin->fwCtx->listeners.removeServiceSlot(getPlugin(), receiver, slot);
+  d->plugin->fwCtx->listeners.removeServiceSlot(getPlugin().data(), receiver, slot);
 }

+ 3 - 3
Libs/PluginFramework/ctkPluginContext.h

@@ -119,7 +119,7 @@ public:
    * @throws std::logic_error If this ctkPluginContext is no
    *         longer valid.
    */
-  ctkPlugin* getPlugin() const;
+  QSharedPointer<ctkPlugin> getPlugin() const;
 
   /**
    * Returns the plugin with the specified identifier.
@@ -128,7 +128,7 @@ public:
    * @return A <code>ctkPlugin</code> object or <code>0</code> if the
    *         identifier does not match any installed plugin.
    */
-  ctkPlugin* getPlugin(long id) const;
+  QSharedPointer<ctkPlugin> getPlugin(long id) const;
 
 
   /**
@@ -142,7 +142,7 @@ public:
    * @return A QList of <code>ctkPlugin</code> objects, one object per
    *         installed plugin.
    */
-  QList<ctkPlugin*> getPlugins() const;
+  QList<QSharedPointer<ctkPlugin> > getPlugins() const;
 
   /**
    * Registers the specified service object with the specified properties

+ 5 - 5
Libs/PluginFramework/ctkPluginEvent.cpp

@@ -29,7 +29,7 @@ class ctkPluginEventData : public QSharedData
 {
 public:
 
-  ctkPluginEventData(ctkPluginEvent::Type type, ctkPlugin* plugin)
+  ctkPluginEventData(ctkPluginEvent::Type type, QSharedPointer<ctkPlugin> plugin)
     : type(type), plugin(plugin)
   {
 
@@ -42,7 +42,7 @@ public:
   }
 
   const ctkPluginEvent::Type type;
-  ctkPlugin *const plugin;
+  const QSharedPointer<ctkPlugin> plugin;
 };
 
 
@@ -62,7 +62,7 @@ bool ctkPluginEvent::isNull() const
   return !d;
 }
 
-ctkPluginEvent::ctkPluginEvent(Type type, ctkPlugin* plugin)
+ctkPluginEvent::ctkPluginEvent(Type type, QSharedPointer<ctkPlugin> plugin)
   : d(new ctkPluginEventData(type, plugin))
 {
 
@@ -80,7 +80,7 @@ ctkPluginEvent& ctkPluginEvent::operator=(const ctkPluginEvent& other)
   return *this;
 }
 
-ctkPlugin* ctkPluginEvent::getPlugin() const
+QSharedPointer<ctkPlugin> ctkPluginEvent::getPlugin() const
 {
   return d->plugin;
 }
@@ -113,7 +113,7 @@ QDebug operator<<(QDebug debug, const ctkPluginEvent& event)
 {
   if (event.isNull()) return debug << "NONE";
 
-  ctkPlugin* p = event.getPlugin();
+  QSharedPointer<ctkPlugin> p = event.getPlugin();
   debug.nospace() << event.getType() << " #" << p->getPluginId() << " (" << p->getLocation() << ")";
   return debug.maybeSpace();
 }

+ 3 - 2
Libs/PluginFramework/ctkPluginEvent.h

@@ -23,6 +23,7 @@
 #define CTKPLUGINEVENT_H
 
 #include <QSharedDataPointer>
+#include <QSharedPointer>
 
 #include "ctkPluginFrameworkExport.h"
 
@@ -166,7 +167,7 @@ public:
    * @param type The event type.
    * @param plugin The plugin which had a lifecycle change.
    */
-  ctkPluginEvent(Type type, ctkPlugin* plugin);
+  ctkPluginEvent(Type type, QSharedPointer<ctkPlugin> plugin);
 
   ctkPluginEvent(const ctkPluginEvent& other);
 
@@ -177,7 +178,7 @@ public:
    *
    * @return The plugin that had a change occur in its lifecycle.
    */
-  ctkPlugin* getPlugin() const;
+  QSharedPointer<ctkPlugin> getPlugin() const;
 
   /**
    * Returns the type of lifecyle event. The type values are:

+ 2 - 2
Libs/PluginFramework/ctkPluginFramework.cpp

@@ -28,8 +28,8 @@
 #include "ctkPluginArchive_p.h"
 
 
-ctkPluginFramework::ctkPluginFramework(ctkPluginFrameworkContext* fw)
-  : ctkPlugin(*new ctkPluginFrameworkPrivate(*this, fw))
+ctkPluginFramework::ctkPluginFramework()
+  : ctkPlugin()
 {
   qRegisterMetaType<ctkPluginFrameworkEvent>("ctkPluginFrameworkEvent");
   qRegisterMetaType<ctkPluginEvent>("ctkPluginEvent");

+ 1 - 1
Libs/PluginFramework/ctkPluginFramework.h

@@ -115,7 +115,7 @@ protected:
 
   friend class ctkPluginFrameworkContext;
 
-  ctkPluginFramework(ctkPluginFrameworkContext* fw);
+  ctkPluginFramework();
 
 };
 

+ 3 - 2
Libs/PluginFramework/ctkPluginFrameworkContext.cpp

@@ -34,12 +34,13 @@ int ctkPluginFrameworkContext::globalId = 1;
 
 ctkPluginFrameworkContext::ctkPluginFrameworkContext(
     const ctkProperties& initProps)
-      : plugins(0), services(0), systemPlugin(new ctkPluginFramework(this)),
+      : plugins(0), services(0), systemPlugin(new ctkPluginFramework()),
       storage(0), firstInit(true), props(initProps), initialized(false)
 {
   {
     QMutexLocker lock(&globalFwLock);
     id = globalId++;
+    systemPlugin->ctkPlugin::init(new ctkPluginFrameworkPrivate(systemPlugin, this));
   }
 
   log() << "created";
@@ -140,7 +141,7 @@ void ctkPluginFrameworkContext::resolvePlugin(ctkPluginPrivate* plugin)
   if (tempResolved.size() > 0 && !tempResolved.contains(plugin))
   {
     ctkPluginException pe("resolve: InternalError1!", ctkPluginException::RESOLVE_ERROR);
-    listeners.frameworkError(plugin->q_func(), pe);
+    listeners.frameworkError(plugin->q_func().data(), pe);
     throw pe;
   }
 

+ 1 - 1
Libs/PluginFramework/ctkPluginFrameworkPrivate.cpp

@@ -27,7 +27,7 @@
 #include "ctkPluginFrameworkContext_p.h"
 
 
-ctkPluginFrameworkPrivate::ctkPluginFrameworkPrivate(ctkPluginFramework& qq, ctkPluginFrameworkContext* fw)
+ctkPluginFrameworkPrivate::ctkPluginFrameworkPrivate(QWeakPointer<ctkPlugin> qq, ctkPluginFrameworkContext* fw)
   : ctkPluginPrivate(qq, fw, 0, ctkPluginConstants::SYSTEM_PLUGIN_LOCATION,
                      ctkPluginConstants::SYSTEM_PLUGIN_SYMBOLICNAME,
                      // TODO: read version from the manifest resource

+ 1 - 1
Libs/PluginFramework/ctkPluginFrameworkPrivate_p.h

@@ -36,7 +36,7 @@ public:
 
   QMutex lock;
 
-  ctkPluginFrameworkPrivate(ctkPluginFramework& qq, ctkPluginFrameworkContext* fw);
+  ctkPluginFrameworkPrivate(QWeakPointer<ctkPlugin> qq, ctkPluginFrameworkContext* fw);
 
   void init();
 

+ 7 - 10
Libs/PluginFramework/ctkPluginPrivate.cpp

@@ -37,10 +37,10 @@ const ctkPlugin::States ctkPluginPrivate::RESOLVED_FLAGS = ctkPlugin::RESOLVED |
 
 
 ctkPluginPrivate::ctkPluginPrivate(
-    ctkPlugin& qq,
+    QWeakPointer<ctkPlugin> qq,
     ctkPluginFrameworkContext* fw,
     ctkPluginArchive* pa)
-      : q_ptr(&qq), fwCtx(fw), id(pa->getPluginId()),
+      : q_ptr(qq), fwCtx(fw), id(pa->getPluginId()),
       location(pa->getPluginLocation().toString()), state(ctkPlugin::INSTALLED),
       archive(pa), pluginContext(0), pluginActivator(0), pluginLoader(pa->getLibLocation()),
       eagerActivation(false), activating(false), deactivating(false)
@@ -67,10 +67,10 @@ ctkPluginPrivate::ctkPluginPrivate(
   }
 }
 
-ctkPluginPrivate::ctkPluginPrivate(ctkPlugin& qq,
+ctkPluginPrivate::ctkPluginPrivate(QWeakPointer<ctkPlugin> qq,
                                    ctkPluginFrameworkContext* fw,
                                    long id, const QString& loc, const QString& sym, const ctkVersion& ver)
-                                     : q_ptr(&qq), fwCtx(fw), id(id), location(loc), symbolicName(sym), version(ver),
+                                     : q_ptr(qq), fwCtx(fw), id(id), location(loc), symbolicName(sym), version(ver),
                                      state(ctkPlugin::INSTALLED), archive(0), pluginContext(0),
                                      pluginActivator(0), eagerActivation(false), activating(false),
                                      deactivating(false)
@@ -100,8 +100,7 @@ ctkPlugin::State ctkPluginPrivate::getUpdatedState()
     }
     catch (const ctkPluginException& pe)
     {
-      Q_Q(ctkPlugin);
-      this->fwCtx->listeners.frameworkError(q, pe);
+      this->fwCtx->listeners.frameworkError(this->q_func().data(), pe);
       throw;
     }
   }
@@ -119,8 +118,7 @@ void ctkPluginPrivate::setAutostartSetting(const ctkPlugin::StartOptions& settin
   }
   catch (const ctkPluginDatabaseException& e)
   {
-    Q_Q(ctkPlugin);
-    this->fwCtx->listeners.frameworkError(q, e);
+    this->fwCtx->listeners.frameworkError(this->q_func().data(), e);
   }
 }
 
@@ -135,8 +133,7 @@ void ctkPluginPrivate::ignoreAutostartSetting()
   }
   catch (const ctkPluginDatabaseException& e)
   {
-    Q_Q(ctkPlugin);
-    this->fwCtx->listeners.frameworkError(q, e);
+    this->fwCtx->listeners.frameworkError(this->q_func().data(), e);
   }
 }
 

+ 6 - 4
Libs/PluginFramework/ctkPluginPrivate_p.h

@@ -39,11 +39,13 @@ class ctkPluginPrivate {
 
 protected:
 
-  ctkPlugin * const q_ptr;
+  const QWeakPointer<ctkPlugin> q_ptr;
 
 public:
 
-  Q_DECLARE_PUBLIC(ctkPlugin)
+  inline QWeakPointer<ctkPlugin> q_func() { return q_ptr; }
+  inline QWeakPointer<const ctkPlugin> q_func() const { return q_ptr; }
+  friend class ctkPlugin;
 
   /**
    * Construct a new plugin based on a ctkPluginArchive.
@@ -53,7 +55,7 @@ public:
    * @param checkContext AccessConrolContext to do permission checks against.
    * @exception std::invalid_argument Faulty manifest for bundle
    */
-  ctkPluginPrivate(ctkPlugin& qq, ctkPluginFrameworkContext* fw,
+  ctkPluginPrivate(QWeakPointer<ctkPlugin> qq, ctkPluginFrameworkContext* fw,
                    ctkPluginArchive* pa /*, Object checkContext*/);
 
   /**
@@ -63,7 +65,7 @@ public:
    *
    * @param fw Framework for this plugin.
    */
-  ctkPluginPrivate(ctkPlugin& qq,
+  ctkPluginPrivate(QWeakPointer<ctkPlugin> qq,
                    ctkPluginFrameworkContext* fw,
                    long id,
                    const QString& loc,

+ 12 - 12
Libs/PluginFramework/ctkPluginTracker.cpp

@@ -59,7 +59,7 @@ void ctkPluginTracker::open()
     {
       QMutexLocker lockT(t.data());
       d->context->connectPluginListener(t.data(), SLOT(pluginChanged(ctkPluginEvent)), Qt::DirectConnection);
-      QList<ctkPlugin*> plugins = d->context->getPlugins();
+      QList<QSharedPointer<ctkPlugin> > plugins = d->context->getPlugins();
       int length = plugins.size();
       for (int i = 0; i < length; i++)
       {
@@ -67,10 +67,10 @@ void ctkPluginTracker::open()
         if ((d->mask & state) == 0)
         {
           /* null out plugins whose states are not interesting */
-          plugins[i] = 0;
+          plugins[i].clear();
         }
       }
-      plugins.removeAll(0);
+      plugins.removeAll(QSharedPointer<ctkPlugin>());
       /* set tracked with the initial bundles */
       t->setInitial(plugins);
     }
@@ -83,7 +83,7 @@ void ctkPluginTracker::open()
 void ctkPluginTracker::close()
 {
   Q_D(ctkPluginTracker);
-  QList<ctkPlugin*> plugins;
+  QList<QSharedPointer<ctkPlugin> > plugins;
   QSharedPointer<ctkTrackedPlugin> outgoing;
   {
     QMutexLocker lock(&d->mutex);
@@ -105,19 +105,19 @@ void ctkPluginTracker::close()
     outgoing->disconnect(SLOT(pluginChanged(ctkPluginEvent)));
   }
 
-  foreach (ctkPlugin* plugin, plugins)
+  foreach (QSharedPointer<ctkPlugin> plugin, plugins)
   {
     outgoing->untrack(plugin, ctkPluginEvent());
   }
 }
 
-QList<ctkPlugin*> ctkPluginTracker::getPlugins() const
+QList<QSharedPointer<ctkPlugin> > ctkPluginTracker::getPlugins() const
 {
   Q_D(const ctkPluginTracker);
   QSharedPointer<ctkTrackedPlugin> t = d->tracked();
   if (t.isNull())
   { /* if ctkPluginTracker is not open */
-    return QList<ctkPlugin*>();
+    return QList<QSharedPointer<ctkPlugin> >();
   }
 
   {
@@ -126,7 +126,7 @@ QList<ctkPlugin*> ctkPluginTracker::getPlugins() const
   }
 }
 
-QVariant ctkPluginTracker::getObject(ctkPlugin* plugin) const
+QVariant ctkPluginTracker::getObject(QSharedPointer<ctkPlugin> plugin) const
 {
   Q_D(const ctkPluginTracker);
   QSharedPointer<ctkTrackedPlugin> t = d->tracked();
@@ -141,7 +141,7 @@ QVariant ctkPluginTracker::getObject(ctkPlugin* plugin) const
   }
 }
 
-void ctkPluginTracker::remove(ctkPlugin* plugin)
+void ctkPluginTracker::remove(QSharedPointer<ctkPlugin> plugin)
 {
   Q_D(ctkPluginTracker);
   QSharedPointer<ctkTrackedPlugin> t = d->tracked();
@@ -182,7 +182,7 @@ int ctkPluginTracker::getTrackingCount() const
   }
 }
 
-QVariant ctkPluginTracker::addingPlugin(ctkPlugin* plugin, const ctkPluginEvent& event)
+QVariant ctkPluginTracker::addingPlugin(QSharedPointer<ctkPlugin> plugin, const ctkPluginEvent& event)
 {
   Q_UNUSED(event)
 
@@ -191,7 +191,7 @@ QVariant ctkPluginTracker::addingPlugin(ctkPlugin* plugin, const ctkPluginEvent&
   return var;
 }
 
-void ctkPluginTracker::modifiedPlugin(ctkPlugin* plugin, const ctkPluginEvent& event, QVariant object)
+void ctkPluginTracker::modifiedPlugin(QSharedPointer<ctkPlugin> plugin, const ctkPluginEvent& event, QVariant object)
 {
   Q_UNUSED(plugin)
   Q_UNUSED(event)
@@ -199,7 +199,7 @@ void ctkPluginTracker::modifiedPlugin(ctkPlugin* plugin, const ctkPluginEvent& e
   /* do nothing */
 }
 
-void ctkPluginTracker::removedPlugin(ctkPlugin* plugin, const ctkPluginEvent& event, QVariant object)
+void ctkPluginTracker::removedPlugin(QSharedPointer<ctkPlugin> plugin, const ctkPluginEvent& event, QVariant object)
 {
   Q_UNUSED(plugin)
   Q_UNUSED(event)

+ 6 - 6
Libs/PluginFramework/ctkPluginTracker.h

@@ -120,7 +120,7 @@ public:
    *
    * @return A list of <code>ctkPlugin</code>s.
    */
-  QList<ctkPlugin*> getPlugins() const;
+  QList<QSharedPointer<ctkPlugin> > getPlugins() const;
 
   /**
    * Returns the customized object for the specified <code>ctkPlugin</code> if
@@ -131,7 +131,7 @@ public:
    *         <code>null</code> if the specified <code>ctkPlugin</code> is not
    *         being tracked.
    */
-  QVariant getObject(ctkPlugin* plugin) const;
+  QVariant getObject(QSharedPointer<ctkPlugin> plugin) const;
 
   /**
    * Remove a plugin from this <code>ctkPluginTracker</code>.
@@ -143,7 +143,7 @@ public:
    *
    * @param plugin The <code>ctkPlugin</code> to be removed.
    */
-  void remove(ctkPlugin* plugin);
+  void remove(QSharedPointer<ctkPlugin> plugin);
 
   /**
    * Return the number of plugins being tracked by this
@@ -200,7 +200,7 @@ protected:
    * @return The specified plugin.
    * @see ctkPluginTrackerCustomizer::addingPlugin(ctkPlugin*, const ctkPluginEvent&)
    */
-  QVariant addingPlugin(ctkPlugin* plugin, const ctkPluginEvent& event);
+  QVariant addingPlugin(QSharedPointer<ctkPlugin> plugin, const ctkPluginEvent& event);
 
   /**
    * Default implementation of the
@@ -220,7 +220,7 @@ protected:
    * @param object The customized object for the specified ctkPlugin.
    * @see ctkPluginTrackerCustomizer::modifiedPlugin(ctkPlugin*, const ctkPluginEvent&, QVariant)
    */
-  void modifiedPlugin(ctkPlugin* plugin, const ctkPluginEvent& event, QVariant object);
+  void modifiedPlugin(QSharedPointer<ctkPlugin> plugin, const ctkPluginEvent& event, QVariant object);
 
   /**
    * Default implementation of the
@@ -240,7 +240,7 @@ protected:
    * @param object The customized object for the specified plugin.
    * @see ctkPluginTrackerCustomizer::removedPlugin(ctkPlugin*, const ctkPluginEvent&, QVariant)
    */
-  void removedPlugin(ctkPlugin* plugin, const ctkPluginEvent& event, QVariant object);
+  void removedPlugin(QSharedPointer<ctkPlugin> plugin, const ctkPluginEvent& event, QVariant object);
 
 private:
 

+ 3 - 3
Libs/PluginFramework/ctkPluginTrackerCustomizer.h

@@ -81,7 +81,7 @@ struct ctkPluginTrackerCustomizer {
    *         object or <code>null</code> if the specified <code>ctkPlugin</code>
    *         object should not be tracked.
    */
-  virtual QVariant addingPlugin(ctkPlugin* plugin, const ctkPluginEvent& event) = 0;
+  virtual QVariant addingPlugin(QSharedPointer<ctkPlugin> plugin, const ctkPluginEvent& event) = 0;
 
   /**
    * A plugin tracked by the <code>ctkPluginTracker</code> has been modified.
@@ -97,7 +97,7 @@ struct ctkPluginTrackerCustomizer {
    *        with the call to this method.
    * @param object The tracked object for the specified plugin.
    */
-  virtual void modifiedPlugin(ctkPlugin* plugin, const ctkPluginEvent& event,
+  virtual void modifiedPlugin(QSharedPointer<ctkPlugin> plugin, const ctkPluginEvent& event,
       QVariant object) = 0;
 
   /**
@@ -114,7 +114,7 @@ struct ctkPluginTrackerCustomizer {
    *        with the call to this method.
    * @param object The tracked object for the specified plugin.
    */
-  virtual void removedPlugin(ctkPlugin* plugin, const ctkPluginEvent& event,
+  virtual void removedPlugin(QSharedPointer<ctkPlugin> plugin, const ctkPluginEvent& event,
       QVariant object) = 0;
 };
 

+ 10 - 14
Libs/PluginFramework/ctkPlugins.cpp

@@ -111,10 +111,11 @@ QSharedPointer<ctkPlugin> ctkPlugins::install(const QUrl& location, QIODevice* i
 
       pa = fwCtx->storage->insertPlugin(location, localPluginPath);
 
-      QSharedPointer<ctkPlugin> res(new ctkPlugin(fwCtx, pa));
+      QSharedPointer<ctkPlugin> res(new ctkPlugin());
+      res->init(res, fwCtx, pa);
       plugins.insert(location.toString(), res);
 
-      fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::INSTALLED, res.data()));
+      fwCtx->listeners.emitPluginChanged(ctkPluginEvent(ctkPluginEvent::INSTALLED, res));
 
       return res;
     }
@@ -143,7 +144,7 @@ void ctkPlugins::remove(const QUrl& location)
   plugins.remove(location.toString());
 }
 
-ctkPlugin* ctkPlugins::getPlugin(int id) const
+QSharedPointer<ctkPlugin> ctkPlugins::getPlugin(int id) const
 {
   if (!fwCtx)
   { // This plugins instance has been closed!
@@ -159,11 +160,11 @@ ctkPlugin* ctkPlugins::getPlugin(int id) const
       QSharedPointer<ctkPlugin> plugin = it.next().value();
       if (plugin->getPluginId() == id)
       {
-        return plugin.data();
+        return plugin;
       }
     }
   }
-  return 0;
+  return QSharedPointer<ctkPlugin>();
 }
 
 ctkPlugin* ctkPlugins::getPlugin(const QString& location) const
@@ -202,7 +203,7 @@ ctkPlugin* ctkPlugins::getPlugin(const QString& name, const ctkVersion& version)
   return 0;
 }
 
-QList<ctkPlugin*> ctkPlugins::getPlugins() const
+QList<QSharedPointer<ctkPlugin> > ctkPlugins::getPlugins() const
 {
   if (!fwCtx)
   { // This plugins instance has been closed!
@@ -211,13 +212,7 @@ QList<ctkPlugin*> ctkPlugins::getPlugins() const
 
   {
     QReadLocker lock(&pluginsLock);
-    QList<ctkPlugin*> res;
-    QHashIterator<QString, QSharedPointer<ctkPlugin> > it(plugins);
-    while (it.hasNext())
-    {
-      res.push_back(it.next().value().data());
-    }
-    return res;
+    return plugins.values();
   }
 }
 
@@ -306,7 +301,8 @@ void ctkPlugins::load()
       ctkPluginArchive* pa = it.next();
       try
       {
-        QSharedPointer<ctkPlugin> plugin(new ctkPlugin(fwCtx, pa));
+        QSharedPointer<ctkPlugin> plugin(new ctkPlugin());
+        plugin->init(plugin, fwCtx, pa);
         plugins.insert(pa->getPluginLocation().toString(), plugin);
       }
       catch (const std::exception& e)

+ 2 - 2
Libs/PluginFramework/ctkPlugins_p.h

@@ -94,7 +94,7 @@
      * @return ctkPlugin or null
      *         if the plugin was not found.
      */
-    ctkPlugin* getPlugin(int id) const;
+    QSharedPointer<ctkPlugin> getPlugin(int id) const;
 
 
     /**
@@ -122,7 +122,7 @@
      *
      * @return A ctkPlugin list with plugins.
      */
-    QList<ctkPlugin*> getPlugins() const;
+    QList<QSharedPointer<ctkPlugin> > getPlugins() const;
 
 
     /**

+ 1 - 1
Libs/PluginFramework/ctkQtServiceRegistrationPrivate.cpp

@@ -44,7 +44,7 @@ QObject* ctkQtServiceRegistrationPrivate::getService()
   {
     try
     {
-      this->plugin->q_func()->start(0);
+      this->plugin->q_func().data()->start(0);
     }
     catch (const ctkPluginException& e)
     {

+ 2 - 2
Libs/PluginFramework/ctkServiceFactory.h

@@ -94,7 +94,7 @@
      *         the classes named when the service was registered.
      * @see ctkPluginContext#getService
      */
-    virtual QObject* getService(ctkPlugin* plugin, ctkServiceRegistration* registration) = 0;
+    virtual QObject* getService(QSharedPointer<ctkPlugin> plugin, ctkServiceRegistration* registration) = 0;
 
     /**
      * Releases a service object.
@@ -110,7 +110,7 @@
      *        <code>ctkServiceFactory::getService</code> method.
      * @see ctkPluginContext#ungetService
      */
-    virtual void ungetService(ctkPlugin* plugin, ctkServiceRegistration* registration,
+    virtual void ungetService(QSharedPointer<ctkPlugin> plugin, ctkServiceRegistration* registration,
         QObject* service) = 0;
   };
 

+ 3 - 3
Libs/PluginFramework/ctkServiceReference.cpp

@@ -69,12 +69,12 @@ QStringList ctkServiceReference::getPropertyKeys() const
   return d->registration->properties.keys();
 }
 
-ctkPlugin* ctkServiceReference::getPlugin() const
+QSharedPointer<ctkPlugin> ctkServiceReference::getPlugin() const
 {
-  return d_func()->registration->plugin->q_func();
+  return d_func()->registration->plugin->q_func().toStrongRef();
 }
 
-QList<ctkPlugin*> ctkServiceReference::getUsingPlugins() const
+QList<QSharedPointer<ctkPlugin> > ctkServiceReference::getUsingPlugins() const
 {
   Q_D(const ctkServiceReference);
 

+ 2 - 2
Libs/PluginFramework/ctkServiceReference.h

@@ -127,7 +127,7 @@ public:
    *         service has already been unregistered.
    * @see ctkPluginContext::registerService(const QStringList&, QObject* , const ServiceProperties&)
    */
-  ctkPlugin* getPlugin() const;
+  QSharedPointer<ctkPlugin> getPlugin() const;
 
   /**
    * Returns the plugins that are using the service referenced by this
@@ -138,7 +138,7 @@ public:
    *         by this <code>ctkServiceReference</code> object is greater than
    *         zero.
    */
-  QList<ctkPlugin*> getUsingPlugins() const;
+  QList<QSharedPointer<ctkPlugin> > getUsingPlugins() const;
 
   /**
    * Compares this <code>ctkServiceReference</code> with the specified

+ 6 - 6
Libs/PluginFramework/ctkServiceReferencePrivate.cpp

@@ -39,7 +39,7 @@ ctkServiceReferencePrivate::ctkServiceReferencePrivate(ctkServiceRegistrationPri
 {
 }
 
-QObject* ctkServiceReferencePrivate::getService(ctkPlugin* plugin)
+QObject* ctkServiceReferencePrivate::getService(QSharedPointer<ctkPlugin> plugin)
 {
   QObject* s = 0;
   {
@@ -63,14 +63,14 @@ QObject* ctkServiceReferencePrivate::getService(ctkPlugin* plugin)
             ctkServiceException se("ctkServiceFactory throw an exception",
                                    ctkServiceException::FACTORY_EXCEPTION, &pe);
             plugin->d_func()->fwCtx->listeners.frameworkError
-                (registration->plugin->q_func(), se);
+                (registration->plugin->q_func().data(), se);
             return 0;
           }
           if (s == 0) {
             ctkServiceException se("ctkServiceFactory produced null",
                                    ctkServiceException::FACTORY_ERROR);
             plugin->d_func()->fwCtx->listeners.frameworkError
-                (registration->plugin->q_func(), se);
+                (registration->plugin->q_func().data(), se);
             return 0;
           }
           for (QStringListIterator i(classes); i.hasNext(); )
@@ -82,7 +82,7 @@ QObject* ctkServiceReferencePrivate::getService(ctkPlugin* plugin)
                                      "that did not implement: " + cls,
                                      ctkServiceException::FACTORY_ERROR);
               plugin->d_func()->fwCtx->listeners.frameworkError
-                  (registration->plugin->q_func(), se);
+                  (registration->plugin->q_func().data(), se);
               return 0;
             }
           }
@@ -110,7 +110,7 @@ QObject* ctkServiceReferencePrivate::getService(ctkPlugin* plugin)
   return s;
 }
 
-bool ctkServiceReferencePrivate::ungetService(ctkPlugin* plugin, bool checkRefCounter)
+bool ctkServiceReferencePrivate::ungetService(QSharedPointer<ctkPlugin> plugin, bool checkRefCounter)
 {
   QMutexLocker lock(&registration->propsLock);
   bool hadReferences = false;
@@ -151,7 +151,7 @@ bool ctkServiceReferencePrivate::ungetService(ctkPlugin* plugin, bool checkRefCo
       }
       catch (const std::exception& e)
       {
-        plugin->d_func()->fwCtx->listeners.frameworkError(registration->plugin->q_func(), e);
+        plugin->d_func()->fwCtx->listeners.frameworkError(registration->plugin->q_func().data(), e);
       }
     }
     registration->dependents.remove(plugin);

+ 3 - 2
Libs/PluginFramework/ctkServiceReferencePrivate.h

@@ -24,6 +24,7 @@
 #define CTKSERVICEREFERENCEPRIVATE_H
 
 #include <QAtomicInt>
+#include <QSharedPointer>
 
 #include "ctkPluginFramework_global.h"
 
@@ -46,7 +47,7 @@ public:
     * @param plugin requester of service.
     * @return Service requested or null in case of failure.
     */
-  QObject* getService(ctkPlugin* plugin);
+  QObject* getService(QSharedPointer<ctkPlugin> plugin);
 
   /**
    * Unget the service object.
@@ -58,7 +59,7 @@ public:
    * @return True if service was remove or false if only refence counter was
    *         decremented.
    */
-  bool ungetService(ctkPlugin* plugin, bool checkRefCounter);
+  bool ungetService(QSharedPointer<ctkPlugin> plugin, bool checkRefCounter);
 
   /**
    * Get all properties registered with this service.

+ 2 - 2
Libs/PluginFramework/ctkServiceRegistration.cpp

@@ -137,7 +137,7 @@ void ctkServiceRegistration::unregister()
       d->available = false;
       if (d->plugin)
       {
-        for (QHashIterator<ctkPlugin*, QObject*> i(d->serviceInstances); i.hasNext();)
+        for (QHashIterator<QSharedPointer<ctkPlugin>, QObject*> i(d->serviceInstances); i.hasNext();)
         {
           QObject* obj = i.next().value();
           try
@@ -149,7 +149,7 @@ void ctkServiceRegistration::unregister()
           }
           catch (const std::exception& ue)
           {
-            ctkPluginFrameworkEvent pfwEvent(ctkPluginFrameworkEvent::ERROR, d->plugin->q_func(), ue);
+            ctkPluginFrameworkEvent pfwEvent(ctkPluginFrameworkEvent::ERROR, d->plugin->q_func().data(), ue);
             d->plugin->fwCtx->listeners
                 .emitFrameworkEvent(pfwEvent);
           }

+ 2 - 2
Libs/PluginFramework/ctkServiceRegistrationPrivate.cpp

@@ -36,9 +36,9 @@ ctkServiceRegistrationPrivate::~ctkServiceRegistrationPrivate()
 
 }
 
-bool ctkServiceRegistrationPrivate::isUsedByPlugin(ctkPlugin* p)
+bool ctkServiceRegistrationPrivate::isUsedByPlugin(QSharedPointer<ctkPlugin> p)
 {
-  QHash<ctkPlugin*, int> deps = dependents;
+  QHash<QSharedPointer<ctkPlugin>, int> deps = dependents;
   return deps.contains(p);
 }
 

+ 3 - 3
Libs/PluginFramework/ctkServiceRegistrationPrivate.h

@@ -68,12 +68,12 @@
      * Plugins dependent on this service. Integer is used as
      * reference counter, counting number of unbalanced getService().
      */
-    QHash<ctkPlugin*,int> dependents;
+    QHash<QSharedPointer<ctkPlugin>,int> dependents;
 
     /**
      * Object instances that factory has produced.
      */
-    QHash<ctkPlugin*, QObject*> serviceInstances;
+    QHash<QSharedPointer<ctkPlugin>, QObject*> serviceInstances;
 
     /**
      * Is service available. I.e., if <code>true</code> then holders
@@ -106,7 +106,7 @@
      * @param p Plugin to check
      * @return true if plugin uses this service
      */
-    bool isUsedByPlugin(ctkPlugin* p);
+    bool isUsedByPlugin(QSharedPointer<ctkPlugin> p);
 
     virtual QObject* getService();
 

+ 1 - 1
Libs/PluginFramework/ctkServices.cpp

@@ -418,7 +418,7 @@ QList<ctkServiceRegistration*> ctkServices::getRegisteredByPlugin(ctkPluginPriva
 }
 
 
-QList<ctkServiceRegistration*> ctkServices::getUsedByPlugin(ctkPlugin* p) const
+QList<ctkServiceRegistration*> ctkServices::getUsedByPlugin(QSharedPointer<ctkPlugin> p) const
 {
   QMutexLocker lock(&mutex);
 

+ 1 - 1
Libs/PluginFramework/ctkServices_p.h

@@ -182,7 +182,7 @@ public:
    * @param p The plugin
    * @return A set of {@link ctkServiceRegistration} objects
    */
-  QList<ctkServiceRegistration*> getUsedByPlugin(ctkPlugin* p) const;
+  QList<ctkServiceRegistration*> getUsedByPlugin(QSharedPointer<ctkPlugin> p) const;
 
   QString getQServiceManagerErrorString(QtMobility::QServiceManager::Error error);
 

+ 4 - 4
Libs/PluginFramework/ctkTrackedPlugin.cpp

@@ -43,7 +43,7 @@ void ctkTrackedPlugin::pluginChanged(const ctkPluginEvent& event)
     return;
   }
 
-  ctkPlugin* plugin = event.getPlugin();
+  QSharedPointer<ctkPlugin> plugin = event.getPlugin();
   ctkPlugin::State state = plugin->getState();
   if (pluginTracker->d_func()->DEBUG)
   {
@@ -68,19 +68,19 @@ void ctkTrackedPlugin::pluginChanged(const ctkPluginEvent& event)
   }
 }
 
-QVariant ctkTrackedPlugin::customizerAdding(ctkPlugin* item,
+QVariant ctkTrackedPlugin::customizerAdding(QSharedPointer<ctkPlugin> item,
     ctkPluginEvent related)
 {
   return customizer->addingPlugin(item, related);
 }
 
-void ctkTrackedPlugin::customizerModified(ctkPlugin* item,
+void ctkTrackedPlugin::customizerModified(QSharedPointer<ctkPlugin> item,
     ctkPluginEvent related, QVariant object)
 {
   customizer->modifiedPlugin(item, related, object);
 }
 
-void ctkTrackedPlugin::customizerRemoved(ctkPlugin* item,
+void ctkTrackedPlugin::customizerRemoved(QSharedPointer<ctkPlugin> item,
     ctkPluginEvent related, QVariant object)
 {
   customizer->removedPlugin(item, related, object);

+ 7 - 5
Libs/PluginFramework/ctkTrackedPlugin_p.h

@@ -23,6 +23,8 @@
 #ifndef CTKTRACKEDPLUGIN_P_H
 #define CTKTRACKEDPLUGIN_P_H
 
+#include <QSharedPointer>
+
 #include "ctkPluginAbstractTracked_p.h"
 #include "ctkPluginEvent.h"
 
@@ -30,7 +32,7 @@ class ctkPluginTracker;
 class ctkPluginTrackerCustomizer;
 
 class ctkTrackedPlugin : public QObject,
-    public ctkPluginAbstractTracked<ctkPlugin*, ctkPluginEvent>
+    public ctkPluginAbstractTracked<QSharedPointer<ctkPlugin>, ctkPluginEvent>
 {
   Q_OBJECT
 
@@ -51,7 +53,7 @@ private slots:
 
 private:
 
-  typedef ctkPluginAbstractTracked<ctkPlugin*, ctkPluginEvent> Superclass;
+  typedef ctkPluginAbstractTracked<QSharedPointer<ctkPlugin>, ctkPluginEvent> Superclass;
 
   ctkPluginTracker* pluginTracker;
   ctkPluginTrackerCustomizer* customizer;
@@ -65,7 +67,7 @@ private:
    * @return Customized object for the tracked item or <code>null</code>
    *         if the item is not to be tracked.
    */
-  QVariant customizerAdding(ctkPlugin* item,
+  QVariant customizerAdding(QSharedPointer<ctkPlugin> item,
                             ctkPluginEvent related);
 
   /**
@@ -76,7 +78,7 @@ private:
    * @param related Action related object.
    * @param object Customized object for the tracked item.
    */
-  void customizerModified(ctkPlugin* item,
+  void customizerModified(QSharedPointer<ctkPlugin> item,
                           ctkPluginEvent related, QVariant object);
 
   /**
@@ -87,7 +89,7 @@ private:
    * @param related Action related object.
    * @param object Customized object for the tracked item.
    */
-  void customizerRemoved(ctkPlugin* item,
+  void customizerRemoved(QSharedPointer<ctkPlugin> item,
                          ctkPluginEvent related, QVariant object);
 };