Example #1
0
ServiceRegistration ServiceRegistry::RegisterService(ModulePrivate* module,
                                                     const std::list<std::string>& classes,
                                                     itk::LightObject* service,
                                                     const ServiceProperties& properties)
{
  if (service == 0)
  {
    throw std::invalid_argument("Can't register 0 as a service");
  }

  // Check if service implements claimed classes and that they exist.
  for (std::list<std::string>::const_iterator i = classes.begin();
       i != classes.end(); ++i)
  {
    if (i->empty())
    {
      throw std::invalid_argument("Can't register as null class");
    }

    if (!(dynamic_cast<ServiceFactory*>(service)))
    {
      if (!CheckServiceClass(service, *i))
      {
        std::string msg;
        std::stringstream ss(msg);
        ss << "Service class " << service->GetNameOfClass() << " is not an instance of "
               << (*i) << ". Maybe you forgot to export the RTTI information for the interface.";
        throw std::invalid_argument(msg);
      }
    }
  }

  ServiceRegistration res(module, service,
                          CreateServiceProperties(properties, classes));
  {
    MutexLocker lock(mutex);
    services.insert(std::make_pair(res, classes));
    serviceRegistrations.push_back(res);
    for (std::list<std::string>::const_iterator i = classes.begin();
         i != classes.end(); ++i)
    {
      std::list<ServiceRegistration>& s = classServices[*i];
      std::list<ServiceRegistration>::iterator ip =
          std::lower_bound(s.begin(), s.end(), res, ServiceRegistrationComparator());
      s.insert(ip, res);
    }
  }

  ServiceReference r = res.GetReference();
  ServiceListeners::ServiceListenerEntries listeners;
  module->coreCtx->listeners.GetMatchingServiceListeners(r, listeners);
  module->coreCtx->listeners.ServiceChanged(listeners,
                                            ServiceEvent(ServiceEvent::REGISTERED, r));
  return res;
}
Example #2
0
void ctkServices::updateServiceRegistrationOrder(const ctkServiceRegistration& sr,
                                              const QStringList& classes)
{
  QMutexLocker lock(&mutex);
  for (QStringListIterator i(classes); i.hasNext(); )
  {
    QList<ctkServiceRegistration>& s = classServices[i.next()];
    s.removeAll(sr);
    s.insert(std::lower_bound(s.begin(), s.end(), sr, ServiceRegistrationComparator()), sr);
  }
}
Example #3
0
void ServiceRegistry::UpdateServiceRegistrationOrder(const ServiceRegistration& sr,
                                                     const std::list<std::string>& classes)
{
  MutexLocker lock(mutex);
  for (std::list<std::string>::const_iterator i = classes.begin();
       i != classes.end(); ++i)
  {
    std::list<ServiceRegistration>& s = classServices[*i];
    std::remove(s.begin(), s.end(), sr);
    s.insert(std::lower_bound(s.begin(), s.end(), sr, ServiceRegistrationComparator()), sr);
  }
}
Example #4
0
ctkServiceRegistration ctkServices::registerService(ctkPluginPrivate* plugin,
                             const QStringList& classes,
                             QObject* service,
                             const ctkDictionary& properties)
{
  if (service == 0)
  {
    throw std::invalid_argument("Can't register 0 as a service");
  }

  // Check if service implements claimed classes and that they exist.
  for (QStringListIterator i(classes); i.hasNext();)
  {
    QString cls = i.next();
    if (cls.isEmpty())
    {
      throw std::invalid_argument("Can't register as null class");
    }

    if (!(qobject_cast<ctkServiceFactory*>(service)))
    {
      if (!checkServiceClass(service, cls))
      {
        QString msg = QString("Service class %1 is not an instance of %2. Maybe you forgot the Q_INTERFACES macro in the service class.")
            .arg(service->metaObject()->className()).arg(cls);
        throw std::invalid_argument(msg.toStdString());
      }
    }
  }

  ctkServiceRegistration res(plugin, service,
                             createServiceProperties(properties, classes));
  {
    QMutexLocker lock(&mutex);
    services.insert(res, classes);
    for (QStringListIterator i(classes); i.hasNext(); )
    {
      QString currClass = i.next();
      QList<ctkServiceRegistration>& s = classServices[currClass];
      QList<ctkServiceRegistration>::iterator ip =
          std::lower_bound(s.begin(), s.end(), res, ServiceRegistrationComparator());
      s.insert(ip, res);
    }
  }

  ctkServiceReference r = res.getReference();
  plugin->fwCtx->listeners.serviceChanged(
      plugin->fwCtx->listeners.getMatchingServiceSlots(r),
      ctkServiceEvent(ctkServiceEvent::REGISTERED, r));
  return res;
}