ctkPluginManager.cxx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * ctkPluginManager.cxx
  3. *
  4. * Created on: Mar 11, 2010
  5. * Author: zelzer
  6. */
  7. #include "ctkPluginManager.h"
  8. #include <QServiceManager>
  9. #include <QDirIterator>
  10. #include <QDebug>
  11. #include <QLibrary>
  12. #include <QApplication>
  13. namespace ctk {
  14. class PluginManagerPrivate
  15. {
  16. public:
  17. QList<QString> pluginPaths;
  18. QServiceManager serviceManager;
  19. };
  20. PluginManager::PluginManager()
  21. : d_ptr(new PluginManagerPrivate())
  22. {
  23. }
  24. PluginManager::~PluginManager()
  25. {
  26. Q_D(PluginManager);
  27. delete d;
  28. }
  29. QServiceManager* PluginManager::serviceManager()
  30. {
  31. Q_D(PluginManager);
  32. return &(d->serviceManager);
  33. }
  34. void PluginManager::addSearchPath(const QString & searchPath)
  35. {
  36. Q_D(PluginManager);
  37. d->pluginPaths.push_back(searchPath);
  38. }
  39. void PluginManager::startAllPlugins()
  40. {
  41. Q_D(PluginManager);
  42. QDirIterator it(d->pluginPaths.front(), QDir::Files);
  43. if (it.hasNext())
  44. {
  45. qApp->addLibraryPath(d->pluginPaths.front());
  46. }
  47. while (it.hasNext()) {
  48. QString libName(it.next());
  49. QLibrary lib(libName);
  50. QFileInfo fileInfo(libName);
  51. QString libBaseName(fileInfo.baseName());
  52. if (libBaseName.startsWith("lib"))
  53. {
  54. libBaseName.remove(0, 3);
  55. }
  56. qDebug() << libBaseName;
  57. lib.load();
  58. if (lib.isLoaded())
  59. {
  60. QString xyz = QString(":/") + libBaseName + "/servicedescriptor.xml";
  61. qDebug() << "resource string: " << xyz;
  62. QFile serviceDescriptor(xyz);
  63. //qDebug() << "file exists: " << serviceDescriptor.exists();
  64. //qDebug() << "open returns:" << serviceDescriptor.open(QIODevice::ReadOnly);
  65. //qDebug() << "file open: " << serviceDescriptor.isOpen();
  66. //qDebug() << "file is readable: " << serviceDescriptor.isReadable();
  67. //QByteArray serviceBA = serviceDescriptor.readAll();
  68. //qDebug() << serviceBA;
  69. qDebug() << "Service for " << libBaseName << " registered:" << d->serviceManager.addService(&serviceDescriptor);
  70. lib.unload();
  71. }
  72. }
  73. }
  74. }