# HG changeset patch
# User Heidi Eckhart <heidieck(a)linux.vnet.ibm.com>
# Date 1196160333 -3600
# Node ID 16ac621eb3b34d11caca00100901d27bede7a7c7
# 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(a)linux.vnet.ibm.com>
diff -r bf54de6af2e2 -r 16ac621eb3b3 std_association.c
--- a/std_association.c Tue Nov 20 16:24:27 2007 -0800
+++ b/std_association.c Tue Nov 27 11:45:33 2007 +0100
@@ -61,18 +61,44 @@ 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 bool match_source_class(const CMPIBroker *broker,
+ const CMPIObjectPath *ref,
+ struct std_assoc *ptr)
+{
+ int i;
+ char *source_class;
+
+ for (i = 0; ptr->source_class[i]; i++) {
+ source_class = ptr->source_class[i];
+
+ if (CMClassPathIsA(broker,
+ ref,
+ source_class,
+ NULL))
+ return true;
+ }
+
+ return false;
}
static CMPIStatus filter_results(struct inst_list *list,
@@ -113,13 +139,13 @@ 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;
+ struct std_assoc *ptr = NULL;
int i;
for (i = 0; ctx->handlers[i]; i++) {
ptr = ctx->handlers[i];
- if (CMClassPathIsA(ctx->brkr, ref, ptr->source_class, NULL))
+ if (match_source_class(ctx->brkr, ref, ptr))
return ptr;
}
@@ -144,9 +170,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 +266,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 16ac621eb3b3 std_association.h
--- a/std_association.h Tue Nov 20 16:24:27 2007 -0800
+++ b/std_association.h Tue Nov 27 11:45:33 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;
Show replies by date
HE> # HG changeset patch
HE> # User Heidi Eckhart <heidieck(a)linux.vnet.ibm.com>
HE> # Date 1196160333 -3600
HE> # Node ID 16ac621eb3b34d11caca00100901d27bede7a7c7
HE> # Parent bf54de6af2e210bef57d74cf12e4872f6ba2da4f
HE> [RFC] Enhance handling of association's references
Thanks for making those changes. I think this is okay now. I'd like
to hold off committing it until we have a patch set against
libvirt-cim to use the new API.
Thanks!
--
Dan Smith
IBM Linux Technology Center
Open Hypervisor Team
email: danms(a)us.ibm.com