diff -r 6fbed849b4f4 -r 1f895d8a5b2b qtmobility/src/contacts/qcontactmanager_p.cpp --- a/qtmobility/src/contacts/qcontactmanager_p.cpp Wed Jun 23 19:08:38 2010 +0300 +++ b/qtmobility/src/contacts/qcontactmanager_p.cpp Tue Jul 06 15:12:50 2010 +0300 @@ -46,6 +46,10 @@ #include "qcontact_p.h" +#include "qcontactaction.h" +#include "qcontactactiondescriptor.h" +#include "qcontactactionfactory.h" + #include #include #include @@ -67,7 +71,12 @@ QTM_BEGIN_NAMESPACE /* Shared QContactManager stuff here, default engine stuff below */ +QList QContactManagerData::m_actionfactories; // list of all factories +QList QContactManagerData::m_descriptors; QHash QContactManagerData::m_engines; +QContactManagerData::DescriptorHash QContactManagerData::m_descriptormap; +QHash QContactManagerData::m_vendormap; +QHash QContactManagerData::m_actionmap; bool QContactManagerData::m_discovered; bool QContactManagerData::m_discoveredStatic; @@ -77,10 +86,20 @@ { QContactManagerData::m_discovered = false; QList factories = QContactManagerData::m_engines.values(); + QList actionfactories = QContactManagerData::m_actionfactories; + for (int i=0; i < factories.count(); i++) { delete factories.at(i); } + for(int i=0; i < actionfactories.count(); i++) { + delete actionfactories.at(i); + } QContactManagerData::m_engines.clear(); + QContactManagerData::m_actionfactories.clear(); + QContactManagerData::m_descriptors.clear(); + QContactManagerData::m_descriptormap.clear(); + QContactManagerData::m_actionmap.clear(); + QContactManagerData::m_vendormap.clear(); } @@ -170,6 +189,7 @@ QObjectList staticPlugins = QPluginLoader::staticInstances(); for (int i=0; i < staticPlugins.count(); i++ ){ QContactManagerEngineFactory *f = qobject_cast(staticPlugins.at(i)); + QContactActionFactory *g = qobject_cast(staticPlugins.at(i)); if (f) { QString name = f->managerName(); #if !defined QT_NO_DEBUG @@ -187,6 +207,29 @@ qWarning() << "Static contacts plugin with reserved name" << name << "ignored"; } } + + if (g) { + QString name = g->name(); +#if !defined QT_NO_DEBUG + if (showDebug) + qDebug() << "Static: found an action factory" << g << "with name" << name; +#endif + if (m_actionfactories.contains(g)) { + qWarning() << "Static contacts plugin" << name << "has the same name as currently loaded plugin; ignored"; + } else { + m_actionfactories.append(g); + + QList actions = g->actionDescriptors(); + QMap::iterator it; + for (int j = 0; j < actions.size(); j++) { + QContactActionDescriptor desc = actions.at(j); + m_descriptormap.insert(desc, g); + m_descriptors.append(desc); + m_actionmap.insertMulti(desc.actionName(), m_descriptors.count() - 1); + m_vendormap.insertMulti(desc.vendorName(), m_descriptors.count() - 1); + } + } + } } } } @@ -213,6 +256,8 @@ for (int i=0; i < m_pluginPaths.count(); i++) { QPluginLoader qpl(m_pluginPaths.at(i)); QContactManagerEngineFactory *f = qobject_cast(qpl.instance()); + QContactActionFactory *g = qobject_cast(qpl.instance()); + if (f) { QString name = f->managerName(); #if !defined QT_NO_DEBUG @@ -231,9 +276,33 @@ } } + if (g) { + QString name = g->name(); +#if !defined QT_NO_DEBUG + if (showDebug) + qDebug() << "Dynamic: found a contact action factory" << g << "with name" << name; +#endif + // we also need to ensure that we haven't already loaded this factory. + if (m_actionfactories.contains(g)) { + qWarning() << "Contacts plugin" << plugins.at(i) << "has the same name as currently loaded plugin" << name << "; ignored"; + } else { + m_actionfactories.append(g); + + QList actions = g->actionDescriptors(); + QMap::iterator it; + for (int j = 0; j < actions.size(); j++) { + const QContactActionDescriptor& desc = actions.at(j); + m_descriptormap.insert(desc, g); + m_descriptors.append(desc); + m_actionmap.insertMulti(desc.actionName(), m_descriptors.count() - 1); + m_vendormap.insertMulti(desc.vendorName(), m_descriptors.count() - 1); + } + } + } + /* Debugging */ #if !defined QT_NO_DEBUG - if (showDebug && !f) { + if (showDebug && !f && !g) { qDebug() << "Unknown plugin:" << qpl.errorString(); if (qpl.instance()) { qDebug() << "[qobject:" << qpl.instance() << "]"; @@ -253,11 +322,65 @@ #if !defined QT_NO_DEBUG if (showDebug) { qDebug() << "Found engines:" << engineNames; + qDebug() << "Found actions:" << m_actionmap.keys(); } #endif } } +QList QContactManagerData::actionDescriptors(const QString& actionName, const QString& vendorName, int implementationVersion) +{ + loadFactories(); + + bool restrict = false; + QSet subset; + QList descriptors; + + // Go through our list of descriptors, looking for a match + if (!actionName.isEmpty()) { + subset = m_actionmap.values(actionName).toSet(); + restrict = true; + } + + if (!vendorName.isEmpty()) { + if (restrict) + subset &= m_vendormap.values(vendorName).toSet(); + else + subset = m_vendormap.values(vendorName).toSet(); + restrict = true; + + /* We still have to check versions, since we don't hash that */ + if (implementationVersion != -1) { + QMutableSetIterator it(subset); + while(it.hasNext()) { + if (m_descriptors.at(it.next()).implementationVersion() != implementationVersion) + it.remove(); + } + } + } + + if (restrict) { + QSetIterator it(subset); + while(it.hasNext()) { + descriptors << m_descriptors.at(it.next()); + } + } else { + /* No restrictions, just iterate over all descriptors and return all actions (!) */ + descriptors = m_descriptors; + } + + return descriptors; +} + +QContactAction* QContactManagerData::action(const QContactActionDescriptor& actionDescriptor) +{ + loadFactories(); + QContactActionFactory* actionFactory = m_descriptormap.value(actionDescriptor, 0); + if (actionFactory) + return actionFactory->instance(actionDescriptor); + return 0; +} + // trampoline for private classes QContactManagerEngine* QContactManagerData::engine(const QContactManager* manager) {