Exemple #1
0
void ServiceRegistry::Get_unlocked(const std::string& clazz, const std::string& filter,
                          ModulePrivate* /*module*/, std::list<ServiceReference>& res) const
{
  std::list<ServiceRegistration>::const_iterator s;
  std::list<ServiceRegistration>::const_iterator send;
  std::list<ServiceRegistration> v;
  LDAPExpr ldap;
  if (clazz.empty())
  {
    if (!filter.empty())
    {
      ldap = LDAPExpr(filter);
      LDAPExpr::ObjectClassSet matched;
      if (ldap.GetMatchedObjectClasses(matched))
      {
        v.clear();
        for(LDAPExpr::ObjectClassSet::const_iterator className = matched.begin();
            className != matched.end(); ++className)
        {
          MapClassServices::const_iterator i = classServices.find(*className);
          if (i != classServices.end())
          {
            std::copy(i->second.begin(), i->second.end(), std::back_inserter(v));
          }
        }
        if (!v.empty())
        {
          s = v.begin();
          send = v.end();
        }
        else
        {
          return;
        }
      }
      else
      {
        s = serviceRegistrations.begin();
        send = serviceRegistrations.end();
      }
    }
    else
    {
      s = serviceRegistrations.begin();
      send = serviceRegistrations.end();
    }
  }
  else
  {
    MapClassServices::const_iterator it = classServices.find(clazz);
    if (it != classServices.end())
    {
      s = it->second.begin();
      send = it->second.end();
    }
    else
    {
      return;
    }
    if (!filter.empty())
    {
      ldap = LDAPExpr(filter);
    }
  }

  for (; s != send; ++s)
  {
    ServiceReference sri = s->GetReference();

    if (filter.empty() || ldap.Evaluate(s->d->properties, false))
    {
      res.push_back(sri);
    }
  }
}
Exemple #2
0
void ServiceRegistry::Get_unlocked(const std::string& clazz,
                                   const std::string& filter,
                                   BundlePrivate* bundle,
                                   std::vector<ServiceReferenceBase>& res) const
{
  std::vector<ServiceRegistrationBase>::const_iterator s;
  std::vector<ServiceRegistrationBase>::const_iterator send;
  std::vector<ServiceRegistrationBase> v;
  LDAPExpr ldap;
  if (clazz.empty()) {
    if (!filter.empty()) {
      ldap = LDAPExpr(filter);
      LDAPExpr::ObjectClassSet matched;
      if (ldap.GetMatchedObjectClasses(matched)) {
        v.clear();
        for (auto& className : matched) {
          auto i = classServices.find(className);
          if (i != classServices.end()) {
            std::copy(
              i->second.begin(), i->second.end(), std::back_inserter(v));
          }
        }
        if (!v.empty()) {
          s = v.begin();
          send = v.end();
        } else {
          return;
        }
      } else {
        s = serviceRegistrations.begin();
        send = serviceRegistrations.end();
      }
    } else {
      s = serviceRegistrations.begin();
      send = serviceRegistrations.end();
    }
  } else {
    MapClassServices::const_iterator it = classServices.find(clazz);
    if (it != classServices.end()) {
      s = it->second.begin();
      send = it->second.end();
    } else {
      return;
    }
    if (!filter.empty()) {
      ldap = LDAPExpr(filter);
    }
  }

  for (; s != send; ++s) {
    ServiceReferenceBase sri = s->GetReference(clazz);

    if (filter.empty() ||
        ldap.Evaluate(PropertiesHandle(s->d->properties, true), false)) {
      res.push_back(sri);
    }
  }

  if (!res.empty()) {
    if (bundle != nullptr) {
      auto ctx = bundle->bundleContext.Load();
      core->serviceHooks.FilterServiceReferences(ctx.get(), clazz, filter, res);
    } else {
      core->serviceHooks.FilterServiceReferences(nullptr, clazz, filter, res);
    }
  }
}