Пример #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;
}
Пример #2
0
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;
}