Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}