vpnengine/dmadipsecvpn/src/dmadddf.cpp
changeset 0 33413c0669b9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/vpnengine/dmadipsecvpn/src/dmadddf.cpp	Thu Dec 17 09:14:51 2009 +0200
@@ -0,0 +1,546 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: Implementation of CDmAdDdf.
+*
+*/
+
+
+#include <utf.h>
+
+#include "dmadddf.h"
+#include "dmadeventlog.h"
+#include "dmadutil.h"
+#include "vpnlogger.h"
+
+CDmAdDdf* CDmAdDdf::NewL(MDmAdCallBack* aDmAdCallBack, CDmAdStore* aStore)
+    {
+    TRACE("CDmAdDdf::NewL");
+    
+    CDmAdDdf* self = NewLC(aDmAdCallBack, aStore);
+    CleanupStack::Pop();
+    return self;
+    }
+
+CDmAdDdf* CDmAdDdf::NewLC(MDmAdCallBack* aDmAdCallBack, CDmAdStore* aStore)
+    {
+    CDmAdDdf* self = new (ELeave) CDmAdDdf(aDmAdCallBack, aStore);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    return self;
+    }
+    
+void CDmAdDdf::ConstructL(void)
+    {
+    TRACE("CDmAdDdf::ConstructL");
+    }
+
+CDmAdDdf::CDmAdDdf(MDmAdCallBack* aDmAdCallBack, CDmAdStore* aStore) :
+   iCallBack(aDmAdCallBack), iStore(aStore)
+    {
+    TRACE("CDmAdDdf::CDmAdDdf");
+    }
+
+CDmAdDdf::~CDmAdDdf()
+    {
+    TRACE("CDmAdDdf::~CDmAdDdf");
+    }
+    
+//===================================================================================================
+    
+void CDmAdDdf::BuildDDFVersionL(CBufBase& aDDFVersion)
+    {
+    TRACE("CDmAdDdf::BuildDDFVersionL");
+    aDDFVersion.InsertL(0, KDmAdDdfVersion);
+    }
+
+void CDmAdDdf::BuildDDFStructureL(MSmlDmDDFObject& aDDF)
+    {
+    TRACE("CDmAdDdf::BuildDDFStructureL");
+    
+    TSmlDmAccessTypes accessTypesExec;
+    accessTypesExec.SetReplace(); // accessTypesExec.SetExec();
+
+    TSmlDmAccessTypes accessTypesGet;
+    accessTypesGet.SetGet();
+
+    TSmlDmAccessTypes accessTypesAdd;
+    accessTypesAdd.SetAdd();
+    
+    TSmlDmAccessTypes accessTypesGetAdd;
+    accessTypesGetAdd.SetGet();
+    accessTypesGetAdd.SetAdd();
+    
+    TSmlDmAccessTypes accessTypesGetDelete;
+    accessTypesGetDelete.SetGet();
+    accessTypesGetDelete.SetDelete();
+    
+    TSmlDmAccessTypes accessTypesAll;
+    accessTypesAll.SetGet();
+    accessTypesAll.SetAdd();
+    accessTypesAll.SetDelete();
+    accessTypesAll.SetReplace();
+    
+    TSmlDmAccessTypes accessTypesNoDelete;
+    accessTypesNoDelete.SetGet();
+    accessTypesNoDelete.SetAdd();
+    accessTypesNoDelete.SetReplace();
+
+    MSmlDmDDFObject* obj;
+    MSmlDmDDFObject* objNokiaIpSecVpn;
+    MSmlDmDDFObject* objIpSecVpnGeneral;
+    MSmlDmDDFObject* objPolicy;
+    MSmlDmDDFObject* objPolicyX;
+    MSmlDmDDFObject* objAp;
+    MSmlDmDDFObject* objApX;
+    MSmlDmDDFObject* objApXPolicyRef;
+
+//----------------------------------------------------------------
+    
+    objNokiaIpSecVpn = &TDmAdUtil::AddChildObjectL(aDDF, KDmAdNodeNokiaIpSecVpn);
+    TDmAdUtil::FillNodeInfoL(*objNokiaIpSecVpn,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EPermanent,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeNokiaIpSecVpn,
+                             ETrue,
+                             KDmAdNokiaIpSecVpnRootTypeProperty);
+    
+//----------------------------------------------------------------
+    
+    objIpSecVpnGeneral = &TDmAdUtil::AddChildObjectL(*objNokiaIpSecVpn, KDmAdNodeGeneral);
+    TDmAdUtil::FillNodeInfoL(*objIpSecVpnGeneral,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EPermanent,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeGeneral,
+                             EFalse,
+                             KNullDesC8);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objIpSecVpnGeneral, KDmAdLeafClientVersion);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafClientVersion,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objIpSecVpnGeneral, KDmAdLeafEventLog);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGetDelete,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafEventLog,
+                             EFalse);
+    
+//----------------------------------------------------------------
+    
+    objPolicy = &TDmAdUtil::AddChildObjectL(*objNokiaIpSecVpn, KDmAdNodePolicy);
+    TDmAdUtil::FillNodeInfoL(*objPolicy,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EPermanent,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodePolicy,
+                             EFalse,
+                             KNullDesC8);
+
+    
+    objPolicyX = &TDmAdUtil::AddChildObjectL(*objPolicy, KDmAdNodeRt);
+    TDmAdUtil::FillNodeInfoL(*objPolicyX,
+                             accessTypesAll,
+                             MSmlDmDDFObject::EZeroOrMore,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeRt,
+                             EFalse,
+                             KNullDesC8);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objPolicyX, KDmAdLeafName);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesNoDelete,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafName,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objPolicyX, KDmAdLeafId);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGetAdd,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafId,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objPolicyX, KDmAdLeafVersion);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesNoDelete,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafVersion,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objPolicyX, KDmAdLeafDescription);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesNoDelete,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafDescription,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objPolicyX, KDmAdLeafIssuer);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesNoDelete,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafIssuer,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objPolicyX, KDmAdLeafContact);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesNoDelete,
+                             MSmlDmDDFObject::EZeroOrOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafContact,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objPolicyX, KDmAdLeafContent);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesNoDelete,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EBin,
+                             KDmAdDescLeafContent,
+                             EFalse);
+    
+    
+//----------------------------------------------------------------
+    
+    objAp = &TDmAdUtil::AddChildObjectL(*objNokiaIpSecVpn, KDmAdNodeAp);
+    TDmAdUtil::FillNodeInfoL(*objAp,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EPermanent,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeAp,
+                             EFalse,
+                             KNullDesC8);
+
+    
+    objApX = &TDmAdUtil::AddChildObjectL(*objAp, KDmAdNodeRt);
+    TDmAdUtil::FillNodeInfoL(*objApX,
+                             accessTypesAll,
+                             MSmlDmDDFObject::EZeroOrMore,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodeRt,
+                             EFalse,
+                             KNullDesC8);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objApX, KDmAdLeafName);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesNoDelete,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafName,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objApX, KDmAdLeafThisRef);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafThisRef,
+                             EFalse);
+    
+    objApXPolicyRef = &TDmAdUtil::AddChildObjectL(*objApX, KDmAdNodePolicyRef);
+    TDmAdUtil::FillNodeInfoL(*objApXPolicyRef,
+                             accessTypesGetAdd,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::ENode,
+                             KDmAdDescNodePolicyRef,
+                             EFalse,
+                             KNullDesC8);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objApXPolicyRef, KDmAdLeafId);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesNoDelete,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafId,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objApXPolicyRef, KDmAdLeafUri);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesGet,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafUri,
+                             EFalse);
+    
+    obj = &TDmAdUtil::AddChildObjectL(*objApX, KDmAdLeafConRef);
+    TDmAdUtil::FillNodeInfoL(*obj,
+                             accessTypesNoDelete,
+                             MSmlDmDDFObject::EOne,
+                             MSmlDmDDFObject::EDynamic,
+                             MSmlDmDDFObject::EChr,
+                             KDmAdDescLeafConRef,
+                             EFalse);
+    
+    }
+    
+//---------------------------------------------------------------------------------------
+    
+void CDmAdDdf::NotRtNodeAddNodeObjectL(const TDesC8& /*aUri*/, 
+                                       const TDesC8& /*aParentLuid*/, 
+                                       TInt aStatusRef)
+    {
+    TRACE("CDmAdDdf::NotRtNodeAddNodeObjectL");
+    iCallBack->SetStatusL(aStatusRef, KErrNone);
+    }
+
+void CDmAdDdf::NotRtNodeUpdateLeafObjectL(const TDesC8& /*aUri*/, 
+                                          const TDesC8& /*aLuid*/, 
+                                          const TDesC8& /*aObject*/, 
+                                          const TDesC8& /*aType*/, 
+                                          TInt aStatusRef)
+    {
+    TRACE("CDmAdDdf::NotRtNodeUpdateLeafObjectL");
+    iCallBack->SetStatusL(aStatusRef, KErrNone);
+    }
+
+TInt CDmAdDdf::NotRtNodeFetchLeafObjectLC(const TDesC8& aUri, 
+                                          const TDesC8& /*aLuid*/, 
+                                          const TDesC8& /*aType*/, 
+                                          CBufBase*& aObject)
+    {
+    TInt status = KErrNotFound;
+    CBufBase* object = CBufFlat::NewL(32);
+    CleanupStack::PushL(object);
+    
+    TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri);
+    if (lastSeg.Compare(KDmAdLeafClientVersion) == 0)
+        {
+        HBufC8* version = CnvUtfConverter::ConvertFromUnicodeToUtf8L(KVersion);
+        CleanupStack::PushL(version);
+        object->InsertL(0, *version);
+        CleanupStack::PopAndDestroy(); //version
+        status = KErrNone;
+        }
+    else if (lastSeg.Compare(KDmAdLeafEventLog) == 0)
+        {
+        TDmAdEventLog::EventLogL(*object);
+        status = KErrNone;
+        }
+    aObject = object;
+    return status;
+    }
+
+void CDmAdDdf::NotRtNodeDeleteObjectL(const TDesC8& aUri, 
+                                      const TDesC8& /*aLuid*/, 
+                                      TInt aStatusRef)
+    {
+    TRACE("CDmAdDdf::NotRtNodeDeleteObjectL");
+    
+    TInt status = KErrNone; //KErrNotFound;
+    TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri);
+    if (lastSeg.Compare(KDmAdLeafEventLog) == 0)
+        {
+        TDmAdEventLog::DeleteLogL();
+        status = KErrNone;
+        }
+    iCallBack->SetStatusL(aStatusRef, status);
+    }
+    
+//---------------------------------------------------------------------------------------
+    
+TBool CDmAdDdf::IsNodeRtNodeL(const TDesC8& aUri)
+    {
+    TRACE("CDmAdDdf::IsNodeRtNodeL");
+    
+    TBool ret = EFalse;
+    TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri);
+
+    if (lastSeg.Compare(KDmAdLeafEventLog) == 0) // for DeleteObjectL: In this case this method is called also when URI is leaf (not always node)
+        {
+        return EFalse;
+        }
+    
+    if (lastSeg.Compare(KDmAdNodeNokiaIpSecVpn) == 0 ||
+        lastSeg.Compare(KDmAdNodeGeneral) == 0 ||
+        lastSeg.Compare(KDmAdNodePolicy) == 0 ||
+        lastSeg.Compare(KDmAdNodeAp) == 0 ||
+        lastSeg.Compare(KDmAdNodePolicyRef) == 0)
+        {
+        ret = EFalse;
+        }
+    else
+        {
+        if (TDmAdUtil::NumOfURISegs(aUri) < 2)
+            {
+            DEBUG_LOG(_L("Node not found"));            
+            User::Leave(KErrNotFound);
+            }
+        TPtrC8 prevSeg = TDmAdUtil::LastUriSeg(TDmAdUtil::RemoveLastUriSeg(aUri));
+        if (prevSeg.Compare(KDmAdNodePolicy) == 0 ||
+            prevSeg.Compare(KDmAdNodeAp) == 0)
+            {
+            ret = ETrue;
+            }
+        else
+            {
+            DEBUG_LOG(_L("Node not found"));
+            User::Leave(KErrNotFound);
+            }
+        }
+    return ret;
+    }
+
+TBool CDmAdDdf::IsLeafUnderRtNodeL(const TDesC8& aUri)
+    {
+    TRACE("CDmAdDdf::IsLeafUnderRtNodeL");
+    
+    TBool ret = EFalse;
+    TPtrC8 nodeUri(TDmAdUtil::RemoveLastUriSeg(aUri));
+    ret = IsNodeRtNodeL(nodeUri);
+    if (!ret)
+        {
+        TPtrC8 nodeUriSeg = TDmAdUtil::LastUriSeg(nodeUri);
+        if (nodeUriSeg.Compare(KDmAdNodePolicyRef) == 0)
+            {
+            ret = ETrue;
+            }
+        }
+    return ret;
+    }
+
+TPtrC8 CDmAdDdf::RtNodeUriForLeafL(const TDesC8& aLeafUri)
+    {
+    TRACE("CDmAdDdf::RtNodeUriForLeafL");
+    
+    TPtrC8 ret;
+    TPtrC8 nodeUri(TDmAdUtil::RemoveLastUriSeg(aLeafUri));
+    TPtrC8 nodeUriSeg(TDmAdUtil::LastUriSeg(nodeUri));
+    TPtrC8 prevNodeUri(TDmAdUtil::RemoveLastUriSeg(nodeUri));
+    TPtrC8 prevNodeUriSeg(TDmAdUtil::LastUriSeg(prevNodeUri));
+    
+    if (prevNodeUriSeg.Compare(KDmAdNodePolicy) == 0 ||
+        prevNodeUriSeg.Compare(KDmAdNodeAp) == 0)
+        {
+        ret.Set(nodeUri);
+        }
+    else if (nodeUriSeg.Compare(KDmAdNodePolicyRef) == 0)
+        {
+        ret.Set(prevNodeUri);
+        }
+    else
+        {
+        DEBUG_LOG(_L("Node not found"));
+        User::Leave(KErrNotFound);
+        }
+    return ret;
+    }
+
+TBool CDmAdDdf::IsTopLevelRtNode(const TDesC8& aUri)
+    {
+    TRACE("CDmAdDdf::IsTopLevelRtNode");
+    
+    (void)aUri;
+    return ETrue;
+    }
+
+HBufC8* CDmAdDdf::ParentRtNodeUriForRtNodeLC(const TDesC8& /*aUri*/)
+    {
+    DEBUG_LOG(_L("CDmAdDdf::ParentRtNodeUriForRtNodeLC method not implemented"));
+    User::Leave(KErrGeneral);
+    return NULL;
+    }
+
+//---------------------------------------------------------------------------------------
+    
+void CDmAdDdf::BuildChildUriListLC(const TDesC8& aUri, 
+                                   const TDesC8& aParentLuid, 
+                                   const CArrayFix<TSmlDmMappingInfo>& aPreviousUriSegmentList, 
+                                   CBufBase*& aCurrentList)
+    {
+    CBufBase* currentList = CBufFlat::NewL(128);
+    CleanupStack::PushL(currentList);
+
+    TPtrC8 lastSeg = TDmAdUtil::LastUriSeg(aUri);
+    if (lastSeg.Compare(KDmAdNodeNokiaIpSecVpn) == 0)
+        {
+        currentList->InsertL(0, KDmAdListOfNokiaIpSecVpnChildren);
+        }
+    else if (lastSeg.Compare(KDmAdNodeGeneral) == 0)
+        {
+        currentList->InsertL(0, KDmAdListOfIpSecVpnGeneralChildren);
+        }
+    else if (lastSeg.Compare(KDmAdNodePolicyRef) == 0)
+        {
+        if (!iStore->FindRtNodeL(aParentLuid, aUri))
+            {
+            DEBUG_LOG(_L("Node not found"));            
+            User::Leave(KErrNotFound);
+            }
+        currentList->InsertL(0, KDmAdListOfPolicyRefChildren);
+        }
+    else if (lastSeg.Compare(KDmAdNodePolicy) == 0 ||
+             lastSeg.Compare(KDmAdNodeAp) == 0)
+        {
+        TDmAdUtil::BuildRtNodeChildUriListL(iCallBack, iStore, aUri, aParentLuid, aPreviousUriSegmentList, *currentList);
+        }
+    else
+        {
+        TPtrC8 prevSeg = TDmAdUtil::LastUriSeg(TDmAdUtil::RemoveLastUriSeg(aUri));
+        if (prevSeg.Compare(KDmAdNodePolicy) == 0 ||
+            prevSeg.Compare(KDmAdNodeAp) == 0)
+            {
+            if (!iStore->FindRtNodeL(aParentLuid, aUri))
+                {
+                DEBUG_LOG(_L("Node not found"));       
+                User::Leave(KErrNotFound);
+                }
+            
+            if (prevSeg.Compare(KDmAdNodePolicy) == 0)
+                {
+                currentList->InsertL(0, KDmAdListOfPolicyXChildren);
+                }
+            else if (prevSeg.Compare(KDmAdNodeAp) == 0)
+                {
+                currentList->InsertL(0, KDmAdListOfApXChildren);
+                }
+            }
+        else
+            {
+            DEBUG_LOG(_L("Node not found"));       
+            User::Leave(KErrNotFound);
+            }
+        }
+
+    aCurrentList = currentList;
+    }