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