From: Adrian S. <a3s...@us...> - 2005-06-06 13:19:59
|
Update of /cvsroot/sblim/sfcc In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv4616 Modified Files: client.c cmci.h Log Message: Added getClass, enumClassNames and enumClasses support - not tested yet Index: cmci.h =================================================================== RCS file: /cvsroot/sblim/sfcc/cmci.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- cmci.h 6 Jun 2005 12:20:08 -0000 1.4 +++ cmci.h 6 Jun 2005 13:19:49 -0000 1.5 @@ -98,16 +98,13 @@ @param op ObjectPath containing namespace and classname components. @param flags Any combination of the following flags are supported: CMPI_FLAG_LocalOnly, CMPI_FLAG_DeepInheritance, CMPI_FLAG_IncludeQualifiers and CMPI_FLAG_IncludeClassOrigin. - @param properties If not NULL, the members of the array define one or more Property - names. Each returned Object MUST NOT include elements for any Properties - missing from this list @param rc Output: Service return status (suppressed when NULL). @return Enumeration of Instances. */ CMPIEnumeration* (*enumClasses) (CMCIClient* cl, - CMPIObjectPath* op, CMPIFlags flags, char** properties, CMPIStatus* rc); + CMPIObjectPath* op, CMPIFlags flags, CMPIStatus* rc); /** Get Instance using <op> as reference. Instance structure can be controled using the <flags> parameter. Index: client.c =================================================================== RCS file: /cvsroot/sblim/sfcc/client.c,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- client.c 6 Jun 2005 12:20:08 -0000 1.5 +++ client.c 6 Jun 2005 13:19:49 -0000 1.6 @@ -307,10 +307,11 @@ static inline void addXmlClassnameParam(UtilStringBuffer *sb, CMPIObjectPath *cop) { - sb->ft->append3Chars(sb, - "<IPARAMVALUE NAME=\"ClassName\"><CLASSNAME NAME=\"", - (char*)cop->ft->getClassName(cop, NULL), - "\"/></IPARAMVALUE>\n"); + CMPIString *cn=cop->ft->getClassName(cop, NULL); + if (cn && cn->hdl && *((char*)cn->hdl)) + sb->ft->append3Chars(sb, + "<IPARAMVALUE NAME=\"ClassName\"><CLASSNAME NAME=\"", + (char*)cn->hdl,"\"/></IPARAMVALUE>\n"); } static void addXmlPropertyListParam(UtilStringBuffer *sb, char** properties) @@ -575,7 +576,7 @@ return NULL; } - if (rh.rvArray->ft->getSimpleType(rh.rvArray,NULL) == CMPI_ref) { + if (rh.rvArray->ft->getSimpleType(rh.rvArray,NULL) == CMPI_instance) { CMPIEnumeration *enm = newCMPIEnumeration(rh.rvArray,NULL); CMSetStatus(rc, CMPI_RC_OK); return enm; @@ -966,23 +967,159 @@ } -static CMPIConstClass* getClass (CMCIClient* cl, - CMPIObjectPath* op, CMPIFlags flags, char** properties, CMPIStatus* rc) +static CMPIConstClass* getClass (CMCIClient* mb, + CMPIObjectPath* cop, CMPIFlags flags, char** properties, CMPIStatus* rc) { - CMSetStatusWithChars(rc, CMPI_RC_ERROR_SYSTEM, "method not supported"); - return NULL; + ClientEnc *cl=(ClientEnc*)mb; + CMCIConnection *con=cl->connection; + UtilStringBuffer *sb=newStringBuffer(2048); + char *error; + + addXmlClassnameParam(sb, cop); + con->ft->genRequest(cl,"GetClass",cop,0,0); + + addXmlHeader(sb); + + sb->ft->appendChars(sb,"<IMETHODCALL NAME=\"GetClass\">"); + + addXmlNamespace(sb, getNameSpaceComponents(cop)); + + emitlocal(sb,flags & CMPI_FLAG_LocalOnly); + emitorigin(sb,flags & CMPI_FLAG_IncludeClassOrigin); + emitqual(sb,flags & CMPI_FLAG_IncludeQualifiers); + + addXmlPropertyListParam(sb, properties); + + addXmlClassnameParam(sb, cop); + + pathToXml(sb, cop); + + sb->ft->appendChars(sb,"</INSTANCENAME>\n</IPARAMVALUE>\n"); + + sb->ft->appendChars(sb,"</IMETHODCALL></SIMPLEREQ>\n</MESSAGE></CIM>"); + +// fprintf(stderr,"%s\n",sb->ft->getCharPtr(sb)); + con->ft->addPayload(con,sb); + + if ((error=con->ft->getResponse(con,cop))) { + CMSetStatusWithChars(rc,CMPI_RC_ERR_FAILED,error); + return NULL; + } +// fprintf(stderr,"%s\n",con->mResponse->ft->getCharPtr(con->mResponse)); + + ResponseHdr rh=scanCimXmlResponse(con->mResponse->ft->getCharPtr(con->mResponse),cop); + + if (rh.errCode!=0) { + CMSetStatusWithChars(rc,rh.errCode,rh.description); + return NULL; + } + + if (rh.rvArray->ft->getSimpleType(rh.rvArray,NULL) == CMPI_class) { + CMSetStatus(rc,CMPI_RC_OK); + return (CMPIConstClass*)(rh.rvArray->ft->getElementAt(rh.rvArray, 0, NULL).value.inst); + } + + CMSetStatusWithChars(rc,CMPI_RC_ERR_FAILED,"Unexpected return value"); + return NULL; } -static CMPIEnumeration* enumClassNames (CMCIClient* cl, - CMPIObjectPath* op, CMPIFlags flags, CMPIStatus* rc) +static CMPIEnumeration* enumClassNames (CMCIClient* mb, + CMPIObjectPath* cop, CMPIFlags flags, CMPIStatus* rc) { - CMSetStatusWithChars(rc, CMPI_RC_ERROR_SYSTEM, "method not supported"); - return NULL; + ClientEnc *cl=(ClientEnc*)mb; + CMCIConnection *con=cl->connection; + UtilStringBuffer *sb=newStringBuffer(2048); + char *error; + + con->ft->genRequest(cl,"EnumerateClassNames",cop,0,0); + + addXmlHeader(sb); + + sb->ft->appendChars(sb,"<IMETHODCALL NAME=\"EnumerateClassNames\">"); + + addXmlNamespace(sb, getNameSpaceComponents(cop)); + + emitdeep(sb,flags & CMPI_FLAG_DeepInheritance); + + addXmlClassnameParam(sb, cop); + + sb->ft->appendChars(sb,"</IMETHODCALL></SIMPLEREQ>\n</MESSAGE></CIM>"); + +// fprintf(stderr,"%s\n",sb->ft->getCharPtr(sb)); + con->ft->addPayload(con,sb); + + if ((error = con->ft->getResponse(con,cop))) { + CMSetStatusWithChars(rc,CMPI_RC_ERR_FAILED,error); + return NULL; + } +// fprintf(stderr,"%s\n",con->mResponse->ft->getCharPtr(con->mResponse)); + + ResponseHdr rh=scanCimXmlResponse(con->mResponse->ft->getCharPtr(con->mResponse),cop); + + if (rh.errCode!=0) { + CMSetStatusWithChars(rc,rh.errCode,rh.description); + return NULL; + } + + if (rh.rvArray->ft->getSimpleType(rh.rvArray,NULL) == CMPI_ref) { + CMPIEnumeration *enm = newCMPIEnumeration(rh.rvArray,NULL); + CMSetStatus(rc,CMPI_RC_OK); + return enm; + } + + CMSetStatusWithChars(rc,CMPI_RC_ERR_FAILED,"Unexpected return value"); + return NULL; } -static CMPIEnumeration* enumClasses (CMCIClient* cl, - CMPIObjectPath* op, CMPIFlags flags, char** properties, CMPIStatus* rc) +static CMPIEnumeration* enumClasses (CMCIClient* mb, + CMPIObjectPath* cop, CMPIFlags flags, CMPIStatus* rc) { + ClientEnc *cl = (ClientEnc *)mb; + CMCIConnection *con = cl->connection; + UtilStringBuffer *sb = newStringBuffer(2048); + char *error; + ResponseHdr rh; + + con->ft->genRequest(cl, "EnumerateClasses", cop, 0, 0); + + addXmlHeader(sb); + + sb->ft->appendChars(sb, "<IMETHODCALL NAME=\"EnumerateClasses\">"); + addXmlNamespace(sb, getNameSpaceComponents(cop)); + + addXmlClassnameParam(sb, cop); + + emitdeep(sb,flags & CMPI_FLAG_DeepInheritance); + emitlocal(sb,flags & CMPI_FLAG_LocalOnly); + emitqual(sb,flags & CMPI_FLAG_IncludeQualifiers); + emitorigin(sb,flags & CMPI_FLAG_IncludeClassOrigin); + + addXmlClassnameParam(sb, cop); + + sb->ft->appendChars(sb,"</IMETHODCALL></SIMPLEREQ>\n</MESSAGE></CIM>"); + +// fprintf(stderr,"%s\n",sb->ft->getCharPtr(sb)); + con->ft->addPayload(con,sb); + + if ((error = con->ft->getResponse(con, cop))) { + CMSetStatusWithChars(rc,CMPI_RC_ERR_FAILED,error); + return NULL; + } +// fprintf(stderr,"%s\n",con->mResponse->ft->getCharPtr(con->mResponse)); + + rh = scanCimXmlResponse(con->mResponse->ft->getCharPtr(con->mResponse), cop); + + if (rh.errCode != 0) { + CMSetStatusWithChars(rc, rh.errCode, rh.description); + return NULL; + } + + if (rh.rvArray->ft->getSimpleType(rh.rvArray,NULL) == CMPI_class) { + CMPIEnumeration *enm = newCMPIEnumeration(rh.rvArray,NULL); + CMSetStatus(rc, CMPI_RC_OK); + return enm; + } + CMSetStatusWithChars(rc, CMPI_RC_ERROR_SYSTEM, "method not supported"); return NULL; } |