| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 | 
							- /*=============================================================================
 
-   Library: CTK
 
-   Copyright (c) German Cancer Research Center,
 
-     Division of Medical and Biological Informatics
 
-   Licensed under the Apache License, Version 2.0 (the "License");
 
-   you may not use this file except in compliance with the License.
 
-   You may obtain a copy of the License at
 
-     http://www.apache.org/licenses/LICENSE-2.0
 
-   Unless required by applicable law or agreed to in writing, software
 
-   distributed under the License is distributed on an "AS IS" BASIS,
 
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
-   See the License for the specific language governing permissions and
 
-   limitations under the License.
 
- =============================================================================*/
 
- #include "ctkMTProviderTracker_p.h"
 
- #include "ctkMTMsg_p.h"
 
- #include <service/cm/ctkManagedService.h>
 
- #include <service/cm/ctkManagedServiceFactory.h>
 
- #include <service/log/ctkLogService.h>
 
- #include <QCoreApplication>
 
- class ctkMTProviderTracker::MetaTypeProviderWrapper
 
- {
 
- public:
 
-   ctkMetaTypeProvider* provider;
 
-   QString pid;
 
-   bool factory;
 
-   MetaTypeProviderWrapper(ctkMetaTypeProvider* provider, const QString& pid, bool factory)
 
-     : provider(provider), pid(pid), factory(factory)
 
-   {
 
-   }
 
-   bool operator==(const MetaTypeProviderWrapper& o) const
 
-   {
 
-     if (this == &o)
 
-       return true;
 
-     return provider == o.provider && pid == o.pid && factory == o.factory;
 
-   }
 
- };
 
- uint qHash(const ctkMTProviderTracker::MetaTypeProviderWrapper wrapper)
 
- {
 
-   uint result = 17;
 
-   result = 31 * result + qHash(wrapper.provider);
 
-   result = 31 * result + qHash(wrapper.pid);
 
-   result = 31 * result + (wrapper.factory ? 1 : 0);
 
-   return result;
 
- }
 
- ctkMTProviderTracker::ctkMTProviderTracker(const QSharedPointer<ctkPlugin>& plugin, ctkLogService* log, ctkServiceTracker<>* tracker)
 
-   : _plugin(plugin), log(log), _tracker(tracker)
 
- {
 
- }
 
- QStringList ctkMTProviderTracker::getPids() const
 
- {
 
-   return getPids(false);
 
- }
 
- QStringList ctkMTProviderTracker::getFactoryPids() const
 
- {
 
-   return getPids(true);
 
- }
 
- QSharedPointer<ctkPlugin> ctkMTProviderTracker::getPlugin() const
 
- {
 
-   return _plugin;
 
- }
 
- ctkObjectClassDefinitionPtr ctkMTProviderTracker::getObjectClassDefinition(const QString& id, const QLocale& locale)
 
- {
 
-   if (_plugin->getState() != ctkPlugin::ACTIVE)
 
-   {
 
-     return ctkObjectClassDefinitionPtr(); // return none if not active
 
-   }
 
-   QSet<MetaTypeProviderWrapper> wrappers = getMetaTypeProviders();
 
-   QSet<MetaTypeProviderWrapper>::ConstIterator end = wrappers.end();
 
-   for (QSet<MetaTypeProviderWrapper>::ConstIterator it = wrappers.begin();
 
-        it != end; ++it)
 
-   {
 
-     if (id == (*it).pid)
 
-     {
 
-       // found a matching pid now call the actual provider
 
-       return (*it).provider->getObjectClassDefinition(id, locale);
 
-     }
 
-   }
 
-   return ctkObjectClassDefinitionPtr();
 
- }
 
- QList<QLocale> ctkMTProviderTracker::getLocales() const
 
- {
 
-   if (_plugin->getState() != ctkPlugin::ACTIVE)
 
-   {
 
-     return QList<QLocale>(); // return none if not active
 
-   }
 
-   QSet<MetaTypeProviderWrapper> wrappers = getMetaTypeProviders();
 
-   QList<QLocale> locales;
 
-   // collect all the unique locales from all providers we found
 
-   QSet<MetaTypeProviderWrapper>::ConstIterator end = wrappers.end();
 
-   for (QSet<MetaTypeProviderWrapper>::ConstIterator it = wrappers.begin();
 
-        it != end; ++it)
 
-   {
 
-     QList<QLocale> wrappedLocales = (*it).provider->getLocales();
 
-     if (wrappedLocales.isEmpty())
 
-       continue;
 
-     for (int j = 0; j < wrappedLocales.size(); j++)
 
-       if (!locales.contains(wrappedLocales[j]))
 
-         locales.push_back(wrappedLocales[j]);
 
-   }
 
-   return locales;
 
- }
 
- QStringList ctkMTProviderTracker::getPids(bool factory) const
 
- {
 
-   if (_plugin->getState() != ctkPlugin::ACTIVE)
 
-   {
 
-     return QStringList(); // return none if not active
 
-   }
 
-   QSet<MetaTypeProviderWrapper> wrappers = getMetaTypeProviders();
 
-   QStringList results;
 
-   QSet<MetaTypeProviderWrapper>::ConstIterator end = wrappers.end();
 
-   for (QSet<MetaTypeProviderWrapper>::ConstIterator it = wrappers.begin();
 
-        it != end; ++it)
 
-   {
 
-     // return only the correct type of pids (regular or factory)
 
-     if (factory == (*it).factory)
 
-       results.push_back((*it).pid);
 
-   }
 
-   return results;
 
- }
 
- QSet<ctkMTProviderTracker::MetaTypeProviderWrapper> ctkMTProviderTracker::getMetaTypeProviders() const
 
- {
 
-   QMap<ctkServiceReference, QObject*> services = _tracker->getTracked();
 
-   if (services.isEmpty())
 
-   {
 
-     return QSet<MetaTypeProviderWrapper>();
 
-   }
 
-   QList<ctkServiceReference> serviceReferences = services.keys();
 
-   QSet<MetaTypeProviderWrapper> result;
 
-   foreach (ctkServiceReference serviceReference, serviceReferences)
 
-   {
 
-     if (serviceReference.getPlugin() == _plugin)
 
-     {
 
-       QObject* service = services.value(serviceReference);
 
-       // If the service is not a ctkMetaTypeProvider, we're not interested in it.
 
-       if (ctkMetaTypeProvider* metatypeService = qobject_cast<ctkMetaTypeProvider*>(service))
 
-       {
 
-         // Include the METATYPE_PID, if present, to return as part of getPids(). Also, include the
 
-         // METATYPE_FACTORY_PID, if present, to return as part of getFactoryPids().
 
-         // The filter ensures at least one of these properties was set for a standalone ctkMetaTypeProvider.
 
-         addMetaTypeProviderWrappers(ctkMetaTypeProvider::METATYPE_PID, serviceReference, metatypeService, false, result);
 
-         addMetaTypeProviderWrappers(ctkMetaTypeProvider::METATYPE_FACTORY_PID, serviceReference, metatypeService, true, result);
 
-         // If the service is a ctkManagedService, include the SERVICE_PID to return as part of getPids().
 
-         // The filter ensures the SERVICE_PID property was set.
 
-         if (qobject_cast<ctkManagedService*>(service))
 
-         {
 
-           addMetaTypeProviderWrappers(ctkPluginConstants::SERVICE_PID, serviceReference, metatypeService, false, result);
 
-         }
 
-         // If the service is a ctkManagedServiceFactory, include the SERVICE_PID to return as part of getFactoryPids().
 
-         // The filter ensures the SERVICE_PID property was set.
 
-         else if (qobject_cast<ctkManagedServiceFactory*>(service))
 
-         {
 
-           addMetaTypeProviderWrappers(ctkPluginConstants::SERVICE_PID, serviceReference, metatypeService, true, result);
 
-         }
 
-       }
 
-     }
 
-   }
 
-   return result;
 
- }
 
- void ctkMTProviderTracker::addMetaTypeProviderWrappers(const QString& servicePropertyName,
 
-                                                        const ctkServiceReference& serviceReference,
 
-                                                        ctkMetaTypeProvider* service, bool factory,
 
-                                                        QSet<MetaTypeProviderWrapper>& wrappers) const
 
- {
 
-   QStringList pids = getStringProperty(servicePropertyName, serviceReference.getProperty(servicePropertyName));
 
-   foreach (QString pid, pids)
 
-   {
 
-     wrappers.insert(MetaTypeProviderWrapper(service, pid, factory));
 
-   }
 
- }
 
- QStringList ctkMTProviderTracker::getStringProperty(const QString& name, const QVariant& value) const
 
- {
 
-   // Don't log a warning if the value is null. The filter guarantees at least one of the necessary properties
 
-   // is there. If others are not, this method will get called with value equal to null.
 
-   if (value.isNull())
 
-     return QStringList();
 
-   if (value.canConvert<QStringList>())
 
-   {
 
-     return value.toStringList();
 
-   }
 
-   CTK_WARN(log) << QCoreApplication::translate(ctkMTMsg::CONTEXT, ctkMTMsg::INVALID_PID_METATYPE_PROVIDER_IGNORED)
 
-                    .arg(_plugin->getSymbolicName()).arg(_plugin->getPluginId()).arg(name). arg(value.toString());
 
-   return QStringList();
 
- }
 
 
  |