From: Adrian S. <a3s...@us...> - 2005-04-25 14:40:51
|
Update of /cvsroot/sblim/sfcb In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31466 Modified Files: cimXmlGen.c cimXmlOps.y cimXmlParser.c cimXmlParser.h cimXmlRequest.c classProvider.c objectImpl.c objectImpl.h objectpath.c providerDrv.c trace.c Log Message: Updated createClass support - classes can be dynamically added and will be appended to classSchema file bug 1181968 should be fixed now Index: cimXmlOps.y =================================================================== RCS file: /cvsroot/sblim/sfcb/cimXmlOps.y,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- cimXmlOps.y 11 Apr 2005 22:04:46 -0000 1.3 +++ cimXmlOps.y 25 Apr 2005 14:40:41 -0000 1.4 @@ -172,20 +172,14 @@ XtokNamedInstance xtokNamedInstance; XtokProperty xtokProperty; - XtokPropertyPart xtokPropertyPart; - XtokPropertyPartList xtokPropertyPartList; + XtokPropertyData xtokPropertyData; XtokMethod xtokMethod; - XtokMethodPart xtokMethodPart; - XtokMethodPartList xtokMethodPartList; - + XtokMethodData xtokMethodData; XtokQualifier xtokQualifier; XtokParamValue xtokParamValue; XtokParam xtokParam; -/* XtokParamPart xtokParamPart; - XtokParamPartList xtokParamPartList; -*/ XtokMethodCall xtokMethodCall; XtokGetClassParmsList xtokGetClassParmsList; @@ -223,7 +217,7 @@ XtokEnumInstanceNames xtokEnumInstanceNames; XtokEnumInstances xtokEnumInstances; - XtokEnumInstancesParmsList xtokEnumInstancesParmsList; + XtokEnumInstancesParmsList xtokEnumInstancesParmsList; XtokEnumInstancesParms xtokEnumInstancesParms; XtokExecQuery xtokExecQuery; @@ -399,7 +393,7 @@ %token <className> XTOK_IP_RESULTROLE %token <className> XTOK_IP_QUERY %token <className> XTOK_IP_QUERYLANG -%token <clasz> XTOK_IP_CLASS +%token <class> XTOK_IP_CLASS %token <xtokPropertyList> XTOK_IP_PROPERTYLIST %type <boolValue> boolValue @@ -420,13 +414,11 @@ %token <xtokProperty> XTOK_PROPERTYREFERENCE %token <intValue> ZTOK_PROPERTYREFERENCE -%type <xtokPropertyPart> propertyPart -%type <xtokPropertyPart> propertyReferencePart -%type <xtokPropertyPartList> propertyPartList -%type <xtokPropertyPartList> propertyReferencePartList +%type <xtokPropertyData> propertyData +%type <xtokProperty> property %token <xtokParam> XTOK_PARAM -%type <xtokParam> param +%type <xtokParam> parameter %token <intValue> ZTOK_PARAM %token <xtokParam> XTOK_PARAMARRAY %token <intValue> ZTOK_PARAMARRAY @@ -435,27 +427,20 @@ %token <xtokParam> XTOK_PARAMREFARRAY %token <intValue> ZTOK_PARAMREFARRAY -%token <xtokMethodPart> XTOK_METHODPART -%type <xtokMethodPart> methodPart -%token <intValue> ZTOK_METHODPART - -%token <xtokMethodPartList> XTOK_METHODPARTLIST -%type <xtokMethodPartList> methodPartList -%token <intValue> ZTOK_METHODPARTLIST - -%token <xtokMethod> XTOK_METHODDEF -//%type <xtokMethod> methodDef -%token <intValue> ZTOK_METHODDEF +%token <xtokMethod> XTOK_METHOD +%type <xtokMethod> method +%token <intValue> ZTOK_METHOD +%type <xtokMethodData> methodData %token <xtokClass> XTOK_CLASS %token <intValue> ZTOK_CLASS -%type <xtokClass> clasz -%type <xtokClassParts> classParts +%type <xtokClass> class +%type <xtokClassData> classData %token <xtokInstance> XTOK_INSTANCE %token <intValue> ZTOK_INSTANCE %type <xtokInstance> instance -%type <xtokInstanceParts> instanceParts +%type <xtokInstanceData> instanceData %type <xtokParamValue> paramValue %token <xtokParamValue> XTOK_PARAMVALUE @@ -990,7 +975,7 @@ ; createClassParm - : XTOK_IP_CLASS clasz ZTOK_IPARAMVALUE + : XTOK_IP_CLASS class ZTOK_IPARAMVALUE { $$.cls = $2; } @@ -1802,109 +1787,83 @@ * class */ - -clasz - : XTOK_CLASS ZTOK_CLASS - { - memset(&$$.properties,0,sizeof($$.properties)); - memset(&$$.qualifiers,0,sizeof($$.qualifiers)); - memset(&$$.methods,0,sizeof($$.methods)); - } - | XTOK_CLASS classPartsList ZTOK_CLASS - { - $$.properties=((ParserControl*)parm)->properties; - $$.qualifiers=((ParserControl*)parm)->qualifiers; - $$.methods=((ParserControl*)parm)->methods; - } -; - -classPartsList - : classParts - { - printf("classPartsList: \n"); - } - | classPartsList classParts +class + : XTOK_CLASS classData ZTOK_CLASS { - printf("classPartsList classParts: \n"); + if (((ParserControl*)parm)->Qs) + $$.qualifiers=((ParserControl*)parm)->qualifiers; + else memset(&$$.qualifiers,0,sizeof($$.qualifiers)); + if (((ParserControl*)parm)->Ps) + $$.properties=((ParserControl*)parm)->properties; + else memset(&$$.properties,0,sizeof($$.properties)); + if (((ParserControl*)parm)->Ms) + $$.methods=((ParserControl*)parm)->methods; + else memset(&$$.methods,0,sizeof($$.methods)); } ; - -classParts - : qualifier - { - printf("classParts qualifier: \n"); - addQualifier(&(((ParserControl*)parm)->qualifiers),&$1); - } - | XTOK_PROPERTY propertyPartList ZTOK_PROPERTY +classData + : /* empty */ {;} + | classData qualifier { - $1.value=$2.value; - $1.propType=typeProperty_Value; - addProperty(&(((ParserControl*)parm)->properties),&$1); + ((ParserControl*)parm)->Qs++; + addQualifier(&(((ParserControl*)parm)->qualifiers),&$2); } - | XTOK_PROPERTYREFERENCE propertyReferencePartList ZTOK_PROPERTYREFERENCE - { - $1.ref=$2.ref; - $1.propType=typeProperty_Reference; - addProperty(&(((ParserControl*)parm)->properties),&$1); - } - | XTOK_METHODDEF methodPartList - { - printf("classParts: method ?\n"); - addMethod(&(((ParserControl*)parm)->methods),&$1); - } -; - -methodPartList - : methodPart - { - printf("methodPartList: \n"); - if ($1.qPart==1) - addQualifier(&($$.qualifiers),&$1.qualifier); - else addParam(&($$.params), &$1.param); + | classData property { + ((ParserControl*)parm)->Ps++; + addProperty(&(((ParserControl*)parm)->properties),&$2); } - | methodPartList methodPart - { - printf("methodPartList methodPart: \n"); - if ($2.qPart==1) - addQualifier(&($$.qualifiers),&$2.qualifier); - else addParam(&($$.params), &$2.param); + | classData method { + ((ParserControl*)parm)->Ms++; + addMethod(&(((ParserControl*)parm)->methods),&$2); } ; -methodPart - : ZTOK_METHODDEF - { - printf("methodPart: ZTOK_METHODDEF\n"); - $$.qPart=-1; - } - | qualifier - { - printf("methodPart: qualifier\n"); - $$.qPart=1; - $$.qualifier=$1; - } - | XTOK_PARAM param +method + : XTOK_METHOD methodData ZTOK_METHOD { - $$.qPart=0; - $$.param=$1; - } + if (((ParserControl*)parm)->MQs) + $$.qualifiers=$2.qualifiers; + else memset(&$$.qualifiers,0,sizeof($$.qualifiers)); + if (((ParserControl*)parm)->MPs) + $$.params=$2.params; + else memset(&$$.params,0,sizeof($$.params)); + ((ParserControl*)parm)->MQs=0; + ((ParserControl*)parm)->MPs=0; + ((ParserControl*)parm)->MPQs=0; + } ; -param - : ZTOK_PARAM +methodData + : /* empty */ {;} + | methodData qualifier { - printf("param: ZTOK_PARAM\n"); - } - | qualifier + if (((ParserControl*)parm)->MQs==0) + memset(&$$.qualifiers,0,sizeof($$.qualifiers)); + ((ParserControl*)parm)->MQs++; + addQualifier(&($$.qualifiers),&$2); + } + | methodData XTOK_PARAM parameter ZTOK_PARAM { - printf("param: qualifier\n"); - addQualifier(&($$.qualifiers),&$1); - } - | param qualifier + if (((ParserControl*)parm)->MPs==0) + memset(&$$.params,0,sizeof($$.params)); + ((ParserControl*)parm)->MPs++; + if (((ParserControl*)parm)->MPQs) + $2.qualifiers=$3.qualifiers; + else memset(&$2.qualifiers,0,sizeof($2.qualifiers)); + addParam(&($$.params),&$2); + ((ParserControl*)parm)->MPQs=0; + } +; + +parameter + : /* empty */ {;} + | parameter qualifier { - printf("param qualifier: \n"); - addQualifier(&($$.qualifiers),&$2); + if (((ParserControl*)parm)->MPQs==0) + memset(&$$.qualifiers,0,sizeof($$.qualifiers)); + ((ParserControl*)parm)->MPQs++; + addQualifier(&($$.qualifiers),&$2); } ; @@ -1913,117 +1872,86 @@ * instance */ - instance - : XTOK_INSTANCE ZTOK_INSTANCE - { - memset(&$$.properties,0,sizeof($$.properties)); - memset(&$$.qualifiers,0,sizeof($$.qualifiers)); - } - | XTOK_INSTANCE instancePartsList ZTOK_INSTANCE + : XTOK_INSTANCE instanceData ZTOK_INSTANCE { - $$.properties=((ParserControl*)parm)->properties; - $$.qualifiers=((ParserControl*)parm)->qualifiers; + if (((ParserControl*)parm)->Qs) + $$.qualifiers=((ParserControl*)parm)->qualifiers; + else memset(&$$.qualifiers,0,sizeof($$.qualifiers)); + if (((ParserControl*)parm)->Ps) + $$.properties=((ParserControl*)parm)->properties; + else memset(&$$.properties,0,sizeof($$.properties)); } ; -instancePartsList - : instanceParts +instanceData + : /* empty */ {;} + | instanceData qualifier { + ((ParserControl*)parm)->Qs++; + addQualifier(&(((ParserControl*)parm)->qualifiers),&$2); } - | instancePartsList instanceParts + | instanceData property { + ((ParserControl*)parm)->Ps++; + addProperty(&(((ParserControl*)parm)->properties),&$2); } ; -instanceParts - : qualifier - { - addQualifier(&(((ParserControl*)parm)->qualifiers),&$1); - } - | XTOK_PROPERTY propertyPartList ZTOK_PROPERTY - { - $1.value=$2.value; - $1.propType=typeProperty_Value; - addProperty(&(((ParserControl*)parm)->properties),&$1); - } - | XTOK_PROPERTYREFERENCE propertyReferencePartList ZTOK_PROPERTYREFERENCE - { - $1.ref=$2.ref; - $1.propType=typeProperty_Reference; - addProperty(&(((ParserControl*)parm)->properties),&$1); - } -; - +/* + * property +*/ -propertyPartList - : propertyPart - { - if ($1.qPart) { - addQualifier(&($$.qualifiers),&$1.qualifier); - } - else { - $$.value=$1.value; - } - } - | propertyPartList propertyPart +property + : XTOK_PROPERTY propertyData ZTOK_PROPERTY { - if ($2.qPart) { - addQualifier(&($$.qualifiers),&$2.qualifier); - } - else { - $$.value=$1.value; // should this be $$.value=$2.value; - } - } + $$.val=$2; + } ; -propertyPart - : qualifier +propertyData + : propertyData qualifier { - $$.qPart=1; - $$.qualifier=$1; + addQualifier(&(((ParserControl*)parm)->qualifiers),&$2); } | value { +// printf("--- value: %s\n",$1.value); $$.value=$1.value; - $$.qPart=0; } -; - - -propertyReferencePartList - : propertyReferencePart + | valueReference { - if ($1.qPart) { - addQualifier(&($$.qualifiers),&$1.qualifier); - } - else { - $$.ref=$1.ref; - } + $$.ref=$1; } - | propertyReferencePartList propertyReferencePart +; + +propertyArray + : XTOK_PROPERTYARRAY ZTOK_PROPERTYARRAY { - if ($2.qPart) { - addQualifier(&($$.qualifiers),&$2.qualifier); - } - else { - $$.ref=$1.ref; // should this be $$.ref=$2.ref; ? - } + printf("--- propertyArray\n"); } ; -propertyReferencePart - : qualifier +propertyList + : XTOK_VALUEARRAY valueArray ZTOK_VALUEARRAY { - $$.qPart=1; - $$.qualifier=$1; - } - | valueReference + $2.values[$2.next]=NULL; + $$.list=$2; + } +; + + +/* + * qualifier +*/ + +qualifier + : XTOK_QUALIFIER value ZTOK_QUALIFIER { - $$.qPart=0; - $$.ref=$1; - } +// printf("--- qualifier %s: %s\n",$1.name,$2.value); + $$.value=$2.value; + } ; @@ -2042,12 +1970,7 @@ } ; -qualifier - : XTOK_QUALIFIER value ZTOK_QUALIFIER - { - $$.value=$2.value; - } -; + /* * localNameSpacePath Index: cimXmlRequest.c =================================================================== RCS file: /cvsroot/sblim/sfcb/cimXmlRequest.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- cimXmlRequest.c 11 Apr 2005 23:13:41 -0000 1.5 +++ cimXmlRequest.c 25 Apr 2005 14:40:42 -0000 1.6 @@ -49,19 +49,6 @@ extern UtilStringBuffer *instanceToString(CMPIInstance * ci, char **props); extern const char *getErrorId(int c); extern const char *instGetClassName(CMPIInstance * ci); -extern int ClClassGetPropertyAt(ClClass * inst, int id, CMPIData * data, - char **name, unsigned long *quals); -extern int ClClassGetPropertyCount(ClClass * inst); -extern int ClClassGetQualifierCount(ClClass * cls); -extern int ClClassGetQualifierAt(ClClass * cls, int id, CMPIData * data, - char **name); -extern int ClInstanceGetPropertyCount(ClInstance * inst); -extern int ClInstanceGetPropertyAt(ClInstance * inst, int id, CMPIData * data, - char **name, unsigned long *quals); -extern int ClClassGetPropQualifierCount(ClClass * cls, int p); -extern int ClClassGetPropQualifierAt(ClClass * cls, int p, int id, - CMPIData * data, char **name); -extern const char *ClGetStringData(CMPIInstance * ci, int id); extern CMPIData opGetKeyCharsAt(CMPIObjectPath * cop, unsigned int index, const char **name, CMPIStatus * rc); @@ -80,7 +67,7 @@ extern CMPIStatus arraySetElementNotTrackedAt(CMPIArray * array, CMPICount index, CMPIValue * val, CMPIType type); extern QLStatement *parseQuery(int mode, char *query, char *lang, char *sns, int *rc); - +extern CMPIConstClass initConstClass(ClClass *cl); const char *opGetClassNameChars(CMPIObjectPath * cop); static char *cimMsg[] = { @@ -415,7 +402,7 @@ object=relocateSerializedConstClass(resp[i]->object[j].data); } // rc=CMSetArrayElementAt(ar, c, &object, binCtx->type); - rc=arraySetElementNotTrackedAt(ar,c, &object, binCtx->type); + rc=arraySetElementNotTrackedAt(ar,c, (CMPIValue*)&object, binCtx->type); } } @@ -564,18 +551,6 @@ _SFCB_RETURN(ctxErrResponse(hdr, &binCtx,0)); } -extern int ClClassAddQualifier(ClObjectHdr * hdr, ClSection * qlfs, - const char *id, CMPIData d); -extern int ClClassAddProperty(ClClass * cls, const char *id, CMPIData d); -extern void *ClObjectGetClSection(ClObjectHdr * hdr, ClSection * s); -extern int ClClassAddPropertyQualifier(ClObjectHdr * hdr, ClProperty * p, - const char *id, CMPIData d); -extern ClClass *ClClassNew(const char *cn, const char *pa); -extern ClClass *ClClassRebuildClass(ClClass * cls, void *area); -extern void ClClassFreeClass(ClClass * cls); -extern char *ClClassToString(ClClass * cls); -extern CMPIConstClass initConstClass(ClClass *cl); - static RespSegments createClass(CimXmlRequestContext * ctx, RequestHdr * hdr) { _SFCB_ENTER(TRACE_CIMXMLPROC, "createClass"); @@ -589,12 +564,15 @@ XtokProperty *p = NULL; XtokProperties *ps = NULL; - XtokQualifiers *qs = NULL; XtokQualifier *q = NULL; + XtokQualifiers *qs = NULL; + XtokMethod *m = NULL; + XtokMethods *ms = NULL; + XtokParam *r = NULL; + XtokParams *rs = NULL; XtokClass *c; CMPIData d; - - printf("--- createClass request\n"); + CMPIParameter pa; memset(&binCtx,0,sizeof(BinRequestContext)); XtokCreateClass *req = (XtokCreateClass *) hdr->cimRequest; @@ -602,7 +580,6 @@ path = NewCMPIObjectPath(req->op.nameSpace.data, req->op.className.data, NULL); cl = ClClassNew(req->op.className.data, req->superClass ? req->superClass : NULL); - cls=initConstClass(cl); c=&req->cls; qs=&c->qualifiers; @@ -618,11 +595,11 @@ ClProperty *prop; int propId; d.state=CMPI_goodValue; - d.value=str2CMPIValue(p->valueType,p->value,NULL); + d.value=str2CMPIValue(p->valueType,p->val.value,&p->val.ref); d.type=p->valueType; propId=ClClassAddProperty(cl, p->name, d); - qs=&p->qualifiers; + qs=&p->val.qualifiers; prop=((ClProperty*)ClObjectGetClSection(&cl->hdr,&cl->properties))+propId-1; for (q=qs->first; q; q=q->next) { d.state=CMPI_goodValue; @@ -631,6 +608,44 @@ ClClassAddPropertyQualifier(&cl->hdr, prop, q->name, d); } } + + ms=&c->methods; + for (m=ms->first; m; m=m->next) { + ClMethod *meth; + ClParameter *parm; + int methId,parmId; + + methId=ClClassAddMethod(cl, m->name, m->type); + meth=((ClMethod*)ClObjectGetClSection(&cl->hdr,&cl->methods))+methId-1; + + qs=&m->qualifiers; + for (q=qs->first; q; q=q->next) { + d.state=CMPI_goodValue; + d.value=str2CMPIValue(q->type,q->value,NULL); + d.type=q->type; + ClClassAddMethodQualifier(&cl->hdr, meth, q->name, d); + } + + rs=&m->params; + for (r=rs->first; r; r=r->next) { + pa.type=r->type; + pa.arraySize=(unsigned int)r->arraySize; + pa.refName=r->refClass; + parmId=ClClassAddMethParameter(&cl->hdr, meth, r->name, pa); + parm=((ClParameter*)ClObjectGetClSection(&cl->hdr,&meth->parameters))+methId-1; + + qs=&r->qualifiers; + for (q=qs->first; q; q=q->next) { + d.state=CMPI_goodValue; + d.value=str2CMPIValue(q->type,q->value,NULL); + d.type=q->type; + ClClassAddMethParamQualifier(&cl->hdr, parm, q->name, d); + } + } + } + + cl = ClClassRebuildClass(cl,NULL); + cls=initConstClass(cl); sreq.principal = setCharsMsgSegment(ctx->principal); sreq.path = setObjectPathMsgSegment(path); @@ -645,7 +660,6 @@ _SFCB_TRACE(1, ("--- Getting Provider context")); irc = getProviderContext(&binCtx, (OperationHdr *) req); - printf("--- Getting Provider context %d\n",irc); _SFCB_TRACE(1, ("--- Provider context gotten")); if (irc == MSG_X_PROVIDER) { @@ -916,7 +930,7 @@ inst = NewCMPIInstance(path, NULL); for (p = req->instance.properties.first; p; p = p->next) { - val = str2CMPIValue(p->valueType, p->value, &p->ref); + val = str2CMPIValue(p->valueType, p->val.value, &p->val.ref); CMSetProperty(inst, p->name, &val, p->valueType); } @@ -994,7 +1008,7 @@ inst = NewCMPIInstance(path, NULL); for (p = xci->properties.first; p; p = p->next) { - val = str2CMPIValue(p->valueType, p->value, &p->ref); + val = str2CMPIValue(p->valueType, p->val.value, &p->val.ref); CMSetProperty(inst, p->name, &val, p->valueType); } sreq->instance = setInstanceMsgSegment(inst); Index: trace.c =================================================================== RCS file: /cvsroot/sblim/sfcb/trace.c,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- trace.c 9 Mar 2005 12:25:14 -0000 1.1.1.1 +++ trace.c 25 Apr 2005 14:40:42 -0000 1.2 @@ -64,6 +64,8 @@ {"sockets", TRACE_SOCKETS}, {"memoryMgr", TRACE_MEMORYMGR}, {"msgQueue", TRACE_MSGQUEUE}, + {"msgQueue", TRACE_MSGQUEUE}, + {"xmlParsing", TRACE_XMLPARSING}, {NULL,0} }; Index: cimXmlGen.c =================================================================== RCS file: /cvsroot/sblim/sfcb/cimXmlGen.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- cimXmlGen.c 13 Apr 2005 15:06:52 -0000 1.4 +++ cimXmlGen.c 25 Apr 2005 14:40:41 -0000 1.5 @@ -38,27 +38,12 @@ #include "queryOperation.h" extern const char *instGetClassName(CMPIInstance * ci); -extern int ClClassGetPropertyAt(ClClass * inst, int id, CMPIData * data, - char **name, unsigned long *quals); -extern int ClClassGetPropertyCount(ClClass * inst); -extern int ClClassGetQualifierCount(ClClass * cls); -extern int ClClassGetQualifierAt(ClClass * cls, int id, CMPIData * data, - char **name); -extern int ClInstanceGetPropertyCount(ClInstance * inst); -extern int ClInstanceGetPropertyAt(ClInstance * inst, int id, CMPIData * data, - char **name, unsigned long *quals); -extern int ClClassGetPropQualifierCount(ClClass * cls, int p); -extern int ClClassGetPropQualifierAt(ClClass * cls, int p, int id, - CMPIData * data, char **name); -extern const char *ClGetStringData(CMPIInstance * ci, int id); - extern CMPIData opGetKeyCharsAt(CMPIObjectPath * cop, unsigned int index, const char **name, CMPIStatus * rc); const char *opGetClassNameChars(CMPIObjectPath * cop); - char *XMLEscape(char *in) { int i, l; @@ -442,6 +427,21 @@ _SFCB_RETURN(0); } +static void method2xml(CMPIType type, CMPIString *name, char *bTag, char *eTag, + UtilStringBuffer * sb, UtilStringBuffer * qsb) +{ + _SFCB_ENTER(TRACE_CIMXMLPROC, "method2xml"); + sb->ft->appendChars(sb, bTag); + sb->ft->appendChars(sb, (char *) name->hdl); + sb->ft->appendChars(sb, "\" TYPE=\""); + sb->ft->appendChars(sb, dataType(type)); + sb->ft->appendChars(sb, "\">\n"); + if (qsb) sb->ft->appendChars(sb, (char *) qsb->hdl); + sb->ft->appendChars(sb, eTag); + + _SFCB_EXIT(); +} + static void data2xml(CMPIData * data, void *obj, CMPIString * name, char *bTag, char *eTag, UtilStringBuffer * sb, UtilStringBuffer * qsb, int inst, int param) { @@ -459,8 +459,7 @@ else sb->ft->appendChars(sb, "\" TYPE=\""); sb->ft->appendChars(sb, dataType(data->type)); sb->ft->appendChars(sb, "\">\n"); - if (qsb) - sb->ft->appendChars(sb, (char *) qsb->hdl); + if (qsb) sb->ft->appendChars(sb, (char *) qsb->hdl); if (data->state == 0) { sb->ft->appendChars(sb, "<VALUE.ARRAY>\n"); for (j = 0; j < ac; j++) { @@ -480,8 +479,7 @@ sb->ft->appendChars(sb, "\" REFERENCECLASS=\""); sb->ft->appendChars(sb, opGetClassNameChars(data->value.ref)); sb->ft->appendChars(sb, "\">\n"); - if (qsb) - sb->ft->appendChars(sb, (char *) qsb->hdl); + if (qsb) sb->ft->appendChars(sb, (char *) qsb->hdl); if (inst) { sb->ft->appendChars(sb, "<VALUE.REFERENCE>\n"); sb->ft->appendChars(sb, "<INSTANCEPATH>\n"); @@ -505,7 +503,7 @@ sb->ft->appendChars(sb,"<QUALIFIER NAME=\"EmbeddedObject\" TYPE=\"boolean\">\n" "<VALUE>TRUE</VALUE>\n</QUALIFIER>\n"); sb->ft->appendChars(sb, "<VALUE>"); - sp = XMLEscape(eo); + sp = XMLEscape((char*)eo); if (sp) freesp = 1; sb->ft->appendChars(sb, "<![CDATA["); sb->ft->appendChars(sb, sp); @@ -521,10 +519,8 @@ else sb->ft->appendChars(sb, "\" TYPE=\""); sb->ft->appendChars(sb, type); sb->ft->appendChars(sb, "\">\n"); - if (qsb) - sb->ft->appendChars(sb, (char *) qsb->hdl); - if (data->state == 0) - value2xml(*data, sb, 1); + if (qsb) sb->ft->appendChars(sb, (char *) qsb->hdl); + if (data->state == 0) value2xml(*data, sb, 1); sb->ft->appendChars(sb, eTag); } } @@ -560,13 +556,72 @@ "<VALUE>TRUE</VALUE>\n</QUALIFIER>\n"); } +static void param2xml(CMPIParameter *pdata, CMPIConstClass * cls, ClParameter *parm, CMPIString *pname, + UtilStringBuffer * sb, unsigned int flags) +{ + ClClass *cl = (ClClass *) cls->hdl; + int i, m; + CMPIData data; + CMPIString qname; + char *etag="</PARAMETER>\n"; + UtilStringBuffer *qsb = NULL; + + if (flags & FL_includeQualifiers) { + m = ClClassGetMethParamQualifierCount(cl,parm); + if (m) qsb = UtilFactory->newStrinBuffer(1024); + for (i = 0; i < m; i++) { + ClClassGetMethParamQualifierAt(cl, parm, i, &data, (char**)&qname.hdl); + data2xml(&data,cls,&qname,"<QUALIFIER NAME=\"","</QUALIFIER>\n",qsb,NULL,0,0); + } + } + + if (pdata->type==CMPI_ref) { + sb->ft->appendChars(sb, "<PARAMETER.REFERENCE NAME=\""); + sb->ft->appendChars(sb, (char*)pname->hdl); + if (pdata->refName) { + sb->ft->appendChars(sb, "\" REFERENCECLASS=\""); + sb->ft->appendChars(sb, pdata->refName); + } + sb->ft->appendChars(sb, "\"\n"); + etag="</PARAMETER.REFERENCE>\n"; + } + else if (pdata->type==CMPI_refA) { + sb->ft->appendChars(sb, "<PARAMETER.REFARRAY NAME=\""); + sb->ft->appendChars(sb, (char*)pname->hdl); + fprintf(stderr,"*** PARAMETER.REFARRAY not implemenetd\n"); + abort(); + etag="</PARAMETER.REFARRAY>\n"; + } + else { + if (pdata->type&CMPI_ARRAY) { + char size[128]; + sb->ft->appendChars(sb, "<PARAMETER.ARRAY NAME=\""); + sb->ft->appendChars(sb, (char*)pname->hdl); + sprintf(size,"\" ARRAYSIZE=\"%d\"",pdata->arraySize); + sb->ft->appendChars(sb, size); + etag="</PARAMETER.ARRAY>\n"; + } + else { + sb->ft->appendChars(sb, "<PARAMETER NAME=\""); + sb->ft->appendChars(sb, (char*)pname->hdl); + } + sb->ft->appendChars(sb, "\" TYPE=\""); + sb->ft->appendChars(sb, dataType(pdata->type)); + sb->ft->appendChars(sb, "\"\n"); + } + + if (qsb) sb->ft->appendChars(sb, (char *) qsb->hdl); + sb->ft->appendChars(sb, etag); +} + int cls2xml(CMPIConstClass * cls, UtilStringBuffer * sb, unsigned int flags) { ClClass *cl = (ClClass *) cls->hdl; - int i, q, m, qm; + int i, m, q, qm, p, pm; char *type, *superCls; CMPIString *name, *qname; - CMPIData data, qdata;static + CMPIData data, qdata; + CMPIType mtype; unsigned long quals; UtilStringBuffer *qsb = UtilFactory->newStrinBuffer(1024); @@ -608,6 +663,32 @@ } CMRelease(name); } + + for (i = 0, m = ClClassGetMethodCount(cl); i < m; i++) { + ClMethod *meth; + ClParameter *parm; + CMPIString name,mname; + qsb->ft->reset(qsb); + ClClassGetMethodAt(cl, i, &mtype, (char**)&mname.hdl, &quals); + meth=((ClMethod*)ClObjectGetClSection(&cl->hdr,&cl->methods))+i; + + if (flags & FL_includeQualifiers) { + for (q = 0, qm = ClClassGetMethQualifierCount(cl, i); q < qm; q++) { + ClClassGetMethQualifierAt(cl, meth, q, &qdata, (char**)&name.hdl); + data2xml(&qdata,cls,&name,"<QUALIFIER NAME=\"","</QUALIFIER>\n",qsb,NULL,0,0); + } + } + + for (p = 0, pm = ClClassGetMethParameterCount(cl, i); p < pm; p++) { + CMPIParameter pdata; + ClClassGetMethParameterAt(cl, meth, p, &pdata, (char**)&name.hdl); + parm=((ClParameter*)ClObjectGetClSection(&cl->hdr,&meth->parameters))+p; + param2xml(&pdata,cls,parm,&name,qsb,flags); + } + + method2xml(mtype,&mname,"<METHOD NAME=\"", "</METHOD>\n",sb, qsb); + } + sb->ft->appendChars(sb, "</CLASS>\n"); _SFCB_RETURN(0); Index: classProvider.c =================================================================== RCS file: /cvsroot/sblim/sfcb/classProvider.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- classProvider.c 12 Apr 2005 08:14:14 -0000 1.8 +++ classProvider.c 25 Apr 2005 14:40:42 -0000 1.9 @@ -56,11 +56,13 @@ struct _ClassRegister { void *hdl; Class_Register_FT *ft; + ClVersionRecord *vr; + int assocs,topAssocs; + char *fn; }; typedef struct _ClassRegister ClassRegister; typedef struct _ClassBase { - char *fn; UtilHashTable *ht; UtilHashTable *it; MRWLOCK mrwLock; @@ -83,27 +85,6 @@ static CMPIConstClass *getClass(ClassRegister * cr, const char *clsName); -extern ClClass *ClClassNew(const char *cn, const char *pa); -extern int ClClassAddQualifier(ClObjectHdr * hdr, ClSection * qlfs, - const char *id, CMPIData d); -extern int ClClassAddProperty(ClClass * cls, const char *id, CMPIData d); -extern void *ClObjectGetClSection(ClObjectHdr * hdr, ClSection * s); -extern int ClClassAddPropertyQualifier(ClObjectHdr * hdr, ClProperty * p, - const char *id, CMPIData d); -extern ClClass *ClClassRebuildClass(ClClass * cls, void *area); -extern void ClClassFreeClass(ClClass * cls); -extern char *ClClassToString(ClClass * cls); -extern CMPIConstClass initConstClass(ClClass *cl); -extern int ClClassGetQualifierAt(ClClass * cls, int id, CMPIData * data, char **name); -extern int ClClassGetQualifierCount(ClClass * cls); -extern int ClClassGetPropertyCount(ClClass * cls); -extern int ClClassGetPropertyAt(ClClass * cls, int id, CMPIData * data, char **name, - unsigned long *quals); -extern int ClClassGetPropQualifierCount(ClClass * cls, int id); -extern int ClClassGetPropQualifierAt(ClClass * cls, int id, int qid, CMPIData * data, - char **name); - -int assocs = 0, topAssocs = 0; typedef struct nameSpaces { int next,max,blen; @@ -142,7 +123,7 @@ static void release(ClassRegister * cr) { ClassBase *cb = (ClassBase *) cr->hdl; - free(cb->fn); + free(cr->fn); cb->ht->ft->release(cb->ht); free(cr); } @@ -187,9 +168,13 @@ char fin[1024]; long s, total=0; ClObjectHdr hdr; + ClVersionRecord *vrp=(ClVersionRecord*)&hdr; + int vRec=0,first=1; cr->hdl = cb; cr->ft = ClassRegisterFT; + cr->vr = NULL; + cr->assocs = cr->topAssocs = 0; strcpy(fin, fname); strcat(fin, "/classSchemas"); @@ -205,18 +190,23 @@ return cr; } - cb->fn = strdup(fin); + cr->fn = strdup(fin); cb->ht = UtilFactory->newHashTable(61, UtilHashTable_charKey | UtilHashTable_ignoreKeyCase); MRWInit(&cb->mrwLock); while ((s = fread(&hdr, 1, sizeof(hdr), in)) == sizeof(hdr)) { -// while ((s = fread(&size, 1, 4, in)) == 4) { CMPIConstClass *cc=NULL; char *buf=NULL; char *cn; - if (hdr.type!=HDR_Class) { + if (first) { + if (vrp->size==sizeof(ClVersionRecord) && vrp->type==HDR_Version && + strcmp(vrp->id,"sfcd-rep")==0) vRec=1; + first=0; + } + + if (vRec==0 && hdr.type!=HDR_Class) { fprintf(stderr,"--- %s contains non-class record(s) - directory skipped\n",fin); return NULL; } @@ -231,15 +221,21 @@ *((ClObjectHdr *) buf) = hdr; if (fread(buf + sizeof(hdr), 1, hdr.size - sizeof(hdr), in) == hdr.size - sizeof(hdr)) { + if (vRec) { + cr->vr=(ClVersionRecord*)buf; + continue; + } cc = NEW(CMPIConstClass); cc->hdl = buf; cc->ft = CMPIConstClassFT; cc->ft->relocate(cc); cn=(char*)cc->ft->getCharClassName(cc); - if (strncmp(cn,"DMY_",4)) { + if (strncmp(cn,"DMY_",4)!=0) { cb->ht->ft->put(cb->ht, cn, cc); - if (cc->ft->isAssociation(cc)) assocs++; - if (cc->ft->getCharSuperClassName(cc) == NULL) topAssocs++; + if (cc->ft->isAssociation(cc)) { + cr->assocs++; + if (cc->ft->getCharSuperClassName(cc) == NULL) cr->topAssocs++; + } } } else { @@ -248,27 +244,35 @@ } } - printf("--- ClassProvider for %s using %ld bytes\n", fname, total); + if (cr->vr) { + printf("--- ClassProvider for %s (%d.%d) using %ld bytes\n", + fname, cr->vr->version, cr->vr->level, total); + } + else printf("--- ClassProvider for %s (no-version) using %ld bytes\n", fname, total); buildInheritanceTable(cr); return cr; } -int cpyClass(ClClass *cl, CMPIConstClass *cc) +int cpyClass(ClClass *cl, CMPIConstClass *cc, unsigned char originId) { ClClass *ccl=(ClClass*)cc->hdl; CMPIData d; + CMPIParameter p; + CMPIType t; char *name; - int i,m,iq,mq,propId; + int i,m,iq,mq,ip,mp,propId,methId,parmId; unsigned long quals; ClProperty *prop; + ClMethod *meth; + ClParameter *parm; cl->quals |= ccl->quals; for (i=0,m=ClClassGetQualifierCount(ccl); i<m; i++) { ClClassGetQualifierAt(ccl,i,&d,&name); ClClassAddQualifier(&cl->hdr, &cl->qualifiers, name, d); - } + } for (i=0,m=ClClassGetPropertyCount(ccl); i<m; i++) { ClClassGetPropertyAt(ccl,i,&d,&name,&quals); @@ -280,6 +284,28 @@ ClClassAddPropertyQualifier(&cl->hdr, prop, name, d); } } + + for (i=0,m=ClClassGetMethodCount(ccl); i<m; i++) { + ClClassGetMethodAt(ccl,i,&t,&name,&quals); + methId=ClClassAddMethod(cl, name, t); + meth=((ClMethod*)ClObjectGetClSection(&cl->hdr,&cl->methods))+methId-1; + + for (iq=0,mq=ClClassGetMethQualifierCount(ccl,methId-1); iq<mq; iq++) { + ClClassGetMethQualifierAt(ccl, meth, iq, &d, &name); + ClClassAddMethodQualifier(&cl->hdr, meth, name, d); + } + + for (ip=0,mp=ClClassGetMethParameterCount(ccl,methId-1); ip<mp; ip++) { + ClClassGetMethParameterAt(ccl, meth, ip, &p, &name); + parmId=ClClassAddMethParameter(&cl->hdr, meth, name, p); + parm=((ClParameter*)ClObjectGetClSection(&cl->hdr,&meth->parameters))+parmId-1; + + for (iq=0,mq=ClClassGetMethParamQualifierCount(ccl,parm); iq<mq; iq++) { + ClClassGetMethParamQualifierAt(ccl, parm, iq, &d, &name); + ClClassAddMethParamQualifier(&cl->hdr, parm, name, d); + } + } + } return 0; } @@ -287,14 +313,16 @@ { CMPIStatus st = { CMPI_RC_OK, NULL }; CMPIConstClass *pcc=getClass(cr,p); + unsigned char originId=0; if (p) { char* np=(char*)cc->ft->getCharSuperClassName(pcc); + if (np) originId=ClClassAddGrandParent(cl,np); st=mergeParents(cr,cl,np,NULL); } - if (cc) cpyClass(cl,cc); - else cpyClass(cl,pcc); + if (cc) cpyClass(cl,cc,originId); + else cpyClass(cl,pcc,originId); return st; } @@ -305,21 +333,29 @@ UtilHashTable *it=cb->it; UtilList *ul; char *pn=p; - ClClass *mc; CMPIConstClass *cc=ccp; - + ClClass *mc; + FILE *rep; + if (p) { mc=ClClassNew(cn,p); - mergeParents(cr,mc,pn,cc); + mergeParents(cr,mc,pn,ccp); + ccp->hdl=mc; } - - cb->ht->ft->put(cb->ht, cn, cc); - if (cc->ft->isAssociation(cc)) assocs++; - if (p == NULL) topAssocs++; - - - - else { + cc=ccp->ft->clone(ccp,NULL); + mc=(ClClass*)cc->hdl; + + cb->ht->ft->put(cb->ht, strdup(cn), cc); + rep = fopen(cr->fn, "a"); + fwrite(mc,1,mc->hdr.size,rep); + fclose(rep); + + 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(); @@ -684,7 +720,7 @@ char *pn = (char*)cc->ft->getCharSuperClassName(cc); char *cn = (char*)cc->ft->getCharClassName(cc); - + cl = getClass(cReg,cn); if (cl) { st.rc = CMPI_RC_ERR_ALREADY_EXISTS; @@ -864,7 +900,7 @@ } else if (strcasecmp(methodName, "getassocs") == 0) { - ar = CMNewArray(_broker, topAssocs, CMPI_string, NULL); + ar = CMNewArray(_broker, cReg->topAssocs, CMPI_string, NULL); ClassBase *cb = (ClassBase *) (cReg + 1); UtilHashTable *ct = cb->ht; HashTableIterator *i; Index: objectImpl.h =================================================================== RCS file: /cvsroot/sblim/sfcb/objectImpl.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- objectImpl.h 12 Mar 2005 00:43:00 -0000 1.2 +++ objectImpl.h 25 Apr 2005 14:40:42 -0000 1.3 @@ -30,6 +30,20 @@ #define MALLOCED(a) (((a) & 0xff000000)!=0xff000000) +#define ClCurrentVersion 1 +#define ClCurrentLevel 0 +#define ClTypeClassRep 1 + +typedef struct { + unsigned long size; // used to determine endianes + unsigned short type; + char id[10]; // "sfcb-rep\0" used to determine asci/ebcdic char encoding + unsigned short version; + unsigned short level; + unsigned short options; + unsigned short reserved[5]; +} ClVersionRecord; + typedef struct { char *str; int used, max; @@ -53,6 +67,7 @@ #define HDR_Instance 2 #define HDR_ObjectPath 3 #define HDR_Args 4 +#define HDR_Version 128 long strBufOffset; long arrayBufOffset; } ClObjectHdr; @@ -67,11 +82,13 @@ typedef struct { ClObjectHdr hdr; - unsigned long quals; + unsigned char quals; #define ClClass_Q_Abstract 1 #define ClClass_Q_Association 2 #define ClClass_Q_Indication 4 #define ClClass_Q_Deprecated 8 + unsigned char parents; + unsigned short reserved; ClString name; ClString parent; ClSection qualifiers; @@ -94,9 +111,11 @@ typedef struct { ClObjectHdr hdr; - unsigned long quals; + unsigned char quals; #define ClInst_Q_Association 2 #define ClInst_Q_Indication 4 + unsigned char parents; + unsigned short reserved; ClString className; ClString nameSpace; ClSection qualifiers; @@ -135,16 +154,110 @@ CMPIData data; unsigned short flags; #define ClProperty_EmbeddedObjectAsString 1 - unsigned short quals; +#define ClProperty_Deleted 2 + unsigned char quals; #define ClProperty_Q_Key 1 #define ClProperty_Q_Propagated 2 #define ClProperty_Q_Deprecated 4 #define ClProperty_Q_EmbeddedObject 8 + unsigned char originId; ClSection qualifiers; } ClProperty; -const char *ClObjectPathGetNameSpace(ClObjectPath * op); -const char *ClObjectPathGetClassName(ClObjectPath * op); +typedef struct { + ClString id; + CMPIType type; + unsigned short flags; + unsigned char quals; + unsigned char originId; + ClSection qualifiers; + ClSection parameters; +} ClMethod; + +typedef struct { + CMPIType type; + unsigned int arraySize; + char *refName; +} CMPIParameter; +typedef struct { + ClString id; + CMPIParameter parameter; + unsigned short quals; + ClSection qualifiers; +} ClParameter; + +/* objectImpl.c */ + +extern const char *ClObjectGetClString(ClObjectHdr *hdr, ClString *id); +extern const CMPIData *ClObjectGetClArray(ClObjectHdr *hdr, ClArray *id); +extern void *ClObjectGetClSection(ClObjectHdr *hdr, ClSection *s); +extern int ClClassAddQualifier(ClObjectHdr *hdr, ClSection *qlfs, const char *id, CMPIData d); +extern int ClClassAddPropertyQualifier(ClObjectHdr *hdr, ClProperty *p, const char *id, CMPIData d); +extern int ClClassAddMethodQualifier(ClObjectHdr *hdr, ClMethod *m, const char *id, CMPIData d); +extern int ClClassAddMethParamQualifier(ClObjectHdr *hdr, ClParameter *p,const char *id, CMPIData d); +extern int ClClassGetQualifierAt(ClClass *cls, int id, CMPIData *data, char **name); +extern int ClClassGetQualifierCount(ClClass *cls); +extern int ClClassGetMethParameterCount(ClClass * cls, int id); +extern int ClClassAddMethParameter(ClObjectHdr *hdr, ClMethod *m, const char *id, CMPIParameter cp); +extern int ClClassLocateMethod(ClObjectHdr *hdr, ClSection *mths, const char *id); +extern int ClClassGetMethQualifierCount(ClClass * cls, int id); +extern int ClClassGetMethParamQualifierCount(ClClass * cls, ClParameter *p); +extern int ClObjectLocateProperty(ClObjectHdr *hdr, ClSection *prps, const char *id); +extern void showClHdr(void *ihdr); +extern unsigned char ClClassAddGrandParent(ClClass *cls, char *gp); +extern ClClass *ClClassNew(const char *cn, const char *pa); +extern unsigned long ClSizeClass(ClClass *cls); +extern ClClass *ClClassRebuildClass(ClClass *cls, void *area); +extern void ClClassRelocateClass(ClClass *cls); +extern void ClClassFreeClass(ClClass *cls); +extern char *ClClassToString(ClClass *cls); +extern int ClClassAddProperty(ClClass *cls, const char *id, CMPIData d); +extern int ClClassGetPropertyCount(ClClass *cls); +extern int ClClassGetPropertyAt(ClClass *cls, int id, CMPIData *data, char **name, unsigned long *quals); +extern int ClClassGetPropQualifierCount(ClClass *cls, int id); +extern int ClClassGetPropQualifierAt(ClClass *cls, int id, int qid, CMPIData *data, char **name); +extern int ClClassAddMethod(ClClass *cls, const char *id, CMPIType t); +extern int ClClassGetMethodCount(ClClass *cls); +extern int ClClassGetMethodAt(ClClass *cls, int id, CMPIType *data, char **name, unsigned long *quals); +extern int ClClassGetMethQualifierAt(ClClass *cls, ClMethod *m, int qid, CMPIData *data, char **name); +extern int ClClassGetMethParameterAt(ClClass *cls, ClMethod *m, int pid, CMPIParameter *parm, char **name); +extern int ClClassGetMethParamQualifierAt(ClClass * cls, ClParameter *parm, int id, CMPIData *d, char **name); +extern int isInstance(CMPIInstance *ci); +extern ClInstance *ClInstanceNew(const char *ns, const char *cn); +extern unsigned long ClSizeInstance(ClInstance *inst); +extern ClInstance *ClInstanceRebuild(ClInstance *inst, void *area); +extern void ClInstanceRelocateInstance(ClInstance *inst); +extern void ClInstanceFree(ClInstance *inst); +extern char *ClInstanceToString(ClInstance *inst); +extern int ClInstanceGetPropertyCount(ClInstance *inst); +extern int ClInstanceGetPropertyAt(ClInstance *inst, int id, CMPIData *data, char **name, unsigned long *quals); +extern int ClInstanceAddProperty(ClInstance *inst, const char *id, CMPIData d); +extern const char *ClInstanceGetClassName(ClInstance *inst); +extern const char *ClInstanceGetNameSpace(ClInstance *inst); +extern const char *ClGetStringData(CMPIInstance *ci, int id); +extern ClObjectPath *ClObjectPathNew(const char *ns, const char *cn); +extern unsigned long ClSizeObjectPath(ClObjectPath *op); +extern ClObjectPath *ClObjectPathRebuild(ClObjectPath *op, void *area); +extern void ClObjectPathRelocateObjectPath(ClObjectPath *op); +extern void ClObjectPathFree(ClObjectPath *op); +extern char *ClObjectPathToString(ClObjectPath *op); +extern int ClObjectPathGetKeyCount(ClObjectPath *op); +extern int ClObjectPathGetKeyAt(ClObjectPath *op, int id, CMPIData *data, char **name); +extern int ClObjectPathAddKey(ClObjectPath *op, const char *id, CMPIData d); +extern void ClObjectPathSetHostName(ClObjectPath *op, const char *hn); +extern const char *ClObjectPathGetHostName(ClObjectPath *op); +extern void ClObjectPathSetNameSpace(ClObjectPath *op, const char *ns); +extern const char *ClObjectPathGetNameSpace(ClObjectPath *op); +extern void ClObjectPathSetClassName(ClObjectPath *op, const char *cn); +extern const char *ClObjectPathGetClassName(ClObjectPath *op); +extern ClArgs *ClArgsNew(void); +extern unsigned long ClSizeArgs(ClArgs *arg); +extern ClArgs *ClArgsRebuild(ClArgs *arg, void *area); +extern void ClArgsRelocateArgs(ClArgs *arg); +extern void ClArgsFree(ClArgs *arg); +extern int ClArgsGetArgCount(ClArgs *arg); +extern int ClArgsGetArgAt(ClArgs *arg, int id, CMPIData *data, char **name); +extern int ClArgsAddArg(ClArgs *arg, const char *id, CMPIData d); #endif Index: objectpath.c =================================================================== RCS file: /cvsroot/sblim/sfcb/objectpath.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- objectpath.c 21 Mar 2005 14:22:38 -0000 1.2 +++ objectpath.c 25 Apr 2005 14:40:42 -0000 1.3 @@ -31,23 +31,6 @@ #include "native.h" #include "msgqueue.h" -extern int ClObjectPathGetKeyAt(ClObjectPath * op, int id, CMPIData * data, - char **name, unsigned long *quals); -extern int ClObjectLocateProperty(ClObjectHdr * hdr, ClSection * prps, - const char *id); -extern int ClObjectPathGetKeyCount(ClObjectPath * op); -extern int ClObjectPathAddKey(ClObjectPath * op, const char *id, CMPIData d); -extern ClObjectPath *ClObjectPathNew(const char *ns, const char *cn); -extern ClObjectPath *ClObjectPathRebuild(ClObjectPath * op, void *area); -extern void ClObjectPathRelocateObjectPath(ClObjectPath *); -extern void ClObjectPathFree(ClObjectPath * op); -extern const char *ClObjectPathGetHostName(ClObjectPath * op); -extern const char *ClObjectPathGetNameSpace(ClObjectPath * op); -extern const char *ClObjectPathGetClassName(ClObjectPath * op); -extern void ClObjectPathSetHostName(ClObjectPath * op, const char *hn); -extern void ClObjectPathSetNameSpace(ClObjectPath * op, const char *ns); -extern void ClObjectPathSetClassName(ClObjectPath * op, const char *cn); -extern unsigned long ClSizeObjectPath(ClObjectPath * op); extern CMPIArray *native_make_CMPIArray(CMPIData * av, CMPIStatus * rc); extern CMPIObjectPath *interal_new_CMPIObjectPath(int mode, const char *, const char *, CMPIStatus *); @@ -161,18 +144,18 @@ ClObjectPath *cop = (ClObjectPath *) op->hdl; CMPIData rv = { 0, CMPI_notFound, {0} }; - if (ClObjectPathGetKeyAt(cop, i, &rv, name ? name : NULL, NULL)) { + if (ClObjectPathGetKeyAt(cop, i, &rv, name ? name : NULL)) { if (rc) CMSetStatus(rc, CMPI_RC_ERR_NOT_FOUND); return rv; } - + if (rv.type == CMPI_chars) { rv.value.string = native_new_CMPIString(rv.value.chars, NULL); rv.type = CMPI_string; } else if (rv.type == CMPI_ref) { - char *msg; + char *msg=""; rv.value.ref = getObjectPath(ClObjectGetClString (&cop->hdr, (ClString *) & rv.value.chars), &msg); } Index: cimXmlParser.h =================================================================== RCS file: /cvsroot/sblim/sfcb/cimXmlParser.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- cimXmlParser.h 11 Apr 2005 23:13:41 -0000 1.3 +++ cimXmlParser.h 25 Apr 2005 14:40:42 -0000 1.4 @@ -185,22 +185,32 @@ } XtokQualifiers; + +typedef struct xtokPropertyData { + union { + char *value; + XtokValueReference ref; + }; + XtokQualifiers qualifiers; +} XtokPropertyData; + typedef struct xtokProperty { struct xtokProperty *next; - XtokQualifiers qualifiers; + // XtokQualifiers qualifiers; char *name; char *classOrigin; char propagated; + char *referenceClass; CMPIType valueType; - union { + XtokPropertyData val; +/* union { struct { char *value; }; struct { XtokValueReference ref; - char *referenceClass; }; - }; + }; */ TypeProperty propType; } XtokProperty; @@ -208,30 +218,17 @@ XtokProperty *last, *first; // must be free'd } XtokProperties; -typedef struct xtokPropertyPartList { - union { - char *value; - XtokValueReference ref; - }; - int qPart; - XtokQualifiers qualifiers; -} XtokPropertyPartList; - -typedef struct xtokPropertyPart { - char *value; - int refValue; - XtokValueReference ref; - int qPart; - XtokQualifier qualifier; -} XtokPropertyPart; - - typedef struct xtokInstance { char *className; XtokProperties properties; XtokQualifiers qualifiers; } XtokInstance; +typedef struct xtokInstanceData { + XtokProperties properties; + XtokQualifiers qualifiers; +} XtokInstanceData; + typedef struct xtokNamedInstance { XtokInstanceName path; XtokInstance instance; @@ -277,6 +274,7 @@ typedef struct xtokMethod { struct xtokMethod *next; + XtokQualifiers qualifiers; XtokParams params; char *name; char *classOrigin; @@ -284,16 +282,10 @@ CMPIType type; } XtokMethod; -typedef struct xtokMethodPart { - XtokParam param; - int qPart; - XtokQualifier qualifier; -} XtokMethodPart; - -typedef struct xtokMethodPartList { +typedef struct xtokMethodData { XtokQualifiers qualifiers; XtokParams params; -} XtokMethodPartList; +} XtokMethodData; typedef struct xtokMethods { XtokMethod *last, *first; // must be free'd @@ -691,6 +683,7 @@ XtokQualifiers qualifiers; XtokMethods methods; XtokParamValues paramValues; + int Qs,Ps,Ms,MPs,MQs,MPQs; jmp_buf env; } ParserControl; Index: cimXmlParser.c =================================================================== RCS file: /cvsroot/sblim/sfcb/cimXmlParser.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- cimXmlParser.c 11 Apr 2005 23:13:41 -0000 1.2 +++ cimXmlParser.c 25 Apr 2005 14:40:42 -0000 1.3 @@ -1023,10 +1023,10 @@ memset(attr, 0, sizeof(attr)); if (tagEquals(parm->xmb, "METHOD")) { attr[1].attr = NULL; - if (attrsOk(parm->xmb, elm, attr, "METHOD", ZTOK_METHODDEF)) { + if (attrsOk(parm->xmb, elm, attr, "METHOD", ZTOK_METHOD)) { memset(&lvalp->xtokMethod, 0, sizeof(XtokMethod)); lvalp->xtokMethod.name = attr[0].attr; - lvalp->xtokMethod.type = (CMPIType) - 1; + lvalp->xtokMethod.type = CMPI_null; if (attr[1].attr) for (i = 0, m = sizeof(types) / sizeof(Types); i < m; i++) { if (strcasecmp(attr[1].attr, types[i].str) == 0) { @@ -1037,7 +1037,7 @@ lvalp->xtokMethod.classOrigin = attr[2].attr; if (attr[3].attr) lvalp->xtokMethod.propagated = !strcasecmp(attr[3].attr, "true"); - return XTOK_METHODDEF; + return XTOK_METHOD; } } return 0; @@ -1060,7 +1060,7 @@ memset(&lvalp->xtokParam, 0, sizeof(XtokParam)); lvalp->xtokParam.pType = ZTOK_PARAM; lvalp->xtokParam.name = attr[0].attr; - lvalp->xtokParam.type = (CMPIType) - 1; + lvalp->xtokParam.type = CMPI_null; if (attr[1].attr) for (i = 0, m = sizeof(types) / sizeof(Types); i < m; i++) { if (strcasecmp(attr[1].attr, types[i].str) == 0) { @@ -1092,11 +1092,12 @@ memset(&lvalp->xtokParam, 0, sizeof(XtokParam)); lvalp->xtokParam.pType = ZTOK_PARAMARRAY; lvalp->xtokParam.name = attr[0].attr; - lvalp->xtokParam.type = (CMPIType) - 1; + lvalp->xtokParam.type = CMPI_null; if (attr[1].attr) for (i = 0, m = sizeof(types) / sizeof(Types); i < m; i++) { if (strcasecmp(attr[1].attr, types[i].str) == 0) { lvalp->xtokParam.type = types[i].type; + lvalp->xtokParam.type |=CMPI_ARRAY; break; } } @@ -1124,6 +1125,7 @@ lvalp->xtokParam.pType = ZTOK_PARAMREF; lvalp->xtokParam.name = attr[0].attr; lvalp->xtokParam.refClass = attr[1].attr; + lvalp->xtokParam.type = CMPI_ref; return XTOK_PARAM; } } @@ -1149,6 +1151,7 @@ lvalp->xtokParam.name = attr[0].attr; lvalp->xtokParam.refClass = attr[1].attr; lvalp->xtokParam.arraySize = attr[2].attr; + lvalp->xtokParam.type = CMPI_refA; return XTOK_PARAM; } } @@ -1188,7 +1191,7 @@ {"PARAMETER.REFERENCE", procParamRef, ZTOK_PARAMREF}, {"PARAMETER.REFARRAY", procParamRefArray, ZTOK_PARAMREFARRAY}, {"PARAMETER", procParam, ZTOK_PARAM}, - {"METHOD", procMethod, ZTOK_METHODDEF}, + {"METHOD", procMethod, ZTOK_METHOD}, {"CLASS", procClass, ZTOK_CLASS}, {"?xml", procXml, ZTOK_XML}, }; @@ -1254,6 +1257,13 @@ control.paramValues.last = control.paramValues.first = NULL; control.properties.last = control.properties.first = NULL; control.qualifiers.last = control.qualifiers.first = NULL; + control.methods.last = control.methods.first = NULL; + control.Qs=0; + control.Ps=0; + control.Ms=0; + control.MPs=0; + control.MQs=0; + control.MPQs=0; if (setjmp(control.env)) { // printf("--- setjmp caught !!\n"); Index: objectImpl.c =================================================================== RCS file: /cvsroot/sblim/sfcb/objectImpl.c,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- objectImpl.c 12 Mar 2005 00:43:00 -0000 1.2 +++ objectImpl.c 25 Apr 2005 14:40:42 -0000 1.3 @@ -108,8 +108,8 @@ { ClArrayBuf *buf; - if MALLOCED - (hdr->arrayBufOffset) buf = (ClArrayBuf *) hdr->arrayBufOffset; + if MALLOCED (hdr->arrayBufOffset) + buf = (ClArrayBuf *) hdr->arrayBufOffset; else buf = (ClArrayBuf *) ((char *) hdr + abs(hdr->arrayBufOffset)); return &(buf->buf[buf->index[id->id - 1]]); @@ -117,8 +117,8 @@ void *ClObjectGetClSection(ClObjectHdr * hdr, ClSection * s) { - if MALLOCED - (s->offset) return (void *) s->offset; + if MALLOCED(s->offset) + return (void *) s->offset; return (void *) ((char *) hdr + abs(s->offset)); } @@ -696,6 +696,7 @@ d.type = CMPI_chars; d.value.chars = (char *) addClString(hdr, (char *) d.value.string->hdl); } + q.data = d; return q; } @@ -742,6 +743,18 @@ return 0; } +int ClClassAddMethodQualifier(ClObjectHdr * hdr, ClMethod * m, + const char *id, CMPIData d) +{ + return ClClassAddQualifier(hdr, &m->qualifiers, id, d); +} + +int ClClassAddMethParamQualifier(ClObjectHdr * hdr, ClParameter * p, + const char *id, CMPIData d) +{ + return ClClassAddQualifier(hdr, &p->qualifiers, id, d); +} + static void freeQualifiers(ClObjectHdr * hdr, ClSection * s) { if MALLOCED @@ -791,17 +804,25 @@ return l; } +static int ClGetQualifierAt(ClClass * cls, ClQualifier *q, int id, CMPIData * data, char **name) +{ + if (data) *data = (q + id)->data; + if (data->type== CMPI_chars) { + const char *str = + ClObjectGetClString(&cls->hdr, (ClString *) & data->value.chars); + data->value.string = native_new_CMPIString(str, NULL); + data->type = CMPI_string; + } + if (name) *name = strdup(ClObjectGetClString(&cls->hdr, &(q + id)->id)); + return 0; +} + int ClClassGetQualifierAt(ClClass * cls, int id, CMPIData * data, char **name) { ClQualifier *q; q = (ClQualifier *) ClObjectGetClSection(&cls->hdr, &cls->qualifiers); - if (id < 0 || id > cls->qualifiers.used) - return 1; - if (data) - *data = (q + id)->data; - if (name) - *name = strdup(ClObjectGetClString(&cls->hdr, &(q + id)->id)); - return 0; + if (id < 0 || id > cls->qualifiers.used) return 1; + return ClGetQualifierAt(cls,q,id,data,name); } int ClClassGetQualifierCount(ClClass * cls) @@ -814,7 +835,266 @@ //------------------------------------------------------- //----- -//-- property support +//-- parameter support +//----- +//------------------------------------------------------- + +static int locateParameter(ClObjectHdr * hdr, ClSection * prms, const char *id) +{ + int i; + ClParameter *p; + + if MALLOCED(prms->offset) + p = (ClParameter *) prms->offset; + else p = (ClParameter *) (((char *) hdr) + abs(prms->offset)); + + for (i = 0; i > prms->used; i++) { + if (strcasecmp(id, ClObjectGetClString(hdr, &(p + i)->id)) == 0) + return i + 1; + } + return 0; +} + +int ClClassGetMethParamQualifierCount(ClClass * cls, ClParameter *p) +{ + return p->qualifiers.used; +} + +static int addClParameter(ClObjectHdr * hdr, ClSection * prms, ClParameter * np) +{ + int i; + ClParameter *p; + + if ((i = locateParameter(hdr, prms, ClObjectGetClString(hdr, &np->id))) == 0) { + p = (ClParameter *) ensureClSpace(hdr, prms, sizeof(*p), 4); + p = p + (prms->used++); + *p = *np; + return prms->used; + } + else return 0; +} + +static ClParameter makeClParameter(ClObjectHdr * hdr, const char *id, + CMPIParameter cp) +{ + ClParameter p; + + memset(&p,0,sizeof(p)); + p.id.id = addClString(hdr, id); + p.parameter = cp; + return p; +} + +int ClClassAddMethParameter(ClObjectHdr * hdr, ClMethod * m, + const char *id, CMPIParameter cp) +{ + ClParameter p; + + p = makeClParameter(hdr, id, cp); + return addClParameter(hdr, &m->parameters, &p); +} + +static long sizeParameters(ClObjectHdr * hdr, ClSection * s) +{ + int l; + long sz = s->used * sizeof(ClParameter); + ClParameter *p = (ClParameter *) ClObjectGetClSection(hdr, s); + + for (l = s->used; l > 0; l--, p++) { + if (p->qualifiers.used) + sz += sizeQualifiers(hdr, &p->qualifiers); + } + DEB(printf("--- sizeParameters: %lu-%p\n", sz, (void *) sz)); + return sz; +} + +static long copyParameters(int ofs, int max, char *to, ClSection * ts, + ClObjectHdr * from, ClSection * fs) +{ + ClParameter *fp = (ClParameter *) ClObjectGetClSection(from, fs); + ClParameter *tp = (ClParameter *) (to + ofs); + int i; + int l = ts->used * sizeof(ClParameter); + if (l == 0) + return 0; + ts->max = ts->used; + + memcpy(tp, fp, l); + ts->offset = -ofs; + + for (i = ts->used; i > 0; i--, fp++, tp++) { + if (tp->qualifiers.used) + l += copyQualifiers(ofs + l, max, to, &tp->qualifiers, from, + &fp->qualifiers); + } + + return l; +} + +static void freeParameters(ClObjectHdr * hdr, ClSection * s) +{ + ClParameter *p; + int i, l; + _SFCB_ENTER(TRACE_OBJECTIMPL, "freeParameters"); + + p = (ClParameter *) ClObjectGetClSection(hdr, s); + + if (p) for (i = 0, l = p->qualifiers.used; i < l; i++) + freeQualifiers(hdr, &p->qualifiers); + if MALLOCED(s->offset) free((void *) s->offset); + + _SFCB_EXIT(); +} + +//------------------------------------------------------- +//----- +//-- method support +//----- +//------------------------------------------------------- + +int ClClassLocateMethod(ClObjectHdr * hdr, ClSection * mths, const char *id) +{ + int i; + ClMethod *m; + + if MALLOCED + (mths->offset) m = (ClMethod *) mths->offset; + else + m = (ClMethod *) (((char *) hdr) + abs(mths->offset)); + + for (i = 0; i < mths->used; i++) { + if (strcasecmp(id, ClObjectGetClString(hdr, &(m + i)->id)) == 0) + return i + 1; + } + return 0; +} + +static int addClassMethodH(ClObjectHdr * hdr, ClSection * mths, + const char *id, CMPIType t) +{ + int i; + ClMethod *m; + + _SFCB_ENTER(TRACE_OBJECTIMPL, "addClassMethodH"); + + if ((i = ClClassLocateMethod(hdr, mths, id)) == 0) { + m = (ClMethod *) ensureClSpace(hdr, mths, sizeof(*m), 8); + m = m + (mths->used++); + clearClSection(&m->qualifiers); + m->id.id = addClString(hdr, id); + m->quals = 0; + m->originId=0; + m->type = t; + _SFCB_RETURN(mths->used); + } + + else { + if MALLOCED (mths->offset) m = (ClMethod *) mths->offset; + else m = (ClMethod *) ((char*)hdr + abs(mths->offset)); + (m + i - 1)->type = t; + _SFCB_RETURN(i); + } +} + +static long sizeMethods(ClObjectHdr * hdr, ClSection * s) +{ + int l; + long sz = s->used * sizeof(ClMethod); + ClMethod *m = (ClMethod *) ClObjectGetClSection(hdr, s); + + for (l = s->used; l > 0; l--, m++) { + if (m->qualifiers.used) + sz += sizeQualifiers(hdr, &m->qualifiers); + if (m->parameters.used) + sz += sizeParameters(hdr, &m->parameters); + } + DEB(printf("--- sizeMethods: %lu-%p\n", sz, (void *) sz)); + return sz; +} + +static long copyMethods(int ofs, int max, char *to, ClSection * ts, + ClObjectHdr... [truncated message content] |