static CMPIConstClass * getResolvedClass(ClassRegister * cr, const char *clsName, ClassRecord * crec, ReadCtl * rctl) { _SFCB_ENTER(TRACE_PROVIDERS, "getResolvedClass"); _SFCB_TRACE(1, ("--- classname %s cReg %p", clsName, cr)); CMPIConstClass *cc = NULL, *cls; ReadCtl ctl = *rctl; ClassBase *cb = (ClassBase *) cr->hdl; if (crec == NULL) { crec = cb->ht->ft->get(cb->ht, clsName); if (crec == NULL) _SFCB_RETURN(NULL); } if (crec->cachedRCls == NULL) { cls = getClass(cr, clsName, &ctl); ClClass *ccl = (ClClass *) cls->hdl; if (ccl->hdr.type == HDR_Class) return cls; char *pn = (char *) cls->ft->getCharSuperClassName(cls); if (pn == NULL) { *rctl = ctl; return cls; } ClClass *mc = ClClassNew(clsName, pn); cc = NEW(CMPIConstClass); cc->ft = CMPIConstClassFT; cc->hdl = mc; // printf("#-# merging %s %s\n",clsName,pn); mergeParents(cr, mc, pn, cls, rctl); if (*rctl == tempRead) _SFCB_RETURN(cc); crec->cachedRCls = cc; cb->cachedRCount++; if (cb->cachedRCount >= cSize) pruneRCache(cr); /* should this be checking rSize? */ ENQ_TOP_LIST(crec, cb->firstRCached, cb->lastRCached, nextRCached, prevRCached); } else { // printf("-#- class %s in resolved cache // %p\n",clsName,crec->cachedRCls); if (crec != cb->firstRCached) { DEQ_FROM_LIST(crec, cb->firstRCached, cb->lastRCached, nextRCached, prevRCached); ENQ_TOP_LIST(crec, cb->firstRCached, cb->lastRCached, nextRCached, prevRCached); } } *rctl = cached; _SFCB_RETURN(crec->cachedRCls); }
static CMPIStatus addClass(ClassRegister * cr, CMPIConstClass * ccp, char *cn, char *p) { CMPIStatus st = { CMPI_RC_OK, NULL }; ClassBase *cb = (ClassBase *) (cr + 1); UtilHashTable *it = cb->it; UtilList *ul; char *pn = p; CMPIConstClass *cc = ccp; ClClass *mc; if (p) { mc = ClClassNew(cn, p); st = mergeParents(cr, mc, pn, ccp); if (st.rc != CMPI_RC_OK) { ClClassFreeClass(mc); return st; } ccp->hdl = mc; } cc = ccp->ft->clone(ccp, NULL); mc = (ClClass *) cc->hdl; cb->ht->ft->put(cb->ht, strdup(cn), cc); if (cc->ft->isAssociation(cc)) { cr->assocs++; if (p == NULL) cr->topAssocs++; } if (p) { ul = it->ft->get(it, p); if (ul == NULL) { ul = UtilFactory->newList(NULL, memUnlinkEncObj); it->ft->put(it, p, ul); } ul->ft->prepend(ul, cn); } return st; }
static int sfcb_add_class(FILE * f, hashentry * he, class_entry * ce, int endianMode) { /* SFCB related */ ClClass * sfcbClass; ClClass * sfcbClassRewritten; ClProperty * sfcbProp; ClMethod * sfcbMeth; ClParameter * sfcbParam; CMPIParameter param; CMPIData data; int prop_id; int meth_id; int meth_param_id; int size; /* Symtab related */ qual_chain * quals = ce -> class_quals; prop_chain * props = ce -> class_props; method_chain * meths = ce -> class_methods; param_chain * meth_params; /* postfix processing - recursive */ if ( ce -> class_parent) { sfcb_add_class( f, he, ce -> class_parent, endianMode ); } if ( htlookup(he, upstrdup(ce -> class_id, strlen(ce -> class_id)), strlen(ce -> class_id)) == NULL ) { if (sfcb_options & BACKEND_VERBOSE) { fprintf(stderr," adding class %s \n", ce -> class_id ); } /* remember we did this class already */ htinsert(he, upstrdup(ce -> class_id, strlen(ce -> class_id)), strlen(ce -> class_id), (void *)1); sfcbClass = ClClassNew( ce -> class_id, ce -> class_parent ? ce -> class_parent -> class_id : NULL ); if (sfcbClass == NULL) { fprintf(stderr,"Error: could not create SFCB class for %s\n",ce -> class_id); return 1; } while (quals) { if (sfcb_options & BACKEND_VERBOSE) { fprintf(stderr," adding qualifier %s for class %s \n", quals -> qual_id, ce -> class_id ); } if (!skipQuals(quals)) { ClClassAddQualifier(&sfcbClass->hdr, &sfcbClass->qualifiers, quals->qual_id, make_cmpi_data(quals->qual_qual->qual_type, quals->qual_qual->qual_array, quals->qual_vals)); } quals = quals -> qual_next; } while (props) { if (sfcb_options & BACKEND_VERBOSE) { if (props->prop_attr & PROPERTY_KEY) fprintf(stderr," adding key property %s for class %s \n", props -> prop_id, ce -> class_id ); else fprintf(stderr," adding property %s for class %s \n", props -> prop_id, ce -> class_id ); } data = make_cmpi_data(props->prop_type, props->prop_array, props->prop_value); prop_id = ClClassAddProperty(sfcbClass, props->prop_id, data, data.type == CMPI_ref ? props->prop_type.type_ref->class_id : NULL); if (prop_id == 0) { fprintf(stderr,"Error: could not add SFCB class property %s for %s\n", props -> prop_id, ce -> class_id); return 1; } quals = props -> prop_quals; sfcbProp=((ClProperty*)ClObjectGetClSection(&sfcbClass->hdr,&sfcbClass->properties))+prop_id-1; while (quals) { if (!skipQuals(quals)) { if (sfcb_options & BACKEND_VERBOSE) { fprintf(stderr," adding qualifier %s for property %s in class %s\n", quals -> qual_id, props -> prop_id, ce -> class_id ); } ClClassAddPropertyQualifier(&sfcbClass->hdr, sfcbProp, quals->qual_id, make_cmpi_data(quals->qual_qual->qual_type, quals->qual_qual->qual_array, quals->qual_vals)); } quals = quals -> qual_next; } props = props -> prop_next; } while (meths) { meth_id = ClClassAddMethod(sfcbClass, meths->method_id, make_cmpi_type(meths->method_type, meths->method_array)); quals = meths->method_quals; sfcbMeth=((ClMethod*)ClObjectGetClSection(&sfcbClass->hdr,&sfcbClass->methods))+meth_id-1; while(quals) { if (!skipQuals(quals)) { ClClassAddMethodQualifier(&sfcbClass->hdr, sfcbMeth, quals->qual_id, make_cmpi_data(quals->qual_qual->qual_type, quals->qual_qual->qual_array, quals->qual_vals)); } quals = quals->qual_next; } meth_params = meths->method_params; while(meth_params && meth_params->param_id) { param.type = make_cmpi_type(meth_params->param_type, meth_params->param_array); param.arraySize = meth_params->param_array; if((param.type == CMPI_ref || param.type == CMPI_refA) && meth_params->param_type.type_ref) { param.refName = meth_params->param_type.type_ref->class_id; } else { param.refName = NULL; } meth_param_id = ClClassAddMethParameter(&sfcbClass->hdr, sfcbMeth, meth_params->param_id, param); quals = meth_params->param_quals; sfcbParam=((ClParameter*)ClObjectGetClSection(&sfcbClass->hdr,&sfcbMeth->parameters))+meth_param_id-1; while(quals) { if (!skipQuals(quals)) { ClClassAddMethParamQualifier(&sfcbClass->hdr, sfcbParam, quals->qual_id, make_cmpi_data(quals->qual_qual->qual_type, quals->qual_qual->qual_array, quals->qual_vals)); } quals = quals->qual_next; } meth_params = meth_params->param_next; } meths = meths->method_next; } sfcbClassRewritten = ClClassRebuildClass(sfcbClass,NULL); if (opt_reduced) { sfcbClassRewritten->hdr.type = HDR_IncompleteClass; } size=sfcbClassRewritten->hdr.size; if (swapMode) { void *tmp=sfcbClassRewritten; sfcbClassRewritten = swapEntryClass(sfcbClassRewritten,&size); free(tmp); } fwrite(sfcbClassRewritten,size,1,f); free(sfcbClassRewritten); } return 0; }