---
src/amf/amfd/imm.cc | 187 ++++++------------------
src/amf/amfd/imm.h | 2 +-
src/ntf/ntfimcnd/ntfimcn_imm.c | 181 +----------------------
src/ntf/ntfimcnd/ntfimcn_imm.h | 30 +---
src/ntf/ntfimcnd/ntfimcn_notifier.c | 2 +-
src/osaf/immutil/immutil.c | 215 +++++++++++++++++++++++-----
src/osaf/immutil/immutil.h | 36 +++++
7 files changed, 263 insertions(+), 390 deletions(-)
diff --git a/src/amf/amfd/imm.cc b/src/amf/amfd/imm.cc
index d917b0d8b..826e90d41 100644
--- a/src/amf/amfd/imm.cc
+++ b/src/amf/amfd/imm.cc
@@ -178,7 +178,7 @@ AvdJobDequeueResultT ImmObjCreate::exec(AVD_CL_CB *cb) {
goto done;
}
rc = saImmOiRtObjectCreate_2(immOiHandle, className_, parent_name,
- attrValues_);
+ (const SaImmAttrValuesT_2**)attrValues_);
cb->avd_imm_status = AVD_IMM_INIT_DONE;
if ((rc == SA_AIS_OK) || (rc == SA_AIS_ERR_EXIST)) {
@@ -208,31 +208,8 @@ done:
//
ImmObjCreate::~ImmObjCreate() {
- unsigned int i, j;
-
- for (i = 0; attrValues_[i] != nullptr; i++) {
- SaImmAttrValuesT_2 *attrValue = (SaImmAttrValuesT_2 *)attrValues_[i];
-
- if (attrValue->attrValueType == SA_IMM_ATTR_SASTRINGT) {
- for (j = 0; j < attrValue->attrValuesNumber; j++) {
- char *p = *((char **)attrValue->attrValues[j]);
- delete[] p;
- }
- } else if (attrValue->attrValueType == SA_IMM_ATTR_SANAMET) {
- for (j = 0; j < attrValue->attrValuesNumber; j++) {
- SaNameT *name = reinterpret_cast<SaNameT *>(attrValue->attrValues[i]);
- osaf_extended_name_free(name);
- }
- }
- delete[] attrValue->attrName;
- delete[] static_cast<char *>(
- attrValue->attrValues[0]); // free blob shared by all values
- delete[] attrValue->attrValues;
- delete attrValue;
- }
-
+ immutil_freeSaImmAttrValuesT(attrValues_);
delete[] className_;
- delete[] attrValues_;
}
//
@@ -630,110 +607,18 @@ typedef struct avd_ccb_apply_ordered_list {
static AvdCcbApplyOrderedListT *ccb_apply_list;
-/* ========================================================================
- * FUNCTION PROTOTYPES
- * ========================================================================
- */
-
-static size_t value_size(SaImmValueTypeT attrValueType) {
- size_t valueSize = 0;
-
- switch (attrValueType) {
- case SA_IMM_ATTR_SAINT32T:
- valueSize = sizeof(SaInt32T);
- break;
- case SA_IMM_ATTR_SAUINT32T:
- valueSize = sizeof(SaUint32T);
- break;
- case SA_IMM_ATTR_SAINT64T:
- valueSize = sizeof(SaInt64T);
- break;
- case SA_IMM_ATTR_SAUINT64T:
- valueSize = sizeof(SaUint64T);
- break;
- case SA_IMM_ATTR_SATIMET:
- valueSize = sizeof(SaTimeT);
- break;
- case SA_IMM_ATTR_SANAMET:
- valueSize = sizeof(SaNameT);
- break;
- case SA_IMM_ATTR_SAFLOATT:
- valueSize = sizeof(SaFloatT);
- break;
- case SA_IMM_ATTR_SADOUBLET:
- valueSize = sizeof(SaDoubleT);
- break;
- case SA_IMM_ATTR_SASTRINGT:
- valueSize = sizeof(SaStringT);
- break;
- case SA_IMM_ATTR_SAANYT:
- osafassert(0);
- break;
- }
-
- return valueSize;
-}
-
-static void copySaImmAttrValuesT(SaImmAttrValuesT_2 *copy,
- const SaImmAttrValuesT_2 *original) {
- size_t valueSize = 0;
- unsigned int i, valueCount = original->attrValuesNumber;
- char *databuffer;
-
- copy->attrName = StrDup(original->attrName);
-
- copy->attrValuesNumber = valueCount;
- copy->attrValueType = original->attrValueType;
- if (valueCount == 0) return; /* (just in case...) */
-
- copy->attrValues = new SaImmAttrValueT[valueCount];
-
- valueSize = value_size(original->attrValueType);
-
- // alloc blob shared by all values
- databuffer = new char[valueCount * valueSize];
-
- for (i = 0; i < valueCount; i++) {
- copy->attrValues[i] = databuffer;
- if (original->attrValueType == SA_IMM_ATTR_SASTRINGT) {
- char *cporig = *((char **)original->attrValues[i]);
- char **cpp = (char **)databuffer;
- *cpp = StrDup(cporig);
- } else if (original->attrValueType == SA_IMM_ATTR_SANAMET) {
- SaNameT *orig = reinterpret_cast<SaNameT *>(original->attrValues[i]);
- SaNameT *dest = reinterpret_cast<SaNameT *>(databuffer);
- osaf_extended_name_alloc(osaf_extended_name_borrow(orig), dest);
- } else {
- memcpy(databuffer, original->attrValues[i], valueSize);
- }
- databuffer += valueSize;
- }
-}
-
-static const SaImmAttrValuesT_2 *dupSaImmAttrValuesT(
- const SaImmAttrValuesT_2 *original) {
- SaImmAttrValuesT_2 *copy = new SaImmAttrValuesT_2;
-
- copySaImmAttrValuesT(copy, original);
- return copy;
-}
-
-static const SaImmAttrValuesT_2 **dupSaImmAttrValuesT_array(
- const SaImmAttrValuesT_2 **original) {
- const SaImmAttrValuesT_2 **copy;
- unsigned int i, alen = 0;
-
- if (original == nullptr) return nullptr;
-
- while (original[alen] != nullptr) alen++;
-
- copy = new const SaImmAttrValuesT_2 *[alen + 1]();
-
- for (i = 0; i < alen; i++) copy[i] = dupSaImmAttrValuesT(original[i]);
-
- return copy;
-}
-
+/*****************************************************************************
+ * Function: class_name_to_class_type
+ *
+ * Purpose: This function returns class ID corresponding to class name.
+ *
+ * Input: className - Class name.
+ *
+ * Returns: AVSV_AMF_CLASS_ID
+ *
+ * NOTES: None.
+ *
+ **************************************************************************/
static AVSV_AMF_CLASS_ID class_name_to_class_type(
const std::string &className) {
int i;
@@ -1900,7 +1785,7 @@ void avd_saImmOiRtObjectUpdate(const std::string &dn,
ImmObjUpdate *ajob = new ImmObjUpdate;
if (avd_cb->avail_state_avd != SA_AMF_HA_ACTIVE) ajob->implementer = false;
- sz = value_size(attrValueType);
+ sz = immutil_valueSize(attrValueType);
ajob->dn = dn;
ajob->attributeName_ = StrDup(attributeName.c_str());
@@ -1977,7 +1862,7 @@ void avd_saImmOiRtObjectCreate(const std::string
&className,
ajob->className_ = StrDup(className.c_str());
osafassert(ajob->className_ != nullptr);
ajob->parentName_ = parentName;
- ajob->attrValues_ = dupSaImmAttrValuesT_array(attrValues);
+ ajob->attrValues_ = immutil_dupSaImmAttrValuesT(attrValues);
Fifo::queue(ajob);
TRACE_LEAVE();
@@ -2392,13 +2277,13 @@ bool ImmObjCreate::immobj_update_required() {
*static_cast<SaAmfHAStateT *>(attribute->attrValues[0]),
susi->state);
memcpy(attribute->attrValues[0], &susi->state,
- value_size(attribute->attrValueType));
+ immutil_valueSize(attribute->attrValueType));
} else if (!strcmp(attribute->attrName, "osafAmfSISUFsmState")) {
TRACE_1("osafAmfSISUFsmState old value:%u, new value:%u",
*static_cast<AVD_SU_SI_STATE *>(attribute->attrValues[0]),
susi->fsm);
memcpy(attribute->attrValues[0], &susi->fsm,
- value_size(attribute->attrValueType));
+ immutil_valueSize(attribute->attrValueType));
}
}
} else if (class_type == AVSV_SA_AMF_CSI_ASSIGNMENT) {
@@ -2450,7 +2335,7 @@ bool ImmObjCreate::immobj_update_required() {
*static_cast<SaAmfHAStateT *>(attribute->attrValues[0]),
susi->state);
memcpy(attribute->attrValues[0], &susi->state,
- value_size(attribute->attrValueType));
+ immutil_valueSize(attribute->attrValueType));
}
}
}
@@ -2472,21 +2357,23 @@ bool ImmObjUpdate::su_get_attr_value() {
TRACE_1("saAmfSUOperState old value:%u, new value:%u",
*static_cast<SaAmfOperationalStateT *>(value_),
su->saAmfSUOperState);
- memcpy(value_, &su->saAmfSUOperState, value_size(attrValueType_));
+ memcpy(value_, &su->saAmfSUOperState, immutil_valueSize(attrValueType_));
} else if (!strcmp(attributeName_, "saAmfSUReadinessState")) {
TRACE_1("saAmfSuReadinessState old value:%u, new value:%u",
*static_cast<SaAmfReadinessStateT *>(value_),
su->saAmfSuReadinessState);
- memcpy(value_, &su->saAmfSuReadinessState, value_size(attrValueType_));
+ memcpy(value_, &su->saAmfSuReadinessState,
+ immutil_valueSize(attrValueType_));
} else if (!strcmp(attributeName_, "saAmfSUPresenceState")) {
TRACE_1("saAmfSUPresenceState old value:%u, new value:%u",
*static_cast<SaAmfPresenceStateT *>(value_),
su->saAmfSUPresenceState);
- memcpy(value_, &su->saAmfSUPresenceState, value_size(attrValueType_));
+ memcpy(value_, &su->saAmfSUPresenceState,
+ immutil_valueSize(attrValueType_));
} else if (!strcmp(attributeName_, "saAmfSUAdminState")) {
TRACE_1("saAmfSUAdminState old value:%u, new value:%u",
*static_cast<SaAmfAdminStateT *>(value_), su->saAmfSUAdminState);
- memcpy(value_, &su->saAmfSUAdminState, value_size(attrValueType_));
+ memcpy(value_, &su->saAmfSUAdminState, immutil_valueSize(attrValueType_));
} else {
// Other attributes not considered.
ret = false;
@@ -2508,11 +2395,11 @@ bool ImmObjUpdate::siass_get_attr_value() {
if (!strcmp(attributeName_, "saAmfSISUHAState")) {
TRACE_1("saAmfSISUHAState old value:%u, new value:%u",
*static_cast<SaAmfHAStateT *>(value_), susi->state);
- memcpy(value_, &susi->state, value_size(attrValueType_));
+ memcpy(value_, &susi->state, immutil_valueSize(attrValueType_));
} else if (!strcmp(attributeName_, "osafAmfSISUFsmState")) {
TRACE_1("osafAmfSISUFsmState old value:%u, new value:%u",
*static_cast<AVD_SU_SI_STATE *>(value_), susi->fsm);
- memcpy(value_, &susi->fsm, value_size(attrValueType_));
+ memcpy(value_, &susi->fsm, immutil_valueSize(attrValueType_));
} else
return false;
return true;
@@ -2545,7 +2432,7 @@ bool ImmObjUpdate::csiass_get_attr_value() {
if (!strcmp(attributeName_, "saAmfCSICompHAState")) {
TRACE_1("saAmfCSICompHAState old value:%u, new value:%u",
*static_cast<SaAmfHAStateT *>(value_), susi->state);
- memcpy(value_, &susi->state, value_size(attrValueType_));
+ memcpy(value_, &susi->state, immutil_valueSize(attrValueType_));
} else
return false;
@@ -2561,17 +2448,20 @@ bool ImmObjUpdate::comp_get_attr_value() {
TRACE_1("saAmfCompOperState old value:%u, new value:%u",
*static_cast<SaAmfOperationalStateT *>(value_),
comp->saAmfCompOperState);
- memcpy(value_, &comp->saAmfCompOperState, value_size(attrValueType_));
+ memcpy(value_, &comp->saAmfCompOperState,
+ immutil_valueSize(attrValueType_));
} else if (!strcmp(attributeName_, "saAmfCompReadinessState")) {
TRACE_1("saAmfCompReadinessState old value:%u, new value:%u",
*static_cast<SaAmfReadinessStateT *>(value_),
comp->saAmfCompReadinessState);
- memcpy(value_, &comp->saAmfCompReadinessState, value_size(attrValueType_));
+ memcpy(value_, &comp->saAmfCompReadinessState,
+ immutil_valueSize(attrValueType_));
} else if (!strcmp(attributeName_, "saAmfCompPresenceState")) {
TRACE_1(" saAmfCompPresenceState old value:%u, new value:%u",
*static_cast<SaAmfPresenceStateT *>(value_),
comp->saAmfCompPresenceState);
- memcpy(value_, &comp->saAmfCompPresenceState, value_size(attrValueType_));
+ memcpy(value_, &comp->saAmfCompPresenceState,
+ immutil_valueSize(attrValueType_));
} else {
// Other attributes not considered.
return false;
@@ -2589,7 +2479,8 @@ bool ImmObjUpdate::si_get_attr_value() {
TRACE_1("saAmfSIAssignmentState old value:%u, new value:%u",
*static_cast<SaAmfAssignmentStateT *>(value_),
si->saAmfSIAssignmentState);
- memcpy(value_, &si->saAmfSIAssignmentState, value_size(attrValueType_));
+ memcpy(value_, &si->saAmfSIAssignmentState,
+ immutil_valueSize(attrValueType_));
}
return true;
}
@@ -2606,11 +2497,13 @@ bool ImmObjUpdate::node_get_attr_value() {
TRACE_1("saAmfNodeOperState old value:%u, new value:%u",
*static_cast<SaAmfOperationalStateT *>(value_),
node->saAmfNodeOperState);
- memcpy(value_, &node->saAmfNodeOperState, value_size(attrValueType_));
+ memcpy(value_, &node->saAmfNodeOperState,
+ immutil_valueSize(attrValueType_));
} else if (!strcmp(attributeName_, "saAmfNodeAdminState")) {
TRACE_1("saAmfNodeAdminState old value:%u, new value:%u",
*static_cast<SaAmfAdminStateT *>(value_),
node->saAmfNodeAdminState);
- memcpy(value_, &node->saAmfNodeAdminState, value_size(attrValueType_));
+ memcpy(value_, &node->saAmfNodeAdminState,
+ immutil_valueSize(attrValueType_));
} else {
// Other attributes not considered.
ret = false;
diff --git a/src/amf/amfd/imm.h b/src/amf/amfd/imm.h
index 670c6914d..99d47d313 100644
--- a/src/amf/amfd/imm.h
+++ b/src/amf/amfd/imm.h
@@ -83,7 +83,7 @@ class ImmObjCreate : public ImmJob {
public:
SaImmClassNameT className_;
std::string parentName_;
- const SaImmAttrValuesT_2 **attrValues_;
+ SaImmAttrValuesT_2 **attrValues_;
ImmObjCreate() : ImmJob(){};
bool immobj_update_required();
diff --git a/src/ntf/ntfimcnd/ntfimcn_imm.c b/src/ntf/ntfimcnd/ntfimcn_imm.c
index b5f18f73d..2e515e22b 100644
--- a/src/ntf/ntfimcnd/ntfimcn_imm.c
+++ b/src/ntf/ntfimcnd/ntfimcn_imm.c
@@ -294,7 +294,7 @@ static void free_ccb_data(CcbUtilCcbData_t *ccb_data) {
struct CcbUtilOperationData* oper_data =
ccb_data->operationListHead;
for (; oper_data!= NULL; oper_data = oper_data->next) {
- free_imm_attrs((SaImmAttrValuesT_2**)
+ immutil_freeSaImmAttrValuesT((SaImmAttrValuesT_2**)
oper_data->userData);
}
ccbutil_deleteCcbData(ccb_data);
@@ -1026,8 +1026,7 @@ SaAisErrorT get_current_attrs(const SaNameT *objectName,
rc = immutil_saImmOmAccessorGet_2(ntfimcn_cb.immAccessorHandle,
objectName, attrNames, &resAttr);
if (SA_AIS_OK == rc) {
- *curAttr =
- dupSaImmAttrValuesT_array(
+ *curAttr = immutil_dupSaImmAttrValuesT(
(const SaImmAttrValuesT_2**) resAttr);
}
else {
@@ -1038,179 +1037,3 @@ SaAisErrorT get_current_attrs(const SaNameT *objectName,
TRACE_LEAVE2("rc = %u", rc);
return rc;
}
-
-static size_t value_size(SaImmValueTypeT type) {
- size_t valueSize = 0;
-
- switch (type)
- {
- case SA_IMM_ATTR_SAINT32T:
- valueSize = sizeof(SaInt32T);
- break;
- case SA_IMM_ATTR_SAUINT32T:
- valueSize = sizeof(SaUint32T);
- break;
- case SA_IMM_ATTR_SAINT64T:
- valueSize = sizeof(SaInt64T);
- break;
- case SA_IMM_ATTR_SAUINT64T:
- valueSize = sizeof(SaUint64T);
- break;
- case SA_IMM_ATTR_SATIMET:
- valueSize = sizeof(SaTimeT);
- break;
- case SA_IMM_ATTR_SANAMET:
- valueSize = sizeof(SaNameT);
- break;
- case SA_IMM_ATTR_SAFLOATT:
- valueSize = sizeof(SaFloatT);
- break;
- case SA_IMM_ATTR_SADOUBLET:
- valueSize = sizeof(SaDoubleT);
- break;
- case SA_IMM_ATTR_SASTRINGT:
- valueSize = sizeof(SaStringT);
- break;
- case SA_IMM_ATTR_SAANYT:
- valueSize = sizeof(SaAnyT);
- break;
- }
- return valueSize;
-}
-
-static void copySaImmAttrValuesT(SaImmAttrValuesT_2 **dest,
- const SaImmAttrValuesT_2 *src) {
- SaImmAttrValuesT_2 *tdest = (SaImmAttrValuesT_2*) calloc(1,
- sizeof(SaImmAttrValuesT_2));
- tdest->attrName = strdup(src->attrName);
-
- tdest->attrValueType = src->attrValueType;
- tdest->attrValuesNumber = src->attrValuesNumber;
- SaUint32T count = src->attrValuesNumber;
- size_t valSize = value_size(src->attrValueType);
- if (src->attrValues == NULL){
- *dest = tdest;
- return;
- }
- tdest->attrValues = (SaImmAttrValueT*) malloc(
- sizeof(SaImmAttrValueT) * count);
-
- for (unsigned int i = 0; i < count; ++i){
- if (src->attrValues[i] == NULL) {
- tdest->attrValues[i] = NULL;
- continue;
- }
- tdest->attrValues[i] = malloc(valSize);
- switch (src->attrValueType) {
- case SA_IMM_ATTR_SASTRINGT: {
- *((SaStringT*) tdest->attrValues[i]) = strdup(
- *((SaStringT*) src->attrValues[i]));
- break;
- }
- case SA_IMM_ATTR_SANAMET: {
- SaNameT *nameSrc = (SaNameT*) src->attrValues[i];
- SaNameT *nameDest = (SaNameT*) tdest->attrValues[i];
- osaf_extended_name_alloc(
- osaf_extended_name_borrow(nameSrc), nameDest);
- break;
- }
- case SA_IMM_ATTR_SAANYT: {
- SaAnyT *anySrc = (SaAnyT*) src->attrValues[i];
- SaAnyT *anyDest = (SaAnyT*) tdest->attrValues[i];
- anyDest->bufferSize = anySrc->bufferSize;
- if (anyDest->bufferSize) {
- anyDest->bufferAddr =
- (SaUint8T*) malloc(anyDest->bufferSize);
- memcpy(anyDest->bufferAddr,
- anySrc->bufferAddr, anyDest->bufferSize);
- } else {
- anyDest->bufferAddr = NULL;
- }
- break;
- }
- default:
- memcpy(tdest->attrValues[i],
- src->attrValues[i], valSize);
- break;
- }
- }
- *dest = tdest;
- }
-
-SaImmAttrValuesT_2** dupSaImmAttrValuesT_array(const SaImmAttrValuesT_2 **src)
{
- // Return if there is no source
- if (src == NULL) {
- TRACE("src is null");
- return NULL;
- }
- // Return if the source is just an array of NULL
- int len = 0;
- while (src[len] != NULL)
- ++len;
- if (!len) {
- TRACE("src length is null");
- return NULL;
- }
- SaImmAttrValuesT_2 **attr = (SaImmAttrValuesT_2**) malloc(
- (len + 1) * sizeof(SaImmAttrValuesT_2*));
- if (attr == NULL) {
- TRACE("Failed to allocate memory");
- return NULL;
- }
- // Deep clone the source to destination
- for (int i = 0; i < len; ++i) {
- copySaImmAttrValuesT(&attr[i], src[i]);
- }
- attr[len] = NULL;
- return attr;
-}
-
-void free_imm_attrs(SaImmAttrValuesT_2 **attrs) {
- if (attrs == NULL)
- return;
- SaImmAttrValuesT_2 *attr;
- SaImmAttrValueT value;
- for (int i = 0; (attr = attrs[i]) != NULL; ++i) {
- free(attr->attrName);
- if (attr->attrValues == NULL) {
- continue;
- }
- for (unsigned int j = 0; j < attr->attrValuesNumber; ++j) {
- value = attr->attrValues[j];
- if (value == NULL) {
- continue;
- }
- if (attr->attrValueType == SA_IMM_ATTR_SASTRINGT) {
- free(*((SaStringT*) value));
- }
- else if (attr->attrValueType == SA_IMM_ATTR_SANAMET) {
- osaf_extended_name_free((SaNameT*) value);
- }
- else if (attr->attrValueType == SA_IMM_ATTR_SAANYT) {
- free(((SaAnyT*) value)->bufferAddr);
- }
- free(value);
- }
- free(attr->attrValues);
- free(attr);
- }
- free(attrs);
-}
-
-const SaImmAttrValuesT_2* find_attr_from_name(
- const SaImmAttrValuesT_2** attrs, SaImmAttrNameT name)
-{
- const SaImmAttrValuesT_2* result = NULL;
- if (!attrs)
- return result;
-
- const SaImmAttrValuesT_2* attr = NULL;
- for (int i = 0; (attr = attrs[i]) != NULL; ++i) {
- if (strcmp(attr->attrName, name) == 0) {
- result = attr;
- break;
- }
- }
- return result;
-}
-
diff --git a/src/ntf/ntfimcnd/ntfimcn_imm.h b/src/ntf/ntfimcnd/ntfimcn_imm.h
index 4cbca811f..8945d3096 100644
--- a/src/ntf/ntfimcnd/ntfimcn_imm.h
+++ b/src/ntf/ntfimcnd/ntfimcn_imm.h
@@ -51,34 +51,8 @@ int ntfimcn_imm_init(ntfimcn_cb_t *cb);
* @return SaAisErrorT
*/
SaAisErrorT get_current_attrs(const SaNameT *objectName,
- const SaImmAttrModificationT_2 **attrMods, SaImmAttrValuesT_2 ***curAttr);
-
-/**
- * Deep clone IMM Attribute Values
- *
- * @param **src[in]
- */
-SaImmAttrValuesT_2** dupSaImmAttrValuesT_array(const SaImmAttrValuesT_2 **src);
-
-/**
- * Deallocate memory used for deep cloning IMM Attribute Values
- *
- * @param **attrs[in]
- */
-void free_imm_attrs(SaImmAttrValuesT_2 **attrs);
-
-/**
- * Find attribute values from the given attribute name
- * Reuturn NULL if no values found for the given name
- *
- * @param **attrs[in]
- * @param name[in]
- * @return SaImmAttrValuesT_2*
- */
-
-const SaImmAttrValuesT_2* find_attr_from_name(
- const SaImmAttrValuesT_2** attrs, SaImmAttrNameT name);
-
+ const SaImmAttrModificationT_2 **attrMods,
+ SaImmAttrValuesT_2 ***curAttr);
#ifdef __cplusplus
}
diff --git a/src/ntf/ntfimcnd/ntfimcn_notifier.c
b/src/ntf/ntfimcnd/ntfimcn_notifier.c
index 45f58c3bf..c63b4393f 100644
--- a/src/ntf/ntfimcnd/ntfimcn_notifier.c
+++ b/src/ntf/ntfimcnd/ntfimcn_notifier.c
@@ -843,7 +843,7 @@ static int fill_attribute_info_modify(
// new attributes below. Can be multi value or
// no value
const SaImmAttrValuesT_2* old_imm_attr_value =
- find_attr_from_name(imm_attrs_in,
+ immutil_findAttrByName(imm_attrs_in,
imm_attr_mods->modAttr.attrName);
TRACE("old_imm_attr_value is <%s>",
old_imm_attr_value? "not null": "null");
diff --git a/src/osaf/immutil/immutil.c b/src/osaf/immutil/immutil.c
index 8b3f0de5f..d2c280ca0 100644
--- a/src/osaf/immutil/immutil.c
+++ b/src/osaf/immutil/immutil.c
@@ -886,40 +886,7 @@ static void copySaImmAttrValuesT(struct Chunk *clist,
SaImmAttrValuesT_2 *copy,
return; /* (just in case...) */
copy->attrValues =
clistMalloc(clist, valueCount * sizeof(SaImmAttrValueT));
-
- switch (original->attrValueType) {
- case SA_IMM_ATTR_SAINT32T:
- valueSize = sizeof(SaInt32T);
- break;
- case SA_IMM_ATTR_SAUINT32T:
- valueSize = sizeof(SaUint32T);
- break;
- case SA_IMM_ATTR_SAINT64T:
- valueSize = sizeof(SaInt64T);
- break;
- case SA_IMM_ATTR_SAUINT64T:
- valueSize = sizeof(SaUint64T);
- break;
- case SA_IMM_ATTR_SATIMET:
- valueSize = sizeof(SaTimeT);
- break;
- case SA_IMM_ATTR_SANAMET:
- valueSize = sizeof(SaNameT);
- break;
- case SA_IMM_ATTR_SAFLOATT:
- valueSize = sizeof(SaFloatT);
- break;
- case SA_IMM_ATTR_SADOUBLET:
- valueSize = sizeof(SaDoubleT);
- break;
- case SA_IMM_ATTR_SASTRINGT:
- valueSize = sizeof(SaStringT);
- break;
- case SA_IMM_ATTR_SAANYT:
- valueSize = sizeof(SaAnyT);
- break;
- }
-
+ valueSize = immutil_valueSize(original->attrValueType);
databuffer = (char *)clistMalloc(clist, valueCount * valueSize);
for (i = 0; i < valueCount; i++) {
copy->attrValues[i] = databuffer;
@@ -2615,3 +2582,183 @@
immutil_saImmOmClassDescriptionMemoryFree_2(SaImmHandleT immHandle,
(int)rc);
return rc;
}
+
+size_t immutil_valueSize(SaImmValueTypeT type)
+{
+ size_t valueSize = 0;
+
+ switch (type) {
+ case SA_IMM_ATTR_SAINT32T:
+ valueSize = sizeof(SaInt32T);
+ break;
+ case SA_IMM_ATTR_SAUINT32T:
+ valueSize = sizeof(SaUint32T);
+ break;
+ case SA_IMM_ATTR_SAINT64T:
+ valueSize = sizeof(SaInt64T);
+ break;
+ case SA_IMM_ATTR_SAUINT64T:
+ valueSize = sizeof(SaUint64T);
+ break;
+ case SA_IMM_ATTR_SATIMET:
+ valueSize = sizeof(SaTimeT);
+ break;
+ case SA_IMM_ATTR_SANAMET:
+ valueSize = sizeof(SaNameT);
+ break;
+ case SA_IMM_ATTR_SAFLOATT:
+ valueSize = sizeof(SaFloatT);
+ break;
+ case SA_IMM_ATTR_SADOUBLET:
+ valueSize = sizeof(SaDoubleT);
+ break;
+ case SA_IMM_ATTR_SASTRINGT:
+ valueSize = sizeof(SaStringT);
+ break;
+ case SA_IMM_ATTR_SAANYT:
+ valueSize = sizeof(SaAnyT);
+ break;
+ }
+ return valueSize;
+}
+
+static void _copySaImmAttrValuesT(SaImmAttrValuesT_2 **dest,
+ const SaImmAttrValuesT_2 *src)
+{
+ SaImmAttrValuesT_2 *tdest = (SaImmAttrValuesT_2*) calloc(1,
+ sizeof(SaImmAttrValuesT_2));
+ tdest->attrName = strdup(src->attrName);
+
+ tdest->attrValueType = src->attrValueType;
+ tdest->attrValuesNumber = src->attrValuesNumber;
+ SaUint32T count = src->attrValuesNumber;
+ size_t valSize = immutil_valueSize(src->attrValueType);
+ if (src->attrValues == NULL){
+ *dest = tdest;
+ return;
+ }
+ tdest->attrValues = (SaImmAttrValueT*) malloc(
+ sizeof(SaImmAttrValueT) * count);
+
+ for (unsigned int i = 0; i < count; ++i){
+ if (src->attrValues[i] == NULL) {
+ tdest->attrValues[i] = NULL;
+ continue;
+ }
+ tdest->attrValues[i] = malloc(valSize);
+ switch (src->attrValueType) {
+ case SA_IMM_ATTR_SASTRINGT: {
+ *((SaStringT*) tdest->attrValues[i]) = strdup(
+ *((SaStringT*) src->attrValues[i]));
+ break;
+ }
+ case SA_IMM_ATTR_SANAMET: {
+ SaNameT *nameSrc = (SaNameT*) src->attrValues[i];
+ SaNameT *nameDest = (SaNameT*) tdest->attrValues[i];
+ osaf_extended_name_alloc(
+ osaf_extended_name_borrow(nameSrc), nameDest);
+ break;
+ }
+ case SA_IMM_ATTR_SAANYT: {
+ SaAnyT *anySrc = (SaAnyT*) src->attrValues[i];
+ SaAnyT *anyDest = (SaAnyT*) tdest->attrValues[i];
+ anyDest->bufferSize = anySrc->bufferSize;
+ if (anyDest->bufferSize) {
+ anyDest->bufferAddr =
+ (SaUint8T*) malloc(anyDest->bufferSize);
+ memcpy(anyDest->bufferAddr,
+ anySrc->bufferAddr, anyDest->bufferSize);
+ } else {
+ anyDest->bufferAddr = NULL;
+ }
+ break;
+ }
+ default:
+ memcpy(tdest->attrValues[i],
+ src->attrValues[i], valSize);
+ break;
+ }
+ }
+ *dest = tdest;
+}
+
+SaImmAttrValuesT_2** immutil_dupSaImmAttrValuesT(
+ const SaImmAttrValuesT_2 **src)
+{
+ // Return if there is no source
+ if (src == NULL) {
+ TRACE("src is null");
+ return NULL;
+ }
+ // Return if the source is just an array of NULL
+ int len = 0;
+ while (src[len] != NULL)
+ ++len;
+ if (!len) {
+ TRACE("src length is null");
+ return NULL;
+ }
+ SaImmAttrValuesT_2 **attr =
+ (SaImmAttrValuesT_2 **)malloc(
+ (len + 1) * sizeof(SaImmAttrValuesT_2*));
+ if (attr == NULL) {
+ TRACE("Failed to allocate memory");
+ return NULL;
+ }
+ // Deep clone the source to destination
+ for (int i = 0; i < len; ++i) {
+ _copySaImmAttrValuesT(&attr[i], src[i]);
+ }
+ attr[len] = NULL;
+ return attr;
+}
+
+void immutil_freeSaImmAttrValuesT(SaImmAttrValuesT_2 **attrs)
+{
+ if (attrs == NULL)
+ return;
+ SaImmAttrValuesT_2 *attr;
+ SaImmAttrValueT value;
+ for (int i = 0; (attr = attrs[i]) != NULL; ++i) {
+ free(attr->attrName);
+ if (attr->attrValues == NULL) {
+ continue;
+ }
+ for (unsigned int j = 0; j < attr->attrValuesNumber; ++j) {
+ value = attr->attrValues[j];
+ if (value == NULL) {
+ continue;
+ }
+ if (attr->attrValueType == SA_IMM_ATTR_SASTRINGT) {
+ free(*((SaStringT*) value));
+ }
+ else if (attr->attrValueType == SA_IMM_ATTR_SANAMET) {
+ osaf_extended_name_free((SaNameT*) value);
+ }
+ else if (attr->attrValueType == SA_IMM_ATTR_SAANYT) {
+ free(((SaAnyT*) value)->bufferAddr);
+ }
+ free(value);
+ }
+ free(attr->attrValues);
+ free(attr);
+ }
+ free(attrs);
+}
+
+const SaImmAttrValuesT_2* immutil_findAttrByName(
+ const SaImmAttrValuesT_2** attrs, SaImmAttrNameT name)
+{
+ const SaImmAttrValuesT_2* result = NULL;
+ if (!attrs)
+ return result;
+
+ const SaImmAttrValuesT_2* attr = NULL;
+ for (int i = 0; (attr = attrs[i]) != NULL; ++i) {
+ if (strcmp(attr->attrName, name) == 0) {
+ result = attr;
+ break;
+ }
+ }
+ return result;
+}
diff --git a/src/osaf/immutil/immutil.h b/src/osaf/immutil/immutil.h
index 63e710f99..7528d8203 100644
--- a/src/osaf/immutil/immutil.h
+++ b/src/osaf/immutil/immutil.h
@@ -191,6 +191,42 @@ EXTERN_C CcbUtilOperationData_t
*ccbutil_getCcbOpDataByDN(SaImmOiCcbIdT id,
*/
/*@{*/
+/**
+ * Get IMM Attribute Value size base on type
+ *
+ * @param type[in]
+ * @return size_t
+ */
+EXTERN_C size_t immutil_valueSize(SaImmValueTypeT type);
+
+/**
+ * Deep clone IMM Attribute Values array
+ *
+ * @param **src[in]
+ * @return SaImmAttrValuesT_2**
+ */
+EXTERN_C SaImmAttrValuesT_2** immutil_dupSaImmAttrValuesT(
+ const SaImmAttrValuesT_2 **src);
+
+/**
+ * Deallocate memory used for deep cloning IMM Attribute Values
+ *
+ * @param **attrs[in]
+ * @return void
+ */
+EXTERN_C void immutil_freeSaImmAttrValuesT(SaImmAttrValuesT_2 **attrs);
+
+/**
+ * Find attribute values from the given attribute name
+ * Reuturn NULL if no values found for the given name
+ *
+ * @param **attrs[in]
+ * @param name[in]
+ * @return SaImmAttrValuesT_2*
+ */
+EXTERN_C const SaImmAttrValuesT_2* immutil_findAttrByName(
+ const SaImmAttrValuesT_2** attrs, SaImmAttrNameT name);
+
/**
* Duplicates a string. The memory is owned by the passed CCB object and will
be
* freed automatically when this object is deleted.
--
2.17.1
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel