[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-cim] [RFC] Rework of association providers



Attached is a patch (applies cleanly to tip) for the association abstraction work we have been discussing. Only 2 associations (Xen_CSElementSettingData and Xen_ProcessorPoolComponent) have been ported to the new common code in cmpiutil. I would like everyone to agree to this new approach before porting the remaining association providers.

The only issue I have with the patch at this point is whether to place the common code (_CMPIGetTargetEndpoints and its related structures) in cmpiutil or in a new file. As you can see, it currently resides in cmpiutil.[ch].

If there are no objections I will port the remaining association providers and commit to the repository within a few days.

Thanks,
Jim
diff -r 7c937c187b5e configure.ac
--- a/configure.ac      Fri Oct 20 13:20:15 2006 -0600
+++ b/configure.ac      Tue Oct 17 14:27:15 2006 -0600
@@ -167,8 +167,8 @@ AC_CONFIG_HEADER([config.h])
 
 # Autogenerate the Makefiles
 AC_CONFIG_FILES([Makefile
-                src/Makefile])
-
+                src/Makefile
+                src/provider_common.h])
 AM_INIT_AUTOMAKE
 
 # Check for the required C compiler
diff -r 7c937c187b5e src/Xen_CSElementSettingData.c
--- a/src/Xen_CSElementSettingData.c    Fri Oct 20 13:20:15 2006 -0600
+++ b/src/Xen_CSElementSettingData.c    Tue Oct 17 14:27:33 2006 -0600
@@ -15,8 +15,8 @@
 //    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  
USA
 // ============================================================================
 // Authors:       Dr. Gareth S. Bestor, <bestor@xxxxxxxxxx>
-// Contributors:
-// Description:
+// Contributors:  Jim Fehlig, <jfehlig@xxxxxxxxxx>
+// Description:   Association provider for Xen_CSElementSettingData.
 // ============================================================================
 
 #include <string.h>
@@ -40,6 +40,9 @@ static CMPIBroker *_BROKER;
 /* Include _SBLIM_TRACE() logging support */
 #include "cmpitrace.h"
 
+/* Include common provider definitions */
+#include "provider_common.h"
+
 
 // ============================================================================
 // CMPI ASSOCIATION PROVIDER FUNCTION TABLE
@@ -48,15 +51,61 @@ static CMPIBroker *_BROKER;
 // ----------------------------------------------------------------------------
 // Info for the class supported by the association provider
 // ----------------------------------------------------------------------------
-                                                                               
                                                  
-/* Name of the left and right hand side classes of this association. */
+
+/* Name of the left and right hand side classes, properties, namespaces, and
+ * key names of this association. */
 static char * _ASSOCCLASS = "Xen_CSElementSettingData";
 static char * _LHSCLASSNAME = "Xen_ComputerSystemSettingData";
 static char * _RHSCLASSNAME = "Xen_ComputerSystem";
 static char * _LHSPROPERTYNAME = "SettingData"; 
 static char * _RHSPROPERTYNAME = "ManagedElement";
+static char * _LHSNAMESPACE = XEN_INSTRUMENTATION_NS;
+static char * _RHSNAMESPACE = XEN_INSTRUMENTATION_NS;
 static char * _LHSKEYNAME = "InstanceID";
 static char * _RHSKEYNAME = "Name";
+
+
+/*
+ * Determine if object path op is a match as defined by the request
+ * parameters incapsulated in assocInfo and assocFilter.
+ */
+static int assocMatch(_CMPIAssocIdentity *assocInfo,
+                      CMPIObjectPath *op,
+                      _CMPIAssocFilter *assocFilter)
+{
+   char *sourceClass = CMGetCharPtr(CMGetClassName(assocInfo->knownEndpoint, 
NULL));
+   char *targetClass = CMGetCharPtr(CMGetClassName(op, NULL));
+   char *sourceKeyName;
+   char *targetKeyName;
+   char *sourceName;
+
+   if (CMClassPathIsA(_BROKER, assocInfo->knownEndpoint, _LHSCLASSNAME, NULL)) 
{
+      sourceKeyName = _LHSKEYNAME;
+      targetKeyName = _RHSKEYNAME;
+   }
+   else {
+      sourceKeyName = _RHSKEYNAME;
+      targetKeyName = _LHSKEYNAME;
+   }
+
+   CMPIData nameData = CMGetKey(assocInfo->knownEndpoint, sourceKeyName, NULL);
+   sourceName = CMGetCharPtr(nameData.value.string);
+   
+   _SBLIM_TRACE(2, ("--- sourcename=\"%s\"", sourceName));
+
+   /* Ignore possible instances of source class. */
+   if (strcmp(targetClass, sourceClass) &&
+       (assocFilter->resultClass == NULL || CMClassPathIsA(_BROKER, op, 
assocFilter->resultClass, NULL))) {
+      /* Only return entries whose name matches the reference. */
+      nameData = CMGetKey(op, targetKeyName, NULL);
+      char *resultName = CMGetCharPtr(nameData.value.string);
+      if (strcmp(sourceName, resultName) == 0)
+         return 1;
+   }
+   
+   return 0;
+}
+
 
 // ----------------------------------------------------------------------------
 // AssociationCleanup()
@@ -93,12 +142,9 @@ static CMPIStatus AssociatorNames(
                const char * resultRole)
 {
    CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
-   char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
-   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
-   char *targetclass;                          /* Class of the target 
object(s). */
-
-   char *sourcekeyname;
-   char *targetkeyname;
+   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
+   _CMPIAssocIdentity assocInfo;
+   _CMPIAssocFilter assocFilter;
 
    _SBLIM_ENTER("AssociatorNames");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
@@ -108,69 +154,24 @@ static CMPIStatus AssociatorNames(
    _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
    _SBLIM_TRACE(2, ("--- resultRole=\"%s\"", resultRole));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
-   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
-
-   /* Check that the requested association class, if any, is supported. */
-   if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
-      if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
-         _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
-         goto exit;
-      }
-   }
-
-   /* Check that the reference matches the required role, if any. */
-   if ((role != NULL) && strcmp(role, sourceclass) != 0) {
-      _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring 
request."));
-      goto exit;
-   }
-
-   /* Determine the target class from the source class. */
-   if (strcmp(sourceclass, _LHSCLASSNAME) == 0) {
-      sourcekeyname = _LHSKEYNAME;
-      targetclass = _RHSCLASSNAME;
-      targetkeyname = _RHSKEYNAME;
-   } else if (strcmp(sourceclass, _RHSCLASSNAME) == 0) {
-      sourcekeyname = _RHSKEYNAME;
-      targetclass = _LHSCLASSNAME;
-      targetkeyname = _LHSKEYNAME;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   }
-   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
-
-   CMPIData namedata = CMGetKey(reference, sourcekeyname, NULL);
-   char * sourcename = CMGetCharPtr(namedata.value.string);
-   _SBLIM_TRACE(2, ("--- sourcename=\"%s\"", sourcename));
-
-   /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, 
targetclass, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
-      _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
-      goto exit;
-   }
-
-   /* Get the list of all target class object paths from the CIMOM. */
-   CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, 
objectpath, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) {
-      _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate 
target class");
-      goto exit;
-   }
-
-   /* Return all object paths that exactly match the target class and 
resultClass, if specified. */
-   while (CMHasNext(objectpaths, NULL)) {
-      CMPIData data = CMGetNext(objectpaths, NULL);
-      char *class = CMGetCharPtr(CMGetClassName(data.value.ref, NULL));
-      if ((strcmp(class,targetclass) == 0) && ((resultClass == NULL) || 
(strcmp(class,resultClass) == 0))) {
-         /* Only return entries whose name matches the reference. */
-         namedata = CMGetKey(data.value.ref, targetkeyname, &status);
-         char * resultname = CMGetCharPtr(namedata.value.string);
-         if (strcmp(sourcename, resultname) == 0) CMReturnObjectPath(results, 
data.value.ref);
-      }
+   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
+
+   assocInfo.knownEndpoint = reference;
+   assocInfo.assocClassName = _ASSOCCLASS;
+   assocInfo.lhsClassName = _LHSCLASSNAME;
+   assocInfo.lhsNamespace = _LHSNAMESPACE;
+   assocInfo.rhsClassName = _RHSCLASSNAME;
+   assocInfo.rhsNamespace = _RHSNAMESPACE;
+   assocInfo.opCode = _CMPI_ASSOC_OP_AN;
+
+   assocFilter.assocClass = assocClass;
+   assocFilter.resultClass = resultClass;
+   assocFilter.role = role;
+   assocFilter.resultRole = resultRole;
+
+   if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, 
assocMatch, results, &status)) {
+      _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", 
CMGetCharPtr(status.msg)));
+      goto exit;
    }
 
    CMReturnDone(results);
@@ -192,15 +193,12 @@ static CMPIStatus Associators(
                const char *resultClass,
                const char *role,
                const char *resultRole,
-               char ** properties)             /* [in] List of desired 
properties (NULL=all). */
-{
-   CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
-   char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
-   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
-   char *targetclass;                           /* Class of the target 
object(s). */
-
-   char *sourcekeyname;
-   char *targetkeyname;
+               const char ** properties)               /* [in] List of desired 
properties (NULL=all). */
+{
+   CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
+   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
+   _CMPIAssocIdentity assocInfo;
+   _CMPIAssocFilter assocFilter;
 
    _SBLIM_ENTER("Associators");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
@@ -210,72 +208,25 @@ static CMPIStatus Associators(
    _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
    _SBLIM_TRACE(2, ("--- resultRole=\"%s\"", resultRole));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
-   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
-
-   /* Check that the requested association class, if any, is supported. */
-   if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
-      if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
-         _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
-         goto exit;
-      }
-   }
-
-   /* Check that the reference matches the required role, if any. */
-   if ((role != NULL) && strcmp(role, sourceclass) != 0) {
-      _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring 
request."));
-      goto exit;
-   }
-   CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_NOT_SUPPORTED, NULL);
-
-   /* Determine the target class from the source class. */
-   if (strcmp(sourceclass, _LHSCLASSNAME) == 0) {
-      sourcekeyname = _LHSKEYNAME;
-      targetclass = _RHSCLASSNAME;
-      targetkeyname = _RHSKEYNAME;
-   } else if (strcmp(sourceclass, _RHSCLASSNAME) == 0) {
-      sourcekeyname = _RHSKEYNAME;
-      targetclass = _LHSCLASSNAME;
-      targetkeyname = _LHSKEYNAME;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   }
-   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
-
-   CMPIData namedata = CMGetKey(reference, sourcekeyname, NULL);
-   char * sourcename = CMGetCharPtr(namedata.value.string);
-   _SBLIM_TRACE(2, ("--- sourcename=\"%s\"", sourcename));
-
-   /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, 
targetclass, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
-      _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
-      goto exit;
-   }
-
-   /* Get the list of all target class instances from the CIMOM. */
-   CMPIEnumeration * instances = CBEnumInstances(_BROKER, context, objectpath, 
NULL, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(instances)) {
-      _SBLIM_TRACE(1,("--- CBEnumInstances() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate 
target class");
-      goto exit;
-   }
-
-   /* Return all instances that exactly match the target class and 
resultClass, if specified. */
-   while (CMHasNext(instances, NULL)) {
-      CMPIData data = CMGetNext(instances, NULL);
-      char *class = 
CMGetCharPtr(CMGetClassName(CMGetObjectPath(data.value.inst,NULL), NULL));
-      if ((strcmp(class,targetclass) == 0) && ((resultClass == NULL) || 
(strcmp(class,resultClass) == 0))) {
-         /* Only return entries whose name matches the reference. */
-         namedata = CMGetProperty(data.value.inst, targetkeyname, NULL);
-         char * resultname = CMGetCharPtr(namedata.value.string);
-// BUG - returning data causes crash !?!
-_SBLIM_TRACE(2, ("--- data.value.inst=\"%s\"", 
CMGetCharPtr(CDToString(_BROKER, data.value.inst, NULL))));
-//         if (strcmp(sourcename, resultname) == 0) CMReturnInstance(results, 
data.value.inst);
-      }
+   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
+
+   assocInfo.knownEndpoint = reference;
+   assocInfo.assocClassName = _ASSOCCLASS;
+   assocInfo.lhsClassName = _LHSCLASSNAME;
+   assocInfo.lhsNamespace = _LHSNAMESPACE;
+   assocInfo.rhsClassName = _RHSCLASSNAME;
+   assocInfo.rhsNamespace = _RHSNAMESPACE;
+   assocInfo.properties = properties;
+   assocInfo.opCode = _CMPI_ASSOC_OP_A;
+
+   assocFilter.assocClass = assocClass;
+   assocFilter.resultClass = resultClass;
+   assocFilter.role = role;
+   assocFilter.resultRole = resultRole;
+
+   if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, 
assocMatch, results, &status)) {
+      _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", 
CMGetCharPtr(status.msg)));
+      goto exit;
    }
 
    CMReturnDone(results);
@@ -299,10 +250,8 @@ static CMPIStatus ReferenceNames(
    CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
    char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
-   char *targetclass;                           /* Class of the target 
object(s). */
-
-   char *sourcekeyname;
-   char *targetkeyname;
+   _CMPIAssocIdentity assocInfo;
+   _CMPIAssocFilter assocFilter;
 
    _SBLIM_ENTER("ReferenceNames");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
@@ -310,88 +259,30 @@ static CMPIStatus ReferenceNames(
    _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
reference, NULL))));
    _SBLIM_TRACE(2, ("--- assocClass=\"%s\"", assocClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
-   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
-
-   /* Check that the requested association class, if any, is supported. */
-   if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
-      if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
-         _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
-         goto exit;
-      }
-   }
-
-   /* Check that the reference matches the required role, if any. */
-   if ((role != NULL) && strcmp(role, sourceclass) != 0) {
-      _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring 
request."));
-      goto exit;
-   }
-
-   /* Determine the target class from the source class. */
-   if (strcmp(sourceclass, _LHSCLASSNAME) == 0) {
-      sourcekeyname = _LHSKEYNAME;
-      targetclass = _RHSCLASSNAME;
-      targetkeyname = _RHSKEYNAME;
-   } else if (strcmp(sourceclass, _RHSCLASSNAME) == 0) {
-      sourcekeyname = _RHSKEYNAME;
-      targetclass = _LHSCLASSNAME;
-      targetkeyname = _LHSKEYNAME;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   }
-   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
-
-   CMPIData namedata = CMGetKey(reference, sourcekeyname, NULL);
-   char * sourcename = CMGetCharPtr(namedata.value.string);
-   _SBLIM_TRACE(2, ("--- sourcename=\"%s\"", sourcename));
-
-   /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, 
targetclass, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
-      _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
-      goto exit;
-   }
-
-   /* Get the list of all target class object paths from the CIMOM. */
-   CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, 
objectpath, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) {
-      _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate 
target class");
-      goto exit;
-   }
-
-   /* Return all object paths that exactly match the target class and 
resultClass, if specified. */
-   while (CMHasNext(objectpaths, NULL)) {
-      CMPIData data = CMGetNext(objectpaths, NULL);
-      char *class = CMGetCharPtr(CMGetClassName(data.value.ref, NULL));
-      if (strcmp(class,targetclass) == 0) {
-
-         /* Create an object path for the association. */
-         CMPIObjectPath * refobjectpath = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, &status);
-         if ((status.rc != CMPI_RC_OK) || CMIsNullObject(refobjectpath)) {
-            _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
-            CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot 
create new CMPIObjectPath");
-            goto exit;
-         }
-
-         /* Assign the references in the association appropriately. */
-         if (strcmp(sourceclass, _RHSCLASSNAME) == 0) {
-            CMAddKey(refobjectpath, _RHSPROPERTYNAME, &reference, CMPI_ref);
-            CMAddKey(refobjectpath, _LHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
-         } else {
-            CMAddKey(refobjectpath, _RHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
-            CMAddKey(refobjectpath, _LHSPROPERTYNAME, &reference, CMPI_ref);
-         }
-
-         /* Only return entries whose name matches the reference. */
-         namedata = CMGetKey(data.value.ref, targetkeyname, &status);
-         char * resultname = CMGetCharPtr(namedata.value.string);
-         if (strcmp(sourcename, resultname) == 0) CMReturnObjectPath(results, 
refobjectpath);
-      }
-   }
+   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
+
+   assocInfo.knownEndpoint = reference;
+   assocInfo.assocClassName = _ASSOCCLASS;
+   assocInfo.lhsClassName = _LHSCLASSNAME;
+   assocInfo.lhsNamespace = _LHSNAMESPACE;
+   assocInfo.lhsPropertyName = _LHSPROPERTYNAME;
+   assocInfo.rhsClassName = _RHSCLASSNAME;
+   assocInfo.rhsNamespace = _RHSNAMESPACE;
+   assocInfo.rhsPropertyName = _RHSPROPERTYNAME;
+   assocInfo.opCode = _CMPI_ASSOC_OP_RN;
+
+   assocFilter.assocClass = assocClass;
+   assocFilter.resultClass = NULL;
+   assocFilter.role = role;
+   assocFilter.resultRole = NULL;
+
+   if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, 
assocMatch, results, &status)) {
+      
+      _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", 
CMGetCharPtr(status.msg)));
+      goto exit;
+   }
+
+   CMReturnDone(results);
 
 exit:
    _SBLIM_RETURNSTATUS(status);
@@ -408,15 +299,13 @@ static CMPIStatus References(
                CMPIObjectPath * reference,     /* [in] Contains the namespace, 
classname and desired object path. */
                const char *assocClass,
                const char *role,
-               char **properties)              /* [in] List of desired 
properties (NULL=all). */
+               const char **properties)                /* [in] List of desired 
properties (NULL=all). */
 {
    CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
    char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
    char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
-   char *targetclass;                           /* Class of the target 
object(s). */
-
-   char *sourcekeyname;
-   char *targetkeyname;
+   _CMPIAssocIdentity assocInfo;
+   _CMPIAssocFilter assocFilter;
 
    _SBLIM_ENTER("References");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
@@ -424,89 +313,33 @@ static CMPIStatus References(
    _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
reference, NULL))));
    _SBLIM_TRACE(2, ("--- assocClass=\"%s\"", assocClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
-   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
-
-   /* Check that the requested association class, if any, is supported. */
-   if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
-      if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
-         _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
-         goto exit;
-      }
-   }
-
-   /* Check that the reference matches the required role, if any. */
-   if ((role != NULL) && strcmp(role, sourceclass) != 0) {
-      _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring 
request."));
-      goto exit;
-   }
-
-   /* Determine the target class from the source class. */
-   if (strcmp(sourceclass, _LHSCLASSNAME) == 0) {
-      sourcekeyname = _LHSKEYNAME;
-      targetclass = _RHSCLASSNAME;
-      targetkeyname = _RHSKEYNAME;
-   } else if (strcmp(sourceclass, _RHSCLASSNAME) == 0) {
-      sourcekeyname = _RHSKEYNAME;
-      targetclass = _LHSCLASSNAME;
-      targetkeyname = _LHSKEYNAME;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   }
-   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
-
-   CMPIData namedata = CMGetKey(reference, sourcekeyname, NULL);
-   char * sourcename = CMGetCharPtr(namedata.value.string);
-   _SBLIM_TRACE(2, ("--- sourcename=\"%s\"", sourcename));
-
-   /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, namespace, 
targetclass, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
-      _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
-      goto exit;
-   }
-
-   /* Get the list of all target class object paths from the CIMOM. */
-   CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, 
objectpath, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) {
-      _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate 
target class");
-      goto exit;
-   }
-
-   /* Return all object paths that exactly match the target class and 
resultClass, if specified. */
-   while (CMHasNext(objectpaths, NULL)) {
-      CMPIData data = CMGetNext(objectpaths, NULL);
-      char *class = CMGetCharPtr(CMGetClassName(data.value.ref, NULL));
-      if (strcmp(class,targetclass) == 0) {
-
-         /* Create an instance for the association. */
-         CMPIInstance * refinstance = _CMNewInstance(_BROKER, namespace, 
_ASSOCCLASS, &status);
-         if ((status.rc != CMPI_RC_OK) || CMIsNullObject(refinstance)) {
-            _SBLIM_TRACE(1,("--- CMNewInstance() failed - %s", 
CMGetCharPtr(status.msg)));
-            CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot 
create new CMPIInstance");
-            goto exit;
-         }
-
-         /* Assign the references in the association appropriately. */
-         if (strcmp(sourceclass, _RHSCLASSNAME) == 0) {
-            CMSetProperty(refinstance, _RHSPROPERTYNAME, &reference, CMPI_ref);
-            CMSetProperty(refinstance, _LHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
-         } else {
-            CMSetProperty(refinstance, _RHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
-            CMSetProperty(refinstance, _LHSPROPERTYNAME, &reference, CMPI_ref);
-         }
-
-         /* Only return entries whose name matches the reference. */
-         namedata = CMGetKey(data.value.ref, targetkeyname, &status);
-         char * resultname = CMGetCharPtr(namedata.value.string);
-         if (strcmp(sourcename, resultname) == 0) CMReturnInstance(results, 
refinstance);
-      }
-   }
-exit:
+   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
+
+   assocInfo.knownEndpoint = reference;
+   assocInfo.assocClassName = _ASSOCCLASS;
+   assocInfo.lhsClassName = _LHSCLASSNAME;
+   assocInfo.lhsNamespace = _LHSNAMESPACE;
+   assocInfo.lhsPropertyName = _LHSPROPERTYNAME;
+   assocInfo.rhsClassName = _RHSCLASSNAME;
+   assocInfo.rhsNamespace = _RHSNAMESPACE;
+   assocInfo.rhsPropertyName = _RHSPROPERTYNAME;
+   assocInfo.properties = properties;
+   assocInfo.opCode = _CMPI_ASSOC_OP_R;
+
+   assocFilter.assocClass = assocClass;
+   assocFilter.resultClass = NULL;
+   assocFilter.role = role;
+   assocFilter.resultRole = NULL;
+
+   if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, 
assocMatch, results, &status)) {
+      
+      _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", 
CMGetCharPtr(status.msg)));
+      goto exit;
+   }
+
+   CMReturnDone(results);
+
+ exit:
    _SBLIM_RETURNSTATUS(status);
 }
 
diff -r 7c937c187b5e src/Xen_ProcessorPoolComponent.c
--- a/src/Xen_ProcessorPoolComponent.c  Fri Oct 20 13:20:15 2006 -0600
+++ b/src/Xen_ProcessorPoolComponent.c  Tue Oct 17 14:27:50 2006 -0600
@@ -16,7 +16,7 @@
 // ============================================================================
 // Authors:       Jim Fehlig, <jfehlig@xxxxxxxxxx>
 // Contributors:
-// Description:
+// Description:   Association provider for Xen_ProcessorPoolComponent.
 // ============================================================================
 
 #include <string.h>
@@ -40,6 +40,8 @@ static CMPIBroker *_BROKER;
 /* Include _SBLIM_TRACE() logging support */
 #include "cmpitrace.h"
 
+/* Include common provider definitions */
+#include "provider_common.h"
 
 // ============================================================================
 // CMPI ASSOCIATION PROVIDER FUNCTION TABLE
@@ -48,18 +50,40 @@ static CMPIBroker *_BROKER;
 // ----------------------------------------------------------------------------
 // Info for the class supported by the association provider
 // ----------------------------------------------------------------------------
-                                                                               
                                                  
-/* Name of the left and right hand side classes of this association. */
+
+/* Name of the left and right hand side classes, properties, namespaces, and
+ * key names of this association. */
 static char * _ASSOCCLASS = "Xen_ProcessorPoolComponent";
 static char * _LHSCLASSNAME = "Xen_ProcessorPool";
-static char * _RHSCLASSNAME = "CIM_Processor";
+static char * _RHSCLASSNAME = HOST_INSTRUMENTATION_PREFIX"Processor";
 static char * _LHSPROPERTYNAME = "GroupComponent"; 
 static char * _RHSPROPERTYNAME = "PartComponent";
-static char * _LHSNAMESPACE = "root/cimv2";
-static char * _RHSNAMESPACE = "smash";
+static char * _LHSNAMESPACE = XEN_INSTRUMENTATION_NS;
+static char * _RHSNAMESPACE = HOST_INSTRUMENTATION_NS;
 
 static char * _XEN_DOMU_PROCESSOR_CLASS = "Xen_Processor";
 
+
+/*
+ * Determine if object path op is a match as defined by the request
+ * parameters incapsulated in assocInfo and assocFilter.
+ */
+static int assocMatch(_CMPIAssocIdentity *assocInfo,
+                      CMPIObjectPath *op,
+                      _CMPIAssocFilter *assocFilter)
+{
+   char *sourceClass = CMGetCharPtr(CMGetClassName(assocInfo->knownEndpoint, 
NULL));
+   char *targetClass = CMGetCharPtr(CMGetClassName(op, NULL));
+   
+   /* Ignore possible instances of source class. */
+   if (strcmp(targetClass, sourceClass) &&
+       (assocFilter->resultClass == NULL || CMClassPathIsA(_BROKER, op, 
assocFilter->resultClass, NULL))) {
+      
+      return 1;
+   }
+
+   return 0;
+}
 
 // ----------------------------------------------------------------------------
 // AssociationCleanup()
@@ -96,10 +120,9 @@ static CMPIStatus AssociatorNames(
                const char * resultRole)
 {
    CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
-   char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
-   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
-   char *targetclass;                          /* Class of the target 
object(s). */
-   char *targetnamespace;
+   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
+   _CMPIAssocIdentity assocInfo;
+   _CMPIAssocFilter assocFilter;
 
    _SBLIM_ENTER("AssociatorNames");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
@@ -109,73 +132,31 @@ static CMPIStatus AssociatorNames(
    _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
    _SBLIM_TRACE(2, ("--- resultRole=\"%s\"", resultRole));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
-   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
-
-   /* Ensure the source class is not a virtual processor */
-   if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) {
-      _SBLIM_TRACE(2, ("--- Ignoring source class %s.", 
_XEN_DOMU_PROCESSOR_CLASS));
-      goto exit;
-   }
-
-   /* Check that the requested association class, if any, is supported. */
-   if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
-      if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
-         _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
-         goto exit;
-      }
-   }
-
-   /* Check that the reference matches the required role, if any. */
-   if ((role != NULL) && strcmp(role, sourceclass) != 0) {
-      _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring 
request."));
-      goto exit;
-   }
-
-   /* Determine the target class from the source class. */
-   if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
-      targetclass = _RHSCLASSNAME;
-      targetnamespace = _RHSNAMESPACE;
-   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
-      targetclass = _LHSCLASSNAME;
-      targetnamespace = _LHSNAMESPACE;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   } 
-   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
-   _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace));
-
-   /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, 
targetclass, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
-      _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
-      goto exit;
-   }
-
-   /* Get the list of all target class object paths from the CIMOM. */
-   CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, 
objectpath, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) {
-      _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate 
target class");
-      goto exit;
-   }
-
-   /* Return all object paths that exactly match the target class and 
resultClass, if specified. */
-   while (CMHasNext(objectpaths, NULL)) {
-      CMPIData data = CMGetNext(objectpaths, NULL);
-      char *class = CMGetCharPtr(CMGetClassName(data.value.ref, NULL));
-
-      _SBLIM_TRACE(2, ("--- got objectpath=\"%s\"", 
CMGetCharPtr(CDToString(_BROKER, data.value.ref, NULL))));
-
-      /* Ignore possible instances of source class. */
-      if (strcmp(class,sourceclass) &&
-          (resultClass == NULL || CMClassPathIsA(_BROKER, data.value.ref, 
resultClass, NULL))) {
-
-         CMReturnObjectPath(results, data.value.ref);
-      }
+   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
+
+   /* Ensure the source class is not a virtual processor */
+   if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) {
+      _SBLIM_TRACE(2, ("--- Ignoring source class %s.", 
_XEN_DOMU_PROCESSOR_CLASS));
+      goto exit;
+   }
+
+   assocInfo.knownEndpoint = reference;
+   assocInfo.assocClassName = _ASSOCCLASS;
+   assocInfo.lhsClassName = _LHSCLASSNAME;
+   assocInfo.lhsNamespace = _LHSNAMESPACE;
+   assocInfo.rhsClassName = _RHSCLASSNAME;
+   assocInfo.rhsNamespace = _RHSNAMESPACE;
+   assocInfo.rhsPropertyName = _RHSPROPERTYNAME;
+   assocInfo.opCode = _CMPI_ASSOC_OP_AN;
+
+   assocFilter.assocClass = assocClass;
+   assocFilter.resultClass = resultClass;
+   assocFilter.role = role;
+   assocFilter.resultRole = resultRole;
+
+   if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, 
assocMatch, results, &status)) {
+      _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", 
CMGetCharPtr(status.msg)));
+      goto exit;
    }
 
    CMReturnDone(results);
@@ -197,13 +178,12 @@ static CMPIStatus Associators(
                const char *resultClass,
                const char *role,
                const char *resultRole,
-               char ** properties)             /* [in] List of desired 
properties (NULL=all). */
-{
-   CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
-   char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
-   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
-   char *targetclass;                           /* Class of the target 
object(s). */
-   char *targetnamespace;
+               const char ** properties)               /* [in] List of desired 
properties (NULL=all). */
+{
+   CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
+   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
+   _CMPIAssocIdentity assocInfo;
+   _CMPIAssocFilter assocFilter;
 
    _SBLIM_ENTER("Associators");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
@@ -213,79 +193,33 @@ static CMPIStatus Associators(
    _SBLIM_TRACE(2, ("--- resultClass=\"%s\"", resultClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
    _SBLIM_TRACE(2, ("--- resultRole=\"%s\"", resultRole));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
-   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
-
-   /* Ensure the source class is not a virtual processor */
-   if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) {
-      _SBLIM_TRACE(2, ("--- Ignoring source class %s.", 
_XEN_DOMU_PROCESSOR_CLASS));
-      goto exit;
-   }
-
-   /* Check that the requested association class, if any, is supported. */
-   if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
-      if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
-         _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
-         goto exit;
-      }
-   }
-
-   /* Check that the reference matches the required role, if any. */
-   if ((role != NULL) && strcmp(role, sourceclass) != 0) {
-      _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring 
request."));
-      goto exit;
-   }
-   CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERR_NOT_SUPPORTED, NULL);
-
-   /* Determine the target class from the source class. */
-   if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
-      targetclass = _RHSCLASSNAME;
-      targetnamespace = _RHSNAMESPACE;
-   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
-      targetclass = _LHSCLASSNAME;
-      targetnamespace = _LHSNAMESPACE;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   } 
-   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
-   _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace));
-
-   /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, 
targetclass, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
-      _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
-      goto exit;
-   }
-
-   /* Get the list of all target class instances from the CIMOM. */
-   CMPIEnumeration * instances = CBEnumInstances(_BROKER, context, objectpath, 
NULL, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(instances)) {
-      _SBLIM_TRACE(1,("--- CBEnumInstances() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate 
target class");
-      goto exit;
-   }
-
-   /* Return all instances that exactly match the target class and 
resultClass, if specified. */
-   while (CMHasNext(instances, NULL)) {
-      CMPIData data = CMGetNext(instances, NULL);
-      CMPIObjectPath *op = CMGetObjectPath(data.value.inst,NULL);
-      char *class = CMGetCharPtr(CMGetClassName(op, NULL));
-
-      CMSetNameSpace(op, targetnamespace);
-      _SBLIM_TRACE(2, ("--- got objectpath=\"%s\"", 
CMGetCharPtr(CDToString(_BROKER, op, NULL))));
-      _SBLIM_TRACE(2, ("--- got class=\"%s\"", class));
-
-      /* Ignore possible instances of source class. */
-      if (strcmp(class,sourceclass) &&
-          (resultClass == NULL || CMClassPathIsA(_BROKER, op, resultClass, 
NULL))) {
-         _SBLIM_TRACE(2, ("--- returning instance"));
-         CMReturnInstance(results, data.value.inst);
-      }
-   }
-   
+   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
+
+   /* Ensure the source class is not a virtual processor */
+   if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) {
+      _SBLIM_TRACE(2, ("--- Ignoring source class %s.", 
_XEN_DOMU_PROCESSOR_CLASS));
+      goto exit;
+   }
+
+   assocInfo.knownEndpoint = reference;
+   assocInfo.assocClassName = _ASSOCCLASS;
+   assocInfo.lhsClassName = _LHSCLASSNAME;
+   assocInfo.lhsNamespace = _LHSNAMESPACE;
+   assocInfo.rhsClassName = _RHSCLASSNAME;
+   assocInfo.rhsNamespace = _RHSNAMESPACE;
+   assocInfo.properties = properties;
+   assocInfo.opCode = _CMPI_ASSOC_OP_A;
+
+   assocFilter.assocClass = assocClass;
+   assocFilter.resultClass = resultClass;
+   assocFilter.role = role;
+   assocFilter.resultRole = resultRole;
+
+   if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, 
assocMatch, results, &status)) {
+      _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", 
CMGetCharPtr(status.msg)));
+      goto exit;
+   }
+
    CMReturnDone(results);
 
 exit:
@@ -305,10 +239,9 @@ static CMPIStatus ReferenceNames(
                const char *role)
 {
    CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
-   char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
-   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
-   char *targetclass;                           /* Class of the target 
object(s). */
-   char *targetnamespace;
+   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
+   _CMPIAssocIdentity assocInfo;
+   _CMPIAssocFilter assocFilter;
 
    _SBLIM_ENTER("ReferenceNames");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
@@ -316,90 +249,36 @@ static CMPIStatus ReferenceNames(
    _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
reference, NULL))));
    _SBLIM_TRACE(2, ("--- assocClass=\"%s\"", assocClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
-   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
-
-   /* Ensure the source class is not a virtual processor */
-   if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) {
-      _SBLIM_TRACE(2, ("--- Ignoring source class %s.", 
_XEN_DOMU_PROCESSOR_CLASS));
-      goto exit;
-   }
-
-   /* Check that the requested association class, if any, is supported. */
-   if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
-      if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
-         _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
-         goto exit;
-      }
-   }
-
-   /* Check that the reference matches the required role, if any. */
-   if ((role != NULL) && strcmp(role, sourceclass) != 0) {
-      _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring 
request."));
-      goto exit;
-   }
-
-   /* Determine the target class from the source class. */
-   if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
-      targetclass = _RHSCLASSNAME;
-      targetnamespace = _RHSNAMESPACE;
-      /* Refences of LHS class should always be in LHS namespace. */
-      CMSetNameSpace(reference, _LHSNAMESPACE);
-   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
-      targetclass = _LHSCLASSNAME;
-      targetnamespace = _LHSNAMESPACE;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   } 
-   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
-   _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace));
-
-   /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, 
targetclass, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
-      _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
-      goto exit;
-   }
-
-   /* Get the list of all target class object paths from the CIMOM. */
-   CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, 
objectpath, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) {
-      _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate 
target class");
-      goto exit;
-   }
-
-   /* Return all object paths that exactly match the target class and 
resultClass, if specified. */
-   while (CMHasNext(objectpaths, NULL)) {
-      CMPIData data = CMGetNext(objectpaths, NULL);
-
-      if((CMClassPathIsA(_BROKER, data.value.ref, targetclass, NULL)) &&
-         (!CMClassPathIsA(_BROKER, data.value.ref, sourceclass, NULL))) {
-         /* Create an object path for the association. Note that the 
association
-          * objects should exist in 'virt namespace' not the host namespace.
-          */
-         CMPIObjectPath * refobjectpath = CMNewObjectPath(_BROKER, 
_LHSNAMESPACE, _ASSOCCLASS, &status);
-         if ((status.rc != CMPI_RC_OK) || CMIsNullObject(refobjectpath)) {
-            _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
-            CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot 
create new CMPIObjectPath");
-            goto exit;
-         }
-
-         /* Assign the references in the association appropriately. */
-         if (strcmp(sourceclass, _RHSCLASSNAME) == 0) {
-            CMAddKey(refobjectpath, _RHSPROPERTYNAME, &reference, CMPI_ref);
-            CMAddKey(refobjectpath, _LHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
-         } else {
-            CMAddKey(refobjectpath, _RHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
-            CMAddKey(refobjectpath, _LHSPROPERTYNAME, &reference, CMPI_ref);
-         }
-
-         CMReturnObjectPath(results, refobjectpath);
-      }
-   }
+   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
+
+   /* Ensure the source class is not a virtual processor */
+   if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) {
+      _SBLIM_TRACE(2, ("--- Ignoring source class %s.", 
_XEN_DOMU_PROCESSOR_CLASS));
+      goto exit;
+   }
+
+   assocInfo.knownEndpoint = reference;
+   assocInfo.assocClassName = _ASSOCCLASS;
+   assocInfo.lhsClassName = _LHSCLASSNAME;
+   assocInfo.lhsNamespace = _LHSNAMESPACE;
+   assocInfo.lhsPropertyName = _LHSPROPERTYNAME;
+   assocInfo.rhsClassName = _RHSCLASSNAME;
+   assocInfo.rhsNamespace = _RHSNAMESPACE;
+   assocInfo.rhsPropertyName = _RHSPROPERTYNAME;
+   assocInfo.opCode = _CMPI_ASSOC_OP_RN;
+
+   assocFilter.assocClass = assocClass;
+   assocFilter.resultClass = NULL;
+   assocFilter.role = role;
+   assocFilter.resultRole = NULL;
+
+   if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, 
assocMatch, results, &status)) {
+      
+      _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", 
CMGetCharPtr(status.msg)));
+      goto exit;
+   }
+
+   CMReturnDone(results);
 
 exit:
    _SBLIM_RETURNSTATUS(status);
@@ -416,13 +295,12 @@ static CMPIStatus References(
                CMPIObjectPath * reference,     /* [in] Contains the namespace, 
classname and desired object path. */
                const char *assocClass,
                const char *role,
-               char **properties)              /* [in] List of desired 
properties (NULL=all). */
-{
-   CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
-   char *namespace = CMGetCharPtr(CMGetNameSpace(reference, NULL)); /* Target 
namespace. */
-   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
-   char *targetclass;                           /* Class of the target 
object(s). */
-   char *targetnamespace;
+               const char **properties)                /* [in] List of desired 
properties (NULL=all). */
+{
+   CMPIStatus status = { CMPI_RC_OK, NULL };    /* Return status of CIM 
operations. */
+   char *sourceclass = CMGetCharPtr(CMGetClassName(reference, &status)); /* 
Class of the source reference object */
+   _CMPIAssocIdentity assocInfo;
+   _CMPIAssocFilter assocFilter;
 
    _SBLIM_ENTER("References");
    _SBLIM_TRACE(2, ("--- self=\"%s\"", self->ft->miName));
@@ -430,90 +308,38 @@ static CMPIStatus References(
    _SBLIM_TRACE(2, ("--- reference=\"%s\"", CMGetCharPtr(CDToString(_BROKER, 
reference, NULL))));
    _SBLIM_TRACE(2, ("--- assocClass=\"%s\"", assocClass));
    _SBLIM_TRACE(2, ("--- role=\"%s\"", role));
-   _SBLIM_TRACE(2, ("--- namespace=\"%s\"", namespace));
-   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
-
-   /* Ensure the source class is not a virtual processor */
-   if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) {
-      _SBLIM_TRACE(2, ("--- Ignoring source class %s.", 
_XEN_DOMU_PROCESSOR_CLASS));
-      goto exit;
-   }
-
-   /* Check that the requested association class, if any, is supported. */
-   if (assocClass != NULL) {
-      CMPIObjectPath * assoc = CMNewObjectPath(_BROKER, namespace, 
_ASSOCCLASS, NULL);
-      if (!CMClassPathIsA(_BROKER, assoc, assocClass, NULL)) {
-         _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
-         goto exit;
-      }
-   }
-
-   /* Check that the reference matches the required role, if any. */
-   if ((role != NULL) && strcmp(role, sourceclass) != 0) {
-      _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring 
request."));
-      goto exit;
-   }
-
-   /* Determine the target class from the source class. */
-   if (CMClassPathIsA(_BROKER, reference, _LHSCLASSNAME, NULL)) {
-      targetclass = _RHSCLASSNAME;
-      targetnamespace = _RHSNAMESPACE;
-      /* Refences of LHS class should always be in LHS namespace. */
-      CMSetNameSpace(reference, _LHSNAMESPACE);
-   } else if (CMClassPathIsA(_BROKER, reference, _RHSCLASSNAME, NULL)) {
-      targetclass = _LHSCLASSNAME;
-      targetnamespace = _LHSNAMESPACE;
-   } else {
-      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
-      goto exit;
-   } 
-   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
-   _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace));
-
-   /* Create an object path for the result class. */
-   CMPIObjectPath * objectpath = CMNewObjectPath(_BROKER, targetnamespace, 
targetclass, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
-      _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
-      goto exit;
-   }
-
-   /* Get the list of all target class object paths from the CIMOM. */
-   CMPIEnumeration * objectpaths = CBEnumInstanceNames(_BROKER, context, 
objectpath, &status);
-   if ((status.rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) {
-      _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", 
CMGetCharPtr(status.msg)));
-      CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot enumerate 
target class");
-      goto exit;
-   }
-
-   /* Return all object paths that exactly match the target class and 
resultClass, if specified. */
-   while (CMHasNext(objectpaths, NULL)) {
-      CMPIData data = CMGetNext(objectpaths, NULL);
-
-      if((CMClassPathIsA(_BROKER, data.value.ref, targetclass, NULL)) &&
-         (!CMClassPathIsA(_BROKER, data.value.ref, sourceclass, NULL))) {
-         /* Create an instance for the association. Note that the association
-          * objects should exist in 'virt namespace' not the host namespace.
-          */
-         CMPIInstance * refinstance = _CMNewInstance(_BROKER, _LHSNAMESPACE, 
_ASSOCCLASS, &status);
-         if ((status.rc != CMPI_RC_OK) || CMIsNullObject(refinstance)) {
-            _SBLIM_TRACE(1,("--- CMNewInstance() failed - %s", 
CMGetCharPtr(status.msg)));
-            CMSetStatusWithChars(_BROKER, &status, CMPI_RC_ERROR, "Cannot 
create new CMPIInstance");
-            goto exit;
-         }
-
-         /* Assign the references in the association appropriately. */
-         if (strcmp(sourceclass, _RHSCLASSNAME) == 0) {
-            CMSetProperty(refinstance, _RHSPROPERTYNAME, &reference, CMPI_ref);
-            CMSetProperty(refinstance, _LHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
-         } else {
-            CMSetProperty(refinstance, _RHSPROPERTYNAME, &data.value.ref, 
CMPI_ref);
-            CMSetProperty(refinstance, _LHSPROPERTYNAME, &reference, CMPI_ref);
-         }
-         
-         CMReturnInstance(results, refinstance);
-      }
-   }
+   _SBLIM_TRACE(2, ("--- sourceclass=\"%s\"", sourceclass));
+
+   /* Ensure the source class is not a virtual processor */
+   if (strcmp(sourceclass, _XEN_DOMU_PROCESSOR_CLASS) == 0) {
+      _SBLIM_TRACE(2, ("--- Ignoring source class %s.", 
_XEN_DOMU_PROCESSOR_CLASS));
+      goto exit;
+   }
+
+   assocInfo.knownEndpoint = reference;
+   assocInfo.assocClassName = _ASSOCCLASS;
+   assocInfo.lhsClassName = _LHSCLASSNAME;
+   assocInfo.lhsNamespace = _LHSNAMESPACE;
+   assocInfo.lhsPropertyName = _LHSPROPERTYNAME;
+   assocInfo.rhsClassName = _RHSCLASSNAME;
+   assocInfo.rhsNamespace = _RHSNAMESPACE;
+   assocInfo.rhsPropertyName = _RHSPROPERTYNAME;
+   assocInfo.properties = properties;
+   assocInfo.opCode = _CMPI_ASSOC_OP_R;
+      
+   assocFilter.assocClass = assocClass;
+   assocFilter.resultClass = NULL;
+   assocFilter.role = role;
+   assocFilter.resultRole = NULL;
+
+   if (_CMPIGetTargetEndpoints(_BROKER, context, &assocInfo, &assocFilter, 
assocMatch, results, &status)) {
+      
+      _SBLIM_TRACE(1,("--- _CMPIGetTargetEndpoints() failed - %s", 
CMGetCharPtr(status.msg)));
+      goto exit;
+   }
+
+   CMReturnDone(results);
+
 exit:
    _SBLIM_RETURNSTATUS(status);
 }
diff -r 7c937c187b5e src/cmpiutil.c
--- a/src/cmpiutil.c    Fri Oct 20 13:20:15 2006 -0600
+++ b/src/cmpiutil.c    Mon Oct 23 11:17:36 2006 -0600
@@ -15,7 +15,7 @@
 //    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  
USA
 // ============================================================================
 // Author:       Dr. Gareth S. Bestor <bestor@xxxxxxxxxx>
-// Contributors:
+// Contributors: Jim Fehlig <jfehlig@xxxxxxxxxx>
 // Summary:      Some useful utility functions
 // Description:
 //    TODO
@@ -30,6 +30,13 @@
 #include "cmpidt.h"
 #include "cmpift.h"
 #include "cmpimacs.h"
+
+#include "cmpiutil.h"
+#include "cmpitrace.h"
+
+/* Include common provider definitions */
+#include "provider_common.h"
+
 
 /* ------------------------------------------------------------------------- */
 
@@ -385,3 +392,150 @@ char * _CMPIValueToString ( CMPIData dat
    }
 }
 
+
+/*
+ * Get target endpoints for association defined by assocInfo.
+ * assocFilter defines any restrictions on the returned enpoints.
+ * matchFunc must be a non-null function that returns true (1) if
+ * potential target endpoints meet the requirements of defined in
+ * assocInfo and assocFilter.  Results are collected in the results
+ * out parameter.
+ * Returns non-zero on failure with additional error information
+ * available in out parameter rc.
+ */
+int _CMPIGetTargetEndpoints(CMPIBroker *mb,
+                            CMPIContext *context,
+                            _CMPIAssocIdentity *assocInfo,
+                            _CMPIAssocFilter *assocFilter,
+                            _CMPIAssocMatchFunc matchFunc,
+                            CMPIResult *results,
+                            CMPIStatus *status)
+{
+   char *sourceClass = CMGetCharPtr(CMGetClassName(assocInfo->knownEndpoint, 
NULL)); /* Class of the source reference object */
+   char *sourceNamespace = 
CMGetCharPtr(CMGetNameSpace(assocInfo->knownEndpoint, NULL)); /* Source 
namespace. */
+   char *targetclass; /* Class of the target object. */
+   char *targetnamespace; /* Namespace of target object. */
+   
+   if (assocInfo == NULL || assocFilter == NULL || matchFunc == NULL ||
+       results == NULL || status == NULL) {
+      _SBLIM_TRACE(1, ("--- Invalid parameter."));
+      CMSetStatus(status, CMPI_RC_ERR_INVALID_PARAMETER);
+      return 1;
+   }
+
+   /* Check that the requested association class, if any, is supported. */
+   if (assocFilter->assocClass != NULL) {
+      CMPIObjectPath *assoc = CMNewObjectPath(mb, sourceNamespace, 
assocInfo->assocClassName, NULL);
+      if (!CMClassPathIsA(mb, assoc, assocFilter->assocClass, NULL)) {
+         _SBLIM_TRACE(2, ("--- Unrecognized association class. Ignoring 
request."));
+         return 1;
+      }
+   }
+
+   /* Check that the reference matches the required role, if any. */
+   if ((assocFilter->role != NULL) && strcmp(assocFilter->role, sourceClass) 
!= 0) {
+      _SBLIM_TRACE(2, ("--- Reference does not match required role. Ignoring 
request."));
+      return 1;
+   }
+
+   /* Determine the target class from the source class. */
+   if (CMClassPathIsA(mb, assocInfo->knownEndpoint, assocInfo->lhsClassName, 
NULL)) {
+      targetclass = assocInfo->rhsClassName;
+      targetnamespace = assocInfo->rhsNamespace;
+   } else if (CMClassPathIsA(mb, assocInfo->knownEndpoint, 
assocInfo->rhsClassName, NULL)) {
+      targetclass = assocInfo->lhsClassName;
+      targetnamespace = assocInfo->lhsNamespace;
+   } else {
+      _SBLIM_TRACE(2, ("--- Unrecognized source class. Ignoring request."));
+      return 1;
+   } 
+   _SBLIM_TRACE(2, ("--- targetclass=\"%s\"", targetclass));
+   _SBLIM_TRACE(2, ("--- targetnamespace=\"%s\"", targetnamespace));
+
+   /* Create an object path for the result class. */
+   CMPIObjectPath *objectpath = CMNewObjectPath(mb, targetnamespace, 
targetclass, status);
+   if ((status->rc != CMPI_RC_OK) || CMIsNullObject(objectpath)) {
+      _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status->msg)));
+      CMSetStatusWithChars(mb, status, CMPI_RC_ERROR, "Cannot create new 
CMPIObjectPath");
+      return 1;
+   }
+
+   /* Get the list of all target class object paths from the CIMOM. */
+   CMPIEnumeration *objectpaths = CBEnumInstanceNames(mb, context, objectpath, 
status);
+   if ((status->rc != CMPI_RC_OK) || CMIsNullObject(objectpaths)) {
+      _SBLIM_TRACE(1,("--- CBEnumInstanceNames() failed - %s", 
CMGetCharPtr(status->msg)));
+      CMSetStatusWithChars(mb, status, CMPI_RC_ERROR, "Cannot enumerate target 
class");
+      return 1;
+   }
+
+   /* Return all object paths that exactly match the target class and 
resultClass, if specified. */
+   while (CMHasNext(objectpaths, NULL)) {
+      CMPIData data = CMGetNext(objectpaths, NULL);
+      if (matchFunc(assocInfo, data.value.ref, assocFilter)) {
+         switch (assocInfo->opCode) {
+            case _CMPI_ASSOC_OP_AN:
+            {
+               CMReturnObjectPath(results, data.value.ref);
+               break;
+            }
+            
+            case _CMPI_ASSOC_OP_A:
+            {
+               CMPIInstance *inst = CBGetInstance(mb, context, data.value.ref, 
assocInfo->properties, status);
+               if ((status->rc == CMPI_RC_OK) && (!CMIsNullObject(inst))) {
+                  //CMSetNameSpace(op, targetnamespace);
+                  CMReturnInstance(results, inst);
+               }
+               break;
+            }
+            
+            case _CMPI_ASSOC_OP_RN:
+            {
+               CMPIObjectPath *refobjectpath = CMNewObjectPath(mb, 
XEN_INSTRUMENTATION_NS, assocInfo->assocClassName, status);
+               if ((status->rc != CMPI_RC_OK) || 
CMIsNullObject(refobjectpath)) {
+                  _SBLIM_TRACE(1,("--- CMNewObjectPath() failed - %s", 
CMGetCharPtr(status->msg)));
+                  CMSetStatusWithChars(mb, status, CMPI_RC_ERROR, "Cannot 
create new CMPIObjectPath");
+                  return 1;
+               }
+
+               /* Assign the references in the association appropriately. */
+               if (strcmp(sourceClass, assocInfo->rhsClassName) == 0) {
+                  CMAddKey(refobjectpath, assocInfo->rhsPropertyName, 
&(assocInfo->knownEndpoint), CMPI_ref);
+                  CMAddKey(refobjectpath, assocInfo->lhsPropertyName, 
&data.value.ref, CMPI_ref);
+               } else {
+                  CMAddKey(refobjectpath, assocInfo->rhsPropertyName, 
&data.value.ref, CMPI_ref);
+                  CMAddKey(refobjectpath, assocInfo->lhsPropertyName, 
&(assocInfo->knownEndpoint), CMPI_ref);
+               }
+               
+               CMReturnObjectPath(results, refobjectpath);
+               break;
+            }
+               
+            case _CMPI_ASSOC_OP_R:
+            {
+               CMPIInstance *refinstance = _CMNewInstance(mb, 
XEN_INSTRUMENTATION_NS, assocInfo->assocClassName, status);
+               if ((status->rc != CMPI_RC_OK) || CMIsNullObject(refinstance)) {
+                  _SBLIM_TRACE(1,("--- CMNewInstance() failed - %s", 
CMGetCharPtr(status->msg)));
+                  CMSetStatusWithChars(mb, status, CMPI_RC_ERROR, "Cannot 
create new CMPIInstance");
+                  return 1;
+               }
+               
+               /* Assign the references in the association appropriately. */
+               if (strcmp(sourceClass, assocInfo->rhsClassName) == 0) {
+                  CMSetProperty(refinstance, assocInfo->rhsPropertyName, 
&(assocInfo->knownEndpoint), CMPI_ref);
+                  CMSetProperty(refinstance, assocInfo->lhsPropertyName, 
&data.value.ref, CMPI_ref);
+               } else {
+                  CMSetProperty(refinstance, assocInfo->rhsPropertyName, 
&data.value.ref, CMPI_ref);
+                  CMSetProperty(refinstance, assocInfo->lhsPropertyName, 
&(assocInfo->knownEndpoint), CMPI_ref);
+               }
+               
+               CMReturnInstance(results, refinstance);
+               break;
+            }
+         }
+      }
+   }
+   
+   return 0;
+}
+
diff -r 7c937c187b5e src/cmpiutil.h
--- a/src/cmpiutil.h    Fri Oct 20 13:20:15 2006 -0600
+++ b/src/cmpiutil.h    Mon Oct 23 10:58:26 2006 -0600
@@ -15,7 +15,7 @@
 //    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  
USA
 // ============================================================================
 // Author:       Dr. Gareth S. Bestor <bestor@xxxxxxxxxx>
-// Contributors:
+// Contributors: Jim Fehlig <jfehlig@xxxxxxxxxx>
 // Summary:      Some useful utility functions
 // Description:
 //    TODO
@@ -62,4 +62,77 @@ const char * _CMPITypeName ( CMPIType ty
 /* Return a string representation of a CMPI value. */
 char * _CMPIValueToString ( CMPIData data );
 
+
+/*
+ * An enumeration defining an association operation, e.g.
+ * AssociatorNames (AN), References (R), etc.
+ */
+enum _CMPIAssocOperation
+{
+   _CMPI_ASSOC_OP_AN,
+   _CMPI_ASSOC_OP_A,
+   _CMPI_ASSOC_OP_RN,
+   _CMPI_ASSOC_OP_R
+};
+
+
+/*
+ * A structure used to specify association meta-data, i.e. its
+ * identitiy.
+ */
+typedef struct _CMPIAssocIdentityStruct
+{
+   CMPIObjectPath *knownEndpoint;
+   char *assocClassName;
+   char *lhsClassName;
+   char *lhsNamespace;
+   char *lhsPropertyName;
+   char *rhsClassName;
+   char *rhsNamespace;
+   char *rhsPropertyName;
+   const char **properties;
+   enum _CMPIAssocOperation opCode;
+} _CMPIAssocIdentity;
+
+
+/*
+ * A structure used to specifiy filters for an association.
+ */
+typedef struct _CMPIAssocFilterStruct
+{
+   const char *assocClass;
+   const char *resultClass;
+   const char *role;
+   const char *resultRole;
+} _CMPIAssocFilter;
+
+
+/*
+ * Function prototype for an association match function.  Associations
+ * must implement a match function that returns true (1) if the
+ * object path op matches the association defined by assocInfo according
+ * to the restriction in assocFilter.
+ */
+typedef int (*_CMPIAssocMatchFunc) (_CMPIAssocIdentity *assocInfo, 
CMPIObjectPath *op, _CMPIAssocFilter *assocFilter);
+
+
+/*
+ * Get target endpoints for association defined by assocInfo.
+ * assocFilter defines any restrictions on the returned enpoints.
+ * matchFunc must be a non-null function that returns true (1) if
+ * potential target endpoints meet the requirements of defined in
+ * assocInfo and assocFilter.  Results are collected in the results
+ * out parameter.
+ * Returns non-zero on failure with additional error information
+ * available in out parameter rc.
+ */
+int _CMPIGetTargetEndpoints( CMPIBroker *mb,
+                             CMPIContext *context,
+                             _CMPIAssocIdentity *assocInfo,
+                             _CMPIAssocFilter *assocFilter,
+                             _CMPIAssocMatchFunc matchFunc,
+                             CMPIResult *results,
+                             CMPIStatus *rc );
+
+
 #endif /* _CMPIUTIL_H_ */
diff -r 7c937c187b5e src/provider_common.h.in
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/src/provider_common.h.in  Tue Oct 17 14:28:42 2006 -0600
@@ -0,0 +1,29 @@
+// Copyright (C) 2006 Novell, Inc.
+//
+//    This library is free software; you can redistribute it and/or
+//    modify it under the terms of the GNU Lesser General Public
+//    License as published by the Free Software Foundation; either
+//    version 2.1 of the License, or (at your option) any later version.
+//
+//    This library is distributed in the hope that it will be useful,
+//    but WITHOUT ANY WARRANTY; without even the implied warranty of
+//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//    Lesser General Public License for more details.
+//
+//    You should have received a copy of the GNU Lesser General Public
+//    License along with this library; if not, write to the Free Software
+//    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  
USA
+// ============================================================================
+// Authors:       Jim Fehlig, <jfehlig@xxxxxxxxxx>
+// Contributors:
+// Description:    Common provider definitions, macros, etc.
+// ============================================================================
+
+#if !defined(__PROVIDER_COMMON_H__)
+#define __PROVIDER_COMMON_H__
+
+#define HOST_INSTRUMENTATION_NS "@HOST_INSTRUMENTATION_NS@"
+#define HOST_INSTRUMENTATION_PREFIX "@HOST_INSTRUMENTATION_PREFIX@"
+#define XEN_INSTRUMENTATION_NS "root/cimv2"
+
+#endif /* __PROVIDER_COMMON_H__ */
diff -r 7c937c187b5e src/provider_common.h
--- a/src/provider_common.h     Fri Oct 20 13:20:15 2006 -0600
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-// Copyright (C) 2006 Novell, Inc.
-//
-//    This library is free software; you can redistribute it and/or
-//    modify it under the terms of the GNU Lesser General Public
-//    License as published by the Free Software Foundation; either
-//    version 2.1 of the License, or (at your option) any later version.
-//
-//    This library is distributed in the hope that it will be useful,
-//    but WITHOUT ANY WARRANTY; without even the implied warranty of
-//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-//    Lesser General Public License for more details.
-//
-//    You should have received a copy of the GNU Lesser General Public
-//    License along with this library; if not, write to the Free Software
-//    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  
USA
-// ============================================================================
-// Authors:       
-// Contributors:
-// Description:    Common provider definitions, macros, etc.
-// ============================================================================
-
-#if !defined(__PROVIDER_COMMON_H__)
-#define __PROVIDER_COMMON_H__
-
-#define HOST_INSTRUMENTATION_NS "smash"
-
-
-#endif /* __PROVIDER_COMMON_H__ */
_______________________________________________
Xen-cim mailing list
Xen-cim@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-cim

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.