syncmlfw/dm/treemodule/src/nsmldmddf.cpp
changeset 0 b497e44ab2fc
child 2 5594fba90824
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/dm/treemodule/src/nsmldmddf.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,1821 @@
+/*
+* Copyright (c) 2005 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:  DM tree etc.
+*
+*/
+
+#include <utf.h>
+#include <smldmadapter.h>
+#include <nsmldebug.h>
+#include <nsmldmmodule.h>
+//For P&S keys
+#include <e32property.h>
+#include "nsmldminternalpskeys.h"
+#include "nsmldmddf.h"
+#include "nsmldmtreeconstants.h"
+#include "nsmldmhostclient.h"
+#include "nsmldmclientandserver.h"
+#include "nsmldmuri.h"
+#include <featmgr.h>
+// FOTA
+#include "nsmldmimpluids.h"
+// FOTA end
+
+#ifndef __WINS__
+// This lowers the unnecessary compiler warning (armv5) to remark.
+// "Warning:  #174-D: expression has no effect..." is caused by 
+// DBG_ARGS8 macro in no-debug builds.
+#pragma diag_remark 174
+#endif
+
+const TInt KGranularity = 4;
+// FOTA
+_LIT8 ( KNSmlDMFotaNode, "FUMO" );
+_LIT8 ( KNSmlDMAcc, "DMAcc");
+_LIT8 ( KNSmlDMRoot, "." );
+// FOTA end
+
+// ===========================================================================
+// CNSmlDmDDF
+// ===========================================================================
+
+// ---------------------------------------------------------------------------
+// CNSmlDmDDF::CNSmlDmDDF(CNSmlDmModule& aDmModule)
+// ----------------------------------------------------------------------------
+CNSmlDmDDF::CNSmlDmDDF(CNSmlDmModule& aDmModule) : iDmModule(aDmModule)
+	{
+	}
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::~CNSmlDmDDF()
+// ----------------------------------------------------------------------------
+CNSmlDmDDF::~CNSmlDmDDF()
+	{
+	delete iMgmtTree;
+
+	iSessionArray.Reset();
+	iSessionArray.Close();
+	
+	iResultRefs.ResetAndDestroy();
+	iDeleteStatusRefs.ResetAndDestroy();
+	iAddNodeStatusRefs.ResetAndDestroy();
+	if(iAddRootNodesList)
+		{
+		delete iAddRootNodesList;
+		}
+	//P&S key deletion,even fine if the key is not there
+	RProperty::Delete( KPSUidNSmlDMSyncAgent,KNSmlDMCmdAddNodeSuccess);
+	FeatureManager::UnInitializeLib();
+	}
+
+// ----------------------------------------------------------------------------
+//CNSmlDmDDF* CNSmlDmDDF::NewL(CNSmlDmDbHandler *aDbHandler)
+// ----------------------------------------------------------------------------
+CNSmlDmDDF* CNSmlDmDDF::NewL(CNSmlDmModule& aModule)
+	{
+	CNSmlDmDDF* self = new (ELeave) CNSmlDmDDF(aModule);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	CleanupStack::Pop();
+	return self;
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::GenerateDDFL(CBufBase& aObject)
+// Generates generates xml from the ddf
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::GenerateDDFL(CBufBase& aObject)
+	{
+	_DBG_FILE("CNSmlDmDDF::GenerateDDFL() : begin");
+	iMgmtTree->GenerateXMLL(aObject);
+	_DBG_FILE("CNSmlDmDDF::GenerateDDFL() : end");
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::SetServerL(const TDesC8& aURI)
+// Sets serverid to db
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::SetServerL(const TDesC8& aServerId)
+	{
+	_DBG_FILE("CNSmlDmDDF::SetServerL() : begin");
+	iDbSession.SetServerL(aServerId);
+	_DBG_FILE("CNSmlDmDDF::SetServerL() : end");
+	}
+
+// ----------------------------------------------------------------------------
+// TBool CNSmlDmDDF::IsDDFChangedL(/*CNSmlDmDbHandler *aDbHandler,*/
+// 	TDesC& aServer)
+// Checks if ddf has been changed. Ask the ddf version from all the adapters
+// and calculates checksum from adapter implementaion uids and versions
+// ----------------------------------------------------------------------------
+TInt CNSmlDmDDF::IsDDFChangedL()
+	{
+	_DBG_FILE("CNSmlDmDDF::IsDDFChangedL() : begin");
+	User::LeaveIfError( iDbSession.Connect() );
+	TInt checkSum(0);
+	for(TInt i=0;i<4;i++)
+		{
+		switch(i)
+			{
+			case 0:
+				if(iSessionArray[i].ConnectL(KNSmlDmHostServer1Name,this)
+					==KErrNone)
+					{
+					iOkSessions=iOkSessions|(0x01<<i);
+					checkSum=checkSum+iSessionArray[i].DDFStructureL(
+						*iMgmtTree);
+					iMgmtTree->SetServerId(i+1);
+					}
+				break;
+			case 1:
+				if(iSessionArray[i].ConnectL(KNSmlDmHostServer2Name,this)
+					==KErrNone)
+					{
+					iOkSessions=iOkSessions|(0x01<<i);
+					checkSum=checkSum+iSessionArray[i].DDFStructureL(
+						*iMgmtTree);
+					iMgmtTree->SetServerId(i+1);
+					}
+				break;
+			case 2:
+				if(iSessionArray[i].ConnectL(KNSmlDmHostServer3Name,this)
+					==KErrNone)
+					{
+					iOkSessions=iOkSessions|(0x01<<i);
+					checkSum=checkSum+iSessionArray[i].DDFStructureL(
+						*iMgmtTree);
+					iMgmtTree->SetServerId(i+1);
+					}
+				break;
+			case 3:
+				if(iSessionArray[i].ConnectL(KNSmlDmHostServer4Name,this)
+					==KErrNone)
+					{
+					iOkSessions=iOkSessions|(0x01<<i);
+					checkSum=checkSum+iSessionArray[i].DDFStructureL(
+						*iMgmtTree);
+					iMgmtTree->SetServerId(i+1);
+					}
+				break;
+			default:
+				User::Panic ( KNSmlTxtPanicDmModule, KErrArgument );
+				break;
+			}
+		}
+	return checkSum;
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::AddObjectL(const TDesC& aURI, const TDesC8& aObject,
+// 	const TDesC& aType)
+// Adds object, if adapter is found by using th uri, calls the adapters add object function.
+// Adapters AddNodeObjectL is called if not leaf object
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::AddObjectL(const TDesC8& aURI,
+	const TDesC8& aObject,
+	const TDesC8& aType,
+	const TInt aStatusRef,
+	TBool aLargeItem)
+	{
+	_DBG_FILE("CNSmlDmDDF::AddObjectL() : begin");
+	TBool adapterCalled = EFalse;
+	TInt status = KNSmlDmStatusNotFound;		
+	if(iAdapterId==0||iSessionId==0)
+		{
+		//update not allowed in object group level (levels before adapter
+		//level) 
+		iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusCommandNotAllowed);
+		return;
+		}
+		
+	if(iDbSession.CheckDynamicAclL(aURI,EAclAdd,iMgmtTree))	 //tarm
+		{
+		//acl rigths ok
+		TNSmlDmDDFFormat format = IsLeafL(aURI);
+		TPtrC8 parentUri = NSmlDmURI::ParentURI(aURI);
+		if(format==ENSmlDmDDFLeaf)
+			{
+			HBufC8* luid = iDbSession.GetLuidAllocL(iAdapterId,aURI);
+			TInt len = luid->Length();
+			CleanupStack::PushL(luid);
+
+			TInt find = KErrNotFound;
+			if( !FeatureManager::FeatureSupported( KFeatureIdSyncMlDm112) )//means DM 1.2
+			 {
+			 if(iAddRootNodesList)
+			     {							
+			     HBufC8* puri = HBufC8::NewLC(parentUri.Length()+2);
+			     puri->Des().Append(parentUri);
+			     puri->Des().Append(',');
+			     find = iAddRootNodesList->Find(puri->Des());	
+			     CleanupStack::PopAndDestroy();
+			     }			
+			 if( find <= KErrNotFound )
+			     {
+			     TBool returnstatus = ETrue; 
+			     TPtrC8 Uri1 = NSmlDmURI::URISeg(aURI,1);
+			     if( iAddRootNodesList && Uri1.Match(KNSmlDMAcc) >= KErrNone )//dm case
+			     {
+			     TPtrC8 FindUri = NSmlDmURI::URISeg(aURI,2);
+			     HBufC8* puri = HBufC8::NewLC(Uri1.Length()+FindUri.Length()+2);
+			     puri->Des().Append(aURI.Left(Uri1.Length()+FindUri.Length()+1));
+			     puri->Des().Append(',');
+			     find = iAddRootNodesList->Find(puri->Des());   
+			     CleanupStack::PopAndDestroy();
+			     if(find >= 0)
+			         {
+			         returnstatus = EFalse; 
+			         }
+			     }
+			     if(returnstatus)//not added in this session
+			         {			    	 
+			         _DBG_FILE("CNSmlDmDDF::AddObjectL()node not added in this session");
+                     if(len > 0) //Luid exists,Already existed
+                     {
+                     iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusAlreadyExists);	 
+                     }
+                     else
+                     {
+                     iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusNotFound);
+                     }
+			         CleanupStack::PopAndDestroy(); //luid
+			         return;
+			         }
+			     }
+				}
+			iSessionArray[iSessionId-1].UpdateLeafL(iAdapterId,*luid,
+				aStatusRef,aURI,aObject,aType,aLargeItem);
+			adapterCalled = ETrue;		
+			CleanupStack::PopAndDestroy(); //luid
+			}
+		else
+			{
+			RProperty::Set(KPSUidNSmlDMSyncAgent, 
+						          KNSmlDMCmdAddNodeSuccess, ENotAdded);
+			HBufC8* luid = iDbSession.GetLuidAllocL(iAdapterId,aURI);
+			CleanupStack::PushL(luid);			
+			CNSmlCallbackElement *newElement 
+				= new (ELeave)CNSmlCallbackElement();
+			CleanupStack::PushL(newElement);
+			newElement->iRef = aStatusRef;
+			newElement->iUri = aURI.AllocL();
+			iAddNodeStatusRefs.AppendL(newElement);
+			CleanupStack::Pop(); //newElement
+			iSessionArray[iSessionId-1].AddNodeL(iAdapterId,*luid,aStatusRef,
+				aURI);
+			//means DM 1.2
+			if( !FeatureManager::FeatureSupported( KFeatureIdSyncMlDm112) )
+			  {
+			  //Check the status of add node, so that update the add buffer
+			  TInt NodeAddingSuccess = KErrNotFound;
+			  TInt NodeorLeafexists= KErrNotFound;
+			  TInt err = RProperty::Get(KPSUidNSmlDMSyncAgent, 
+					  KNSmlDMCmdAddNodeSuccess, NodeAddingSuccess);
+			  //This key will be set by DM Host Session's setstatus
+			  TInt err1 = RProperty::Get( KPSUidNSmlDMSyncAgent, 
+					  KNSmlDMCmdAddOnExistingNodeorLeafKey,
+					  NodeorLeafexists );				  
+			  if( ( err1 == KErrNone && NodeorLeafexists == EAddCmd ) && 
+			          (err == KErrNone && (NodeAddingSuccess == EAdded ||
+			                  NodeAddingSuccess == ENotAdded) ) )
+			      {
+			      if(iAddRootNodesList) //already created
+			          {																						
+			          //Do check if there is any node already added					
+			          if( iAddRootNodesList->Match(aURI) <= KErrNotFound ) 
+			              {
+			              iAddRootNodesList = iAddRootNodesList->ReAllocL
+			              (iAddRootNodesList->Length() + aURI.Length()+ 10);
+			              iAddRootNodesList->Des().Append(aURI);
+			              }					
+			          }
+			      else //getting created
+			          {					
+			          iAddRootNodesList = HBufC8::NewL(aURI.Length()+ 10);					
+			          iAddRootNodesList->Des().Append(aURI);
+			          }			      
+			      iAddRootNodesList->Des().Append(',');				
+			      }			  			  
+			  }
+			adapterCalled = ETrue;
+		
+			CleanupStack::PopAndDestroy(); //luid
+			}
+		} //end if(iDbSession.CheckAclL())
+	else
+		{
+		//no acl rights
+		status = KNSmlDmStatusPermissionDenied;
+		}
+
+	if(!adapterCalled)
+		{
+		iDmModule.DoSetStatusL(aStatusRef,status);
+		}
+	_DBG_FILE("CNSmlDmDDF::AddObjectL() : begin");
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::UpdateObjectL(const TDesC& aURI, const TDesC8& aObject,
+//	const TDesC& aType)
+// Calls the adapters UpdateObjectL function if the adapter is recognised by
+// using URI 
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::UpdateObjectL(const TDesC8& aURI,
+	const TDesC8& aObject,
+	const TDesC8& aType,
+	const TInt aStatusRef,
+	TBool aLargeItem,
+	// FOTA
+	TInt aTotSizeOfLarge
+	// FOTA end
+	)
+	{
+	_DBG_FILE("CNSmlDmDDF::UpdateObjectL() : begin");
+
+	TBool adapterCalled = EFalse;
+	TInt status = KNSmlDmStatusNotFound;
+	
+	
+	if(iAdapterId==0||iSessionId==0)
+		{
+		//update not allowed in object group level
+		//(levels before adapter level) 
+		iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusCommandNotAllowed);
+		return;
+		}
+		
+	if(iDbSession.CheckDynamicAclL(aURI,EAclReplace,iMgmtTree)) //tarm
+		{
+		//acl rigths ok
+		TNSmlDmDDFFormat format = IsLeafL(aURI);
+		
+		if(format==ENSmlDmDDFLeaf)
+			{
+			HBufC8* luid = iDbSession.GetLuidAllocL(iAdapterId,aURI);
+			CleanupStack::PushL(luid);
+
+			// FOTA
+			iSessionArray[iSessionId-1].UpdateLeafL(iAdapterId,*luid,
+				aStatusRef,aURI,aObject,aType,aLargeItem,aTotSizeOfLarge);
+			// FOTA end
+			adapterCalled = ETrue;
+		
+			CleanupStack::PopAndDestroy(); //luid
+			}
+		else
+			{
+			status=KNSmlDmStatusCommandNotAllowed;
+			}
+			
+			
+		} //end if(iDbSession.CheckAclL())
+	else
+		{
+		//no acl rights
+		status = KNSmlDmStatusPermissionDenied;
+		}
+
+	if(!adapterCalled)
+		{
+		iDmModule.DoSetStatusL(aStatusRef,status);
+		}
+
+	_DBG_FILE("CNSmlDmDDF::UpdateObjectL() : end");
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::FetchObjectL(const TDesC& aURI, const TDesC& aType,
+//	CBufBase& aObject )
+// Calls the adapters FetchObjectL function via IPC if the adapter and 
+// correct host server are recognised by using URI.
+// Adapters ChildURIListL is called, if not leaf object
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::FetchObjectL(const TDesC8& aURI,
+	const TDesC8& aType,
+	const TInt aResultsRef,
+	const TInt aStatusRef,
+	TBool aAclPass )
+	{
+	_DBG_FILE("CNSmlDmDDF::FetchObjectL() : begin");
+	TBool adapterCalled = EFalse;
+	TInt status = KNSmlDmStatusNotFound;
+
+	if(aAclPass||iDbSession.CheckDynamicAclL(aURI,EAclGet,iMgmtTree)) //tarm
+		{
+		//acl rights ok or internal query when aclchecking is passed
+		HBufC8* luid = NULL;
+
+		if(iAdapterId==0||iSessionId==0)
+			{
+			//this will response to gets before adapter level
+			TInt status = KNSmlDmStatusOK;
+			CBufBase* object = CBufFlat::NewL(128);
+			CleanupStack::PushL(object);
+			CNSmlDmNodeList* final = NULL;
+			if(aURI.Length()==0||aURI.Compare(KNSmlDmRootUri)==0)
+				{
+				//fetch for the root level
+				CNSmlDmNodeList* nodeListPtr = iMgmtTree->iNodeListPtr;
+				//loop through the fisrt level after root
+				while(nodeListPtr!=0)
+					{
+					object->InsertL(object->Size(),
+						nodeListPtr->iNode->iNodeName.iContent,
+						nodeListPtr->iNode->iNodeName.iLength);
+						
+					if(nodeListPtr->iNext!=0)
+						{
+						object->InsertL(object->Size(),KNSmlDmLitSeparator8);
+						}
+					nodeListPtr = nodeListPtr->iNext;
+					}
+				}
+			else
+				{
+				iMgmtTree->FindNameFromNodeListL(aURI,final);
+
+				if(!final)
+					{
+					//the node was not found from ddf
+					status = KNSmlDmStatusNotFound;
+					}
+				else
+					{
+					if(final->iNode)
+						{
+						CNSmlDmNodeList* nodeListPtr =
+							final->iNode->iNodeListPtr;
+					
+						//loop the childs of "final" node
+						while(nodeListPtr)
+							{
+							object->InsertL(object->Size(),
+								nodeListPtr->iNode->iNodeName.iContent,
+								nodeListPtr->iNode->iNodeName.iLength);
+								
+							if(nodeListPtr->iNext)
+								{
+								object->InsertL(object->Size(),
+									KNSmlDmLitSeparator8);
+								}
+							nodeListPtr = nodeListPtr->iNext;
+							}
+						}
+					else
+						{
+						object->InsertL(0,KNullDesC8);
+						}
+					}
+				}
+			iDmModule.DoSetStatusL(aStatusRef,status);
+			if(status == KNSmlDmStatusOK)
+				{
+				CNSmlCallbackElement *newElement =
+					new (ELeave)CNSmlCallbackElement();
+					
+				CleanupStack::PushL(newElement);
+				newElement->iRef = aResultsRef;
+				newElement->iUri = aURI.AllocL();
+				newElement->iNode = ETrue;
+				iResultRefs.AppendL(newElement);
+				CleanupStack::Pop(); //newElement
+				SetResultsL(aResultsRef,*object,aType,object->Size());
+				}
+			CleanupStack::PopAndDestroy(); //object
+			return;
+			} //end if(iAdapterId==0||iSessionId==0)
+
+		luid = iDbSession.GetLuidAllocL(iAdapterId,aURI);
+		CleanupStack::PushL(luid);
+
+		CNSmlCallbackElement *newElement = new (ELeave)CNSmlCallbackElement();
+		CleanupStack::PushL(newElement);
+		newElement->iRef = aResultsRef;
+		newElement->iUri = 0;
+
+		//mapping info found for the uri
+		TNSmlDmDDFFormat format = IsLeafL(aURI);
+		if(format==ENSmlDmDDFLeaf)
+			{
+			newElement->iUri = aURI.AllocL();
+			newElement->iNode = EFalse;
+			iResultRefs.AppendL(newElement);
+			CleanupStack::Pop(); //newElement
+			
+			iSessionArray[iSessionId-1].FetchLeafObjectL(iAdapterId,
+				aURI,*luid,aType,aResultsRef,aStatusRef);
+
+			adapterCalled = ETrue;
+			}
+		else if(format==ENSmlDmDDFNode)
+			{
+			//interior node, ask the childurilist from the adapter
+			CArrayFixFlat<TSmlDmMappingInfo> *previousList
+				=new (ELeave) CArrayFixFlat <TSmlDmMappingInfo> (KGranularity);
+				
+			CleanupStack::PushL(previousList);
+			iDbSession.GetUriSegListL(iAdapterId,aURI,*previousList);
+			newElement->iUri = aURI.AllocL();
+			newElement->iNode = ETrue;
+			iResultRefs.AppendL(newElement);
+			CleanupStack::Pop(2); //previousList,newElement
+			CleanupStack::PushL(previousList);
+			iSessionArray[iSessionId-1].ChildURIListL(iAdapterId,aURI,*luid,
+				*previousList,aResultsRef,aStatusRef);
+				
+			adapterCalled = ETrue;
+			CleanupStack::PopAndDestroy(); //previousList
+			} //end else IsLeaf
+		CleanupStack::PopAndDestroy(); //luid
+		} //end if(iDbSession.CheckAclL())
+	else
+		{
+		status = KNSmlDmStatusPermissionDenied;
+		}
+
+	if(!adapterCalled)
+		{
+		iDmModule.DoSetStatusL(aStatusRef,status);
+		}
+
+	_DBG_FILE("CNSmlDmDDF::FetchObjectL() : end");
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::FetchObjectSizeL(const TDesC8& aURI,
+//	const TDesC8& aType,
+//	const TInt aResultsRef,
+//	const TInt aStatusRef)
+// Calls the adapters FetchObjectSizeL function via IPC if the adapter and 
+// correct host server are recognised by using URI.
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::FetchObjectSizeL(const TDesC8& aURI,
+	const TDesC8& aType,
+	const TInt aResultsRef,
+	const TInt aStatusRef)
+	{
+	_DBG_FILE("CNSmlDmDDF::FetchObjectSizeL() : begin");
+
+	if(iAdapterId&&iSessionId)
+		{
+		HBufC8* luid = iDbSession.GetLuidAllocL(iAdapterId,aURI);
+		CleanupStack::PushL(luid);
+
+		CNSmlCallbackElement *newElement = new (ELeave)CNSmlCallbackElement();
+		CleanupStack::PushL(newElement);
+		newElement->iRef = aResultsRef;
+		newElement->iUri = aURI.AllocL();
+		newElement->iNode = EFalse;
+		iResultRefs.AppendL(newElement);
+		CleanupStack::Pop(); //newElement
+		iSessionArray[iSessionId-1].FetchLeafObjectSizeL(iAdapterId,aURI,*luid,aType,aResultsRef,aStatusRef);
+		CleanupStack::PopAndDestroy(); //luid
+		}
+	else
+		{
+		iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusNotFound);
+		}
+
+
+	_DBG_FILE("CNSmlDmDDF::FetchObjectSizeL() : end");
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::ExecuteObjectL(const TDesC& aURI, const TDesC8& aObject,
+// const TDesC& aType)
+// Calls the adapters ExecuteObjectL function if the adapter is recognised
+// by using URI 
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::ExecuteObjectL(const TDesC8& aURI,
+	const TDesC8& aObject,
+	const TDesC8& aType,
+	const TInt aStatusRef,
+	// FOTA
+	const TDesC8& aCorrelator,
+	// FOTA end	
+	TBool aLargeItem)
+	{
+	_DBG_FILE("CNSmlDmDDF::ExecuteObjectL() : begin");
+
+	TBool adapterCalled = EFalse;
+	TInt status = KNSmlDmStatusNotFound;
+	
+	if(iAdapterId==0||iSessionId==0)
+		{
+		//update not allowed in object group level
+		//(levels before adapter level) 
+		iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusCommandNotAllowed);
+		return;
+		}
+		
+	if(iDbSession.CheckDynamicAclL(aURI,EAclExecute,iMgmtTree)) //tarm
+		{
+		//acl rigths ok
+		HBufC8* luid = iDbSession.GetLuidAllocL(iAdapterId,aURI);
+		CleanupStack::PushL(luid);
+		// FOTA 
+		// For the FOTA adapter put the correlator to aObject instead of
+		// data.
+		if ( iAdapterId == KNSmlDMFotaAdapterImplUid || iAdapterId == KNSmlDMAMAdapterImplUid)
+			{
+			iSessionArray[iSessionId-1].ExecuteCommandL(iAdapterId,*luid,
+				aStatusRef,aURI,aCorrelator,aType,aLargeItem);
+			}
+		else
+			{
+			iSessionArray[iSessionId-1].ExecuteCommandL(iAdapterId,*luid,
+				aStatusRef,aURI,aObject,aType,aLargeItem);		
+			}
+		// FOTA end			
+		adapterCalled = ETrue;
+		
+		CleanupStack::PopAndDestroy(); //luid
+		} //end if(iDbSession.CheckAclL())
+	else
+		{
+		//no acl rights
+		status = KNSmlDmStatusPermissionDenied;
+		}
+
+	if(!adapterCalled)
+		{
+		iDmModule.DoSetStatusL(aStatusRef,status);
+		}
+
+	_DBG_FILE("CNSmlDmDDF::ExecuteObjectL() : end");
+
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::CopyObjectL(const TDesC& aURI, const TDesC8& aObject,
+//	const TDesC& aType)
+// Calls the adapters CopyObjectL function if the adapter is recognised
+// by using URI 
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::CopyObjectL(const TDesC8& aTargetURI,
+	const TDesC8& aSourceURI,
+	const TDesC8& aType,
+	const TInt aStatusRef)
+	{
+	_DBG_FILE("CNSmlDmDDF::CopyObjectL() : begin");
+
+	TBool adapterCalled = EFalse;
+	TInt status = KNSmlDmStatusNotFound;
+	
+	
+//	if(format==ENode)
+	if(iAdapterId==0||iSessionId==0)
+		{
+		//update not allowed in object group level
+		//(levels before adapter level) 
+		iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusCommandNotAllowed);
+		return;
+		}
+		
+	if(iDbSession.CheckDynamicAclL(aSourceURI,EAclGet,iMgmtTree)&& //tarm
+		iDbSession.CheckDynamicAclL(aTargetURI,EAclAdd,iMgmtTree))
+		{
+		//acl rigths ok
+		HBufC8* targetLuid = iDbSession.GetLuidAllocL(iAdapterId,aTargetURI);
+		CleanupStack::PushL(targetLuid);
+		HBufC8* sourceLuid = iDbSession.GetLuidAllocL(iAdapterId,aSourceURI);
+		CleanupStack::PushL(sourceLuid);
+
+		iSessionArray[iSessionId-1].CopyCommandL(iAdapterId,
+			*targetLuid,aTargetURI,*sourceLuid,aSourceURI,aStatusRef,aType);
+
+		adapterCalled = ETrue;
+		
+		CleanupStack::PopAndDestroy(2); //targetLuid,sourceLuid
+		} //end if(iDbSession.CheckAclL())
+	else
+		{
+		//no acl rights
+		status = KNSmlDmStatusPermissionDenied;
+		}
+
+	if(!adapterCalled)
+		{
+		iDmModule.DoSetStatusL(aStatusRef,status);
+		}
+
+	_DBG_FILE("CNSmlDmDDF::CopyObjectL() : end");
+	}
+
+
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::DeleteObjectL(const TDesC& aURI)
+// Calls the adapters DeleteObjectL function if the adapter is
+// recognised by using URI.
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::DeleteObjectL(const TDesC8& aURI,const TInt aStatusRef)
+	{
+	_DBG_FILE("CNSmlDmDDF::DeleteObjectL(): begin");
+	TInt status = KNSmlDmStatusNotFound;
+	TBool adapterCalled = EFalse;
+
+	if(iAdapterId==0||iSessionId==0)
+		{
+		//delete not allowed in object group level
+		//(levels before adapter level) 
+		iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusCommandNotAllowed);
+		return;
+		}
+
+	if(iDbSession.CheckDynamicAclL(aURI,EAclDelete,iMgmtTree)) //tarm
+		{
+		//acl rights ok
+		HBufC8* luid = iDbSession.GetLuidAllocL(iAdapterId,aURI);
+		CleanupStack::PushL(luid);
+
+		if(luid->Length())
+			{
+			CNSmlCallbackElement *newElement 
+				= new (ELeave)CNSmlCallbackElement();
+			CleanupStack::PushL(newElement);
+			newElement->iRef = aStatusRef;
+			newElement->iUri = aURI.AllocL();
+			iDeleteStatusRefs.AppendL(newElement);
+			CleanupStack::Pop(); //newElement
+			
+			iSessionArray[iSessionId-1].DeleteObjectL(iAdapterId,*luid,
+				aStatusRef,aURI);
+				
+			adapterCalled = ETrue;
+			}
+		else
+			{
+			iSessionArray[iSessionId-1].DeleteObjectL(iAdapterId,*luid,
+				aStatusRef,aURI);
+				
+			adapterCalled = ETrue;
+			}	
+		CleanupStack::PopAndDestroy(); //luid
+		} //end if(iDbSession.CheckAclL())
+	else
+		{
+		status = KNSmlDmStatusPermissionDenied;
+		}
+
+	if(!adapterCalled)
+		{
+		iDmModule.DoSetStatusL(aStatusRef,status);
+		}
+
+	_DBG_FILE("CNSmlDmDDF::DeleteObjectL() : end");
+	}
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::CheckURIL(const TDesC& aURI)
+// Compares URI to ddf and check that URI is valid
+// ----------------------------------------------------------------------------
+CNSmlDmDDF::TAccess CNSmlDmDDF::CheckURIL(const TDesC8& aURI,
+	TNSmlDmCmdType aCmd)
+	{
+	_DBG_FILE("CNSmlDmDDF::CheckURIL() : begin");
+	TAccess ret(ENotExist);
+	TUint8 access(0);
+	TUriCheck found = CheckAdapterL(aURI,access);
+	if(found!=EUriNotFound)
+		{
+		//uri OK, now check the access which is set in ddf
+		ret = ENotAccess;
+		switch(aCmd)
+			{
+			case EAclAdd:
+			if(access&TSmlDmAccessTypes::EAccessType_Add)
+				{
+				ret = EOk;
+				}
+			break;
+		
+			case EAclReplace:
+			if(access&TSmlDmAccessTypes::EAccessType_Replace)
+				{
+				ret = EOk;
+				}
+			break;
+		
+			case EAclGet:
+			if(access&TSmlDmAccessTypes::EAccessType_Get)
+				{
+				ret = EOk;
+				}
+			break;
+	
+			case EAclDelete:
+			if(access&TSmlDmAccessTypes::EAccessType_Delete)
+				{
+				ret = EOk;
+				}
+			break;
+
+			case EAclExecute:
+			if(access&TSmlDmAccessTypes::EAccessType_Exec)
+				{
+				ret = EOk;
+				}
+			break;
+
+			case EAclCopy:
+			if(access&TSmlDmAccessTypes::EAccessType_Copy)
+				{
+				ret = EOk;
+				}
+			break;
+			default:
+			User::Panic ( KNSmlTxtPanicDmModule, KErrArgument );
+			break;
+			}
+		}
+
+	_DBG_FILE("CNSmlDmDDF::CheckURIL() : end");
+	return ret;
+	}
+
+
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::ConstructL()
+// Second phase constructor
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::ConstructL()
+	{
+	_DBG_FILE("CNSmlDmDDF::ConstructL() : begin");
+	iMgmtTree = CNSmlDmMgmtTree::NewL();
+	iResultSessionId=KErrNotFound;
+	for(TInt i=0;i<4;i++)
+		{
+		RNSmlDMDataSession session;
+		iSessionArray.AppendL(session);
+		}
+    FeatureManager::InitializeLibL(); 		
+    RProperty::Define(KPSUidNSmlDMSyncAgent,
+    		KNSmlDMCmdAddNodeSuccess, RProperty::EInt,
+			KReadPolicy, KWritePolicy );
+	_DBG_FILE("CNSmlDmDDF::ConstructL() : end");
+	}
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::CheckAclL( const TDesC& aURI,
+// CNSmlDmDbHandler::TCmdType aCmdType)
+// Does the ACL checking
+// ----------------------------------------------------------------------------
+TBool CNSmlDmDDF::CheckAclL( const TDesC8& aURI, TNSmlDmCmdType aCmdType)
+	{
+	TUint8 access(0);
+	if(aURI.Length()==0||aURI.Compare(KNSmlDmRootUri)==0
+		||CheckAdapterL(aURI,access)!=EUriNotFound)
+		{
+		return iDbSession.CheckDynamicAclL(aURI,aCmdType,iMgmtTree); //tarm
+		}
+	return EFalse;
+	}
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::UpdateAclL( const TDesC& aURI,const TDesC8 &aACL)
+// Updates ACL to tree db
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::UpdateAclL( const TDesC8& aURI,
+	const TDesC8 &aACL, const TInt aStatusRef)
+	{
+	if(aURI.Length()==0||aURI.Compare(KNSmlDmRootUri)==0)
+	    {
+		iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusForbidden);
+	    }
+	else
+	    {
+    	TNSmlDmDDFFormat format = IsLeafL(aURI);
+    	TBool access(0);
+    	TPtrC8 parentUri = NSmlDmURI::ParentURI(aURI);
+    	if(format==ENSmlDmDDFLeaf)
+    		{
+    		access = CheckAclL(parentUri,EAclReplace);
+    		}
+    	else
+    		{
+    		access = CheckAclL(parentUri,EAclReplace)
+    			||CheckAclL(aURI,EAclReplace);
+    		}
+
+    	if(access)
+    		{
+    		TInt ret = iDbSession.UpdateAclL(aURI,aACL);
+    		if( ret == KErrNone)
+    			{
+    			iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusOK);
+    			}
+    		else if( ret == KErrAccessDenied)
+    			{
+    			iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusForbidden);
+    			}
+    		else
+    			{
+    			iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusCommandFailed);
+    			}
+    		}
+    	else
+    		{
+    		iDmModule.DoSetStatusL(aStatusRef,KNSmlDmStatusPermissionDenied);
+    		}
+	    }
+	}
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::GetAclL( const TDesC& aURI, CBufBase &aACL)
+// ----------------------------------------------------------------------------
+TInt CNSmlDmDDF::GetAclL( const TDesC8& aURI, CBufBase &aACL)
+	{
+	TInt ret = KNSmlDmStatusPermissionDenied;
+	if(CheckAclL(aURI,EAclGet))
+		{
+		iDbSession.GetAclL(aURI,aACL,EFalse);
+		ret = KNSmlDmStatusOK;
+		}
+	return ret;
+	}
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::GetLuidAllocL(const TDesC& aURI)
+// gets and allocates the mapped luid from tree db
+// ----------------------------------------------------------------------------
+HBufC8* CNSmlDmDDF::GetLuidAllocL(const TDesC8& aURI)
+	{
+	HBufC8* luid=0;
+	if(CheckURIL(aURI,EAclGet)!=CNSmlDmDDF::ENotExist)
+		{
+		if(iAdapterId)
+			{
+			luid = iDbSession.GetLuidAllocL(iAdapterId,aURI);
+			}
+		}
+	if(!luid)
+		{
+		luid = KNullDesC8().AllocL();
+		}
+	return luid;
+	}
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::StartAtomicL()
+// Start atomic indication
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::StartAtomicL()
+	{
+	for(TInt i=0;i<4;i++)
+		{
+		if(iOkSessions&(0x01<<i))
+			{
+			iSessionArray[i].StartAtomicL();
+			}
+		}
+	iDbSession.StartAtomic();
+	}
+	
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::CommitAtomicL()
+// Commit atomic indication
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::CommitAtomicL()
+	{
+	for(TInt i=0;i<4;i++)
+		{
+		if(iOkSessions&(0x01<<i))
+			{
+			iSessionArray[i].CommitAtomicL();
+			}
+		}
+	iDbSession.CommitAtomic();
+	}
+	
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::RollbackAtomicL()
+// Rollback atomic indication
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::RollbackAtomicL()
+	{
+	for(TInt i=0;i<4;i++)
+		{
+		if(iOkSessions&(0x01<<i))
+			{
+			iSessionArray[i].RollbackAtomicL();
+			}
+		}
+	iDbSession.RollbackAtomic();
+	}
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::DisconnectFromOtherServers()
+//	Closes the connections to callback server and host servers.
+//	Separate function is needed, since the disconnecting cannot 
+//	be made after the active scheduler of the thread is stopped.
+// ----------------------------------------------------------------------------
+//
+void CNSmlDmDDF::DisconnectFromOtherServers()
+	{
+	iDbSession.Close();
+	for ( TInt i(0); i<iSessionArray.Count(); i++ )
+		{
+		if(iOkSessions&(0x01<<i))
+			{
+			iSessionArray[i].Close();
+			}
+		}
+	}
+// FOTA
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::MarkGenAlertsSentL()
+//	When the generic alerts are successfully sent to the remote 
+//	server, the FOTA adapter needs to be informed about this.
+//	This command is chained through the DM engine.
+// ----------------------------------------------------------------------------
+//
+void CNSmlDmDDF::MarkGenAlertsSentL()
+	{
+	CNSmlDmNodeList* final = NULL;
+	iMgmtTree->FindNameFromNodeListL ( KNSmlDMFotaNode, final );
+	if ( final )
+		{
+		TUint32 adapterId(0);
+		TUint8 sessionId(0);
+		final->GetImplUid ( adapterId, sessionId );
+		iSessionArray[sessionId-1].MarkGenAlertsSent();
+		}
+	}
+// FOTA end
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::MarkGenAlertsSentL(const TDesC8& aURI)
+//	When the generic alerts are successfully sent to the remote 
+//	server, the FOTA adapter needs to be informed about this.
+//	This command is chained through the DM engine.
+//  For 1.2 Any adapter can send the Generic adapter,
+//  Hence URI of adapter is passed 
+// ----------------------------------------------------------------------------
+//   
+ 
+void CNSmlDmDDF::MarkGenAlertsSentL(const TDesC8& aURI)
+
+    {
+    _DBG_FILE("CNSmlDmDDF::MarkGenAlertsSentL (TDesC8& aURI) : begin");
+    CNSmlDmNodeList* final = NULL;
+    //Get the first root node from the aURI
+     HBufC8* nodeURI = HBufC8::NewLC(aURI.Length());
+    TInt i= 0;
+    TBool dotPresentInURI = EFalse;
+    for( i=0; i < aURI.Length(); i++ )
+        {
+        if((aURI[i] == '.') && (i==0))
+        {
+        	dotPresentInURI = ETrue;
+        	continue;
+        }
+        
+        if((aURI[i] == '/') && (i==1))
+        continue;
+        if(aURI[i]=='/')
+            {
+            break;
+            }
+        }
+
+    if(i>0)
+        {
+        if(dotPresentInURI)
+        {
+        	 nodeURI->Des().Format(aURI.Mid(2,i-2)); // removing ./
+        }
+        else
+        {
+        	 nodeURI->Des().Format(aURI.Left(i));
+        }
+        }
+       iMgmtTree->FindNameFromNodeListL (nodeURI->Des(),final);
+       
+       if(final)
+        {
+        _DBG_FILE("CNSmlDmDDF::MarkGenAlertsSentL (TDesC8& aURI) Adapter found  ");  
+         
+        TUint32 adapterId(0);
+		TUint8 sessionId(0);
+		final->GetImplUid ( adapterId, sessionId );
+		if(sessionId == 0)
+		{
+		  sessionId = 1;
+		}
+		 
+	    iSessionArray[sessionId-1].MarkGenAlertsSent(nodeURI->Des());
+        }
+       else
+        {
+         _DBG_FILE("CNSmlDmDDF::MarkGenAlertsSentL (TDesC8& aURI) Adapter NOT found  ");  
+        }
+        CleanupStack::PopAndDestroy(); //nodeURI
+        _DBG_FILE("CNSmlDmDDF::MarkGenAlertsSentL (TDesC8& aURI) : END");
+    }
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::CheckAdapterL(const TDesC& aURI)
+// Finds the correct adapter from correct host server by using DDF.
+// EUriNotFound returned if uri not according to DDF
+// EBeforeAdapter returned if URI ok, but points to node bfore
+// adapterlevel
+// EPassAdapter returned if command should pass to adapeter
+// In pass adapter case, iAdapterId is set to correct adapters uid and
+// iSessionId is set to point to session to correct host server.
+// ----------------------------------------------------------------------------
+CNSmlDmDDF::TUriCheck CNSmlDmDDF::CheckAdapterL(const TDesC8& aURI,
+	TUint8& aAccess)
+	{
+	_DBG_FILE("CNSmlDmDDF::CheckAdapterL() : begin");
+
+	aAccess = 0;
+
+	//check if root level
+	if(aURI.Length()==0||aURI.Compare(KNSmlDmRootUri)==0)
+		{
+		iAdapterId = 0;
+		iSessionId = 0;
+		aAccess |= TSmlDmAccessTypes::EAccessType_Get;
+		aAccess |= TSmlDmAccessTypes::EAccessType_Replace;
+		return EBeforeAdapter;
+		}
+
+	TUriCheck found = EUriNotFound;
+
+
+	CNSmlDmNodeList* final=0;
+	iMgmtTree->FindNameFromNodeListL(aURI,final);
+
+	if(!final)
+		{
+		iAdapterId = 0;
+		iSessionId = 0;
+		return EUriNotFound;
+		}
+	else
+		{
+		final->GetImplUid(iAdapterId,iSessionId);
+		aAccess |= final->iNode->iDFProperties.iAccessTypes;
+		if(iAdapterId==0||iSessionId==0)
+			{
+			//before adapter level, do not pass adapter
+			found = EBeforeAdapter;
+			iAdapterId=0;
+			iSessionId=0;
+			}
+		else
+			{
+			//adapter level, adapter is loaded and EPassAdapter returned
+			found = EPassAdapter;
+			}
+		}
+
+	_DBG_FILE("CNSmlDmDDF::CheckAdapterL() : end");
+	return found;
+	}
+
+
+// ----------------------------------------------------------------------------
+// TFormat CNSmlDmDDF::IsLeafL(const TDesC& aURI)
+// Function checks if the object pointed by aURI is leaf object of
+// the adapter returns ELeaf, ENode or ENotFound
+// ----------------------------------------------------------------------------
+TNSmlDmDDFFormat CNSmlDmDDF::IsLeafL(const TDesC8& aURI)
+	{
+	_DBG_FILE("CNSmlDmDDF::IsLeafL() : begin");
+
+	_DBG_FILE("CNSmlDmDDF::IsLeafL : before FindNameFromNodelist()");
+	CNSmlDmNodeList* final;
+	return iMgmtTree->FindNameFromNodeListL(aURI,final);
+	}
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::GetFormatAllocL()
+// Get format from ddf
+// ----------------------------------------------------------------------------
+HBufC8* CNSmlDmDDF::GetFormatAllocL(const TDesC8& aURI)
+	{
+	_DBG_FILE("CNSmlDmDDF::GetFormatAllocL() : begin");
+
+	CNSmlDmNodeList* final=0;
+	iMgmtTree->FindNameFromNodeListL(aURI,final);
+
+	HBufC8* format = 0;
+	if(!final)
+		{
+		format = HBufC8::NewL(KNSmlDmFormatNode().Length());
+		format->Des().Format(KNSmlDmFormatNode);
+		return format;
+		}
+	else
+		{
+		switch(final->iNode->iDFProperties.iDFFormat)
+			{
+			case MSmlDmDDFObject::EChr:
+				format = KNSmlDmFormatChr().AllocL();
+				break;
+
+			case MSmlDmDDFObject::EB64:
+				format = KNSmlDmFormatB64().AllocL();
+				break;
+
+			case MSmlDmDDFObject::EBool:
+				format = KNSmlDmFormatBool().AllocL();
+				break;
+
+			case MSmlDmDDFObject::EInt:
+				format = KNSmlDmFormatInt().AllocL();
+				break;
+
+			case MSmlDmDDFObject::ENode:
+				format = KNSmlDmFormatNode().AllocL();
+				break;
+
+			case MSmlDmDDFObject::ENull:
+				format = KNSmlDmFormatNull().AllocL();
+				break;
+
+			case MSmlDmDDFObject::EXml:
+				format = KNSmlDmFormatXml().AllocL();
+				break;
+
+			case MSmlDmDDFObject::EBin:
+				format = KNSmlDmFormatBin().AllocL();
+				break;
+            
+    		case MSmlDmDDFObject::EDate:
+    			{
+    			if(!FeatureManager::FeatureSupported( KFeatureIdSyncMlDm112  ))
+    			format = KNSmlDDFFormatDate().AllocL();
+    			else
+				format = KNSmlDmFormatChr().AllocL();
+    		    break;
+    			}
+    		case MSmlDmDDFObject::ETime:
+    			{
+    			if(!FeatureManager::FeatureSupported( KFeatureIdSyncMlDm112  ))
+    		    format = KNSmlDDFFormatTime().AllocL();
+    			else
+    			format = KNSmlDmFormatChr().AllocL();
+    		    break;
+    			}
+    		case MSmlDmDDFObject::EFloat:
+    			{
+    			if(!FeatureManager::FeatureSupported( KFeatureIdSyncMlDm112  ))
+    		    format = KNSmlDDFFormatFloat().AllocL();
+    			else
+    			format = KNSmlDmFormatChr().AllocL();
+    			break;
+    			}
+	
+			default:
+				format = KNSmlDmFormatChr().AllocL();
+				break;
+			}
+		}
+	return format;
+	}
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::GetMimeTypeL()
+// Get mimetype from ddf
+// ----------------------------------------------------------------------------
+TInt CNSmlDmDDF::GetMimeTypeL(const TDesC8& aURI,CBufBase& aObject)
+	{
+	_DBG_FILE("CNSmlDmDDF::GetMimeTypeL() : begin");
+
+	CNSmlDmNodeList* final=0;
+	iMgmtTree->FindNameFromNodeListL(aURI,final);
+
+	TInt ret(KErrNotFound);
+	if(final)
+		{
+		ret = KErrNone;
+		if(final->iNode->iDFProperties.iDFType)
+			{
+			aObject.InsertL(0,final->iNode->iDFProperties.iDFType->iContent,
+				final->iNode->iDFProperties.iDFType->iLength);
+			}
+		else
+			{
+			aObject.InsertL(0,KNullDesC8);
+			}
+		}
+	return ret;
+	}
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::GetCaseSenseL()
+// Get mimetype from ddf
+// ----------------------------------------------------------------------------
+TInt CNSmlDmDDF::GetCaseSenseL(const TDesC8& aURI,CBufBase& aObject)
+	{
+	_DBG_FILE("CNSmlDmDDF::GetCaseSenseL() : begin");
+
+	CNSmlDmNodeList* final=0;
+	TInt ret(KErrNotFound);
+	   
+    if(aURI.Compare(KNSmlDMRoot)==0)
+    {
+    	ret = KErrNone;
+    	aObject.InsertL(0,KNSmlDDFCaseSense,
+				KNSmlDDFCaseSense.iTypeLength);
+    }
+    else
+    {
+    iMgmtTree->FindNameFromNodeListL(aURI,final);	
+    }
+	if(final)
+		{
+		ret = KErrNone;
+		if(final->iNode->iDFProperties.iCaseSense)
+			{
+			aObject.InsertL(0,KNSmlDDFCaseSense,
+				KNSmlDDFCaseSense.iTypeLength);
+			}
+		else
+			{
+			aObject.InsertL(0,KNSmlDDFCaseSense,
+				KNSmlDDFCaseInSense.iTypeLength);
+				
+		//	aObject.InsertL(0,KNullDesC8);
+			}
+		}
+	return ret;
+	}
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmDDF::GetNameL()
+// Function which gets the name from ddf by using URI
+// ----------------------------------------------------------------------------
+TInt CNSmlDmDDF::GetNameL(const TDesC8& aURI,CBufBase& aObject)
+	{
+	_DBG_FILE("CNSmlDmDDF::GetMimeTypeL() : begin");
+
+	CNSmlDmNodeList* final=NULL;
+	iMgmtTree->FindNameFromNodeListL(aURI,final);
+
+
+	if(!final)
+		{
+		return KErrNotFound;
+		}
+	else
+		{
+		aObject.InsertL(0,final->iNode->iNodeName.iContent,
+			final->iNode->iNodeName.iLength);
+		}
+	return KErrNone;
+	}
+
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::RemoveEndAndBeginSlashes(CBufBase &aObject)
+// Removes "/" marks from the end and begin of the aObject 
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::RemoveEndAndBeginSlashes(CBufBase &aObject) const
+	{
+	if(aObject.Size()!=0)
+		{
+		if(aObject.Ptr(0)[0]==KNSmlDMUriSeparator)
+			{
+			aObject.Delete(0,1);
+			}
+		if(aObject.Ptr(aObject.Size()-1)[0]==KNSmlDMUriSeparator)
+			{
+			aObject.Delete(aObject.Size()-1,1);
+			aObject.Compress();
+			}
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::MoreDataL(CBufBase*& adata)
+// Gets more data in case of largeobject
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::MoreDataL(CBufBase*& aData)
+	{
+	if(iResultSessionId>=0)
+		{
+		iSessionArray[iResultSessionId].MoreDataL(aData);
+		}
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::EndMessageL( )
+// Message ends
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::EndMessageL( )
+	{
+	_DBG_FILE("CNSmlDmDDF::EndMessageL() : begin");
+	TInt i;
+	if(iResultSessionId==KErrNotFound)
+		{
+    	_DBG_FILE("CNSmlDmDDF::EndMessageL() :iResultSessionId==KErrNotFound ");
+		for(i=0;i<iSessionArray.Count();i++)
+			{
+			if(iOkSessions&(0x01<<i))
+				{
+            	_DBG_FILE("CNSmlDmDDF::EndMessageL():before CompleteOuts...");
+				iSessionArray[i].CompleteOutstandingCmdsL();
+				}
+			}
+		}
+
+	iResultRefs.ResetAndDestroy();
+	iDeleteStatusRefs.ResetAndDestroy();
+	iAddNodeStatusRefs.ResetAndDestroy();
+	_DBG_FILE("CNSmlDmDDF::EndMessageL() : end");
+	}
+
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::SetMappingL(const TDesC& aURI, const TDesC& aLUID )
+// Callback function which is called by adapter for setting the mapping info
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::SetMappingL(const TDesC8& aURI, const TDesC8& aLUID )
+	{
+	iDbSession.AddMappingInfoL(iAdapterId,aURI,aLUID);
+	}
+
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::SetStatusL( TInt aStatusRef, 
+//	CNSmlDmAdapter::TError aErrorCode )
+// Callback function which is called by adapter for returning correct
+//	statuscode
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::SetStatusL( TInt aStatusRef,
+	MSmlDmAdapter::TError aErrorCode )
+	{
+
+	TInt status = KNSmlDmStatusCommandFailed;
+	//map the adapter return code to statuscode
+	switch(aErrorCode)
+		{
+		case MSmlDmAdapter::EOk:
+		status=KNSmlDmStatusOK;
+		break;
+
+		case MSmlDmAdapter::ENotFound:
+		status=KNSmlDmStatusNotFound;
+		break;
+							
+		case MSmlDmAdapter::EInvalidObject:
+		break;
+							
+		case MSmlDmAdapter::EAlreadyExists:
+		status=KNSmlDmStatusAlreadyExists;
+		break;
+							
+		case MSmlDmAdapter::ETooLargeObject:
+		status=KNSmlDmStatusRequestEntityTooLarge;
+		break;
+		
+		case MSmlDmAdapter::EDiskFull:
+		status = KNSmlDmStatusDeviceFull;
+		break;
+
+		case MSmlDmAdapter::EError:
+		status = KNSmlDmStatusCommandFailed;
+		break;
+
+		case MSmlDmAdapter::ERollbackFailed:
+		status = KNSmlDmStatusAtomicRollBackFailed;
+		break;
+
+		case MSmlDmAdapter::EObjectInUse:
+		break;
+
+		case MSmlDmAdapter::ENoMemory:
+		status = KNSmlDmStatusDeviceFull;
+		break;
+
+		case MSmlDmAdapter::ECommitOK:
+		status = KNSmlDmStatusOK;
+		break;
+
+		case MSmlDmAdapter::ERollbackOK:
+		status = KNSmlDmStatusAtomicRollBackOK;
+		break;
+
+		case MSmlDmAdapter::ECommitFailed:
+		status=KNSmlDmStatusOK;
+		break;
+        
+		case MSmlDmAdapter::ENotAllowed:
+		status = KNSmlDmStatusCommandNotAllowed;
+		break;
+
+		case MSmlDmAdapter::EAcceptedForProcessing:
+		status =	KNSmlDmStatusAcceptedForProcessing;
+		break;
+		
+		case MSmlDmAdapter::EExecSuccess:
+		status =	KNSmlDmStatusSuccess;
+		break;
+		
+case MSmlDmAdapter::EExecClientError:
+status =	KNSmlDmStatusClientError;
+		break;
+case MSmlDmAdapter::		EExecUserCancelled:
+status =	KNSmlDmStatusUserCancelled;
+		break;
+case MSmlDmAdapter::		EExecDownloadFailed:
+status =	KNSmlDmStatusDownloadFailed;
+		break;
+case MSmlDmAdapter::		EExecAltDwnldAuthFail:
+status =	KNSmlDmStatusAltDwnldAuthFail;
+		break;
+case MSmlDmAdapter::		EExecDownFailOOM:
+status =	KNSmlDmStatusDownFailOOM;
+		break;
+case MSmlDmAdapter::		EExecInstallFailed:
+status =	KNSmlDmStatusInstallFailed;
+		break;
+case MSmlDmAdapter::		EExecInstallOOM:
+status =	KNSmlDmStatusInstallOOM;
+		break;
+case MSmlDmAdapter::		EExecPkgValidationFail:
+status =	KNSmlDmStatusPkgValidationFail;
+		break;
+case MSmlDmAdapter::		EExecRemoveFailed:
+status =	KNSmlDmStatusRemoveFailed;
+		break;
+case MSmlDmAdapter::		EExecActivateFailed:
+status =	KNSmlDmStatusActivateFailed;
+		break;
+case MSmlDmAdapter::		EExecDeactivateFailed:
+status =	KNSmlDmStatusDeactivateFailed;
+		break;
+case MSmlDmAdapter::		EExecNotImplemented:
+status =	KNSmlDmStatusNotImplemented;
+		break;
+case MSmlDmAdapter::		EExecUndefError:
+status =	KNSmlDmStatusUndefError;
+		break;
+case MSmlDmAdapter::		EExecOperationReject:
+status =	KNSmlDmStatusOperationReject;
+		break;
+case MSmlDmAdapter::		EExecAltDwnldSrvError:
+status =	KNSmlDmStatusAltDwnldSrvError;
+		break;
+case MSmlDmAdapter::		EExecAltDwnldSrvUnavailable:
+status =	KNSmlDmStatusAltDwnldSrvUnavailable;
+		break;
+		
+		default:
+		status = KNSmlDmStatusCommandFailed;
+		break;
+		}
+	DeleteandAddStatusRefsL(aStatusRef, aErrorCode);
+
+	iDmModule.DoSetStatusL(aStatusRef,status);
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmDDF::SetResultsL( TInt aResultsRef, CBufBase& aObject,
+//	const TDesC& aType )
+// Callback function which is called by adapter for returning correct
+// statuscode
+// ----------------------------------------------------------------------------
+void CNSmlDmDDF::SetResultsL( TInt aResultsRef,
+	CBufBase& aObject,
+	const TDesC8& aType,
+	TInt aTotalSize,
+	TInt8 aSessionId )
+	{
+	_DBG_FILE("CNSmlDmDDF::SetResultsL() : begin");
+	if(aObject.Size()<aTotalSize)
+		{
+		DBG_ARGS8(_S8("CNSmlDmDDF::SetResultsL,Size= %d, TotalSize= %d"),
+		    aObject.Size(),aTotalSize  );
+		iResultSessionId=aSessionId;
+		}
+	else
+		{
+		DBG_ARGS8(
+		    _S8("CNSmlDmDDF::SetResultsL not large,Size= %d,TotalSize= %d"),
+		    aObject.Size(),aTotalSize  );
+		iResultSessionId=KErrNotFound;
+		}
+	TInt index = -1;
+	for(TInt i=0;i<iResultRefs.Count();i++)
+		{
+		if(iResultRefs[i]->iRef == aResultsRef)
+			{
+			if(iResultRefs[i]->iNode)
+				{
+				RemoveEndAndBeginSlashes(aObject);
+				
+				iDbSession.UpdateMappingInfoL(iAdapterId,
+					*iResultRefs[i]->iUri,aObject);
+					
+#ifdef NOT_DEFINED //tarm start (removed)
+				CNSmlDmNodeList* final=NULL;
+            	iMgmtTree->FindNameFromNodeListL(*iResultRefs[i]->iUri,final);
+
+            	if(final&&final->iNode)
+            	    {
+            	    final = final->iNode->iNodeListPtr;
+            	    if(final&&final->iNode->iNodeName.iLength==0)
+            	        {
+                		iDbSession.DefaultACLsToChildrenL(*iResultRefs[i]->iUri,aObject);
+            	        }
+            	    }
+#endif //tarm end
+				}
+			index = i;
+			break;
+			}
+		}
+
+	if(index>=0)
+		{
+		HBufC8* format = GetFormatAllocL(*iResultRefs[index]->iUri);
+		CleanupStack::PushL(format);
+		delete iResultRefs[index];
+		iResultRefs.Remove(index);
+		iDmModule.DoSetResultsL(aResultsRef,aObject,aType,
+			format->Des(),aTotalSize);
+		CleanupStack::PopAndDestroy(); //format
+		}
+	}
+
+
+
+// ===========================================================================
+// CNSmlDmLinkCallback
+// ===========================================================================
+
+// ----------------------------------------------------------------------------
+// CNSmlDmLinkCallback::CNSmlDmLinkCallback()
+// ----------------------------------------------------------------------------
+CNSmlDmLinkCallback::CNSmlDmLinkCallback()
+	{
+	}
+
+// ----------------------------------------------------------------------------
+// CNSmlDmLinkCallback::~CNSmlDmLinkCallback()
+// ----------------------------------------------------------------------------
+CNSmlDmLinkCallback::~CNSmlDmLinkCallback()
+	{
+	delete iResults;
+	}
+
+// ----------------------------------------------------------------------------
+// CNSmlDmLinkCallback::NewL()
+// ----------------------------------------------------------------------------
+CNSmlDmLinkCallback* CNSmlDmLinkCallback::NewL()
+	{
+	CNSmlDmLinkCallback* self = new (ELeave) CNSmlDmLinkCallback();
+	return self;
+	}
+
+// ----------------------------------------------------------------------------
+// CNSmlDmLinkCallback::SetResultsL()
+// ----------------------------------------------------------------------------
+void CNSmlDmLinkCallback::SetResultsL( TInt /*aResultsRef*/,
+	const CBufBase& aObject,
+	const TDesC8& /*aType*/,
+	const TDesC8& /*aFormat*/,
+	TInt /*aTotalSize*/)
+	{
+	if(!iResults)
+		{
+		iResults = CBufFlat::NewL(16);
+		}
+	else
+		{
+		iResults->Reset();
+		}
+	iResults->InsertL(0,CONST_CAST(CBufBase&,aObject).Ptr(0),aObject.Size());
+	}
+
+// ----------------------------------------------------------------------------
+// CNSmlDmLinkCallback::SetStatusL()
+// ----------------------------------------------------------------------------
+void CNSmlDmLinkCallback::SetStatusL( TInt /*aStatusRef*/, TInt aStatusCode )
+	{
+	iStatus = aStatusCode;
+	}
+
+// ----------------------------------------------------------------------------
+// CNSmlDmLinkCallback::GetResultsL()
+// ----------------------------------------------------------------------------
+void CNSmlDmLinkCallback::GetResultsL(CBufBase*& aData,
+	CSmlDmAdapter::TError& aStatus )
+	{
+	if(iStatus==KNSmlDmStatusOK)
+		{
+		aStatus = CSmlDmAdapter::EOk;
+		}
+	else if(iStatus==KNSmlDmStatusNotFound)
+		{
+		aStatus = CSmlDmAdapter::ENotFound;
+		}
+	else
+		{
+		aStatus = CSmlDmAdapter::EError;
+		}
+	aData = iResults;
+	}
+
+
+// ----------------------------------------------------------------------------
+// CNSmlDmLinkCallback::GetStatusL()
+// ----------------------------------------------------------------------------
+TInt CNSmlDmLinkCallback::GetStatusL()
+	{
+	return iStatus;
+	}
+
+// ===========================================================================
+// CNSmlCallbackElement
+// ===========================================================================
+CNSmlCallbackElement::~CNSmlCallbackElement()
+	{
+	delete iUri;
+	}
+
+
+// ===========================================================================
+// CNSmlDmDDF::DeleteandAddStatusRefsL
+// ===========================================================================
+void CNSmlDmDDF::DeleteandAddStatusRefsL( TInt aStatusRef,
+		MSmlDmAdapter::TError aErrorCode )
+	{
+	TInt i=0;
+	for(i=0;i<iDeleteStatusRefs.Count();i++)
+		{
+		if(aStatusRef==iDeleteStatusRefs[i]->iRef)
+			{
+			if(aErrorCode==CSmlDmAdapter::EOk||
+					aErrorCode==CSmlDmAdapter::ENotFound)
+				{
+				//remove mapping info from db
+				iDbSession.RemoveMappingInfoL(iAdapterId,
+						*iDeleteStatusRefs[i]->iUri);
+
+				iDbSession.DeleteAclL(*iDeleteStatusRefs[i]->iUri);
+				}
+			delete iDeleteStatusRefs[i];	
+			iDeleteStatusRefs.Remove(i);
+			break;
+			}
+		}
+
+	for(i=0;i<iAddNodeStatusRefs.Count();i++)
+		{
+		if(aStatusRef==iAddNodeStatusRefs[i]->iRef)
+			{
+			if(aErrorCode==CSmlDmAdapter::EOk)
+				{
+				//check replace rights of parent
+				if(!iDbSession.CheckAclL(NSmlDmURI::ParentURI(
+						*iAddNodeStatusRefs[i]->iUri),EAclReplace))
+					{
+					iDbSession.DefaultACLsToServerL(
+							*iAddNodeStatusRefs[i]->iUri);
+					}
+				}
+			delete iAddNodeStatusRefs[i];
+			iAddNodeStatusRefs.Remove(i);
+			break;
+			}
+		}
+	}
+