Browse Source

Fixed wrong service look up in case of certain filter expressions.

Sascha Zelzer 14 years ago
parent
commit
02b7ff144e

+ 32 - 16
Libs/PluginFramework/ctkLDAPExpr.cpp

@@ -179,43 +179,59 @@ ctkLDAPExpr::~ctkLDAPExpr()
 }
 
 //----------------------------------------------------------------------------
-QSet<QString> ctkLDAPExpr::getMatchedObjectClasses() const
+bool ctkLDAPExpr::getMatchedObjectClasses(QSet<QString>& objClasses) const
 {
-  QSet<QString> objClasses;
-  if (d->m_operator == EQ) 
+  if (d->m_operator == EQ)
   {
     if (d->m_attrName.compare(ctkPluginConstants::OBJECTCLASS, Qt::CaseInsensitive) &&
       d->m_attrValue.indexOf(WILDCARD) < 0) 
     {
       objClasses.insert( d->m_attrValue );
+      return true;
     }
+    return false;
   }
   else if (d->m_operator == AND) 
   {
-    for (int i = 0; i < d->m_args.size( ); i++) {
-      QSet<QString> r = d->m_args[i].getMatchedObjectClasses();
-      if ( !r.empty() ) {
-        if (objClasses.empty()) {
+    bool result = false;
+    for (int i = 0; i < d->m_args.size( ); i++)
+    {
+      QSet<QString> r;
+      if(d->m_args[i].getMatchedObjectClasses(r))
+      {
+        result = true;
+        if (objClasses.empty())
+        {
           objClasses = r;
-        } else {
+        }
+        else
+        {
           // if AND op and classes in several operands,
           // then only the intersection is possible.
-          objClasses = r;
+          objClasses.intersect(r);
         }
       }
     }
-  } else if (d->m_operator == OR) {
-    for (int i = 0; i < d->m_args.length( ); i++) {
-      QSet<QString> r = d->m_args[i].getMatchedObjectClasses();
-      if ( !r.empty() ) {
+    return result;
+  }
+  else if (d->m_operator == OR)
+  {
+    for (int i = 0; i < d->m_args.length( ); i++)
+    {
+      QSet<QString> r;
+      if (d->m_args[i].getMatchedObjectClasses(r))
+      {
         objClasses += r;
-      } else {
+      }
+      else
+      {
         objClasses.clear();
-        break;
+        return false;
       }
     }
+    return true;
   }
-  return objClasses;
+  return false;
 }
 
 //----------------------------------------------------------------------------

+ 5 - 3
Libs/PluginFramework/ctkLDAPExpr_p.h

@@ -78,11 +78,13 @@ public:
 
   /**
    * Get object class set matched by this LDAP expression. This will not work
-   * with wildcards and NOT expressions. If a set can not be determined return null.
+   * with wildcards and NOT expressions. If a set can not be determined return <code>fasle</code>.
    *
-   * @return A set of classes matched, otherwise an empty set.
+   * \param objClasses The set of matched classes will be added to objClasses.
+   * \return If the set cannot be determined, <code>false</code> is returned,
+   *         <code>true</code> otherwise.
    */
-  QSet<QString> getMatchedObjectClasses() const;
+  bool getMatchedObjectClasses(QSet<QString>& objClasses) const;
 
   /**
    * Checks if this LDAP expression is "simple". The definition of

+ 2 - 2
Libs/PluginFramework/ctkServices.cpp

@@ -196,8 +196,8 @@ QList<ctkServiceReference> ctkServices::get(const QString& clazz, const QString&
     if (!filter.isEmpty())
     {
       ldap = ctkLDAPExpr(filter);
-      QSet<QString> matched = ldap.getMatchedObjectClasses();
-      if (!matched.isEmpty())
+      QSet<QString> matched;
+      if (ldap.getMatchedObjectClasses(matched))
       {
         v.clear();
         foreach (QString className, matched)