Hi Hung,

Multiple adminowners are allowed for each immhandle
Multiple ccbhandles(IDs) allowed for each adminownerhandle

If we need to store in the OI cb , then we have to book-keep ccbids and 
there corresponding ccb operation object name

Instead I chose to read from IMMND , as AccessorGet or new message will 
have to get admin owner from IMMND.

Thanks,
Neel.

On 2016/11/23 01:47 PM, Hung Nguyen wrote:
> Hi Neel,
>
> I think we can fix this ticket without new message type.
>
> Before the CcbCompleted callback, the OI always gets one or more 
> CcbCreate/Modify/Delete callbacks.
> We can use those callbacks to get admo name.
>
> We add more members to 'struct imma_oi_ccb_record'
> SaStringT firstObjectName;
> SaStringT adminOwnerName;
>
>
> CcbCreate callback:
> We can get the admo name right away
> by reading 'SaImmAttrAdminOwnerName' attribute from 
> 'evt->info.objCreate.attrValues'
> Then store the admo name in imma_oi_ccb_record.adminOwnerName.
>
>
> CcbModify/Delete callback:
> We can't get the admo name right away.
> We have to store the object name in imma_oi_ccb_record.firstObjectName.
> This only needs to be done once, no need to overwrite 'firstObjectName' in 
> later callbacks.
> We only need one object name of the CCB.
>
>
> Now when we need to get admo name in CcbCompleted callback,
> we have to fetch the imma_oi_ccb_record of that ccb.
> If the ccb_record already has adminOwnerName, we can use it right away.
> If the ccb_record only has firstObjectName, use saImmOmAccessorGet_2 to 
> retrieve the admo name.
>
>
> BR,
> Hung Nguyen - DEK Technologies
>
> --------------------------------------------------------------------------------
> From: Neelakanta [email protected]
> Sent: Friday, November 18, 2016 9:54PM
> To: Zoran Milinkovic, Hung Nguyen
>      [email protected],[email protected]
> Cc: Opensaf-devel
>      [email protected]
> Subject: [PATCH 1 of 1] imm:allow augumentCcbInit with ROF as false in 
> completed callback[#1956]
>
>
>   osaf/libs/agents/saf/imma/imma_oi_api.c    |  156 
> +++++++++++++++++++++++++---
>   osaf/libs/common/immsv/immsv_evt.c         |   49 ++++++--
>   osaf/libs/common/immsv/include/immsv_evt.h |    2 +
>   osaf/services/saf/immsv/immnd/ImmModel.cc  |   39 +++++++
>   osaf/services/saf/immsv/immnd/ImmModel.hh  |    3 +
>   osaf/services/saf/immsv/immnd/immnd_evt.c  |   65 ++++++++++++
>   osaf/services/saf/immsv/immnd/immnd_init.h |    3 +
>   7 files changed, 284 insertions(+), 33 deletions(-)
>
>
> with saImmOmCcbObjectRead, completed callback is also allowed to call 
> saImmOiAugmentCcbInitialize.
>   When ROF is false the augumentInit will get new adminowner with same name 
> as old adminowner name with ROF as true.
>
> Since, object name is not set for completed callback, a new event from OI to 
> IMMND is required to get adminownername from ccbID
> The patch inroduces new event by sending ccbID and response of the event will 
> be the adminname of the corresponding ccbId.
>
> diff --git a/osaf/libs/agents/saf/imma/imma_oi_api.c 
> b/osaf/libs/agents/saf/imma/imma_oi_api.c
> --- a/osaf/libs/agents/saf/imma/imma_oi_api.c
> +++ b/osaf/libs/agents/saf/imma/imma_oi_api.c
> @@ -3617,6 +3617,97 @@ getAdmoName(SaImmHandleT privateOmHandle
>   }
>   
>   
> /****************************************************************************
> +  Name          : immsv_oi_augment_ccb_get_admo_name
> +
> +  Description   : The function gets adminoperation name from the CcbID.
> +               For the saImmOiAugmentCcbInitialize when the ROF flag is false
> +               for the original adminOperation name(#1956).
> +
> +  Arguments     :  privateOmHandle - IMM OM handle
> +                   ccbId  -  The ccbId from the completed callback .
> +                   admoNameOut - The AdminOperation name of the ccbId
> +                timeout - synchronous timeout
> +
> +  Return Values :  SA_AIS_OK
> +                   SA_AIS_ERR_BAD_HANDLE
> +
> +******************************************************************************/
> +
> +SaAisErrorT immsv_oi_augment_ccb_get_admo_name(
> +                               SaImmHandleT privateOmHandle,
> +                            SaUint32T ccbId,
> +                               SaStringT  *admoNameOut,
> +                            SaTimeT timeout)
> +
> +{
> +        SaAisErrorT rc = SA_AIS_OK;
> +     IMMA_CB *cb = &imma_cb;
> +     uint32_t proc_rc;
> +     IMMSV_EVT evt;
> +     IMMSV_EVT *out_evt = NULL;
> +     SaStringT * admtmp;
> +        TRACE_ENTER();
> +
> +     memset(&evt, 0, sizeof(IMMSV_EVT));
> +        evt.type = IMMSV_EVT_TYPE_IMMND;
> +        evt.info.immnd.type = IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO;
> +     evt.info.immnd.info.ccbId = ccbId;
> +
> +     proc_rc = imma_mds_msg_sync_send(cb->imma_mds_hdl, &cb->immnd_mds_dest, 
> &evt, &out_evt, timeout);
> +     switch(proc_rc) {
> +                case NCSCC_RC_SUCCESS:
> +                        break;
> +
> +                case NCSCC_RC_REQ_TIMOUT:
> +                        rc = imma_proc_check_stale(cb, privateOmHandle, 
> SA_AIS_ERR_TIMEOUT);
> +                        goto mds_send_fail;
> +
> +                default:
> +                        rc = SA_AIS_ERR_LIBRARY;
> +                        TRACE_4("ERR_LIBRARY: MDS returned unexpected error 
> code %u", proc_rc);
> +                        goto mds_send_fail;
> +        }
> +
> +     if(out_evt) {
> +                osafassert(out_evt->type == IMMSV_EVT_TYPE_IMMA);
> +                if (out_evt->info.imma.type == IMMA_EVT_ND2A_IMM_ERROR) {
> +                        rc = out_evt->info.imma.info.errRsp.error;
> +                        osafassert(rc && (rc != SA_AIS_OK));
> +                        free(out_evt);  /*BUGFIX (leak) 090506 */
> +                        out_evt = NULL;
> +                        goto mds_send_fail;
> +                }
> +
> +                osafassert(out_evt->info.imma.type == 
> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP);
> +             IMMSV_ATTR_VALUES_LIST *p;
> +
> +             osafassert(out_evt->info.imma.info.searchNextRsp);
> +             p = out_evt->info.imma.info.searchNextRsp->attrValuesList;
> +             IMMSV_ATTR_VALUES *q = &(p->n);
> +             osafassert(!(strncmp(q->attrName.buf, 
> "SaImmAttrAdminOwnerName", strlen("SaImmAttrAdminOwnerName"))));
> +             osafassert(q->attrValuesNumber == 1);
> +             admtmp = (SaStringT *) imma_copyAttrValue3(q->attrValueType, 
> &(q->attrValue));
> +             *admoNameOut = *admtmp;
> +             TRACE("The admin operation Name %s ", *admoNameOut);
> +
> +             if(out_evt) {
> +                     if(out_evt->info.imma.info.searchNextRsp) {
> +                             
> if(out_evt->info.imma.info.searchNextRsp->attrValuesList) {
> +                                     
> immsv_free_attrvalues_list(out_evt->info.imma.info.searchNextRsp->attrValuesList);
> +                             }
> +                             free(out_evt->info.imma.info.searchNextRsp);
> +                             out_evt->info.imma.info.searchNextRsp = NULL;
> +                     }
> +                     free(out_evt);
> +             }
> +     }
> +
> + mds_send_fail:
> +        TRACE_LEAVE();
> +        return rc;
> +}
> +
> +/****************************************************************************
>     Name          :  saImmOiAugmentCcbInitialize
>    
>     Description   :  Allows the OI implementers to augment ops to a ccb 
> related
> @@ -3850,32 +3941,57 @@ SaAisErrorT saImmOiAugmentCcbInitialize(
>                       TRACE("AugCcbinit: Admo has ReleaseOnFinalize FALSE "
>                               "=> init separate admo => must fetch admo-name 
> first");
>                       osafassert(locked == false);
> -                     SaNameT admName;/* Used to get admo string name copied 
> to stack.*/
> -
> -                     rc = getAdmoName(privateOmHandle, cbi, &admName);
> -                     if(rc != SA_AIS_OK) {
> -                             TRACE("ERR_TRY_AGAIN: failed to obtain 
> SaImmAttrAdminOwnerName %u", rc);
> -                             if(rc != SA_AIS_ERR_TRY_AGAIN) {
> -                                     rc = SA_AIS_ERR_TRY_AGAIN;
> +                     if(cbi->type == IMMA_CALLBACK_OI_CCB_COMPLETED){
> +                             SaStringT admOwnerStr;
> +                             rc = 
> immsv_oi_augment_ccb_get_admo_name(privateOmHandle, cbi->ccbID, &admOwnerStr, 
> cl_node->syncr_timeout);
> +                             if(rc != SA_AIS_OK) {
> +                                     TRACE("ERR_TRY_AGAIN: failed to obtain 
> SaImmAttrAdminOwnerName %u", rc);
> +                                     if(rc != SA_AIS_ERR_TRY_AGAIN) {
> +                                             rc = SA_AIS_ERR_TRY_AGAIN;
> +                                     }
> +                                     if(admOwnerStr)
> +                                             free(admOwnerStr);
> +                                     goto done;
> +                             }
> +                             rc = 
> immsv_om_admo_handle_initialize(privateOmHandle, (const 
> SaImmAdminOwnerNameT)admOwnerStr, &privateAoHandle);
> +                             if(rc != SA_AIS_OK) {
> +                                  TRACE("ERR_TRY_AGAIN: failed to obtain 
> internal admo handle rc:%u", rc);
> +                                     if(rc != SA_AIS_ERR_TRY_AGAIN) {
> +                                             rc = SA_AIS_ERR_TRY_AGAIN;
> +                                              }      
> +                                     if(admOwnerStr)
> +                                             free(admOwnerStr);
> +                                     goto done;
> +                             }
> +                                     if(admOwnerStr)
> +                                             free(admOwnerStr);
> +                     } else {
> +                             SaNameT admName;/* Used to get admo string name 
> copied to stack.*/
> +                             rc = getAdmoName(privateOmHandle, cbi, 
> &admName);
> +                             if(rc != SA_AIS_OK) {
> +                                     TRACE("ERR_TRY_AGAIN: failed to obtain 
> SaImmAttrAdminOwnerName %u", rc);
> +                                     if(rc != SA_AIS_ERR_TRY_AGAIN) {
> +                                             rc = SA_AIS_ERR_TRY_AGAIN;
> +                                     }
> +                                     osaf_extended_name_free(&admName);
> +                                     goto done;
> +                             }
> +                             TRACE("Obtaned AdminOwnerName:%s", 
> osaf_extended_name_borrow(&admName));
> +                             /* Allocate private admowner with 
> ReleaseOnFinalize as TRUE */
> +                             osafassert(immsv_om_admo_handle_initialize);
> +                             rc = 
> immsv_om_admo_handle_initialize(privateOmHandle,
> +                                             (SaImmAdminOwnerNameT) 
> osaf_extended_name_borrow(&admName), &privateAoHandle);
> +
> +                             if(rc != SA_AIS_OK) {
> +                                     TRACE("ERR_TRY_AGAIN: failed to obtain 
> internal admo handle rc:%u", rc);
> +                                     if(rc != SA_AIS_ERR_TRY_AGAIN) {
> +                                             rc = SA_AIS_ERR_TRY_AGAIN;
>                               }
>                               osaf_extended_name_free(&admName);
>                               goto done;
> -                     }
> -                     TRACE("Obtaned AdminOwnerName:%s", 
> osaf_extended_name_borrow(&admName));
> -                     /* Allocate private admowner with ReleaseOnFinalize as 
> TRUE */
> -                     osafassert(immsv_om_admo_handle_initialize);
> -                     rc = immsv_om_admo_handle_initialize(privateOmHandle,
> -                             (SaImmAdminOwnerNameT) 
> osaf_extended_name_borrow(&admName), &privateAoHandle);
> -
> -                     if(rc != SA_AIS_OK) {
> -                             TRACE("ERR_TRY_AGAIN: failed to obtain internal 
> admo handle rc:%u", rc);
> -                             if(rc != SA_AIS_ERR_TRY_AGAIN) {
> -                                     rc = SA_AIS_ERR_TRY_AGAIN;
>                               }
>                               osaf_extended_name_free(&admName);
> -                             goto done;
>                       }
> -                     osaf_extended_name_free(&admName);
>               }
>       } else {TRACE("AugCcbinit: Admo has ROF == TRUE");}
>   
> diff --git a/osaf/libs/common/immsv/immsv_evt.c 
> b/osaf/libs/common/immsv/immsv_evt.c
> --- a/osaf/libs/common/immsv/immsv_evt.c
> +++ b/osaf/libs/common/immsv/immsv_evt.c
> @@ -177,6 +177,7 @@ static const char *immnd_evt_names[] = {
>       "IMMND_EVT_A2ND_OBJ_CREATE_2",  /* saImmOmCcbObjectCreate_o3 */
>       "IMMND_EVT_A2ND_OI_OBJ_CREATE_2",       /* saImmOiRtObjectCreate_o3 */
>       "IMMND_EVT_A2ND_OBJ_SAFE_READ",       /* saImmOmCcbObjectRead */
> +     "IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO", /* To get Admin owner name for 
> corresponding ccbID */
>       "undefined (high)"
>   };
>   
> @@ -1332,19 +1333,22 @@ static uint32_t immsv_evt_enc_sublevels(
>                               }
>                       }
>               } else if ((i_evt->info.imma.type == 
> IMMA_EVT_ND2A_SEARCHNEXT_RSP) ||
> -                     (i_evt->info.imma.type == 
> IMMA_EVT_ND2A_ACCESSOR_GET_RSP)) {
> +                     (i_evt->info.imma.type == 
> IMMA_EVT_ND2A_ACCESSOR_GET_RSP) ||
> +                     (i_evt->info.imma.type == 
> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP)) {
>                       uint8_t *p8;
>                       int depth = 0;
>                       /*Encode searchNext response */
>                       IMMSV_OM_RSP_SEARCH_NEXT *sn = 
> i_evt->info.imma.info.searchNextRsp;
>                       osafassert(sn);
>   
> -                     IMMSV_OCTET_STRING *os = &(sn->objectName);
> -                     IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
> -                     ncs_encode_32bit(&p8, os->size);
> -                     ncs_enc_claim_space(o_ub, 4);
> -                     if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) {
> -                             return NCSCC_RC_OUT_OF_MEM;
> +                     if(i_evt->info.imma.type != 
> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP){
> +                             IMMSV_OCTET_STRING *os = &(sn->objectName);
> +                             IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
> +                             ncs_encode_32bit(&p8, os->size);
> +                             ncs_enc_claim_space(o_ub, 4);
> +                             if(!immsv_evt_enc_inline_text(__LINE__, o_ub, 
> os)) {
> +                                     return NCSCC_RC_OUT_OF_MEM;
> +                             }
>                       }
>   
>                       IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 1);
> @@ -2013,7 +2017,8 @@ static uint32_t immsv_evt_dec_sublevels(
>                               }
>                       }
>               } else if ((o_evt->info.imma.type == 
> IMMA_EVT_ND2A_SEARCHNEXT_RSP) ||
> -                     (o_evt->info.imma.type == 
> IMMA_EVT_ND2A_ACCESSOR_GET_RSP)) {
> +                     (o_evt->info.imma.type == 
> IMMA_EVT_ND2A_ACCESSOR_GET_RSP) ||
> +                     (o_evt->info.imma.type == 
> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP)) {
>                       uint8_t *p8;
>                       uint8_t c8;
>                       uint8_t local_data[8];
> @@ -2022,11 +2027,13 @@ static uint32_t immsv_evt_dec_sublevels(
>                       o_evt->info.imma.info.searchNextRsp = calloc(1, 
> sizeof(IMMSV_OM_RSP_SEARCH_NEXT));
>   
>                       /* Decode object name */
> -                     IMMSV_OCTET_STRING *os = 
> &(o_evt->info.imma.info.searchNextRsp->objectName);
> -                     IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4);
> -                     os->size = ncs_decode_32bit(&p8);
> -                     ncs_dec_skip_space(i_ub, 4);
> -                     immsv_evt_dec_inline_string(i_ub, os);
> +                     if(o_evt->info.imma.type != 
> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP){
> +                             IMMSV_OCTET_STRING *os = 
> &(o_evt->info.imma.info.searchNextRsp->objectName);
> +                             IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 
> 4);
> +                             os->size = ncs_decode_32bit(&p8);
> +                             ncs_dec_skip_space(i_ub, 4);
> +                             immsv_evt_dec_inline_string(i_ub, os);
> +                     }
>   
>                       IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 1);
>                       c8 = ncs_decode_8bit(&p8);
> @@ -2657,6 +2664,7 @@ static uint32_t immsv_evt_enc_toplevel(I
>   
>               case IMMA_EVT_ND2A_SEARCHNEXT_RSP:      //Response from for 
> SearchNext
>               case IMMA_EVT_ND2A_ACCESSOR_GET_RSP:    //Response from for 
> AccessorGet
> +             case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP: //Response to get 
> Admin name from ccbID
>                       /*Totaly encoded in sublevel. */
>                       break;
>   
> @@ -3424,6 +3432,14 @@ static uint32_t immsv_evt_enc_toplevel(I
>   
>                       break;
>   
> +             case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO:
> +
> +                        IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
> +                        ncs_encode_32bit(&p8, immndevt->info.ccbId);
> +                        ncs_enc_claim_space(o_ub, 4);
> +
> +                        break;
> +
>               case IMMND_EVT_A2ND_IMM_ADMOP:  /* Syncronous AdminOp */
>               case IMMND_EVT_A2ND_IMM_ADMOP_ASYNC:    /* Asyncronous AdminOp 
> */
>                       IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
> @@ -4048,6 +4064,7 @@ static uint32_t immsv_evt_dec_toplevel(N
>   
>               case IMMA_EVT_ND2A_SEARCHNEXT_RSP:      //Response from for 
> SearchNext
>               case IMMA_EVT_ND2A_ACCESSOR_GET_RSP:    //Response from for 
> AccessorGet
> +             case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP: //Response to get 
> Admin name from ccbID
>                       /*Totaly decoded in sublevel. */
>                       break;
>   
> @@ -4845,6 +4862,12 @@ static uint32_t immsv_evt_dec_toplevel(N
>                       immndevt->info.ccbId = ncs_decode_32bit(&p8);
>                       ncs_dec_skip_space(i_ub, 4);
>                       break;
> +             
> +             case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO:       /* Get Admin 
> owner name for corresponding ccbID */
> +                     IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4);
> +                     immndevt->info.ccbId = ncs_decode_32bit(&p8);
> +                     ncs_dec_skip_space(i_ub, 4);
> +                     break;
>   
>               case IMMND_EVT_A2ND_IMM_ADMOP:  /* Syncronous AdminOp */
>               case IMMND_EVT_A2ND_IMM_ADMOP_ASYNC:    /* Asyncronous AdminOp 
> */
> diff --git a/osaf/libs/common/immsv/include/immsv_evt.h 
> b/osaf/libs/common/immsv/include/immsv_evt.h
> --- a/osaf/libs/common/immsv/include/immsv_evt.h
> +++ b/osaf/libs/common/immsv/include/immsv_evt.h
> @@ -93,6 +93,7 @@ typedef enum imma_evt_type {
>       IMMA_EVT_ND2A_OI_OBJ_CREATE_LONG_UC = 31,       /*OBJ CREATE UP-CALL 
> with long DN. */
>       IMMA_EVT_ND2A_OI_OBJ_MODIFY_LONG_UC = 32,       /*OBJ MODIFY UP-CALL 
> with long DN. */
>       IMMA_EVT_ND2A_OI_OBJ_DELETE_LONG_UC = 33,       /*OBJ DELETE UP-CALL 
> with long DN. */
> +     IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP = 34,    /* Response for augumet 
> ccb get admin owner name from ccbid*/
>   
>       IMMA_EVT_MAX
>   } IMMA_EVT_TYPE;
> @@ -215,6 +216,7 @@ typedef enum immnd_evt_type {
>       IMMND_EVT_A2ND_OI_OBJ_CREATE_2 = 99,    /* saImmOiRtObjectCreate_o3 */
>   
>       IMMND_EVT_A2ND_OBJ_SAFE_READ = 100,     /* saImmOmCcbObjectRead */
> +     IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO = 101, /* Get Admin owner name from 
> CCbID */
>   
>       IMMND_EVT_MAX
>   } IMMND_EVT_TYPE;
> diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc 
> b/osaf/services/saf/immsv/immnd/ImmModel.cc
> --- a/osaf/services/saf/immsv/immnd/ImmModel.cc
> +++ b/osaf/services/saf/immsv/immnd/ImmModel.cc
> @@ -2380,6 +2380,14 @@ immModel_fetchRtUpdate(IMMND_CB *cb,
>           fetchRtUpdate(syncReq, rtModReq, syncFevsBase)?SA_TRUE:SA_FALSE;
>   }
>   
> +SaAisErrorT immModel_getAdminOwnerFromCcbId(IMMND_CB *cb,
> +     SaUint32T ccbId, SaStringT *admOwnNameptr)
> +{
> +
> +    return ImmModel::instance(&cb->immModel)->
> +        getAdminOwnerFromCcbId(ccbId, admOwnNameptr);
> +
> +}
>   
>   SaAisErrorT
>   immModel_resourceDisplay(IMMND_CB *cb,
> @@ -13179,6 +13187,37 @@ ImmModel::updateImmObject2(const ImmsvOm
>   }
>   
>   SaAisErrorT
> +ImmModel::getAdminOwnerFromCcbId(const SaUint32T ccbId, SaStringT 
> *admOwnNameptr)
> +{
> +    SaAisErrorT err = SA_AIS_OK;
> +    CcbVector::iterator i;
> +    AdminOwnerVector::iterator j = sOwnerVector.end();
> +    SaUint32T ownerId;
> +    TRACE_ENTER();
> +
> +    i = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId));
> +    if (i == sCcbVector.end()) {
> +        LOG_NO("ERR_BAD_HANDLE: CCB %u does not exist", ccbId);
> +        err = SA_AIS_ERR_BAD_HANDLE;
> +    } else {
> +        ownerId = (*i)->mAdminOwnerId;
> +        j = std::find_if(sOwnerVector.begin(), sOwnerVector.end(), 
> IdIs(ownerId));
> +        if((*i)->mAdminOwnerId && (j == sOwnerVector.end())) {
> +            LOG_NO("ERR_BAD_HANDLE: admin owner %u does not exist", 
> (*i)->mAdminOwnerId);
> +            err = SA_AIS_ERR_BAD_HANDLE;
> +        } else {
> +            TRACE_5(" admin owner '%s'", (*j)->mAdminOwnerName.c_str());
> +            *admOwnNameptr = (char *) 
> malloc((*j)->mAdminOwnerName.length()+1);
> +            strcpy( *admOwnNameptr, (*j)->mAdminOwnerName.c_str());
> +        }
> +     TRACE("Owner id %d", ownerId);
> +    }
> +
> +    TRACE_LEAVE();
> +    return err;
> +}
> +
> +SaAisErrorT
>   ImmModel::resourceDisplay(const struct ImmsvAdminOperationParam *reqparams,
>                                   struct ImmsvAdminOperationParam **rparams, 
> SaUint64T searchcount)
>   {
> diff --git a/osaf/services/saf/immsv/immnd/ImmModel.hh 
> b/osaf/services/saf/immsv/immnd/ImmModel.hh
> --- a/osaf/services/saf/immsv/immnd/ImmModel.hh
> +++ b/osaf/services/saf/immsv/immnd/ImmModel.hh
> @@ -492,6 +492,9 @@ public:
>                                         const struct ImmsvAdminOperationParam 
> *reqparams,
>                                         struct ImmsvAdminOperationParam 
> **rparams,
>                                         SaUint64T searchcount);
> +    SaAisErrorT       getAdminOwnerFromCcbId(
> +                                      SaUint32T ccbId,
> +                                      SaStringT *admOwnNameptr);
>   
>       void              setScAbsenceAllowed(SaUint32T scAbsenceAllowed);
>       
> diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c 
> b/osaf/services/saf/immsv/immnd/immnd_evt.c
> --- a/osaf/services/saf/immsv/immnd/immnd_evt.c
> +++ b/osaf/services/saf/immsv/immnd/immnd_evt.c
> @@ -225,6 +225,7 @@ static void immnd_evt_ccb_abort(IMMND_CB
>               SaUint32T * clArrSize, SaUint32T *nodeId);
>   
>   static uint32_t immnd_evt_proc_reset(IMMND_CB *cb, IMMND_EVT *evt, 
> IMMSV_SEND_INFO *sinfo);
> +static uint32_t immnd_evt_aug_ccb_get_admo(IMMND_CB *cb, IMMND_EVT *evt, 
> IMMSV_SEND_INFO *sinfo);
>   
>   #if 0                               /* Only for debug */
>   static void printImmValue(SaImmValueTypeT t, IMMSV_EDU_ATTR_VAL *v)
> @@ -631,6 +632,10 @@ void immnd_process_evt(void)
>               rc = immnd_evt_proc_admop_rsp(cb, &evt->info.immnd, 
> &evt->sinfo, SA_TRUE, SA_TRUE);
>               break;
>   
> +     case IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO:
> +             rc = immnd_evt_aug_ccb_get_admo(cb, &evt->info.immnd, 
> &evt->sinfo);
> +             break;
> +
>       case IMMND_EVT_ND2ND_ADMOP_RSP:
>       case IMMND_EVT_ND2ND_ADMOP_RSP_2:
>               rc = immnd_evt_proc_admop_rsp(cb, &evt->info.immnd, 
> &evt->sinfo, SA_FALSE, SA_FALSE);
> @@ -4445,6 +4450,66 @@ static void immnd_evt_sync_fevs_base(IMM
>   
>   }
>   
> +/*****************************************************************************
> + * Name          : immnd_evt_aug_ccb_get_admo
> + *
> + * Description   : Function to get adminoperation name from the CcbID.
> + *                 When saImmOiAugmentCcbInitialize is called from completed
> +                callback.
> + *
> + * Arguments     : IMMND_CB *cb - IMMND CB pointer
> + *                 IMMSV_EVT *evt - Received Event structure
> + *
> + * Return Values : NCSCC_RC_SUCCESS/Error.
> + *
> + 
> *****************************************************************************/
> +
> +
> +static uint32_t immnd_evt_aug_ccb_get_admo(IMMND_CB *cb, IMMND_EVT *evt, 
> IMMSV_SEND_INFO *sinfo)
> +{
> +     IMMSV_EVT send_evt;
> +     SaAisErrorT err = SA_AIS_OK;
> +     uint32_t rc = NCSCC_RC_SUCCESS;
> +     SaStringT admOwnName = NULL;
> +     TRACE_ENTER();  
> +
> +     err = immModel_getAdminOwnerFromCcbId(cb, evt->info.ccbId, &admOwnName);
> +     memset(&send_evt, '\0', sizeof(IMMSV_EVT));
> +     
> +     if (err == SA_AIS_OK && admOwnName) {
> +             IMMSV_OM_RSP_SEARCH_NEXT * rsp = (IMMSV_OM_RSP_SEARCH_NEXT*) 
> calloc(1, sizeof(IMMSV_OM_RSP_SEARCH_NEXT));
> +             /* The objectName is not sent by response, only the adminowner 
> information is sent as attribute*/
> +
> +             rsp->attrValuesList = (IMMSV_ATTR_VALUES_LIST *) calloc(1, 
> sizeof(IMMSV_ATTR_VALUES_LIST));
> +             IMMSV_ATTR_VALUES* attr = &(rsp->attrValuesList->n);
> +
> +             attr->attrName.size = (SaUint32T) 
> strlen("SaImmAttrAdminOwnerName")+1;
> +             attr->attrName.buf = strdup("SaImmAttrAdminOwnerName");
> +             attr->attrValueType = SA_IMM_ATTR_SASTRINGT;
> +             attr->attrValuesNumber =1;
> +             attr->attrValue.val.x.size=(SaUint32T) strlen(admOwnName)+1;
> +             attr->attrValue.val.x.buf = (char *) 
> malloc(attr->attrValue.val.x.size);
> +             memcpy(attr->attrValue.val.x.buf, admOwnName, 
> attr->attrValue.val.x.size);
> +             TRACE("The AdminOwner Name is %s ", attr->attrValue.val.x.buf);
> +
> +             send_evt.type = IMMSV_EVT_TYPE_IMMA;
> +             send_evt.info.imma.type = 
> IMMND_EVT_A2ND_OI_AUG_CCB_GET_ADMO_RSP;
> +             send_evt.info.imma.info.searchNextRsp = rsp;
> +     } else {
> +             send_evt.info.imma.type = IMMA_EVT_ND2A_IMM_ERROR;
> +                send_evt.info.imma.info.errRsp.error = err;
> +                send_evt.info.imma.info.errRsp.errStrings = NULL;
> +     }
> +     
> +     rc = immnd_mds_send_rsp(cb, sinfo, &send_evt);
> +     if (rc != NCSCC_RC_SUCCESS) {
> +             LOG_WA("Failed to send response to agent/client over MDS 
> rc:%u", rc);
> +     }
> +     if(admOwnName)
> +             free(admOwnName);
> +     return rc;
> +}
> +
>   static void immnd_evt_safe_read_lock(IMMND_CB *cb, IMMND_EVT *evt,
>          SaBoolT originatedAtThisNd, SaImmHandleT clnt_hdl, MDS_DEST 
> reply_dest)
>   {
> diff --git a/osaf/services/saf/immsv/immnd/immnd_init.h 
> b/osaf/services/saf/immsv/immnd/immnd_init.h
> --- a/osaf/services/saf/immsv/immnd/immnd_init.h
> +++ b/osaf/services/saf/immsv/immnd/immnd_init.h
> @@ -446,6 +446,9 @@ extern "C" {
>               const struct ImmsvAdminOperationParam *reqparams,
>               struct ImmsvAdminOperationParam **rparams);
>   
> +     SaAisErrorT immModel_getAdminOwnerFromCcbId(IMMND_CB *cb,
> +             SaUint32T ccbId, SaStringT *admOwnNameptr);
> +
>       void
>       immModel_setCcbErrorString(IMMND_CB *cb,
>               SaUint32T ccbId,
>

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to