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

Reply via email to