osaf/services/saf/immsv/immnd/ImmModel.cc  |  143 ++++++++++++++++++++++++----
 osaf/services/saf/immsv/immnd/ImmModel.hh  |   11 ++-
 osaf/services/saf/immsv/immnd/immnd_evt.c  |   28 ++++-
 osaf/services/saf/immsv/immnd/immnd_init.h |    4 +
 4 files changed, 157 insertions(+), 29 deletions(-)


This feature is only for appliers with version A.2.17 or later.
Appliers which are initialized as A.2.17 or later MUST support 
SA_IMM_ATTR_VALUES_REPLACE in their callbacks.

diff --git a/osaf/services/saf/immsv/immnd/ImmModel.cc 
b/osaf/services/saf/immsv/immnd/ImmModel.cc
--- a/osaf/services/saf/immsv/immnd/ImmModel.cc
+++ b/osaf/services/saf/immsv/immnd/ImmModel.cc
@@ -723,6 +723,12 @@ immModel_canonicalizeAttrModification(IM
     return 
ImmModel::instance(&cb->immModel)->canonicalizeAttrModification(req);
 }
 
+struct immsv_attr_mods_list*
+immModel_getAllWritableAttributes(IMMND_CB *cb, const ImmsvOmCcbObjectModify 
*req, bool* hasLongDn)
+{
+    return ImmModel::instance(&cb->immModel)->getAllWritableAttributes(req, 
hasLongDn);
+}
+
 SaUint32T
 immModel_getLocalAppliersForObj(IMMND_CB *cb,
     const SaNameT* objName,
@@ -776,6 +782,11 @@ immModel_getLocalAppliersForCcb(IMMND_CB
     return arrSize;
 }
 
+SaUint32T immModel_getPbeApplierConn(IMMND_CB *cb)
+{
+       return ImmModel::instance(&cb->immModel)->getPbeApplierConn();
+}
+
 SaAisErrorT
 immModel_ccbObjectModify(IMMND_CB *cb, 
     const struct ImmsvOmCcbObjectModify* req,
@@ -6607,6 +6618,15 @@ void ImmModel::getLocalAppliersForObj(co
     }
 }
 
+SaUint32T ImmModel::getPbeApplierConn()
+{
+       SaUint32T conn = 0;
+       unsigned int nodeId = 0;
+       getPbeBSlave(&conn, &nodeId);
+
+       return conn;
+}
+
 /*
   Checks if the there is any local special applier AND if the CCB op callbacks
   have not yet included information about admin-owner-name.
@@ -7024,12 +7044,49 @@ ImmModel::specialApplierTrimCreate(SaUin
     return attrValues;
 }
 
+/* Get after image of an object in a specific CCB */
+ObjectInfo*
+ImmModel::getObjectAfterImageInCcb(const std::string& objName, SaUint32T ccbId)
+{
+    CcbVector::iterator ci;
+    CcbInfo* ccb = NULL;
+    ObjectInfo* afim = NULL;
+    ObjectMutationMap::iterator omuti;
+    ObjectMutation* oMut = NULL;
+
+    osafassert(!objName.empty());
+
+    /* Get ccb info */
+    ci = std::find_if(sCcbVector.begin(), sCcbVector.end(), CcbIdIs(ccbId));
+    osafassert(ci != sCcbVector.end());
+    ccb = *ci;
+
+    /* Get object mutation */
+    omuti = ccb->mMutations.find(objName);
+    osafassert(omuti != ccb->mMutations.end());
+    oMut = omuti->second;
+
+    /* Get after image */
+    if (oMut->mOpType == IMM_CREATE) { /* Chained operation */
+        ObjectMap::iterator oi = sObjectMap.find(objName);
+        osafassert(oi != sObjectMap.end());
+        afim = oi->second;
+    } else if (oMut->mOpType == IMM_MODIFY) {
+        afim = oMut->mAfterImage;
+    } /* return NULL for IMM_DELETE */
+
+    return afim;
+}
+
 /* This function converts value(s) of an attribute into a single attr-mod.
  * attrModType is always SA_IMM_ATTR_VALUES_REPLACE.
+ *
+ * 'hasLongDns' is set to true when there's at least one value is long dn.
+ * If it's NULL or 'true', no checking for long DNs will be done.
  */
 immsv_attr_mods_list*
 ImmModel::attrValueToAttrMod(const ObjectInfo* obj, const std::string& 
attrName,
-                             SaUint32T attrType)
+                             SaUint32T attrType, SaImmAttrFlagsT attrFlags, 
bool* hasLongDn)
 {
     ImmAttrValueMap::const_iterator avi = obj->mAttrValueMap.find(attrName);
     osafassert(avi != obj->mAttrValueMap.end());
@@ -7059,6 +7116,26 @@ ImmModel::attrValueToAttrMod(const Objec
         attrMod->attrValue.attrValuesNumber = 1 + attrValue->extraValues();
     } /* else, attrValuesNumber is already set to 0 */
 
+    /* Check for long DN when attribute type is
+     * 'SA_IMM_ATTR_SANAMET' or 'SA_IMM_ATTR_SASTRINGT with SA_IMM_ATTR_DN'.
+     * Will be skipped if hasLongDn is NULL or already 'true'. */
+    if (hasLongDn && !(*hasLongDn) && !attrValue->empty() &&
+            (attrType == SA_IMM_ATTR_SANAMET ||
+                    (attrType == SA_IMM_ATTR_SASTRINGT && (attrFlags & 
SA_IMM_ATTR_DN)))) {
+        if (strlen(attrValue->getValueC_str()) >= 
SA_MAX_UNEXTENDED_NAME_LENGTH) { /* Check head value */
+            *hasLongDn = true; /* Found! Skip checking more values */
+        } else if (attrValue->extraValues()) { /* Check more values */
+            ImmAttrMultiValue* multiVal = ((ImmAttrMultiValue *) 
attrValue)->getNextAttrValue();
+            while (multiVal) {
+                if (!multiVal->empty() && strlen(multiVal->getValueC_str()) >= 
SA_MAX_UNEXTENDED_NAME_LENGTH) {
+                    *hasLongDn = true; /* Found! Stop checking */
+                    break; /* while */
+                }
+                multiVal = multiVal->getNextAttrValue();
+            }
+        }
+    }
+
     return attrMod;
 }
 
@@ -7072,36 +7149,16 @@ ImmModel::canonicalizeAttrModification(c
     TRACE_ENTER();
     immsv_attr_mods_list* result = NULL;
     std::string objectName;
-    CcbVector::iterator ci;
-    CcbInfo* ccb = NULL;
     ObjectInfo* afim = NULL;
-    ObjectMutationMap::iterator omuti;
-    ObjectMutation* oMut = NULL;
 
     /* Get object Name */
     size_t sz = strnlen(req->objectName.buf, (size_t) req->objectName.size);
     objectName.append((const char*) req->objectName.buf, sz);
     osafassert(!objectName.empty());
 
-    /* Get ccb info */
-    ci = std::find_if(sCcbVector.begin(), sCcbVector.end(), 
CcbIdIs(req->ccbId));
-    osafassert(ci != sCcbVector.end());
-    ccb = *ci;
-
-    /* Get object mutation */
-    omuti = ccb->mMutations.find(objectName);
-    osafassert(omuti != ccb->mMutations.end());
-    oMut = omuti->second;
-
     /* Get after image */
-    osafassert(oMut->mOpType != IMM_DELETE);
-    if (oMut->mOpType == IMM_CREATE) { /* Chained operation */
-        ObjectMap::iterator oi = sObjectMap.find(objectName);
-        osafassert(oi != sObjectMap.end());
-        afim = oi->second;
-    } else if (oMut->mOpType == IMM_MODIFY) {
-        afim = oMut->mAfterImage;
-    }
+    afim = getObjectAfterImageInCcb(objectName, req->ccbId);
+    osafassert(afim);
 
     /* Build canonicalized attr-mod list */
     immsv_attr_mods_list* reqAttrMods = req->attrMods;
@@ -7119,6 +7176,46 @@ ImmModel::canonicalizeAttrModification(c
     return result;
 }
 
+/* This function allocates new memory for attribute-modifications
+ * for all writable attributes of object.
+ * Remember to free the memory with immsv_free_attrmods().
+ */
+immsv_attr_mods_list*
+ImmModel::getAllWritableAttributes(const ImmsvOmCcbObjectModify *req, bool* 
hasLongDn)
+{
+    TRACE_ENTER();
+    immsv_attr_mods_list* result = NULL;
+    std::string objectName;
+    ObjectInfo* afim = NULL;
+    AttrMap::iterator ai;
+
+    /* Get object Name */
+    size_t sz = strnlen(req->objectName.buf, (size_t) req->objectName.size);
+    objectName.append((const char*) req->objectName.buf, sz);
+    osafassert(!objectName.empty());
+
+    /* Get after image */
+    afim = getObjectAfterImageInCcb(objectName, req->ccbId);
+    osafassert(afim);
+
+    /* Build attr-mod list for all writable attributes */
+    osafassert(hasLongDn);
+    ClassInfo* classInfo = afim->mClassInfo;
+    ai = classInfo->mAttrMap.begin();
+    for (; ai != classInfo->mAttrMap.end(); ai++) {
+        if (ai->second->mFlags & SA_IMM_ATTR_WRITABLE) {
+            immsv_attr_mods_list* attrMod = attrValueToAttrMod(afim, 
(std::string&) ai->first,
+                                                               
ai->second->mValueType,
+                                                               
ai->second->mFlags, hasLongDn);
+            attrMod->next = result;
+            result = attrMod;
+        }
+    }
+
+    TRACE_LEAVE();
+    return result;
+}
+
 /** 
  * Creates an object
  */
diff --git a/osaf/services/saf/immsv/immnd/ImmModel.hh 
b/osaf/services/saf/immsv/immnd/ImmModel.hh
--- a/osaf/services/saf/immsv/immnd/ImmModel.hh
+++ b/osaf/services/saf/immsv/immnd/ImmModel.hh
@@ -240,9 +240,13 @@ public:
                                         ConnVector& connVector,
                                        SaUint32T* appCtnPtr);
 
+    SaUint32T getPbeApplierConn();
+
     immsv_attr_mods_list* canonicalizeAttrModification(
             const struct ImmsvOmCcbObjectModify *req);
     
+    immsv_attr_mods_list* getAllWritableAttributes(const 
ImmsvOmCcbObjectModify *req, bool* hasLongDn);
+
     SaAisErrorT         ccbObjectModify(
                                         const ImmsvOmCcbObjectModify* req,
                                         SaUint32T* implConn,
@@ -712,9 +716,14 @@ private:
                             ObjectInfo *obj,
                             const char *noDanglingRef);
 
+    ObjectInfo* getObjectAfterImageInCcb(const std::string& objName,
+                                         SaUint32T ccbId);
+
     immsv_attr_mods_list* attrValueToAttrMod(const ObjectInfo* obj,
                                              const std::string& attrName,
-                                             SaUint32T attrType);
+                                             SaUint32T attrType,
+                                             SaImmAttrFlagsT attrFlags = 0,
+                                             bool* hasLongDn = NULL);
 
 };
 
diff --git a/osaf/services/saf/immsv/immnd/immnd_evt.c 
b/osaf/services/saf/immsv/immnd/immnd_evt.c
--- a/osaf/services/saf/immsv/immnd/immnd_evt.c
+++ b/osaf/services/saf/immsv/immnd/immnd_evt.c
@@ -6213,7 +6213,11 @@ static void immnd_evt_proc_object_modify
        SaNameT objName;
        osaf_extended_name_clear(&objName);
        bool hasLongDns=false;
+       /* These 2 attr-mods lists will only be generated on demand */
        IMMSV_ATTR_MODS_LIST* canonicalizedAttrMod = NULL;
+       IMMSV_ATTR_MODS_LIST* allWritableAttr = NULL;
+       /* Used when canonicalizing all writable attributes */
+       bool writableAttrHasLongDns = false;
 
        TRACE_ENTER();
 #if 0                          /*ABT DEBUG PRINTOUTS START */
@@ -6246,6 +6250,9 @@ static void immnd_evt_proc_object_modify
        err = immModel_ccbObjectModify(cb, &(evt->info.objModify), &implConn, 
&implNodeId, 
                &continuationId, &pbeConn, pbeNodeIdPtr, &objName, &hasLongDns);
 
+       /* If 'hasLongDns' is true, allWritableAttr will also contains long DN 
*/
+       writableAttrHasLongDns = hasLongDns;
+
        if(pbeNodeIdPtr && pbeConn && err == SA_AIS_OK) {
                /*The persistent back-end is present and executing at THIS 
node. */
                osafassert(cb->mIsCoord);
@@ -6362,12 +6369,11 @@ static void immnd_evt_proc_object_modify
                SaUint32T arrSize =
                        immModel_getLocalAppliersForObj(cb, &objName,
                                evt->info.objModify.ccbId, &applConnArr, 
SA_FALSE);
+               SaUint32T pbeApplierConn = immModel_getPbeApplierConn(cb); /* 0 
if not local or not exist */
 
                if(arrSize) {
                        memset(&send_evt, '\0', sizeof(IMMSV_EVT));
                        send_evt.type = IMMSV_EVT_TYPE_IMMA;
-                       send_evt.info.imma.type = hasLongDns ? 
IMMA_EVT_ND2A_OI_OBJ_MODIFY_LONG_UC :
-                               IMMA_EVT_ND2A_OI_OBJ_MODIFY_UC;
                        send_evt.info.imma.info.objModify = evt->info.objModify;
                        send_evt.info.imma.info.objModify.adminOwnerId = 0;
                        /* Re-use the adminOwner member of the ccbModify 
message to hold the 
@@ -6376,6 +6382,8 @@ static void immnd_evt_proc_object_modify
                        for (; ix < arrSize && err == SA_AIS_OK; ++ix) {
                                bool isSpecialApplier = false;
                                send_evt.info.imma.info.objModify.attrMods = 
evt->info.objModify.attrMods;
+                               send_evt.info.imma.type = hasLongDns ? 
IMMA_EVT_ND2A_OI_OBJ_MODIFY_LONG_UC :
+                                       IMMA_EVT_ND2A_OI_OBJ_MODIFY_UC;
                                implHandle = 
m_IMMSV_PACK_HANDLE(applConnArr[ix], cb->node_id);
                                send_evt.info.imma.info.objModify.immHandle = 
implHandle;
 
@@ -6405,10 +6413,18 @@ static void immnd_evt_proc_object_modify
                                                
oi_cl_node->version.minorVersion >= 0x11 &&
                                                
oi_cl_node->version.majorVersion == 0x2 &&
                                                oi_cl_node->version.releaseCode 
== 'A') {
-                                       if (!canonicalizedAttrMod) { /* Check 
if canonicalizedAttrMod is already built */
-                                               canonicalizedAttrMod = 
immModel_canonicalizeAttrModification(cb, &(evt->info.objModify));
+                                       if (applConnArr[ix] == pbeApplierConn) 
{ /* Slave pbe */
+                                               
osafassert(canonicalizedAttrMod); /* Must already be built for primary pbe */
+                                               
send_evt.info.imma.info.objModify.attrMods = canonicalizedAttrMod;
+                                       } else {
+                                               if (!allWritableAttr) { /* 
Check if allWritableAttr is already built */
+                                                       allWritableAttr = 
immModel_getAllWritableAttributes(cb, &(evt->info.objModify),
+                                                                               
                                                                                
         &writableAttrHasLongDns);
+                                               }
+                                               
send_evt.info.imma.info.objModify.attrMods = allWritableAttr;
+                                               send_evt.info.imma.type = 
writableAttrHasLongDns ?
+                                                       
IMMA_EVT_ND2A_OI_OBJ_MODIFY_LONG_UC : IMMA_EVT_ND2A_OI_OBJ_MODIFY_UC;
                                        }
-                                       
send_evt.info.imma.info.objModify.attrMods = canonicalizedAttrMod;
                                }
                                /* Slave pbe is initialized with latest OI api 
version,
                                 * it will also receive canonicalized attrMod 
like the primary pbe
@@ -6458,6 +6474,8 @@ static void immnd_evt_proc_object_modify
        /* Free the canonicalized attr mods */
        immsv_free_attrmods(canonicalizedAttrMod);
        canonicalizedAttrMod = NULL;
+       immsv_free_attrmods(allWritableAttr);
+       allWritableAttr = NULL;
        osaf_extended_name_free(&objName);
        TRACE_LEAVE();
 }
diff --git a/osaf/services/saf/immsv/immnd/immnd_init.h 
b/osaf/services/saf/immsv/immnd/immnd_init.h
--- a/osaf/services/saf/immsv/immnd/immnd_init.h
+++ b/osaf/services/saf/immsv/immnd/immnd_init.h
@@ -170,6 +170,7 @@ extern "C" {
                 SaUint32T **aplConnArr, SaBoolT externalRep);
        SaUint32T immModel_getLocalAppliersForCcb(IMMND_CB *cb, SaUint32T 
ccbId, SaUint32T **aplConnArr,
                SaUint32T* applCtnPtr);
+       SaUint32T immModel_getPbeApplierConn(IMMND_CB *cb);
 
        SaAisErrorT
            immModel_ccbObjectModify(IMMND_CB *cb,
@@ -299,6 +300,9 @@ extern "C" {
        struct immsv_attr_mods_list*
        immModel_canonicalizeAttrModification(IMMND_CB *cb, const struct 
ImmsvOmCcbObjectModify *req);
 
+       struct immsv_attr_mods_list*
+       immModel_getAllWritableAttributes(IMMND_CB *cb, const struct 
ImmsvOmCcbObjectModify *req, bool* hasLongDn);
+
        SaBoolT immModel_protocol41Allowed(IMMND_CB *cb);
        SaBoolT immModel_protocol43Allowed(IMMND_CB *cb);
        SaBoolT immModel_protocol45Allowed(IMMND_CB *cb);

------------------------------------------------------------------------------
Site24x7 APM Insight: Get Deep Visibility into Application Performance
APM + Mobile APM + RUM: Monitor 3 App instances at just $35/Month
Monitor end-to-end web transactions and take corrective actions now
Troubleshoot faster and improve end-user experience. Signup Now!
http://pubads.g.doubleclick.net/gampad/clk?id=272487151&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to