# HG changeset patch
# Parent d2b24512df47284c06f43db26e094a02ae296d6a
cpa: Add support for extended SaNameT [#1574] v2

diff --git a/osaf/libs/agents/saf/cpa/Makefile.am b/osaf/libs/agents/saf/cpa/Makefile.am
--- a/osaf/libs/agents/saf/cpa/Makefile.am
+++ b/osaf/libs/agents/saf/cpa/Makefile.am
@@ -22,6 +22,7 @@ noinst_LTLIBRARIES = libcpa.la
 
 libcpa_la_CPPFLAGS = \
 	-DNCS_CPA=1 \
+	-DSA_EXTENDED_NAME_SOURCE \
 	$(AM_CPPFLAGS) \
 	-I$(top_srcdir)/osaf/libs/common/cpsv/include
 
diff --git a/osaf/libs/agents/saf/cpa/cpa_api.c b/osaf/libs/agents/saf/cpa/cpa_api.c
--- a/osaf/libs/agents/saf/cpa/cpa_api.c
+++ b/osaf/libs/agents/saf/cpa/cpa_api.c
@@ -870,19 +870,24 @@ SaAisErrorT saCkptCheckpointOpen(SaCkptH
 	bool locked = false;
 	SaTimeT time_out=0;
 	CPA_GLOBAL_CKPT_NODE *gc_node = NULL;
+	SaConstStringT ckpt_name = NULL;
 	
 	TRACE_ENTER2("SaCkptCheckpointHandleT passed is %llx",ckptHandle);
-	if ((checkpointName == NULL) || (checkpointHandle == NULL) || (checkpointName->length == 0)) {
+	if ((checkpointName == NULL) || (checkpointHandle == NULL) || (osaf_extended_name_length(checkpointName) == 0)) {
 		TRACE_4("Cpa CkptOpen Api failed with return value:%d,ckptHandle:%llx", SA_AIS_ERR_INVALID_PARAM, ckptHandle);
-		TRACE_LEAVE2("API return code = %u", rc);
+		TRACE_LEAVE2("API return code = %u", SA_AIS_ERR_INVALID_PARAM);
 		return SA_AIS_ERR_INVALID_PARAM;
-	}
-
-	m_CPSV_SET_SANAMET(checkpointName);
+	} else if (osaf_extended_name_length(checkpointName) > kOsafMaxDnLength) {
+		TRACE_4("Cpa CkptOpen Api failed with return value:%d,ckptHandle:%llx", SA_AIS_ERR_TOO_BIG, ckptHandle);
+		TRACE_LEAVE2("API return code = %u", SA_AIS_ERR_TOO_BIG);
+		return SA_AIS_ERR_TOO_BIG;
+	}
+
+	ckpt_name = osaf_extended_name_borrow(checkpointName);
 
 	/* SA_AIS_ERR_INVALID_PARAM, bullet 4 in SAI-AIS-CKPT-B.02.02 
            Section 3.6.1 saCkptCheckpointOpen() and saCkptCheckpointOpenAsync(), Return Values */
-        if (strncmp((const char *)checkpointName->value, "safCkpt=", 8) != 0) {
+        if (strncmp(ckpt_name, "safCkpt=", 8) != 0) {
                 TRACE_4("Cpa CkptOpen:DN failed with return value:%d,ckptHandle:%llx", SA_AIS_ERR_INVALID_PARAM, ckptHandle);
 		TRACE_LEAVE2("API return code = %u", rc);
                 return SA_AIS_ERR_INVALID_PARAM;
@@ -901,7 +906,7 @@ SaAisErrorT saCkptCheckpointOpen(SaCkptH
 
 	
 	/* Draft Validations */
-	rc = cpa_open_attr_validate(checkpointCreationAttributes, checkpointOpenFlags, checkpointName);
+	rc = cpa_open_attr_validate(checkpointCreationAttributes, checkpointOpenFlags);
 	if (rc != SA_AIS_OK) {
 		/* No need to log, already logged inside the cpa_open_attr_validate */
 		goto done;
@@ -957,7 +962,7 @@ SaAisErrorT saCkptCheckpointOpen(SaCkptH
 	lc_node->cl_hdl = ckptHandle;
 	lc_node->open_flags = checkpointOpenFlags;
 
-	lc_node->ckpt_name = *checkpointName;
+	lc_node->ckpt_name = strdup(ckpt_name);
 
 	/* Add CPA_LOCAL_CKPT_NODE to lcl_ckpt_hdl_tree */
 	proc_rc = cpa_lcl_ckpt_node_add(&cb->lcl_ckpt_tree, lc_node);
@@ -976,7 +981,7 @@ SaAisErrorT saCkptCheckpointOpen(SaCkptH
 	evt.info.cpnd.info.openReq.client_hdl = ckptHandle;
 	evt.info.cpnd.info.openReq.lcl_ckpt_hdl = lc_node->lcl_ckpt_hdl;
 
-	evt.info.cpnd.info.openReq.ckpt_name = *checkpointName;
+	osaf_extended_name_lend(ckpt_name, &evt.info.cpnd.info.openReq.ckpt_name);
 
 	if (checkpointCreationAttributes) {
 		evt.info.cpnd.info.openReq.ckpt_attrib = *checkpointCreationAttributes;
@@ -1120,6 +1125,7 @@ gl_node_add_fail:
 
  lc_node_add_fail:
 	if (lc_node != NULL) {
+		free((void *)lc_node->ckpt_name);
 		m_MMGR_FREE_CPA_LOCAL_CKPT_NODE(lc_node);
 	}
 
@@ -1171,28 +1177,31 @@ SaAisErrorT saCkptCheckpointOpenAsync(Sa
 	CPA_LOCAL_CKPT_NODE *lc_node = NULL;
 	CPA_CLIENT_NODE *cl_node = NULL;
 	uint32_t proc_rc = NCSCC_RC_SUCCESS;
+	SaConstStringT ckpt_name = NULL;
 	
 	TRACE_ENTER2("SaCkptCheckpointHandleT passed is %llx",ckptHandle);
 	
 	if (checkpointName == NULL) {
 		TRACE_4("cpa CkptOpenAsync Api failed with return value:%d,ckptHandle:%llx", SA_AIS_ERR_INVALID_PARAM, ckptHandle);
-		TRACE_LEAVE2("API return code = %u", rc);
+		TRACE_LEAVE2("API return code = %u", SA_AIS_ERR_INVALID_PARAM);
 		return SA_AIS_ERR_INVALID_PARAM;
-	}
-
-	/* Draft Validations */
-
-	m_CPSV_SET_SANAMET(checkpointName);
+	} else if (osaf_extended_name_length(checkpointName) > kOsafMaxDnLength) {
+		TRACE_4("Cpa CkptOpenAsync Api failed with return value:%d,ckptHandle:%llx", SA_AIS_ERR_TOO_BIG, ckptHandle);
+		TRACE_LEAVE2("API return code = %u", SA_AIS_ERR_TOO_BIG);
+		return SA_AIS_ERR_TOO_BIG;
+	}
+
+	ckpt_name = osaf_extended_name_borrow(checkpointName);
 
 	/* SA_AIS_ERR_INVALID_PARAM, bullet 4 in SAI-AIS-CKPT-B.02.02 
            Section 3.6.1 saCkptCheckpointOpen() and saCkptCheckpointOpenAsync(), Return Values */
-        if (strncmp((const char *)checkpointName->value, "safCkpt=", 8) != 0) {
+        if (strncmp(ckpt_name, "safCkpt=", 8) != 0) {
                 TRACE_4("cpa CkptOpen:DN Api failed with return value:%d,ckptHandle:%llx", SA_AIS_ERR_INVALID_PARAM, ckptHandle);
 		TRACE_LEAVE2("API return code = %u", rc);
                 return SA_AIS_ERR_INVALID_PARAM;
         }
 
-	rc = cpa_open_attr_validate(checkpointCreationAttributes, checkpointOpenFlags, checkpointName);
+	rc = cpa_open_attr_validate(checkpointCreationAttributes, checkpointOpenFlags);
 	if (rc != SA_AIS_OK) {
 		/* No need to log, it is already logged inside */
 		goto done;
@@ -1253,7 +1262,7 @@ SaAisErrorT saCkptCheckpointOpenAsync(Sa
 	lc_node->lcl_ckpt_hdl = NCS_PTR_TO_UNS64_CAST(lc_node);
 	lc_node->cl_hdl = ckptHandle;
 	lc_node->open_flags = checkpointOpenFlags;
-	lc_node->ckpt_name = *checkpointName;
+	lc_node->ckpt_name = strdup(ckpt_name);
 
 	/* Add CPA_LOCAL_CKPT_NODE to lcl_ckpt_hdl_tree */
 	proc_rc = cpa_lcl_ckpt_node_add(&cb->lcl_ckpt_tree, lc_node);
@@ -1272,7 +1281,7 @@ SaAisErrorT saCkptCheckpointOpenAsync(Sa
 	evt.info.cpnd.info.openReq.client_hdl = ckptHandle;
 	evt.info.cpnd.info.openReq.lcl_ckpt_hdl = lc_node->lcl_ckpt_hdl;
 
-	evt.info.cpnd.info.openReq.ckpt_name = *checkpointName;
+	osaf_extended_name_lend(ckpt_name, &evt.info.cpnd.info.openReq.ckpt_name);
 
 	if (checkpointCreationAttributes) {
 		evt.info.cpnd.info.openReq.ckpt_attrib = *checkpointCreationAttributes;
@@ -1357,6 +1366,7 @@ SaAisErrorT saCkptCheckpointOpenAsync(Sa
 
  lc_node_add_fail:
 	if (lc_node != NULL) {
+		free((void *)lc_node->ckpt_name);
 		m_MMGR_FREE_CPA_LOCAL_CKPT_NODE(lc_node);
 	}
 
@@ -1575,17 +1585,22 @@ SaAisErrorT saCkptCheckpointUnlink(SaCkp
 	uint32_t proc_rc = NCSCC_RC_SUCCESS;
 	CPA_CLIENT_NODE *cl_node = NULL;
 	CPA_CB *cb = NULL;
+	SaConstStringT ckpt_name = NULL;
 
 	TRACE_ENTER2("SaCkptCheckpointHandleT passed is %llx",ckptHandle);
 	/* For unlink CPA will not perform any operation other than passing
 	   the request to CPND */
 	if (checkpointName == NULL) {
 		rc = SA_AIS_ERR_INVALID_PARAM;
-		TRACE_4("Cpa CkptUnlink  api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle);
+		TRACE_4("Cpa CkptUnlink Api failed with return value:%d,ckptHandle:%llx", rc, ckptHandle);
 		return rc;
-	}
-
-	m_CPSV_SET_SANAMET(checkpointName);
+	} else if (osaf_extended_name_length(checkpointName) > kOsafMaxDnLength) {
+		TRACE_4("Cpa CkptUnlink Api failed with return value:%d,ckptHandle:%llx", SA_AIS_ERR_TOO_BIG, ckptHandle);
+		TRACE_LEAVE2("API return code = %u", SA_AIS_ERR_TOO_BIG);
+		return SA_AIS_ERR_TOO_BIG;
+	}
+
+	ckpt_name = osaf_extended_name_borrow(checkpointName);
 
 	/* retrieve CPA CB */
 	m_CPA_RETRIEVE_CB(cb);
@@ -1626,10 +1641,7 @@ SaAisErrorT saCkptCheckpointUnlink(SaCkp
 	evt.type = CPSV_EVT_TYPE_CPND;
 	evt.info.cpnd.type = CPND_EVT_A2ND_CKPT_UNLINK;
 
-	/*  evt.info.cpnd.info.ulinkReq.ckpt_name.length = checkpointName->length;
-	   memcpy(evt.info.cpnd.info.ulinkReq.ckpt_name.value,checkpointName->value,checkpointName->length);   */
-
-	evt.info.cpnd.info.ulinkReq.ckpt_name = *checkpointName;
+	osaf_extended_name_lend(ckpt_name, &evt.info.cpnd.info.ulinkReq.ckpt_name);
 
 	/* IF CPND IS DOWN  */
 	if (false == cb->is_cpnd_up) {
diff --git a/osaf/libs/agents/saf/cpa/cpa_db.c b/osaf/libs/agents/saf/cpa/cpa_db.c
--- a/osaf/libs/agents/saf/cpa/cpa_db.c
+++ b/osaf/libs/agents/saf/cpa/cpa_db.c
@@ -267,6 +267,8 @@ uint32_t cpa_lcl_ckpt_node_delete(CPA_CB
 			ncshm_destroy_hdl(NCS_SERVICE_ID_CPA, lc_node->async_req_tmr.uarg);
 		}
 
+		free((void *)lc_node->ckpt_name);
+
 		m_MMGR_FREE_CPA_LOCAL_CKPT_NODE(lc_node);
 	}
 
diff --git a/osaf/libs/agents/saf/cpa/cpa_mds.c b/osaf/libs/agents/saf/cpa/cpa_mds.c
--- a/osaf/libs/agents/saf/cpa/cpa_mds.c
+++ b/osaf/libs/agents/saf/cpa/cpa_mds.c
@@ -517,7 +517,7 @@ static uint32_t cpa_mds_svc_evt(CPA_CB *
 		   evt.type = CPSV_EVT_TYPE_CPND;
 		   evt.info.cpnd.type = CPND_EVT_A2ND_CKPT_LIST_UPDATE;
 		   evt.info.cpnd.info.ckptListUpdate.client_hdl = lc_node->cl_hdl; 
-		   evt.info.cpnd.info.ckptListUpdate.ckpt_name = lc_node->ckpt_name ;
+		   osaf_extended_name_lend(lc_node->ckpt_name, &evt.info.cpnd.info.ckptListUpdate.ckpt_name);
 
 		   proc_rc = cpa_mds_msg_send(cb->cpa_mds_hdl, &cb->cpnd_mds_dest, &evt, NCSMDS_SVC_ID_CPND);
 
diff --git a/osaf/libs/agents/saf/cpa/cpa_proc.c b/osaf/libs/agents/saf/cpa/cpa_proc.c
--- a/osaf/libs/agents/saf/cpa/cpa_proc.c
+++ b/osaf/libs/agents/saf/cpa/cpa_proc.c
@@ -87,7 +87,7 @@ uint32_t cpa_version_validate(SaVersionT
 ******************************************************************************/
 uint32_t cpa_open_attr_validate(const SaCkptCheckpointCreationAttributesT
 			     *checkpointCreationAttributes,
-			     SaCkptCheckpointOpenFlagsT checkpointOpenFlags, const SaNameT *checkpointName)
+			     SaCkptCheckpointOpenFlagsT checkpointOpenFlags)
 {
 	SaCkptCheckpointCreationFlagsT creationFlags = 0;
 	/* Check the Open Flags is set, it should  */
diff --git a/osaf/libs/common/cpsv/include/cpa.h b/osaf/libs/common/cpsv/include/cpa.h
--- a/osaf/libs/common/cpsv/include/cpa.h
+++ b/osaf/libs/common/cpsv/include/cpa.h
@@ -33,6 +33,7 @@
 #ifndef CPA_H
 #define CPA_H
 
+#include "osaf_extended_name.h"
 #include "cpsv.h"
 #include "cpa_dl_api.h"
 #include "cpsv_papi.h"
diff --git a/osaf/libs/common/cpsv/include/cpa_cb.h b/osaf/libs/common/cpsv/include/cpa_cb.h
--- a/osaf/libs/common/cpsv/include/cpa_cb.h
+++ b/osaf/libs/common/cpsv/include/cpa_cb.h
@@ -41,7 +41,7 @@ typedef struct cpa_local_ckpt_node {
 	SaCkptHandleT cl_hdl;	/* client handle */
 	SaCkptCheckpointHandleT gbl_ckpt_hdl;	/* globally aware handle */
 	SaCkptCheckpointOpenFlagsT open_flags;
-	SaNameT ckpt_name;
+	SaConstStringT ckpt_name;
 	CPA_TMR async_req_tmr;	/* Timer used for async requests */
 	uint32_t sect_iter_cnt;
 } CPA_LOCAL_CKPT_NODE;
diff --git a/osaf/libs/common/cpsv/include/cpa_proc.h b/osaf/libs/common/cpsv/include/cpa_proc.h
--- a/osaf/libs/common/cpsv/include/cpa_proc.h
+++ b/osaf/libs/common/cpsv/include/cpa_proc.h
@@ -42,7 +42,7 @@ uint32_t cpa_process_evt(CPA_CB *cb, CPS
 uint32_t cpa_version_validate(SaVersionT *version);
 uint32_t cpa_open_attr_validate(const SaCkptCheckpointCreationAttributesT
 				      *checkpointCreationAttributes,
-				      SaCkptCheckpointOpenFlagsT checkpointOpenFlags, const SaNameT *checkpointName);
+				      SaCkptCheckpointOpenFlagsT checkpointOpenFlags);
 
 uint32_t cpa_callback_ipc_init(CPA_CLIENT_NODE *client_info);
 void cpa_callback_ipc_destroy(CPA_CLIENT_NODE *client_info);
