[Libvirt-cim] [PATCH] [RFC] Enhance handling of association's references

Heidi Eckhart heidieck at linux.vnet.ibm.com
Fri Nov 23 11:04:15 UTC 2007


# HG changeset patch
# User Heidi Eckhart <heidieck at linux.vnet.ibm.com>
# Date 1195819371 -3600
# Node ID db20c6206fb6decb484035bec81d7c7f2be75eae
# Parent  bf54de6af2e210bef57d74cf12e4872f6ba2da4f
[RFC] Enhance handling of association's references

The source and target classnames of std_assoc are now lists,
containing all supported classnames. This approach frees
the provider from  listing all possible combinations as
instances of std_assoc.

Signed-off-by: Heidi Eckhart <heidieck at linux.vnet.ibm.com>

diff -r bf54de6af2e2 -r db20c6206fb6 std_association.c
--- a/std_association.c	Tue Nov 20 16:24:27 2007 -0800
+++ b/std_association.c	Fri Nov 23 13:02:51 2007 +0100
@@ -61,18 +61,24 @@ static bool match_class(const CMPIBroker
 static bool match_class(const CMPIBroker *broker,
                         const char *ns,
                         const char *test_class,
-                        const char *comp_class)
+                        char **comp_class_list)
 {
         CMPIObjectPath *rop;
+        char *comp_class;
+        int i;
 
         rop = CMNewObjectPath(broker, ns, test_class, NULL);
 
-        if ((test_class == NULL) ||
-            (comp_class == NULL) ||
-            match_op(broker, rop, comp_class))
-                return true;
-        else
-                return false;
+        for (i = 0; comp_class_list[i]; i++) {
+                comp_class = comp_class_list[i];
+
+                if ((test_class == NULL) ||
+                    (comp_class == NULL) ||
+                    match_op(broker, rop, comp_class))
+                        return true;
+        }
+
+        return false;
 }
 
 static CMPIStatus filter_results(struct inst_list *list,
@@ -113,15 +119,30 @@ std_assoc_get_handler(const struct std_a
 std_assoc_get_handler(const struct std_assoc_ctx *ctx,
                       const CMPIObjectPath *ref)
 {
-        struct std_assoc *ptr;
-        int i;
+        struct std_assoc *hdl = NULL;
+        char *source_class;
+        int i, j;
 
         for (i = 0; ctx->handlers[i]; i++) {
-                ptr = ctx->handlers[i];
-
-                if (CMClassPathIsA(ctx->brkr, ref, ptr->source_class, NULL))
-                        return ptr;
-        }
+                hdl = ctx->handlers[i];
+
+                for (j = 0; hdl->source_class[j]; j++) {
+                        source_class = hdl->source_class[j];
+
+                        if (CMClassPathIsA(ctx->brkr, 
+                                           ref, 
+                                           source_class, 
+                                           NULL))
+                                break;
+
+                        source_class = NULL;
+                }
+                if (source_class)
+                        break;
+        }
+
+        if (hdl)
+                return hdl;
 
         return NULL;
 }
@@ -144,9 +165,6 @@ static CMPIStatus do_assoc(struct std_as
         handler = std_assoc_get_handler(ctx, ref);
         if (handler == NULL) {
                 CU_DEBUG("No handler found.");
-                cu_statusf(ctx->brkr, &s,
-                           CMPI_RC_ERR_FAILED,
-                           "Unable to handle this association");
                 goto out;
         }
 
@@ -243,9 +261,7 @@ static CMPIStatus do_ref(struct std_asso
 
         handler = std_assoc_get_handler(ctx, ref);
         if (handler == NULL) {
-                cu_statusf(ctx->brkr, &s,
-                           CMPI_RC_ERR_FAILED,
-                           "Unable to handle this association");
+                CU_DEBUG("No handler found.");
                 goto out;
         }
 
diff -r bf54de6af2e2 -r db20c6206fb6 std_association.h
--- a/std_association.h	Tue Nov 20 16:24:27 2007 -0800
+++ b/std_association.h	Fri Nov 23 13:02:51 2007 +0100
@@ -37,13 +37,13 @@ typedef CMPIInstance *(*make_ref_t)(cons
                                     struct std_assoc *);
 
 struct std_assoc {
-        char *source_class;
+        char **source_class;
         char *source_prop;
 
-        char *target_class;
+        char **target_class;
         char *target_prop;
     
-        char *assoc_class;
+        char **assoc_class;
 
         assoc_handler_t handler;
         make_ref_t make_ref;




More information about the Libvirt-cim mailing list