bool Plugin::load() { if(DynamicLibrary::load()) if (loadMetadata()) { return loadFactories(); } return false; }
QList<Extension *> PluginManager::extensions(QObject *parent) { loadFactories(); if(d->extensionsLoaded) return d->extensions; foreach(PluginFactory *factory, factories(Plugin::ExtensionType)) { Extension *extension = static_cast<Extension *>(factory->createInstance(parent)); d->extensions.append(extension); }
void QOrganizerManagerData::createEngine(const QString& managerName, const QMap<QString, QString>& parameters) { m_engine = 0; QString builtManagerName = managerName.isEmpty() ? QOrganizerManager::availableManagers().value(0) : managerName; if (builtManagerName == QLatin1String("memory")) { m_engine = new QOrganizerManagerEngineV2Wrapper( QOrganizerItemMemoryEngine::createMemoryEngine(parameters)); } else { int implementationVersion = parameterValue(parameters, QTORGANIZER_IMPLEMENTATION_VERSION_NAME, -1); bool found = false; bool loadedDynamic = false; /* First check static factories */ loadStaticFactories(); /* See if we got a fast hit */ QList<QOrganizerManagerEngineFactory*> factories = m_engines.values(builtManagerName); m_lastError = QOrganizerManager::NoError; while(!found) { foreach (QOrganizerManagerEngineFactory* f, factories) { QList<int> versions = f->supportedImplementationVersions(); if (implementationVersion == -1 ||//no given implementation version required versions.isEmpty() || //the manager engine factory does not report any version versions.contains(implementationVersion)) { QOrganizerManagerEngine* engine = f->engine(parameters, &m_lastError); // if it's a V2, use it m_engine = qobject_cast<QOrganizerManagerEngineV2*>(engine); if (!m_engine && engine) { // Nope, v1, so wrap it m_engine = new QOrganizerManagerEngineV2Wrapper(engine); } found = true; break; } } // Break if found or if this is the second time through if (loadedDynamic || found) break; // otherwise load dynamic factories and reloop loadFactories(); factories = m_engines.values(builtManagerName); loadedDynamic = true; } // XXX remove this // the engine factory could lie to us, so check the real implementation version if (m_engine && (implementationVersion != -1 && m_engine->managerVersion() != implementationVersion)) { m_lastError = QOrganizerManager::VersionMismatchError; m_engine = 0; } if (!m_engine) { if (m_lastError == QOrganizerManager::NoError) m_lastError = QOrganizerManager::DoesNotExistError; m_engine = new QOrganizerItemInvalidEngine(); } }