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; }
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); } }
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); } }
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; }