Pārlūkot izejas kodu

ENH: PluginFramework: adapted CTKCore export macro and first service test

Sascha Zelzer 15 gadi atpakaļ
vecāks
revīzija
535b2d231c

+ 5 - 1
Applications/ctkCLIPluginExplorer/ctkCLIPluginExplorer.cxx

@@ -14,8 +14,12 @@ 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.addSearchPath("C:\\development\\CTK-pluginfw\\CTK-build\\bin\\Plugins");
   pluginManager.startAllPlugins();
 
+  qDebug() << "List of services: " <<  pluginManager.serviceManager()->findServices();
+
+  QObject* service = pluginManager.serviceManager()->loadInterface("org.commontk.cli.ICLIManager");
+
   return 0;
 }

+ 1 - 1
Libs/Core/PluginFramework/ctkPluginActivator.h

@@ -14,7 +14,7 @@
 
 namespace ctk {
 
-  class Q_CTK_CORE_EXPORT PluginActivator
+  class PluginActivator
   {
   public:
 

+ 1 - 1
Libs/Core/PluginFramework/ctkPluginContext.h

@@ -19,7 +19,7 @@ namespace ctk {
 
   class PluginContextPrivate;
 
-  class Q_CTK_CORE_EXPORT PluginContext
+  class CTK_CORE_EXPORT PluginContext
   {
 
 	  Q_DECLARE_PRIVATE(PluginContext)

+ 27 - 12
Libs/Core/PluginFramework/ctkPluginManager.cxx

@@ -7,9 +7,11 @@
 
 #include "ctkPluginManager.h"
 
+#include <QServiceManager>
 #include <QDirIterator>
 #include <QDebug>
 #include <QLibrary>
+#include <QApplication>
 
 namespace ctk {
 
@@ -18,6 +20,7 @@ class PluginManagerPrivate
 public:
 
   QList<QString> pluginPaths;
+  QServiceManager serviceManager;
 };
 
 PluginManager::PluginManager()
@@ -32,6 +35,12 @@ PluginManager::~PluginManager()
   delete d;
 }
 
+QServiceManager* PluginManager::serviceManager()
+{
+  Q_D(PluginManager);
+  return &(d->serviceManager);
+}
+
 void PluginManager::addSearchPath(const QString & searchPath)
 {
   Q_D(PluginManager);
@@ -42,6 +51,10 @@ void PluginManager::startAllPlugins()
 {
   Q_D(PluginManager);
   QDirIterator it(d->pluginPaths.front(), QDir::Files);
+  if (it.hasNext())
+  {
+    qApp->addLibraryPath(d->pluginPaths.front());
+  }
   while (it.hasNext()) {
        QString libName(it.next());
        QLibrary lib(libName);
@@ -53,18 +66,20 @@ void PluginManager::startAllPlugins()
        }
        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();
+       if (lib.isLoaded())
+       {
+         QString xyz = QString(":/") + libBaseName + "/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;
+         qDebug() << "Service for " << libBaseName << " registered:" << d->serviceManager.addService(&serviceDescriptor);
+         lib.unload();
+       }
   }
 
 }

+ 8 - 1
Libs/Core/PluginFramework/ctkPluginManager.h

@@ -9,12 +9,17 @@
 #define CTKPLUGINMANAGER_H_
 
 #include <QString>
+#include <QServiceManager>
+
+#include <CTKCoreExport.h>
 
 namespace ctk {
 
+  using namespace QtMobility;
+
   class PluginManagerPrivate;
 
-  class PluginManager
+  class CTK_CORE_EXPORT PluginManager
   {
     Q_DECLARE_PRIVATE(PluginManager)
 
@@ -23,6 +28,8 @@ namespace ctk {
     PluginManager();
     virtual ~PluginManager();
 
+    QServiceManager* serviceManager();
+
 	  void addSearchPath(const QString& searchPath);
 
 	  void startAllPlugins();

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

@@ -28,6 +28,7 @@ namespace ctk {
                               QAbstractSecuritySession* session)
   {
     std::cout << "Creating service instance for " << descriptor.interfaceName().toStdString() << std::endl;
+    return 0;
   }
 
 Q_EXPORT_PLUGIN2(org_commontk_cli, CLIPlugin)

+ 1 - 1
Plugins/org.commontk.cli/servicedescriptor.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" ?>
   <service>
     <name>ctkCLIService</name>
-    <filepath>org_commontk_cli</filepath>
+    <filepath>liborg_commontk_cli</filepath>
     <interface>
       <name>org.commontk.cli.ICLIManager</name>
       <version>1.0</version>