static void loopOnChildren(ClassRegister * cReg, char *cn, const CMPIResult *rslt) { UtilList *ul = getChildren(cReg, cn); char *child; if (ul) for (child = (char *) ul->ft->getFirst(ul); child; child = (char *) ul->ft->getNext(ul)) { CMPIConstClass *cl = getClass(cReg, child); CMReturnInstance(rslt, (CMPIInstance *) cl); loopOnChildren(cReg, child, rslt); } }
static void loopOnChildren(ClassRegister *cReg, char *cn, CMPIResult * rslt) { UtilList *ul = getChildren(cReg,cn); char *child; ReadCtl ctl; if (ul) for (child = (char *) ul->ft->getFirst(ul); child; child = (char *) ul->ft->getNext(ul)) { ctl=tempRead; CMPIConstClass *cl = getResolvedClass(cReg,child,NULL, &ctl); CMReturnInstance(rslt, (CMPIInstance *) cl); if (ctl!=cached) CMRelease(cl); loopOnChildren(cReg,child,rslt); } }
static CMPIStatus ClassProviderEnumClasses(CMPIClassMI * mi, const CMPIContext *ctx, const CMPIResult *rslt, const CMPIObjectPath * ref) { CMPIStatus st = { CMPI_RC_OK, NULL }; char *cn = NULL; CMPIFlags flgs = 0; CMPIString *cni; ClassBase *cb; Iterator it; char *key; int rc; CMPIConstClass *cls; ClassRegister *cReg; ReadCtl rctl; ClassRecord *crec; _SFCB_ENTER(TRACE_PROVIDERS, "ClassProviderEnumClasss"); cReg = getNsReg(ref, &rc); if (cReg == NULL) { CMPIStatus st = { CMPI_RC_ERR_INVALID_NAMESPACE, NULL }; _SFCB_RETURN(st); } cReg->ft->wLock(cReg); flgs = ctx->ft->getEntry(ctx, CMPIInvocationFlags, NULL).value.uint32; cni = ref->ft->getClassName(ref, NULL); if (cni) { cn = (char *) cni->hdl; if (cn && *cn == 0) cn = NULL; } cb = (ClassBase *) cReg->hdl; if (cn == NULL) { for (it = cReg->ft->getFirstClassRecord(cReg, &key, &crec); key && it && crec; it = cReg->ft->getNextClassRecord(cReg, it, &key, &crec)) { char *cn = key; char *pcn = crec->parent; if ((flgs & CMPI_FLAG_DeepInheritance) || pcn == NULL) { rctl = tempRead; CMPIConstClass *rcls = getResolvedClass(cReg, cn, crec, &rctl); CMReturnInstance(rslt, (CMPIInstance *) rcls); if (rctl != cached) CMRelease(rcls); } } } else { rctl = tempRead; cls = getResolvedClass(cReg, cn, NULL, &rctl); if (cls == NULL) { st.rc = CMPI_RC_ERR_INVALID_CLASS; } else if ((flgs & CMPI_FLAG_DeepInheritance) == 0) { UtilList *ul = getChildren(cReg, cn); char *child; if (ul) for (child = (char *) ul->ft->getFirst(ul); child; child = (char *) ul->ft->getNext(ul)) { rctl = tempRead; cls = getResolvedClass(cReg, child, NULL, &rctl); CMReturnInstance(rslt, (CMPIInstance *) cls); if (rctl != cached) CMRelease(cls); } } else if (cn && (flgs & CMPI_FLAG_DeepInheritance)) { loopOnChildren(cReg, cn, rslt); } } cReg->ft->wUnLock(cReg); _SFCB_RETURN(st); }
static CMPIStatus ClassProviderEnumClasses(CMPIClassMI * mi, const CMPIContext *ctx, const CMPIResult *rslt, const CMPIObjectPath * ref) { CMPIStatus st = { CMPI_RC_OK, NULL }; char *cn = NULL; CMPIFlags flgs = 0; CMPIString *cni; ClassBase *cb; HashTableIterator *it; char *key; int rc; CMPIConstClass *cls; ClassRegister *cReg; _SFCB_ENTER(TRACE_PROVIDERS, "ClassProviderEnumClasss"); cReg = getNsReg(ref, &rc); if (cReg == NULL) { CMPIStatus st = { CMPI_RC_ERR_INVALID_NAMESPACE, NULL }; _SFCB_RETURN(st); } cReg->ft->rLock(cReg); flgs = ctx->ft->getEntry(ctx, CMPIInvocationFlags, NULL).value.uint32; cni = ref->ft->getClassName(ref, NULL); if (cni) { cn = (char *) cni->hdl; if (cn && *cn == 0) cn = NULL; } cb = (ClassBase *) cReg->hdl; if (cn == NULL) { for (it = cb->ht->ft->getFirst(cb->ht, (void **) &key, (void **) &cls); key && it && cls; it = cb->ht->ft->getNext(cb->ht, it, (void **) &key, (void **) &cls)) { if ((flgs & CMPI_FLAG_DeepInheritance) || cls->ft->getCharSuperClassName(cls) == NULL) { CMReturnInstance(rslt, (CMPIInstance *) cls); } } } else { cls = getClass(cReg, cn); if (cls == NULL) { st.rc = CMPI_RC_ERR_INVALID_CLASS; } else if ((flgs & CMPI_FLAG_DeepInheritance) == 0) { UtilList *ul = getChildren(cReg, cn); char *child; if (ul) for (child = (char *) ul->ft->getFirst(ul); child; child = (char *) ul->ft->getNext(ul)) { cls = getClass(cReg, child); CMReturnInstance(rslt, (CMPIInstance *) cls); } } else if (flgs & CMPI_FLAG_DeepInheritance) { loopOnChildren(cReg, cn, rslt); } } cReg->ft->rUnLock(cReg); _SFCB_RETURN(st); }