Browse Source

ENH: adding simple plugin classes and prototype code

Sascha Zelzer 15 years ago
parent
commit
ea842cca45

+ 9 - 0
Applications/ctkCLIPluginExplorer/CMakeLists.txt

@@ -0,0 +1,9 @@
+
+SET(app_srcs
+  ctkCLIPluginExplorer.cxx
+)
+
+CtkMacroBuildQtApp(
+  NAME CLIPluginExplorer
+  SRCS ${app_srcs}
+)

+ 21 - 0
Applications/ctkCLIPluginExplorer/ctkCLIPluginExplorer.cxx

@@ -0,0 +1,21 @@
+/*
+ * ctkCLIPluginExplorer.cxx
+ *
+ *  Created on: Mar 11, 2010
+ *      Author: zelzer
+ */
+
+#include <QCoreApplication>
+
+#include <PluginFramework/ctkPluginManager.h>
+
+int main(int argc, char** argv)
+{
+  QCoreApplication app(argc, argv);
+
+  ctk::PluginManager pluginManager;
+  pluginManager.addSearchPath("/home/zelzer/git/CTK/bin-debug/CTK-build/bin/Plugins");
+  pluginManager.startAllPlugins();
+
+  return 0;
+}

+ 1 - 0
CMakeLists.txt

@@ -116,6 +116,7 @@ SET(ctk_plugins
 # CTK Applications
 #
 SET(ctk_applications
+  ctkCLIPluginExplorer
   ctkDICOM
   #ctkDICOMIndexer
   )

+ 7 - 0
Libs/Core/CMakeLists.txt

@@ -37,10 +37,17 @@ SET(KIT_include_directories
 SET(KIT_SRCS
   ctkUtils.cxx
   ctkUtils.h
+
+  # PluginFramework sources
+  PluginFramework/ctkPluginContext.cxx
+  PluginFramework/ctkPluginManager.cxx
   )
 
 # Headers that should run through moc
 SET(KIT_MOC_SRCS
+
+  # PluginFramework headers
+  PluginFramework/ctkPluginActivator.h
   )
 
 # UI files

+ 32 - 0
Libs/Core/PluginFramework/ctkPluginActivator.h

@@ -0,0 +1,32 @@
+/*
+ * ctkPluginActivator.h
+ *
+ *  Created on: Mar 10, 2010
+ *      Author: zelzer
+ */
+
+#ifndef CTKPLUGINACTIVATOR_H_
+#define CTKPLUGINACTIVATOR_H_
+
+#include "ctkPluginContext.h"
+
+#include "CTKCoreExport.h"
+
+namespace ctk {
+
+  class Q_CTK_CORE_EXPORT PluginActivator
+  {
+  public:
+
+    virtual ~PluginActivator() {};
+
+    virtual void start(PluginContext::Pointer context) = 0;
+    virtual void stop(PluginContext::Pointer context) = 0;
+
+  };
+
+}
+
+Q_DECLARE_INTERFACE(ctk::PluginActivator, "org.commontk.core.pluginactivator")
+
+#endif /* CTKPLUGINACTIVATOR_H_ */

+ 39 - 0
Libs/Core/PluginFramework/ctkPluginContext.cxx

@@ -0,0 +1,39 @@
+/*
+ * ctkPluginContext.cxx
+ *
+ *  Created on: Mar 10, 2010
+ *      Author: zelzer
+ */
+
+#include "ctkPluginContext.h"
+
+#include <QServiceManager>
+
+namespace ctk {
+
+  class PluginContextPrivate
+  {
+
+  public:
+
+	  QServiceManager serviceManager;
+  };
+
+
+  PluginContext::PluginContext()
+  : d_ptr(new PluginContextPrivate())
+  {}
+
+  PluginContext::~PluginContext()
+  {
+	  Q_D(PluginContext);
+	  delete d;
+  }
+
+  QServiceInterfaceDescriptor PluginContext::getServiceDescriptor(const QString& interfaceName) const
+  {
+	Q_D(const PluginContext);
+	return d->serviceManager.interfaceDefault(interfaceName);
+  }
+
+}

+ 44 - 0
Libs/Core/PluginFramework/ctkPluginContext.h

@@ -0,0 +1,44 @@
+/*
+ * ctkPluginContext.h
+ *
+ *  Created on: Mar 10, 2010
+ *      Author: zelzer
+ */
+
+#ifndef CTKPLUGINCONTEXT_H_
+#define CTKPLUGINCONTEXT_H_
+
+#include <QSharedPointer>
+#include <QServiceInterfaceDescriptor>
+
+#include "CTKCoreExport.h"
+
+using namespace QtMobility;
+
+namespace ctk {
+
+  class PluginContextPrivate;
+
+  class Q_CTK_CORE_EXPORT PluginContext
+  {
+
+	  Q_DECLARE_PRIVATE(PluginContext)
+
+  public:
+
+    //TODO use a macro
+    typedef QSharedPointer<PluginContext> Pointer;
+
+    PluginContext();
+    virtual ~PluginContext();
+
+    QServiceInterfaceDescriptor getServiceDescriptor(const QString& interfaceName) const;
+
+  protected:
+
+    PluginContextPrivate * const d_ptr;
+  };
+
+}
+
+#endif /* CTKPLUGINCONTEXT_H_ */

+ 72 - 0
Libs/Core/PluginFramework/ctkPluginManager.cxx

@@ -0,0 +1,72 @@
+/*
+ * ctkPluginManager.cxx
+ *
+ *  Created on: Mar 11, 2010
+ *      Author: zelzer
+ */
+
+#include "ctkPluginManager.h"
+
+#include <QDirIterator>
+#include <QDebug>
+#include <QLibrary>
+
+namespace ctk {
+
+class PluginManagerPrivate
+{
+public:
+
+  QList<QString> pluginPaths;
+};
+
+PluginManager::PluginManager()
+: d_ptr(new PluginManagerPrivate())
+{
+
+}
+
+PluginManager::~PluginManager()
+{
+  Q_D(PluginManager);
+  delete d;
+}
+
+void PluginManager::addSearchPath(const QString & searchPath)
+{
+  Q_D(PluginManager);
+  d->pluginPaths.push_back(searchPath);
+}
+
+void PluginManager::startAllPlugins()
+{
+  Q_D(PluginManager);
+  QDirIterator it(d->pluginPaths.front(), QDir::Files);
+  while (it.hasNext()) {
+       QString libName(it.next());
+       QLibrary lib(libName);
+       QFileInfo fileInfo(libName);
+       QString libBaseName(fileInfo.baseName());
+       if (libBaseName.startsWith("lib"))
+       {
+         libBaseName.remove(0, 3);
+       }
+       qDebug() << libBaseName;
+       lib.load();
+       qDebug() << "lib loaded: " << lib.isLoaded();
+       QString xyz = QString(":/") + libBaseName + "/servicedescriptor.xml";
+       //QString xyz = ":/servicedescriptor.xml";
+       qDebug() << "resource string: " << xyz;
+       QFile serviceDescriptor(xyz);
+       qDebug() << "file exists: " << serviceDescriptor.exists();
+       qDebug() << "open returns:" << serviceDescriptor.open(QIODevice::ReadOnly);
+       qDebug() << "file open: " << serviceDescriptor.isOpen();
+       qDebug() << "file is readable: " << serviceDescriptor.isReadable();
+       QByteArray serviceBA = serviceDescriptor.readAll();
+       qDebug() << serviceBA;
+       lib.unload();
+  }
+
+}
+
+}

+ 39 - 0
Libs/Core/PluginFramework/ctkPluginManager.h

@@ -0,0 +1,39 @@
+/*
+ * ctkPluginManager.h
+ *
+ *  Created on: Mar 10, 2010
+ *      Author: zelzer
+ */
+
+#ifndef CTKPLUGINMANAGER_H_
+#define CTKPLUGINMANAGER_H_
+
+#include <QString>
+
+namespace ctk {
+
+  class PluginManagerPrivate;
+
+  class PluginManager
+  {
+    Q_DECLARE_PRIVATE(PluginManager)
+
+  public:
+
+    PluginManager();
+    virtual ~PluginManager();
+
+	  void addSearchPath(const QString& searchPath);
+
+	  void startAllPlugins();
+
+  protected:
+
+	  PluginManagerPrivate* const d_ptr;
+
+  };
+
+}
+
+
+#endif /* CTKPLUGINMANAGER_H_ */

+ 23 - 0
Plugins/org.commontk.cli/CMakeLists.txt

@@ -0,0 +1,23 @@
+
+
+SET(plugin_srcs
+  ctkCLIPlugin.cxx
+)
+
+SET(plugin_moc
+  ctkCLIPlugin.h
+)
+
+SET(plugin_qrc_files
+  org_commontk_cli.qrc
+)
+
+SET(LIBRARY_OUTPUT_PATH ${LIBRARY_OUTPUT_PATH}/Plugins)
+
+CtkMacroBuildQtPlugin(
+  NAME org_commontk_cli
+  SRCS ${plugin_srcs}
+  MOC_SRCS ${plugin_moc}
+  QRC_FILES ${plugin_qrc_files}
+  EXPORT_DIRECTIVE "org_commontk_cli_EXPORT"
+)

+ 35 - 0
Plugins/org.commontk.cli/ctkCLIPlugin.cxx

@@ -0,0 +1,35 @@
+/*
+ * ctkCLIPlugin.cxx
+ *
+ *  Created on: Mar 11, 2010
+ *      Author: zelzer
+ */
+
+#include "ctkCLIPlugin.h"
+
+#include <QtPlugin>
+
+#include <iostream>
+
+namespace ctk {
+
+  void CLIPlugin::start(PluginContext::Pointer context)
+  {
+    std::cout << "Plugin A started\n";
+  }
+
+  void CLIPlugin::stop(PluginContext::Pointer context)
+  {
+    std::cout << "Plugin B stopped\n";
+  }
+
+  QObject* CLIPlugin::createInstance(const QServiceInterfaceDescriptor& descriptor,
+                              QServiceContext* context,
+                              QAbstractSecuritySession* session)
+  {
+    std::cout << "Creating service instance for " << descriptor.interfaceName().toStdString() << std::endl;
+  }
+
+Q_EXPORT_PLUGIN2(org_commontk_cli, CLIPlugin)
+
+}

+ 39 - 0
Plugins/org.commontk.cli/ctkCLIPlugin.h

@@ -0,0 +1,39 @@
+/*
+ * ctkCLIPlugin.h
+ *
+ *  Created on: Mar 11, 2010
+ *      Author: zelzer
+ */
+
+#ifndef CTKCLIPLUGIN_H_
+#define CTKCLIPLUGIN_H_
+
+#include <PluginFramework/ctkPluginActivator.h>
+
+#include <QServicePluginInterface>
+
+using namespace QtMobility;
+
+namespace ctk {
+
+  class CLIPlugin : public QObject,
+                    public PluginActivator,
+                    public QServicePluginInterface
+  {
+    Q_OBJECT
+    Q_INTERFACES(ctk::PluginActivator QtMobility::QServicePluginInterface)
+
+  public:
+
+    void start(PluginContext::Pointer context);
+    void stop(PluginContext::Pointer context);
+
+    QObject* createInstance(const QServiceInterfaceDescriptor& descriptor,
+                            QServiceContext* context,
+                            QAbstractSecuritySession* session);
+
+  };
+
+}
+
+#endif /* CTKCLIPLUGIN_H_ */

+ 12 - 0
Plugins/org.commontk.cli/ctkICLIManager.h

@@ -0,0 +1,12 @@
+/*
+ * ctkICLIManager.h
+ *
+ *  Created on: Mar 11, 2010
+ *      Author: zelzer
+ */
+
+#ifndef CTKICLIMANAGER_H_
+#define CTKICLIMANAGER_H_
+
+
+#endif /* CTKICLIMANAGER_H_ */

+ 5 - 0
Plugins/org.commontk.cli/org_commontk_cli.qrc

@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+ <qresource prefix="/org_commontk_cli">
+  <file>servicedescriptor.xml</file>
+ </qresource>
+</RCC>

+ 11 - 0
Plugins/org.commontk.cli/servicedescriptor.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" ?>
+  <service>
+    <name>ctkCLIService</name>
+    <filepath>org_commontk_cli</filepath>
+    <interface>
+      <name>org.commontk.cli.ICLIManager</name>
+      <version>1.0</version>
+      <capabilities></capabilities>
+      <description>Interface that allows to discover and manage CLI modules</description>
+    </interface>
+  </service>