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