osaf/libs/agents/saf/imma/imma_om_api.c          |    8 +-
 osaf/libs/common/immsv/immsv_evt.c               |  265 ++++++++++++----------
 osaf/libs/common/immsv/include/immsv_evt.h       |    4 +
 osaf/libs/common/immsv/include/immsv_evt_model.h |    1 +
 osaf/services/saf/immsv/immd/immd_evt.c          |   19 +-
 osaf/services/saf/immsv/immnd/ImmModel.cc        |   13 +-
 osaf/services/saf/immsv/immnd/immnd_evt.c        |   27 ++-
 7 files changed, 205 insertions(+), 132 deletions(-)


Define new message types: IMMD_EVT_ND2D_ADMINIT_REQ_2 and 
IMMND_EVT_D2ND_ADMINIT_2.
IMMND_EVT_A2ND_IMM_ADMINIT messages are only sent in scope of a node so no need 
to define a new message type.

Add new member 'stringAdminOwnerName' to IMMSV_OM_ADMIN_OWNER_INITIALIZE.
'stringAdminOwnerName' is used in IMMND_EVT_A2ND_IMM_ADMINIT and new message 
types.

IMMND will use IMMD_EVT_ND2D_ADMINIT_REQ_2 messages if protocol47 is enabled 
and IMMD_EVT_ND2D_ADMINIT_REQ messages if protocol47 is disabled.

When receiving an IMMD_EVT_ND2D_ADMINIT_REQ message, IMMD will broadcast an 
IMMND_EVT_D2ND_ADMINIT message.
When receiving an IMMD_EVT_ND2D_ADMINIT_REQ_2 message, IMMD will broadcast an 
IMMND_EVT_D2ND_ADMINIT_2 message.

ImmModel now has to handle both old and new messages.
The message type is detected by checking if 'name' member of 
IMMSV_OM_ADMIN_OWNER_INITIALIZE is empty or not.

diff --git a/osaf/libs/agents/saf/imma/imma_om_api.c 
b/osaf/libs/agents/saf/imma/imma_om_api.c
--- a/osaf/libs/agents/saf/imma/imma_om_api.c
+++ b/osaf/libs/agents/saf/imma/imma_om_api.c
@@ -1012,8 +1012,8 @@ SaAisErrorT saImmOmAdminOwnerInitialize(
        evt.type = IMMSV_EVT_TYPE_IMMND;
        evt.info.immnd.type = IMMND_EVT_A2ND_IMM_ADMINIT;
        evt.info.immnd.info.adminitReq.client_hdl = immHandle;
-       osaf_extended_name_alloc(adminOwnerName,
-                       &evt.info.immnd.info.adminitReq.i.adminOwnerName);
+       evt.info.immnd.info.adminitReq.i.stringAdminOwnerName.size = 
strlen(adminOwnerName) + 1;
+       evt.info.immnd.info.adminitReq.i.stringAdminOwnerName.buf = 
adminOwnerName;
        if (releaseOwnershipOnFinalize) {
                evt.info.immnd.info.adminitReq.i.releaseOwnershipOnFinalize = 
true;
                /* Release on finalize can not be undone in case of IMMND crash.
@@ -8707,8 +8707,8 @@ static SaBoolT imma_re_initialize_admin_
        evt.type = IMMSV_EVT_TYPE_IMMND;
        evt.info.immnd.type = IMMND_EVT_A2ND_IMM_ADMINIT;
        evt.info.immnd.info.adminitReq.client_hdl = immHandle;
-       osaf_extended_name_alloc(adm_found_node->mAdminOwnerName,
-                       &evt.info.immnd.info.adminitReq.i.adminOwnerName);
+       evt.info.immnd.info.adminitReq.i.stringAdminOwnerName.size = 
strlen(adm_found_node->mAdminOwnerName) + 1;
+       evt.info.immnd.info.adminitReq.i.stringAdminOwnerName.buf = 
adm_found_node->mAdminOwnerName;
        evt.info.immnd.info.adminitReq.i.releaseOwnershipOnFinalize = false;
        
        temp_hdl = adm_found_node->admin_owner_hdl;
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
@@ -68,6 +68,7 @@ static const char *immd_evt_names[] = {
        "IMMD_EVT_ND2D_LOADING_COMPLETED",
        "IMMD_EVT_ND2D_2PBE_PRELOAD",
        "IMMD_EVT_ND2D_IMPLSET_REQ_2",
+       "IMMD_EVT_ND2D_ADMINIT_REQ_2",
        "undefined (high)"
 };
 
@@ -181,6 +182,7 @@ static const char *immnd_evt_names[] = {
        "IMMND_EVT_D2ND_IMPLSET_RSP_2", /* Implementer set reply from D with 
impl id */
        "IMMND_EVT_A2ND_OBJ_CREATE_2",  /* saImmOmCcbObjectCreate_o3 */
        "IMMND_EVT_A2ND_OI_OBJ_CREATE_2",       /* saImmOiRtObjectCreate_o3 */
+       "IMMND_EVT_D2ND_ADMINIT_2",     /* Admin Owner init reply */
        "undefined (high)"
 };
 
@@ -1565,7 +1567,11 @@ static uint32_t immsv_evt_enc_sublevels(
                        if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) {
                                return NCSCC_RC_OUT_OF_MEM;
                        }
-
+               } else if (i_evt->info.immd.type == 
IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+                       IMMSV_OCTET_STRING *os = 
&(i_evt->info.immd.info.admown_init.i.stringAdminOwnerName);
+                       if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) {
+                               return NCSCC_RC_OUT_OF_MEM;
+                       }
                }
        } else if (i_evt->type == IMMSV_EVT_TYPE_IMMND) {
                if ((i_evt->info.immnd.type == IMMND_EVT_A2ND_IMM_FEVS) ||
@@ -1989,6 +1995,16 @@ static uint32_t immsv_evt_enc_sublevels(
                        if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) {
                                return NCSCC_RC_OUT_OF_MEM;
                        }
+               } else if (i_evt->info.immnd.type == 
IMMND_EVT_A2ND_IMM_ADMINIT) {
+                       IMMSV_OCTET_STRING *os = 
&(i_evt->info.immnd.info.adminitReq.i.stringAdminOwnerName);
+                       if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) {
+                               return NCSCC_RC_OUT_OF_MEM;
+                       }
+               } else if (i_evt->info.immnd.type == IMMND_EVT_D2ND_ADMINIT_2) {
+                       IMMSV_OCTET_STRING *os = 
&(i_evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName);
+                       if(!immsv_evt_enc_inline_text(__LINE__, o_ub, os)) {
+                               return NCSCC_RC_OUT_OF_MEM;
+                       }
                }
        }
 
@@ -2190,6 +2206,9 @@ static uint32_t immsv_evt_dec_sublevels(
 
                        os = &(o_evt->info.immd.info.ctrl_msg.pbeFile);
                        immsv_evt_dec_inline_string(i_ub, os);
+               } else if (o_evt->info.immd.type == 
IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+                       IMMSV_OCTET_STRING *os = 
&(o_evt->info.immd.info.admown_init.i.stringAdminOwnerName);
+                       immsv_evt_dec_inline_string(i_ub, os);
                }
        } else if (o_evt->type == IMMSV_EVT_TYPE_IMMND) {
                if ((o_evt->info.immnd.type == IMMND_EVT_A2ND_IMM_FEVS) ||
@@ -2497,6 +2516,12 @@ static uint32_t immsv_evt_dec_sublevels(
                        IMMSV_OCTET_STRING *os = 
                                
&(o_evt->info.immnd.info.ccbUpcallRsp.errorString);
                        immsv_evt_dec_inline_string(i_ub, os);
+               } else if (o_evt->info.immnd.type == 
IMMND_EVT_A2ND_IMM_ADMINIT) {
+                       IMMSV_OCTET_STRING *os = 
&(o_evt->info.immnd.info.adminitReq.i.stringAdminOwnerName);
+                       immsv_evt_dec_inline_string(i_ub, os);
+               } else if (o_evt->info.immnd.type == IMMND_EVT_D2ND_ADMINIT_2) {
+                       IMMSV_OCTET_STRING *os = 
&(o_evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName);
+                       immsv_evt_dec_inline_string(i_ub, os);
                }
        }
        return NCSCC_RC_SUCCESS;
@@ -2933,31 +2958,39 @@ static uint32_t immsv_evt_enc_toplevel(I
                        break;
 
                case IMMD_EVT_ND2D_ADMINIT_REQ: /* AdminOwnerInitialize */
+               case IMMD_EVT_ND2D_ADMINIT_REQ_2:       /* AdminOwnerInitialize 
*/
                {
                        IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 8);
                        ncs_encode_64bit(&p8, 
immdevt->info.admown_init.client_hdl);
                        ncs_enc_claim_space(o_ub, 8);
 
-                       IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 2);
-                       const char* value = 
osaf_extended_name_borrow(&immdevt->info.admown_init.i.adminOwnerName);
-                       size_t length = strlen(value);
-                       if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
-                               // With this check we don't need to check for 
extended names
-                               LOG_WA("Admin owner name is too long (max. 255 
characters)");
-                               rc = NCSCC_RC_FAILURE;
-                               break;
-                       }
-                       ncs_encode_16bit(&p8, length);
-                       ncs_enc_claim_space(o_ub, 2);
-
-                       /* adminOwnerName.value is top level because type is 
SaNameT */
-                       if(ncs_encode_n_octets_in_uba(o_ub,
-                                       (uint8_t*) value,
-                                       length)
-                                       != NCSCC_RC_SUCCESS) {
-                               LOG_WA("Failure inside 
ncs_encode_n_octets_in_uba");
-                               rc = NCSCC_RC_FAILURE;
-                               break;
+                       if (immdevt->type == IMMD_EVT_ND2D_ADMINIT_REQ) {
+                               IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 2);
+                               const char* value = 
osaf_extended_name_borrow(&immdevt->info.admown_init.i.adminOwnerName);
+                               size_t length = strlen(value);
+                               if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
+                                       // With this check we don't need to 
check for extended names
+                                       LOG_WA("Admin owner name is too long 
(max. 255 characters)");
+                                       rc = NCSCC_RC_FAILURE;
+                                       break;
+                               }
+                               ncs_encode_16bit(&p8, length);
+                               ncs_enc_claim_space(o_ub, 2);
+
+                               /* adminOwnerName.value is top level because 
type is SaNameT */
+                               if(ncs_encode_n_octets_in_uba(o_ub,
+                                               (uint8_t*) value,
+                                               length)
+                                               != NCSCC_RC_SUCCESS) {
+                                       LOG_WA("Failure inside 
ncs_encode_n_octets_in_uba");
+                                       rc = NCSCC_RC_FAILURE;
+                                       break;
+                               }
+                       } else if (immdevt->type == 
IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+                               IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
+                               ncs_encode_32bit(&p8, 
immdevt->info.admown_init.i.stringAdminOwnerName.size);
+                               ncs_enc_claim_space(o_ub, 4);
+                               /* 
immdevt->info.admown_init.i.stringAdminOwnerName.buf encoded by sublevel */
                        }
 
                        IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 1);
@@ -3153,27 +3186,10 @@ static uint32_t immsv_evt_enc_toplevel(I
                        ncs_encode_64bit(&p8, 
immndevt->info.adminitReq.client_hdl);
                        ncs_enc_claim_space(o_ub, 8);
 
-                       IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 2);
-                       const char* value = 
osaf_extended_name_borrow(&immndevt->info.adminitReq.i.adminOwnerName);
-                       size_t length = strlen(value);
-                       if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
-                               // With this check we don't need to check for 
extended names
-                               LOG_WA("Admin owner name is too long (max. 255 
characters)");
-                               rc = NCSCC_RC_FAILURE;
-                               break;
-                       }
-                       ncs_encode_16bit(&p8, length);
-                       ncs_enc_claim_space(o_ub, 2);
-
-                       /* adminOwnerName.value is top level because type is 
SaNameT */
-                       if(ncs_encode_n_octets_in_uba(o_ub,
-                                       (uint8_t*) value,
-                                       length)
-                                       != NCSCC_RC_SUCCESS) {
-                               LOG_WA("Failure inside 
ncs_encode_n_octets_in_uba");
-                               rc = NCSCC_RC_FAILURE;
-                               break;
-                       }
+                       IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
+                       ncs_encode_32bit(&p8, 
immndevt->info.adminitReq.i.stringAdminOwnerName.size);
+                       ncs_enc_claim_space(o_ub, 4);
+                       /* immndevt->info.adminitReq.i.stringAdminOwnerName.buf 
encoded by sublevel */
 
                        IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 1);
                        ncs_encode_8bit(&p8, 
immndevt->info.adminitReq.i.releaseOwnershipOnFinalize);
@@ -3805,30 +3821,38 @@ static uint32_t immsv_evt_enc_toplevel(I
                        break;
 
                case IMMND_EVT_D2ND_ADMINIT:    /* Admin Owner init reply */
+               case IMMND_EVT_D2ND_ADMINIT_2:  /* Admin Owner init reply */
                        IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
                        ncs_encode_32bit(&p8, 
immndevt->info.adminitGlobal.globalOwnerId);
                        ncs_enc_claim_space(o_ub, 4);
 
-                       IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 2);
-                       const char* value = 
osaf_extended_name_borrow(&immndevt->info.adminitGlobal.i.adminOwnerName);
-                       size_t length = strlen(value);
-                       if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
-                               // With this check we don't need to check for 
extended names
-                               LOG_WA("Admin owner name is too long (max. 255 
characters)");
-                               rc = NCSCC_RC_FAILURE;
-                               break;
-                       }
-                       ncs_encode_16bit(&p8, length);
-                       ncs_enc_claim_space(o_ub, 2);
-
-                       /* adminOwnerName.value is top level because type is 
SaNameT */
-                       if(ncs_encode_n_octets_in_uba(o_ub,
-                                       (uint8_t*) value,
-                                       length)
-                                       != NCSCC_RC_SUCCESS) {
-                               LOG_WA("Failure inside 
ncs_encode_n_octets_in_uba");
-                               rc = NCSCC_RC_FAILURE;
-                               break;
+                       if (immndevt->type == IMMND_EVT_D2ND_ADMINIT) {
+                               IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 2);
+                               const char* value = 
osaf_extended_name_borrow(&immndevt->info.adminitGlobal.i.adminOwnerName);
+                               size_t length = strlen(value);
+                               if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
+                                       // With this check we don't need to 
check for extended names
+                                       LOG_WA("Admin owner name is too long 
(max. 255 characters)");
+                                       rc = NCSCC_RC_FAILURE;
+                                       break;
+                               }
+                               ncs_encode_16bit(&p8, length);
+                               ncs_enc_claim_space(o_ub, 2);
+
+                               /* adminOwnerName.value is top level because 
type is SaNameT */
+                               if(ncs_encode_n_octets_in_uba(o_ub,
+                                               (uint8_t*) value,
+                                               length)
+                                               != NCSCC_RC_SUCCESS) {
+                                       LOG_WA("Failure inside 
ncs_encode_n_octets_in_uba");
+                                       rc = NCSCC_RC_FAILURE;
+                                       break;
+                               }
+                       } else if (immndevt->type == IMMND_EVT_D2ND_ADMINIT_2) {
+                               IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 4);
+                               ncs_encode_32bit(&p8, 
immndevt->info.adminitGlobal.i.stringAdminOwnerName.size);
+                               ncs_enc_claim_space(o_ub, 4);
+                               /* 
immndevt->info.adminitGlobal.i.stringAdminOwnerName.buf encoded by sublevel */
                        }
 
                        IMMSV_RSRV_SPACE_ASSERT(p8, o_ub, 1);
@@ -4320,34 +4344,42 @@ static uint32_t immsv_evt_dec_toplevel(N
                        break;
 
                case IMMD_EVT_ND2D_ADMINIT_REQ: /* AdminOwnerInitialize */
+               case IMMD_EVT_ND2D_ADMINIT_REQ_2:       /* AdminOwnerInitialize 
*/
                {
                        IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 8);
                        immdevt->info.admown_init.client_hdl = 
ncs_decode_64bit(&p8);
                        ncs_dec_skip_space(i_ub, 8);
 
-                       IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 2);
-                       size_t length = ncs_decode_16bit(&p8);
-                       ncs_dec_skip_space(i_ub, 2);
-                       if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
-                               LOG_WA("Admin owner name is too long (max. 255 
characters)");
-                               rc = NCSCC_RC_FAILURE;
-                               break;
+                       if (immdevt->type == IMMD_EVT_ND2D_ADMINIT_REQ) {
+                               IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 
2);
+                               size_t length = ncs_decode_16bit(&p8);
+                               ncs_dec_skip_space(i_ub, 2);
+                               if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
+                                       LOG_WA("Admin owner name is too long 
(max. 255 characters)");
+                                       rc = NCSCC_RC_FAILURE;
+                                       break;
+                               }
+
+                               /* adminOwnerName.value is top level because 
type is SaNameT */
+                               char* value = (char*) malloc(length + 1);
+                               if (value == NULL || 
ncs_decode_n_octets_from_uba(i_ub,
+                                               (uint8_t*) value,
+                                               length) !=
+                                                               
NCSCC_RC_SUCCESS) {
+                                       free(value);
+                                       LOG_WA("Failure inside 
ncs_decode_n_octets_from_uba");
+                                       rc = NCSCC_RC_FAILURE;
+                                       break;
+                               }
+                               value[length] = '\0';
+                               osaf_extended_name_steal(value, 
&immdevt->info.admown_init.i.adminOwnerName);
+                       } else if (immdevt->type == 
IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+                               IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 
4);
+                               
immdevt->info.admown_init.i.stringAdminOwnerName.size = ncs_decode_32bit(&p8);
+                               ncs_dec_skip_space(i_ub, 4);
+                               /* 
immdevt->info.admown_init.i.stringAdminOwnerName.buf decoded by sublevel */
                        }
 
-                       /* adminOwnerName.value is top level because type is 
SaNameT */
-                       char* value = (char*) malloc(length + 1);
-                       if (value == NULL || ncs_decode_n_octets_from_uba(i_ub,
-                                       (uint8_t*) value,
-                                       length) !=
-                                                       NCSCC_RC_SUCCESS) {
-                               free(value);
-                               LOG_WA("Failure inside 
ncs_decode_n_octets_from_uba");
-                               rc = NCSCC_RC_FAILURE;
-                               break;
-                       }
-                       value[length] = '\0';
-                       osaf_extended_name_steal(value, 
&immdevt->info.admown_init.i.adminOwnerName);
-
                        IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 1);
                        immdevt->info.admown_init.i.releaseOwnershipOnFinalize 
= ncs_decode_8bit(&p8);
                        ncs_dec_skip_space(i_ub, 1);
@@ -4544,28 +4576,10 @@ static uint32_t immsv_evt_dec_toplevel(N
                        immndevt->info.adminitReq.client_hdl = 
ncs_decode_64bit(&p8);
                        ncs_dec_skip_space(i_ub, 8);
 
-                       IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 2);
-                       size_t length = ncs_decode_16bit(&p8);
-                       ncs_dec_skip_space(i_ub, 2);
-                       if(length >= IMMSV_MAX_ADMO_NAME_LENGTH) {
-                               LOG_WA("Admin owner name is too long (max. 255 
characters)");
-                               rc = NCSCC_RC_FAILURE;
-                               break;
-                       }
-
-                       /* adminOwnerName.value is top level because type is 
SaNameT */
-                       char* value = (char*) malloc(length + 1);
-                       if (value == NULL || ncs_decode_n_octets_from_uba(i_ub,
-                                       (uint8_t*) value,
-                                       length) !=
-                                                       NCSCC_RC_SUCCESS) {
-                               free(value);
-                               LOG_WA("Failure inside 
ncs_decode_n_octets_from_uba");
-                               rc = NCSCC_RC_FAILURE;
-                               break;
-                       }
-                       value[length] = '\0';
-                       osaf_extended_name_steal(value, 
&immndevt->info.adminitReq.i.adminOwnerName);
+                       IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4);
+                       immndevt->info.adminitReq.i.stringAdminOwnerName.size = 
ncs_decode_32bit(&p8);
+                       ncs_dec_skip_space(i_ub, 4);
+                       /* immndevt->info.adminitReq.i.stringAdminOwnerName.buf 
decoded by sublevel */
 
                        IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 1);
                        immndevt->info.adminitReq.i.releaseOwnershipOnFinalize 
= ncs_decode_8bit(&p8);
@@ -5251,28 +5265,37 @@ static uint32_t immsv_evt_dec_toplevel(N
                        break;
 
                case IMMND_EVT_D2ND_ADMINIT:    /* Admin Owner init reply */
+               case IMMND_EVT_D2ND_ADMINIT_2:  /* Admin Owner init reply */
                {
                        IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 4);
                        immndevt->info.adminitGlobal.globalOwnerId = 
ncs_decode_32bit(&p8);
                        ncs_dec_skip_space(i_ub, 4);
 
-                       IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 2);
-                       size_t length = ncs_decode_16bit(&p8);
-                       ncs_dec_skip_space(i_ub, 2);
-
-                       /* adminOwnerName.value is top level because type is 
SaNameT */
-                       char* value = (char*) malloc(length + 1);
-                       if (value == NULL || ncs_decode_n_octets_from_uba(i_ub,
-                                       (uint8_t*) value,
-                                       length) !=
-                                                       NCSCC_RC_SUCCESS) {
-                               free(value);
-                               LOG_ER("Failure inside 
ncs_decode_n_octets_from_uba");
-                               rc = NCSCC_RC_FAILURE;
-                               break;
+                       
osaf_extended_name_clear(&immndevt->info.adminitGlobal.i.adminOwnerName);
+                       if (immndevt->type == IMMND_EVT_D2ND_ADMINIT) {
+                               IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 
2);
+                               size_t length = ncs_decode_16bit(&p8);
+                               ncs_dec_skip_space(i_ub, 2);
+
+                               /* adminOwnerName.value is top level because 
type is SaNameT */
+                               char* value = (char*) malloc(length + 1);
+                               if (value == NULL || 
ncs_decode_n_octets_from_uba(i_ub,
+                                               (uint8_t*) value,
+                                               length) !=
+                                                               
NCSCC_RC_SUCCESS) {
+                                       free(value);
+                                       LOG_ER("Failure inside 
ncs_decode_n_octets_from_uba");
+                                       rc = NCSCC_RC_FAILURE;
+                                       break;
+                               }
+                               value[length] = '\0';
+                               osaf_extended_name_steal(value, 
&immndevt->info.adminitGlobal.i.adminOwnerName);
+                       } else if (immndevt->type == IMMND_EVT_D2ND_ADMINIT_2) {
+                               IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 
4);
+                               
immndevt->info.adminitGlobal.i.stringAdminOwnerName.size = 
ncs_decode_32bit(&p8);
+                               ncs_dec_skip_space(i_ub, 4);
+                               /* 
immndevt->info.adminitGlobal.i.stringAdminOwnerName.buf decoded by sublevel */
                        }
-                       value[length] = '\0';
-                       osaf_extended_name_steal(value, 
&immndevt->info.adminitGlobal.i.adminOwnerName);
 
                        IMMSV_FLTN_SPACE_ASSERT(p8, local_data, i_ub, 1);
                        
immndevt->info.adminitGlobal.i.releaseOwnershipOnFinalize = 
ncs_decode_8bit(&p8);
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
@@ -214,6 +214,8 @@ typedef enum immnd_evt_type {
        IMMND_EVT_A2ND_OBJ_CREATE_2 = 98,       /* saImmOmCcbObjectCreate_o3 */
        IMMND_EVT_A2ND_OI_OBJ_CREATE_2 = 99,    /* saImmOiRtObjectCreate_o3 */
 
+       IMMND_EVT_D2ND_ADMINIT_2 = 100, /* Admin Owner init reply */
+
        IMMND_EVT_MAX
 } IMMND_EVT_TYPE;
 /* Make sure the string array in immsv_evt.c matches the IMMND_EVT_TYPE enum. 
*/
@@ -261,6 +263,8 @@ typedef enum immd_evt_type {
 
        IMMD_EVT_ND2D_IMPLSET_REQ_2 = 27, /* OiImplementerSet */
 
+       IMMD_EVT_ND2D_ADMINIT_REQ_2 = 28,       /* AdminOwnerInitialize */
+
        IMMD_EVT_MAX
 } IMMD_EVT_TYPE;
 /* Make sure the string array in immsv_evt.c matches the IMMD_EVT_TYPE enum. */
diff --git a/osaf/libs/common/immsv/include/immsv_evt_model.h 
b/osaf/libs/common/immsv/include/immsv_evt_model.h
--- a/osaf/libs/common/immsv/include/immsv_evt_model.h
+++ b/osaf/libs/common/immsv/include/immsv_evt_model.h
@@ -136,6 +136,7 @@ extern "C" {
        typedef struct ImmsvOmAdminOwnerInitialize {
                SaNameT adminOwnerName;
                SaBoolT releaseOwnershipOnFinalize;
+               IMMSV_OCTET_STRING stringAdminOwnerName;
        } IMMSV_OM_ADMIN_OWNER_INITIALIZE;
 
        typedef struct ImmsvOmCcbInitialize {
diff --git a/osaf/services/saf/immsv/immd/immd_evt.c 
b/osaf/services/saf/immsv/immd/immd_evt.c
--- a/osaf/services/saf/immsv/immd/immd_evt.c
+++ b/osaf/services/saf/immsv/immd/immd_evt.c
@@ -131,6 +131,7 @@ void immd_process_evt(void)
                rc = immd_evt_proc_immnd_announce_dump(cb, &evt->info.immd, 
&evt->sinfo);
                break;
        case IMMD_EVT_ND2D_ADMINIT_REQ:
+       case IMMD_EVT_ND2D_ADMINIT_REQ_2:
                rc = immd_evt_proc_adminit_req(cb, &evt->info.immd, 
&evt->sinfo);
                break;
        case IMMD_EVT_ND2D_IMPLSET_REQ:
@@ -1628,7 +1629,11 @@ static uint32_t immd_evt_proc_adminit_re
        uba.start = NULL;
        TRACE_ENTER();
 
-       TRACE_5("Admin owner name:%s", 
osaf_extended_name_borrow(&adminit_req->i.adminOwnerName));
+       if (evt->type == IMMD_EVT_ND2D_ADMINIT_REQ) {
+               TRACE_5("Admin owner name:%s", 
osaf_extended_name_borrow(&adminit_req->i.adminOwnerName));
+       } else if (evt->type == IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+               TRACE_5("Admin owner name:%s", 
adminit_req->i.stringAdminOwnerName.buf);
+       }
 
        globalId = ++(cb->admo_id_count);
        if (cb->admo_id_count == 0xffffffff) {
@@ -1661,7 +1666,11 @@ static uint32_t immd_evt_proc_adminit_re
 
        memset(&fevs_evt, 0, sizeof(IMMSV_EVT));
        fevs_evt.type = IMMSV_EVT_TYPE_IMMND;
-       fevs_evt.info.immnd.type = IMMND_EVT_D2ND_ADMINIT;
+       if (evt->type == IMMD_EVT_ND2D_ADMINIT_REQ) {
+               fevs_evt.info.immnd.type = IMMND_EVT_D2ND_ADMINIT;
+       } else if (evt->type == IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+               fevs_evt.info.immnd.type = IMMND_EVT_D2ND_ADMINIT_2;
+       }
        fevs_evt.info.immnd.info.adminitGlobal.globalOwnerId = globalId;
        fevs_evt.info.immnd.info.adminitGlobal.i = adminit_req->i;
 
@@ -1706,6 +1715,12 @@ static uint32_t immd_evt_proc_adminit_re
                m_MMGR_FREE_BUFR_LIST(uba.start);
        }
 
+       if (evt->type == IMMD_EVT_ND2D_ADMINIT_REQ_2) {
+               free(adminit_req->i.stringAdminOwnerName.buf);
+               adminit_req->i.stringAdminOwnerName.buf = NULL;
+               adminit_req->i.stringAdminOwnerName.size = 0;
+       }
+
        TRACE_LEAVE();
        return proc_rc;
 }
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
@@ -4352,13 +4352,22 @@ ImmModel::adminOwnerCreate(const ImmsvOm
     unsigned int nodeId)
 {
     SaAisErrorT err = SA_AIS_OK;
+    std::string admin_name;
     TRACE_ENTER();
     if(immNotWritable()) {
         TRACE_LEAVE();
         return SA_AIS_ERR_TRY_AGAIN;
     }
     
-    if (strcmp("IMMLOADER", osaf_extended_name_borrow(&req->adminOwnerName)) 
== 0) {
+    if (osaf_is_extended_name_empty(&req->adminOwnerName)) {
+        /* This must be IMMND_EVT_D2ND_ADMINIT_2 */
+        const IMMSV_OCTET_STRING *os = &req->stringAdminOwnerName;
+        admin_name = std::string((const char*) os->buf, strnlen((const char*) 
os->buf, (size_t) os->size));
+    } else {
+        admin_name = 
std::string(osaf_extended_name_borrow(&req->adminOwnerName));
+    }
+
+    if (strcmp("IMMLOADER", admin_name.c_str()) == 0) {
         if(sImmNodeState != IMM_NODE_LOADING) {
             LOG_NO("ERR_INVALID_PARAM: Admin Owner 'IMMLOADER' only allowed 
for loading");
             TRACE_LEAVE();
@@ -4370,7 +4379,7 @@ ImmModel::adminOwnerCreate(const ImmsvOm
     
     info->mId = ownerId;
     
-    
info->mAdminOwnerName.append(osaf_extended_name_borrow(&req->adminOwnerName));
+    info->mAdminOwnerName.append(admin_name);
     if(info->mAdminOwnerName.empty() || !nameCheck(info->mAdminOwnerName)) {
         LOG_NO("ERR_INVALID_PARAM: Not a valid Admin Owner Name");
         delete info;
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
@@ -476,6 +476,14 @@ uint32_t immnd_evt_destroy(IMMSV_EVT *ev
                free(evt->info.immnd.info.ccbUpcallRsp.errorString.buf);
                evt->info.immnd.info.ccbUpcallRsp.errorString.buf = NULL;
                evt->info.immnd.info.ccbUpcallRsp.errorString.size = 0;
+       } else if (evt->info.immnd.type == IMMND_EVT_A2ND_IMM_ADMINIT) {
+               
free(evt->info.immnd.info.adminitReq.i.stringAdminOwnerName.buf);
+               evt->info.immnd.info.adminitReq.i.stringAdminOwnerName.buf = 
NULL;
+               evt->info.immnd.info.adminitReq.i.stringAdminOwnerName.size = 0;
+       } else if (evt->info.immnd.type == IMMND_EVT_D2ND_ADMINIT_2) {
+               
free(evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName.buf);
+               evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName.buf = 
NULL;
+               evt->info.immnd.info.adminitGlobal.i.stringAdminOwnerName.size 
= 0;
        }
 
        if (onheap) {
@@ -2334,11 +2342,17 @@ static uint32_t immnd_evt_proc_admowner_
        }
 
        send_evt.type = IMMSV_EVT_TYPE_IMMD;
-       send_evt.info.immd.type = IMMD_EVT_ND2D_ADMINIT_REQ;
+       if (immModel_protocol47Allowed(cb)) {
+               send_evt.info.immd.type = IMMD_EVT_ND2D_ADMINIT_REQ_2;
+               send_evt.info.immd.info.admown_init.i = evt->info.adminitReq.i;
+       } else {
+               send_evt.info.immd.type = IMMD_EVT_ND2D_ADMINIT_REQ;
+               
osaf_extended_name_lend(evt->info.adminitReq.i.stringAdminOwnerName.buf,
+                       &send_evt.info.immd.info.admown_init.i.adminOwnerName);
+               
send_evt.info.immd.info.admown_init.i.releaseOwnershipOnFinalize = 
evt->info.adminitReq.i.releaseOwnershipOnFinalize;
+       }
        send_evt.info.immd.info.admown_init.client_hdl = 
evt->info.adminitReq.client_hdl;
 
-       send_evt.info.immd.info.admown_init.i = evt->info.adminitReq.i;
-
        /* send the request to the IMMD, reply comes back over fevs. */
 
        rc = immnd_mds_msg_send(cb, NCSMDS_SVC_ID_IMMD, cb->immd_mdest_id, 
&send_evt);
@@ -3294,6 +3308,11 @@ static SaAisErrorT immnd_fevs_local_chec
                error = SA_AIS_ERR_LIBRARY;
                break;
 
+       case IMMND_EVT_D2ND_ADMINIT_2:
+               LOG_WA("ERR_LIBRARY: IMMND_EVT_D2ND_ADMINIT_2 can not arrive 
from client lib");
+               error = SA_AIS_ERR_LIBRARY;
+               break;
+
        case IMMND_EVT_D2ND_IMPLSET_RSP:
                LOG_WA("ERR_LIBRARY: IMMND_EVT_D2ND_IMPLSET_RSP can not arrive 
from client lib");
                error = SA_AIS_ERR_LIBRARY;
@@ -7930,6 +7949,7 @@ immnd_evt_proc_fevs_dispatch(IMMND_CB *c
                break;
 
        case IMMND_EVT_D2ND_ADMINIT:
+       case IMMND_EVT_D2ND_ADMINIT_2:
                immnd_evt_proc_adminit_rsp(cb, &frwrd_evt.info.immnd, 
originatedAtThisNd, clnt_hdl, reply_dest);
                break;
 
@@ -8877,6 +8897,7 @@ static void immnd_evt_proc_adminit_rsp(I
        SaUint32T conn;
 
        osafassert(evt);
+       osafassert((evt->type != IMMND_EVT_D2ND_ADMINIT_2) || 
immModel_protocol47Allowed(cb));
        conn = m_IMMSV_UNPACK_HANDLE_HIGH(clnt_hdl);
        nodeId = m_IMMSV_UNPACK_HANDLE_LOW(clnt_hdl);
        err = immModel_adminOwnerCreate(cb, &(evt->info.adminitGlobal.i),

------------------------------------------------------------------------------
BPM Camp - Free Virtual Workshop May 6th at 10am PDT/1PM EDT
Develop your own process in accordance with the BPMN 2 standard
Learn Process modeling best practices with Bonita BPM through live exercises
http://www.bonitasoft.com/be-part-of-it/events/bpm-camp-virtual- event?utm_
source=Sourceforge_BPM_Camp_5_6_15&utm_medium=email&utm_campaign=VA_SF
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to