Hi Hung,

I over looked imma_oi_ccb_record, the idea was to avoid increasing 
library memory, if the apply/abort is not called.
I agree that it can be done from OI side also.
will re-publish the patch.

Thanks,
Neel.

On 2016/11/23 02:58 PM, Hung Nguyen wrote:
> Hi Neel,
>
> 'struct imma_oi_ccb_record' is already defined in imma_cb.h
> It's used to store information of a specific CCB.
>
> By using imma_oi_ccb_record to store admoName/ObjectName,
> we can avoid new message and also don't have to change anything in IMMND 
> server.
>
>
> BR,
> Hung Nguyen - DEK Technologies
>
> --------------------------------------------------------------------------------
> From: Neelakanta [email protected]
> Sent: Wednesday, November 23, 2016 3:56PM
> To: Hung Nguyen, Zoran Milinkovic
>      [email protected],[email protected]
> Cc: Opensaf-devel
>      [email protected]
> Subject: Re: [PATCH 1 of 1] imm:allow augumentCcbInit with ROF as false in 
> completed callback[#1956]
>
>
> 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