From: Adrian S. <a3s...@us...> - 2005-04-27 11:11:05
|
Update of /cvsroot/sblim/sfcb In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2174 Modified Files: cimXmlParser.c cimXmlRequest.c classProvider.c providerDrv.c providerMgr.h Log Message: Added deleteClass support Index: cimXmlRequest.c =================================================================== RCS file: /cvsroot/sblim/sfcb/cimXmlRequest.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- cimXmlRequest.c 26 Apr 2005 21:58:47 -0000 1.8 +++ cimXmlRequest.c 27 Apr 2005 11:10:41 -0000 1.9 @@ -551,6 +551,53 @@ _SFCB_RETURN(ctxErrResponse(hdr, &binCtx,0)); } +static RespSegments deleteClass(CimXmlRequestContext * ctx, RequestHdr * hdr) +{ + CMPIObjectPath *path; + int irc; + BinRequestContext binCtx; + BinResponseHdr *resp; + DeleteClassReq sreq; + + _SFCB_ENTER(TRACE_CIMXMLPROC, "deleteClass"); + + memset(&binCtx,0,sizeof(BinRequestContext)); + XtokDeleteClass *req = (XtokDeleteClass *) hdr->cimRequest; + + memset(&sreq,0,sizeof(sreq)); + sreq.operation=OPS_DeleteClass; + sreq.count=2; + + path = NewCMPIObjectPath(req->op.nameSpace.data, req->op.className.data, NULL); + sreq.objectPath = setObjectPathMsgSegment(path); + sreq.principal = setCharsMsgSegment(ctx->principal); + + binCtx.oHdr = (OperationHdr *) req; + binCtx.bHdr = &sreq.hdr; + binCtx.bHdr->flags = 0; + binCtx.rHdr = hdr; + binCtx.bHdrSize = sizeof(sreq); + binCtx.chunkedMode=binCtx.xmlAs=binCtx.noResp=0; + binCtx.pAs=NULL; + + _SFCB_TRACE(1, ("--- Getting Provider context")); + irc = getProviderContext(&binCtx, (OperationHdr *) req); + + _SFCB_TRACE(1, ("--- Provider context gotten")); + if (irc == MSG_X_PROVIDER) { + resp = invokeProvider(&binCtx); + closeProviderContext(&binCtx); + resp->rc--; + if (resp->rc == CMPI_RC_OK) { + _SFCB_RETURN(iMethodResponse(hdr, NULL)); + } + _SFCB_RETURN(iMethodErrResponse(hdr, getErrSegment(resp->rc, + (char*)resp->object[0].data))); + } + closeProviderContext(&binCtx); + _SFCB_RETURN(ctxErrResponse(hdr, &binCtx,0)); +} + static RespSegments createClass(CimXmlRequestContext * ctx, RequestHdr * hdr) { _SFCB_ENTER(TRACE_CIMXMLPROC, "createClass"); @@ -1650,7 +1697,7 @@ {notSupported}, //dummy {getClass}, //OPS_GetClass 1 {getInstance}, //OPS_GetInstance 2 - {notSupported}, //OPS_DeleteClass 3 + {deleteClass}, //OPS_DeleteClass 3 {deleteInstance}, //OPS_DeleteInstance 4 {createClass}, //OPS_CreateClass 5 {createInstance}, //OPS_CreateInstance 6 Index: cimXmlParser.c =================================================================== RCS file: /cvsroot/sblim/sfcb/cimXmlParser.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- cimXmlParser.c 25 Apr 2005 14:40:42 -0000 1.3 +++ cimXmlParser.c 27 Apr 2005 11:10:41 -0000 1.4 @@ -472,6 +472,8 @@ if (strcasecmp(attr[0].attr, "createClass") == 0) return XTOK_CREATECLASS; + if (strcasecmp(attr[0].attr, "deleteClass") == 0) + return XTOK_DELETECLASS; if (strcasecmp(attr[0].attr, "deleteClass") == 0) return unsupported(parm); Index: providerMgr.h =================================================================== RCS file: /cvsroot/sblim/sfcb/providerMgr.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- providerMgr.h 11 Apr 2005 23:13:42 -0000 1.3 +++ providerMgr.h 27 Apr 2005 11:10:55 -0000 1.4 @@ -353,6 +353,19 @@ }; } DeleteInstanceReq; +typedef union deleteClassReq { + BinRequestHdr hdr; + struct { + unsigned short operation; + unsigned short options; + void *provId; + unsigned int flags; + unsigned long count; // maps to MsgList + MsgSegment principal; + MsgSegment objectPath; + }; +} DeleteClassReq; + typedef union invokeMethodReq { BinRequestHdr hdr; struct { Index: providerDrv.c =================================================================== RCS file: /cvsroot/sblim/sfcb/providerDrv.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- providerDrv.c 26 Apr 2005 21:58:47 -0000 1.9 +++ providerDrv.c 27 Apr 2005 11:10:42 -0000 1.10 @@ -685,6 +685,35 @@ return l; } +static BinResponseHdr *deleteClass(BinRequestHdr * hdr, ProviderInfo * info, int requestor) +{ + _SFCB_ENTER(TRACE_PROVIDERDRV, "deleteClass"); + DeleteClassReq *req = (DeleteClassReq *) hdr; + CMPIObjectPath *path = relocateSerializedObjectPath(req->objectPath.data); + CMPIStatus rci = { CMPI_RC_OK, NULL }; + CMPIResult *result = native_new_CMPIResult(0,1,NULL); + CMPIContext *ctx = native_new_CMPIContext(TOOL_MM_ADD,info); + BinResponseHdr *resp; + CMPIFlags flgs=0; + + ctx->ft->addEntry(ctx,CMPIInvocationFlags,(CMPIValue*)&flgs,CMPI_uint32); + ctx->ft->addEntry(ctx,CMPIPrincipal,(CMPIValue*)&req->principal.data,CMPI_chars); + + _SFCB_TRACE(1, ("--- Calling provider %s",info->providerName)); + rci = info->classMI->ft->deleteClass(info->classMI, ctx, result,path); + _SFCB_TRACE(1, ("--- Back from provider rc: %d", rci.rc)); + + if (rci.rc == CMPI_RC_OK) { + resp = (BinResponseHdr *) calloc(1,sizeof(BinResponseHdr)); + resp->count = 0; + resp->moreChunks=0; + resp->rc = 1; + } + else resp = errorResp(&rci); + + _SFCB_RETURN(resp); +} + static BinResponseHdr *getClass(BinRequestHdr * hdr, ProviderInfo * info, int requestor) { GetClassReq *req = (GetClassReq *) hdr; @@ -1685,7 +1714,7 @@ {opNotSupported}, //dummy {getClass}, //OPS_GetClass 1 {getInstance}, //OPS_GetInstance 2 - {opNotSupported}, //OPS_DeleteClass 3 + {deleteClass}, //OPS_DeleteClass 3 {deleteInstance}, //OPS_DeleteInstance 4 {createClass}, //OPS_CreateClass 5 {createInstance}, //OPS_CreateInstance 6 Index: classProvider.c =================================================================== RCS file: /cvsroot/sblim/sfcb/classProvider.c,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- classProvider.c 26 Apr 2005 21:58:47 -0000 1.10 +++ classProvider.c 27 Apr 2005 11:10:41 -0000 1.11 @@ -74,6 +74,7 @@ ClassRegister *(*clone) (ClassRegister * br); CMPIConstClass *(*getClass) (ClassRegister * br, const char *clsName); int (*putClass) (ClassRegister * br, CMPIConstClass * cls); + int (*removeClass) (ClassRegister * br, const char *className); UtilList *(*getChildren) (ClassRegister * br, const char *className); void (*rLock)(ClassRegister * cr); void (*wLock)(ClassRegister * cr); @@ -159,6 +160,20 @@ return cb->it->ft->get(cb->it, className); } +static void removeChild(ClassRegister * cr, const char* pn, const char *chd) +{ + ClassBase *cb = (ClassBase *) (cr + 1); + char *child; + UtilList *ul=cb->it->ft->get(cb->it, pn); + + if (ul) for (child =(char*)ul->ft->getFirst(ul); child; child=(char*)ul->ft->getNext(ul)) { + if (strcasecmp(child,chd)==0) { + ul->ft->removeCurrent(ul); + break; + } + } +} + static ClassRegister *newClassRegister(char *fname) { ClassRegister *cr = @@ -450,6 +465,54 @@ return cb->ht->ft->put(cb->ht, cls->ft->getCharClassName(cls), cls); } +static void removeClass(ClassRegister * cr, const char *clsName) +{ + FILE *repold,*repnew; + char *tmpfn; + int s; + ClObjectHdr hdr; + ClassBase *cb = (ClassBase *) cr->hdl; + + cb->ht->ft->remove(cb->ht, clsName); + + repold = fopen(cr->fn, "r"); + tmpfn=malloc(strlen(cr->fn)+8); + strcpy(tmpfn,cr->fn); + strcat(tmpfn,".tmp"); + repnew = fopen(tmpfn, "w"); + + while ((s = fread(&hdr, 1, sizeof(hdr), repold)) == sizeof(hdr)) { + CMPIConstClass cc; + char *buf=NULL; + char *cn; + + buf = (char *) malloc(hdr.size); + *((ClObjectHdr *) buf) = hdr; + + if (fread(buf + sizeof(hdr), 1, hdr.size - sizeof(hdr), repold) == hdr.size - sizeof(hdr)) { + if (hdr.type==HDR_Class) { + cc.hdl = buf; + cc.ft = CMPIConstClassFT; + cc.ft->relocate(&cc); + cn=(char*)cc.ft->getCharClassName(&cc); + if (strcasecmp(clsName,cn)==0) { + free(buf); + continue; + } + } + fwrite(buf,1,hdr.size,repnew); + free(buf); + } + } + fclose(repold); + fclose(repnew); + + unlink(cr->fn); + rename(tmpfn, cr->fn); + + free(tmpfn); +} + static CMPIConstClass *getClass(ClassRegister * cr, const char *clsName) { @@ -466,6 +529,7 @@ regClone, getClass, putClass, + removeClass, getChildren, rLock, wLock, @@ -725,12 +789,13 @@ st.rc = CMPI_RC_ERR_ALREADY_EXISTS; _SFCB_RETURN(st); } - if (pn && (cl=getClass(cReg,cn))==NULL) { + if (pn && (cl=getClass(cReg,pn))==NULL) { st.rc = CMPI_RC_ERR_INVALID_SUPERCLASS; _SFCB_RETURN(st); } cReg->ft->wLock(cReg); + addClass(cReg,cc,cn,pn); cReg->ft->wUnLock(cReg); @@ -752,8 +817,44 @@ CMPIContext * ctx, CMPIResult * rslt, CMPIObjectPath * cop) { - CMPIStatus st = { CMPI_RC_ERR_NOT_SUPPORTED, NULL }; - return st; + ClassRegister *cReg; + CMPIConstClass * cl; + int rc; + + CMPIStatus st = { CMPI_RC_OK, NULL }; + + _SFCB_ENTER(TRACE_PROVIDERS, "ClassProviderDeleteClass"); + + cReg=getNsReg(cop, &rc); + if (cReg==NULL) { + CMPIStatus st = { CMPI_RC_ERR_INVALID_NAMESPACE, NULL }; + _SFCB_RETURN(st); + } + + char *cn = (char*)cop->ft->getClassName(cop,NULL)->hdl; + + cl = getClass(cReg,cn); + if (cl==NULL) { + st.rc = CMPI_RC_ERR_NOT_FOUND; + _SFCB_RETURN(st); + } + + UtilList *ul = getChildren(cReg,cn); + if (ul) { + st.rc = CMPI_RC_ERR_CLASS_HAS_CHILDREN; + _SFCB_RETURN(st); + } + + char *pn = (char*)cl->ft->getCharSuperClassName(cl); + + cReg->ft->wLock(cReg); + + if (pn) removeChild(cReg, pn, cn); + removeClass(cReg, cn); + + cReg->ft->wUnLock(cReg); + + _SFCB_RETURN(st); } /* ---------------------------------------------------------------------------*/ |