Hi Thanh, Here is V2 patch.
Best Regards, ThuanTr -----Original Message----- From: Thuan Tran <thuan.t...@dektech.com.au> Sent: Tuesday, August 11, 2020 1:08 PM To: Thanh Nguyen <thanh.ngu...@dektech.com.au>; Thang Duc Nguyen <thang.d.ngu...@dektech.com.au>; Minh Hon Chau <minh.c...@dektech.com.au> Cc: opensaf-devel@lists.sourceforge.net; Thuan Tran <thuan.t...@dektech.com.au> Subject: [PATCH 1/1] osaf: move common functions into immutil [#3211] --- 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 Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel