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; }
ServiceRegistrationBase ServiceRegistry::RegisterService( BundlePrivate* bundle, const InterfaceMapConstPtr& service, const ServiceProperties& properties) { if (!service || service->empty()) { throw std::invalid_argument( "Can't register empty InterfaceMap as a service"); } // Check if we got a service factory bool isFactory = service->count("org.cppmicroservices.factory") > 0; bool isPrototypeFactory = (isFactory ? static_cast<bool>(std::dynamic_pointer_cast<PrototypeServiceFactory>( std::static_pointer_cast<ServiceFactory>( service->find("org.cppmicroservices.factory")->second))) : false); std::vector<std::string> classes; // Check if service implements claimed classes and that they exist. for (auto i : *service) { if (i.first.empty() || (!isFactory && i.second == nullptr)) { throw std::invalid_argument("Can't register as null class"); } classes.push_back(i.first); } ServiceRegistrationBase res( bundle, service, CreateServiceProperties( properties, classes, isFactory, isPrototypeFactory)); { auto l = this->Lock(); US_UNUSED(l); services.insert(std::make_pair(res, classes)); serviceRegistrations.push_back(res); for (auto& clazz : classes) { std::vector<ServiceRegistrationBase>& s = classServices[clazz]; std::vector<ServiceRegistrationBase>::iterator ip = std::lower_bound(s.begin(), s.end(), res); s.insert(ip, res); } } ServiceReferenceBase r = res.GetReference(std::string()); ServiceListeners::ServiceListenerEntries listeners; ServiceEvent registeredEvent(ServiceEvent::SERVICE_REGISTERED, r); bundle->coreCtx->listeners.GetMatchingServiceListeners(registeredEvent, listeners); bundle->coreCtx->listeners.ServiceChanged(listeners, registeredEvent); return res; }