syncmlfw/dm/treemodule/src/nsmldmmodule.cpp
changeset 0 b497e44ab2fc
child 25 b183ec05bd8c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/dm/treemodule/src/nsmldmmodule.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,972 @@
+/*
+* 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 module
+*
+*/
+
+
+#include <e32def.h>
+#include <nsmldebug.h>
+#include <nsmldmmodule.h>
+#include "nsmldmddf.h"
+#include "nsmldmcommandbuffer.h"
+#include "nsmldmtreeconstants.h"
+#include "nsmldmuri.h"
+#include <featmgr.h>
+
+_LIT8(KNSmlDmUriDDF, "DDF");
+_LIT8(KNSmlDmPropetyACL, "ACL");
+_LIT8(KNSmlDmPropetyFormat, "Format");
+_LIT8(KNSmlDmPropetyName, "Name");
+_LIT8(KNSmlDmPropetySize, "Size");
+_LIT8(KNSmlDmPropetyType, "Type");
+_LIT8(KNSmlDmPropertyCaseSense, "CaseSense");
+_LIT8(KNSmlDmDDFDevInfoModDDF, "DevInfo/Ext/ModDDF");
+
+// ===========================================================================
+// CSmlDmModule
+// ===========================================================================
+
+// ----------------------------------------------------------------------------
+// CNSmlDmModule::~CNSmlDmModule()
+// ----------------------------------------------------------------------------
+CNSmlDmModule::~CNSmlDmModule()
+	{
+	delete iDDF;
+	delete iCommandBuffer;
+	iPropResults.ResetAndDestroy();
+	FeatureManager::UnInitializeLib();
+	}
+
+// ----------------------------------------------------------------------------
+// CNSmlDmModule* CNSmlDmModule::NewL( MNSmlDmModuleCallBack* aCallBack)
+// ----------------------------------------------------------------------------
+EXPORT_C CNSmlDmModule* CNSmlDmModule::NewL( MNSmlDmModuleCallBack* aCallBack)
+	{
+	CNSmlDmModule* self = new (ELeave) CNSmlDmModule();
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	self->iCallBack = aCallBack;
+	CleanupStack::Pop();
+	return self;
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::SetServerL(const TDesC& aServer)
+// Sets the server
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::SetServerL(const TDesC8& aServer)
+	{
+	_DBG_FILE("CNSmlDmModule::SetServer() : begin");
+	iDDF->SetServerL(aServer);
+	_DBG_FILE("CNSmlDmModule::SetServer() : end");
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::AddObjectL(const TDesC8& aURI, const TDesC8& aObject,
+//		const TDesC8& aType, TInt aStatusRef )
+// Add operation in DM protocoll
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::AddObjectL(const TDesC8& aURI,
+	const TDesC8& aObject,
+	const TDesC8& aType,
+	TInt aStatusRef,
+	TBool aLargeItem )
+	{
+	_DBG_FILE("CNSmlDmModule::AddObjectL() : begin");
+
+	TPtrC8 uri = NSmlDmURI::RemoveDotSlash(aURI);
+
+	if(iInTransaction)
+		{
+		if(aLargeItem)
+			{
+			DoSetStatusL(aStatusRef,KNSmlDmStatusCommandFailed);
+			return;
+			}
+		//command buffering
+		iCommandBuffer->AddObjectL(uri,aObject,aType,aStatusRef);
+		}
+	else
+		{
+		TInt status = KNSmlDmNoStatus;
+		CNSmlDmDDF::TAccess access = iDDF->CheckURIL(NSmlDmURI::RemoveProp(uri),EAclAdd);
+
+		if(access == CNSmlDmDDF::EOk )
+			{
+			//check if property asked
+			TInt offset = uri.Find(KNSmlDmProperty);
+			if(offset==KErrNotFound)
+				{
+				//property is not asked, put the request to adapter
+				iDDF->AddObjectL(uri,aObject,aType,aStatusRef,aLargeItem);
+				}
+			else
+				{
+				status = KNSmlDmStatusCommandNotAllowed;
+				}
+			}
+		else if(access==CNSmlDmDDF::ENotAccess)
+			{
+			status = KNSmlDmStatusCommandNotAllowed;
+			}
+		else
+			{
+			status = KNSmlDmStatusNotFound;
+			}
+		if(status!=KNSmlDmNoStatus)
+			{
+			DoSetStatusL(aStatusRef,status);
+			}
+		}
+	_DBG_FILE("CNSmlDmModule::AddObjectL() : end");
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::UpdateObjectL(const TDesC8& aURI, const TDesC8& aObject,
+// const TDesC8& aType, TInt aStatusRef )
+// Replace operation in DM protocoll
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::UpdateObjectL(const TDesC8& aURI,
+	const TDesC8& aObject,
+	const TDesC8& aType,
+	TInt aStatusRef,
+	TBool aLargeItem,
+	// FOTA
+	TInt aTotSizeOfLarge
+	// FOTA end
+	 )
+	{
+	_DBG_FILE("CNSmlDmModule::UpdateObjectL() : begin");
+
+	TPtrC8 uri = NSmlDmURI::RemoveDotSlash(aURI);
+
+	if(iInTransaction)
+		{
+		if(aLargeItem)
+			{
+			DoSetStatusL(aStatusRef,KNSmlDmStatusCommandFailed);
+			return;
+			}
+		//command buffering
+		iCommandBuffer->UpdateObjectL(uri,aObject,aType,aStatusRef);
+		}
+	else
+		{
+		TInt status = KNSmlDmNoStatus;
+		TInt offset = uri.Find(KNSmlDmProperty);
+		CNSmlDmDDF::TAccess access = iDDF->CheckURIL(
+			NSmlDmURI::RemoveProp(uri),EAclReplace);
+
+		if(access == CNSmlDmDDF::EOk)
+			{
+			//check if property asked
+			if(offset==KErrNotFound)
+				{
+				//property is not asked, put the request to adapter
+				// FOTA
+				iDDF->UpdateObjectL(uri,aObject,aType,aStatusRef,aLargeItem,aTotSizeOfLarge);
+				// FOTA end
+				}
+			else
+				{
+				UpdatePropertyL(uri,aObject,aType,offset+
+					KNSmlDmProperty().Length(),aStatusRef);
+				}
+			}
+		else if(access == CNSmlDmDDF::ENotAccess)
+			{
+			status = KNSmlDmStatusCommandNotAllowed;
+			}
+		else
+			{
+			status = KNSmlDmStatusNotFound;
+			}
+
+		if(status!=KNSmlDmNoStatus)
+			{
+			DoSetStatusL(aStatusRef,status);
+			}
+		} //end else(iInTransAction)
+	_DBG_FILE("CNSmlDmModule::UpdateObjectL() : end");
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::FetchObjectL(const TDesC8& aURI, const TDesC8& aType,
+// const TDesC8& aCmdRef, TInt aStatusRef,TBool aAclPass )
+// Get operation in DM protocoll
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::FetchObjectL(const TDesC8& aURI,
+	const TDesC8& aType,
+	const TInt aResultsRef,
+	TInt aStatusRef,
+	TBool aAclPass)
+	{
+	_DBG_FILE("CNSmlDmModule::FetchObjectL() : begin");
+	CBufBase *object=NULL;
+	TPtrC8 uri = NSmlDmURI::RemoveDotSlash(aURI);
+
+	if (uri.Compare(KNSmlDmUriDDF)==0)
+		{
+		object = CBufFlat::NewL(1024);
+		CleanupStack::PushL(object);
+		iDDF->GenerateDDFL(*object/*,iDbHandler*/);
+		iCallBack->SetResultsL(aResultsRef,*object,aType,KNSmlDmFormatChr,
+			object->Size());
+		iCallBack->SetStatusL(aStatusRef,KNSmlDmStatusOK);
+		CleanupStack::PopAndDestroy(); //object
+		}
+	else if(uri.Compare(KNSmlDmDDFDevInfoModDDF)==0)
+		{
+		object = CBufFlat::NewL(10);
+		CleanupStack::PushL(object);
+		TBuf8<10> ddfCRC;
+		ddfCRC.Num(iDDFCrc);
+		object->InsertL(0,ddfCRC);
+		
+		iCallBack->SetResultsL(aResultsRef,*object,aType,KNSmlDmFormatChr,
+			object->Size());
+		iCallBack->SetStatusL(aStatusRef,KNSmlDmStatusOK);
+		CleanupStack::PopAndDestroy(); //object
+		}
+	else
+		{
+		if(iInTransaction)
+			{
+			//command buffering
+			iCommandBuffer->FetchObjectL(uri,aType,aResultsRef,aStatusRef);
+			}
+		else
+			{
+			TInt status = KNSmlDmNoStatus;
+			CNSmlDmDDF::TAccess access = iDDF->CheckURIL(
+				NSmlDmURI::RemoveProp(uri),EAclGet);
+	
+			if(access == CNSmlDmDDF::EOk)
+				{
+				//check if property asked
+				TInt offset = uri.Find(KNSmlDmProperty);
+				if(offset==KErrNotFound)
+					{
+					if(uri.Find(KNSmlDmQuestionMark)>=0)
+						{
+						status = KNSmlDmStatusOptionalFeatureNotSupported;
+						}
+					else
+						{
+						//property is not asked, put the request to adapter
+						iDDF->FetchObjectL(uri,aType,aResultsRef,aStatusRef,
+							aAclPass);
+						}
+					}
+				else
+					{
+					GetPropertyL(uri,aType,KNSmlDmProperty().Length()+
+						offset,aResultsRef,aStatusRef);
+					}
+				}
+			else if(access == CNSmlDmDDF::ENotAccess)
+				{
+				status = KNSmlDmStatusCommandNotAllowed;
+				//check if property asked
+
+				}
+			else
+				{
+				status = KNSmlDmStatusNotFound;
+				}
+	
+			if(status!=KNSmlDmNoStatus)
+				{
+				DoSetStatusL(aStatusRef,status);
+				}
+			} //end else iInTransAction
+		} //end else DDF
+	_DBG_FILE("CNSmlDmModule::FetchObjectL() : end");
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::DeleteObjectL( const TDesC8& aURI, TInt aStatusRef )
+// Delete operation in DM protocoll
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::DeleteObjectL( const TDesC8& aURI,
+TInt aStatusRef )
+	{
+	_DBG_FILE("CNSmlDmModule::DeleteObjectL() : begin");
+	TPtrC8 uri = NSmlDmURI::RemoveDotSlash(aURI);
+
+	if(iInTransaction)
+		{
+		//command buffering
+		iCommandBuffer->DeleteObjectL(uri,aStatusRef);
+		}
+	else
+		{
+		TInt status = KNSmlDmNoStatus;
+		CNSmlDmDDF::TAccess access = iDDF->CheckURIL(
+			NSmlDmURI::RemoveProp(uri),EAclDelete);
+		if(access==CNSmlDmDDF::EOk)
+			{
+			//check if property asked
+			TInt offset = uri.Find(KNSmlDmProperty);
+			if(offset==KErrNotFound)
+				{
+				//property is not asked, put the request to adapter
+				iDDF->DeleteObjectL(uri,aStatusRef);
+				}
+			else
+				{
+				status = KNSmlDmStatusCommandNotAllowed;
+				}
+			}
+		else if(access==CNSmlDmDDF::ENotAccess)
+			{
+			status = KNSmlDmStatusCommandNotAllowed;
+			}
+		else
+			{
+			status = KNSmlDmStatusNotFound;
+			}
+
+		if(status!=KNSmlDmNoStatus)
+			{
+			DoSetStatusL(aStatusRef,status);
+			}
+		}
+	_DBG_FILE("CNSmlDmModule::DeleteObjectL() : end");
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::ExecuteObjectL( const TDesC8& aURI,
+// const TDesC8& aObject, const TDesC8& aType, TInt aStatusRef)
+// Execute operation in DM protocoll
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::ExecuteObjectL( const TDesC8& aURI,
+	const TDesC8& aObject,
+	const TDesC8& aType,
+	TInt aStatusRef,
+	// FOTA
+	const TDesC8& aCorrelator,
+	// FOTA end	
+	TBool aLargeItem )
+	{
+	_DBG_FILE("CNSmlDmModule::ExecuteObjectL() : begin");
+
+	TPtrC8 uri = NSmlDmURI::RemoveDotSlash(aURI);
+
+	if(iInTransaction)
+		{
+		if(aLargeItem)
+			{
+			DoSetStatusL(aStatusRef,KNSmlDmStatusCommandFailed);
+			return;
+			}
+		//command buffering
+		// FOTA
+		// It is not expected that the FOTA adapter will get atomic commands.
+		// That's why correlator is not forwarded to the command buffer.
+		// FOTA end		
+		iCommandBuffer->ExecuteObjectL(uri,aObject,aType,aStatusRef);
+		}
+	else
+		{
+		TInt status = KNSmlDmNoStatus;
+		TInt offset = uri.Find(KNSmlDmProperty);
+		CNSmlDmDDF::TAccess access = iDDF->CheckURIL(
+			NSmlDmURI::RemoveProp(uri),EAclExecute);
+
+		if(access == CNSmlDmDDF::EOk)
+			{
+			//check if property asked
+			if(offset==KErrNotFound)
+				{
+				//property is not asked, put the request to adapter
+				// FOTA
+				iDDF->ExecuteObjectL(uri,aObject,aType,aStatusRef,aCorrelator,aLargeItem);
+				// FOTA end
+				}
+			else
+				{
+				status = KNSmlDmStatusCommandNotAllowed;
+				}
+			}
+		else if(access == CNSmlDmDDF::ENotAccess)
+			{
+			//check if property asked
+			status = KNSmlDmStatusCommandNotAllowed;
+			}
+		else
+			{
+			status = KNSmlDmStatusNotFound;
+			}
+
+		if(status!=KNSmlDmNoStatus)
+			{
+			DoSetStatusL(aStatusRef,status);
+			}
+		} //end else(iInTransAction)
+	_DBG_FILE("CNSmlDmModule::ExecuteObjectL() : end");
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::CopyObjectL( const TDesC8& aURI,
+//	const TDesC8& aObject, const TDesC8& aType, TInt aStatusRef)
+// Copy operation in DM protocoll.
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::CopyObjectL( const TDesC8& aTargetURI,
+	const TDesC8& aSourceURI,
+	const TDesC8& aType,
+	TInt aStatusRef)
+	{
+	_DBG_FILE("CNSmlDmModule::CopyObjectL() : begin");
+
+	TPtrC8 sourceUri = NSmlDmURI::RemoveDotSlash(aSourceURI);
+	TPtrC8 targetUri = NSmlDmURI::RemoveDotSlash(aTargetURI);
+
+	if(iInTransaction)
+		{
+		//command buffering
+		iCommandBuffer->CopyObjectL(targetUri,sourceUri,aType,aStatusRef);
+		}
+	else
+		{
+		TInt status = KNSmlDmNoStatus;
+		TInt offset = sourceUri.Find(KNSmlDmProperty);
+		CNSmlDmDDF::TAccess access = iDDF->CheckURIL(
+			NSmlDmURI::RemoveProp(sourceUri),EAclCopy);
+
+		if(access == CNSmlDmDDF::EOk)
+			{
+			//check if property asked
+			if(offset==KErrNotFound)
+				{
+				//property is not asked, put the request to adapter
+				iDDF->CopyObjectL(targetUri,sourceUri,aType,aStatusRef);
+				}
+			else
+				{
+				status = KNSmlDmStatusCommandNotAllowed;
+				}
+			}
+		else if(access == CNSmlDmDDF::ENotAccess)
+			{
+			//check if property asked
+			status = KNSmlDmStatusCommandNotAllowed;
+			}
+		else
+			{
+			status = KNSmlDmStatusNotFound;
+			}
+
+		if(status!=KNSmlDmNoStatus)
+			{
+			DoSetStatusL(aStatusRef,status);
+			}
+		} //end else(iInTransAction)
+	_DBG_FILE("CNSmlDmModule::CopyObjectL() : end");
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::StartTransactionL( )
+// Start Atomic operation
+// Tells that the following commands must be buffered
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::StartTransactionL( )
+	{
+	iInTransaction = ETrue;
+	if(iCommandBuffer==0)
+		{
+		iCommandBuffer = CNSmlDmCommandBuffer::NewL(*this);
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::CommitTransactionL( )
+// Commit Atomic operation
+// The buffered commands can be executed
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::CommitTransactionL( )
+	{
+	iInTransaction = EFalse;
+	if(iCommandBuffer)
+		{
+		iCommandBuffer->CommitL(*iDDF);
+		delete iCommandBuffer;
+		iCommandBuffer = 0;
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::RollBackL( )
+// Rollback Atomic operation
+// The buffered commands are removed from buffer and they are not executed
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::RollBackL( )
+	{
+	iInTransaction = EFalse;
+	if(iCommandBuffer)
+		{
+		delete iCommandBuffer;
+		iCommandBuffer = 0;
+		}
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::EndMessageL( )
+// Indicates message ending
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::EndMessageL( )
+	{
+	_DBG_FILE("CNSmlDmModule::EndMessageL() : begin");
+	iDDF->EndMessageL();
+	iPropResults.ResetAndDestroy();
+	iInternalStatusRef = 0;
+	_DBG_FILE("CNSmlDmModule::EndMessageL() : end");
+	}
+
+// ----------------------------------------------------------------------------
+// TInt CNSmlDmModule::IsDDFChangedL( )
+// Returns a checksum of ddf versions. Checksum changes if the ddf changes
+// ----------------------------------------------------------------------------
+EXPORT_C TInt CNSmlDmModule::IsDDFChangedL( )
+	{
+	return iDDFCrc;
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::MoreDataL(CBufBase*& adata)
+// Gets more data in case of largeobject
+// ----------------------------------------------------------------------------
+EXPORT_C void CNSmlDmModule::MoreDataL(CBufBase*& aData)
+	{
+	iDDF->MoreDataL(aData);
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::UpdatePropertyL(const TDesC8& aURI,
+//	const TDesC8& aObject, const TDesC8& aType, TInt aOffset)
+// Replace property operation in DM protocoll
+// ----------------------------------------------------------------------------
+void CNSmlDmModule::UpdatePropertyL(const TDesC8& aURI,
+	const TDesC8& aObject,
+	const TDesC8& /*aType*/,
+	TInt aOffset,
+	const TInt aStatusRef )
+	{
+
+	if(aURI.Mid(aOffset).Compare(KNSmlDmPropetyACL)==0)
+		{
+		iDDF->UpdateAclL(NSmlDmURI::RemoveProp(aURI),aObject,aStatusRef);
+		}
+	else
+		{
+		DoSetStatusL(aStatusRef,KNSmlDmStatusCommandNotAllowed);
+		}
+	}
+
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::GetPropertyL(const TDesC8& aURI, const TDesC8& aType,
+//	const TDesC8& aCmdRef, TInt aOffset )
+// Get property operation in DM protocoll
+// ----------------------------------------------------------------------------
+void CNSmlDmModule::GetPropertyL(const TDesC8& aURI,
+	const TDesC8& aType,
+	TInt aOffset,
+	TInt aResultsRef,
+	TInt aStatusRef)
+	{
+	TPtrC8 uri = NSmlDmURI::RemoveProp(aURI);
+	if(iDDF->CheckAclL(uri,EAclGet))
+		{
+		CNSmlGetPropertyElement* propGet =
+			 new (ELeave)CNSmlGetPropertyElement();
+		CleanupStack::PushL(propGet);
+		propGet->iResultsRef = aResultsRef;
+		propGet->iStatusRef = aStatusRef;
+		propGet->iStatusCode = KNSmlDmNoStatus;
+		propGet->iUri = uri.AllocL();
+
+		if(aURI.Mid(aOffset).Compare(KNSmlDmPropetyACL)==0)
+			{
+			propGet->iProp = EPropACL;
+			iPropResults.AppendL(propGet);
+			CleanupStack::Pop(); // propGet
+			if(uri.Compare(KNSmlDmDDFDevInfoModDDF)==0)
+				{
+				DoSetStatusL(aStatusRef,KNSmlDmStatusOK);
+				CBufBase* object = CBufFlat::NewL(128);
+				CleanupStack::PushL(object);
+				DoSetResultsL(aResultsRef,*object,aType,KNullDesC8,0,ETrue);
+				CleanupStack::PopAndDestroy(); //object
+				}
+			else
+				{
+				iDDF->FetchObjectL(uri,aType,aResultsRef,aStatusRef);
+				}
+			}
+		else if(aURI.Mid(aOffset).Compare(KNSmlDmPropetyFormat)==0)
+			{
+			propGet->iProp = EPropFormat;
+			iPropResults.AppendL(propGet);
+			CleanupStack::Pop(); // propGet
+			iDDF->FetchObjectL(uri,aType,aResultsRef,aStatusRef);
+			}
+		else if(aURI.Mid(aOffset).Compare(KNSmlDmPropetyName)==0)
+			{
+			propGet->iProp = EPropName;
+			iPropResults.AppendL(propGet);
+			CleanupStack::Pop(); // propGet
+			iDDF->FetchObjectL(uri,aType,aResultsRef,aStatusRef);
+			}
+		else if(aURI.Mid(aOffset).Compare(KNSmlDmPropetySize)==0)
+			{
+//			if(iDDF->IsLeafL(uri)==CNSmlDmDDF::ELeaf)
+			if(iDDF->IsLeafL(uri)==ENSmlDmDDFLeaf)
+				{
+				propGet->iProp = EPropSize;
+				iPropResults.AppendL(propGet);
+				CleanupStack::Pop(); // propGet
+				iDDF->FetchObjectSizeL(uri,aType,aResultsRef,aStatusRef);
+				}
+			else
+				{
+				delete propGet->iUri;
+				propGet->iUri = 0;
+				CleanupStack::PopAndDestroy(); // propGet
+				DoSetStatusL(aStatusRef,KNSmlDmStatusOptionalFeatureNotSupported);
+				}
+			}
+		else if(aURI.Mid(aOffset).Compare(KNSmlDmPropetyType)==0)
+			{
+			propGet->iProp = EPropType;
+			iPropResults.AppendL(propGet);
+			CleanupStack::Pop(); // propGet
+			iDDF->FetchObjectL(uri,aType,aResultsRef,aStatusRef);
+			}
+		else
+			{
+			if(!FeatureManager::FeatureSupported( KFeatureIdSyncMlDm112  ))
+			{
+				if(aURI.Mid(aOffset).Compare(KNSmlDmPropertyCaseSense)==0) 
+			    {
+			    propGet->iProp = EPropCaseSense;
+				iPropResults.AppendL(propGet);
+				CleanupStack::Pop(); // propGet
+				iDDF->FetchObjectL(uri,aType,aResultsRef,aStatusRef);
+			    }
+			    else
+			    {
+			    delete propGet->iUri;
+				propGet->iUri =0;
+				CleanupStack::PopAndDestroy(); // propGet
+				DoSetStatusL(aStatusRef,KNSmlDmStatusOptionalFeatureNotSupported);
+			    }
+			    
+			}
+			else
+			{
+				delete propGet->iUri;
+				propGet->iUri =0;
+				CleanupStack::PopAndDestroy(); // propGet
+				DoSetStatusL(aStatusRef,KNSmlDmStatusOptionalFeatureNotSupported);
+			}
+			}
+		}
+	else
+		{
+		DoSetStatusL(aStatusRef,KNSmlDmStatusPermissionDenied);
+		}
+	}
+
+
+// ----------------------------------------------------------------------------
+// TBool CNSmlDmModule::DeleteInTransactionL( )
+// Deletes te items added inside the atomic, in case that atomic fails
+// ----------------------------------------------------------------------------
+void CNSmlDmModule::DeleteInTransactionL(const TDesC8& aURI,
+	MNSmlDmModuleCallBack *aCallBack)
+	{
+	MNSmlDmModuleCallBack *tmpCallBack = iCallBack;
+	TBool tmpInTransaction = iInTransaction;
+	iInTransaction = EFalse;
+	iCallBack = aCallBack;
+	iInternalCommand = ETrue;
+	DeleteObjectL(aURI, iInternalStatusRef--);
+	iInternalCommand = EFalse;
+	iCallBack = tmpCallBack;
+	iInTransaction = tmpInTransaction;
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::DoSetStatusL( )
+// The status is provided throug this function to caller
+// ----------------------------------------------------------------------------
+void CNSmlDmModule::DoSetStatusL(TInt aStatusRef, TInt aStatusCode,
+	TBool aSkipCmdBuf)
+	{
+	if(!iInternalCommand&&aStatusRef==-1)
+		{
+		return;
+		}
+	TInt status = aStatusCode;
+	
+	//loop through if the command is for getting property
+	for(TInt i=0;i<iPropResults.Count();i++)
+		{
+		if(aStatusRef==iPropResults[i]->iStatusRef)
+			{
+			if(status>KNSmlDmStatusLargestOK)
+				{
+				//the property is asked, but the fetch for command is failed for
+				//some reason -> return status not allowed 
+				status = KNSmlDmStatusCommandNotAllowed;
+				if(iPropResults[i]->iStatusCode==0) //checks if status is allready handled
+					{
+					//status was not handled before
+					iPropResults[i]->iStatusCode=status;
+					}
+				else
+					{
+					//status was handled before in DoSetResultsL()
+					return;
+					}
+				}
+			else
+				{
+				return;
+				}
+			break;
+			}
+		}
+	if(iCommandBuffer!=0 && !aSkipCmdBuf &&
+		iCommandBuffer->CheckStatusRef(aStatusRef))
+		{
+		//command has came inside atomic
+		iCommandBuffer->SetStatus(aStatusRef,status);
+		}
+	else
+		{
+		iCallBack->SetStatusL(aStatusRef,status);
+		}
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::DoSetResultsL( )
+// Sets the result to caller by using callback interface
+// ----------------------------------------------------------------------------
+void CNSmlDmModule::DoSetResultsL(TInt aResultsRef, CBufBase& aObject,
+	const TDesC8& aType,
+	const TDesC8& aFormat,
+	TInt aTotalSize,
+	TBool aSkipCmdBuf)
+	{
+	if(!iInternalCommand&&aResultsRef==-1)
+		{
+		return;
+		}
+
+	TInt index = -1;
+	//loop throug the prop result buffer, the buffe contains element for
+	//each fetch to any property
+	for(TInt i=0;i<iPropResults.Count();i++)
+		{
+		if(aResultsRef==iPropResults[i]->iResultsRef &&
+			iPropResults[i]->iStatusCode<KNSmlDmStatusLargestOK)
+			{
+			//fetch to property found and status to fetch is
+			//OK status -> it is OK to return the asked property
+			index = i;
+			//the HandlePropertyResultsL gets the property to aObject
+			iPropResults[i]->iStatusCode = HandlePropertyResultsL(i,aObject);
+			break;
+			}
+		}
+
+	if(iCommandBuffer!=0 && !aSkipCmdBuf &&
+		iCommandBuffer->CheckResultsRef(aResultsRef))
+		{
+		//command has come inside atomic
+		if(index>=0)
+			{
+			//property is asked inside the atomic, the status and result are
+			//given back to command buffer
+			iCommandBuffer->SetStatus(iPropResults[index]->iStatusRef,
+				iPropResults[index]->iStatusCode);
+			}
+		iCommandBuffer->SetResultsL(aResultsRef,aObject,aType,aFormat);
+		}
+	else
+		{
+		//command has not come niside the atomic
+		if(index>=0)
+			{
+			//fetch for property found, the result and status are returned
+			//from property result buffer
+			iCallBack->SetStatusL(iPropResults[index]->iStatusRef,
+				iPropResults[index]->iStatusCode);
+			if(iPropResults[index]->iStatusCode<KNSmlDmStatusLargestOK)
+				{
+				iCallBack->SetResultsL(aResultsRef,aObject,aType,aFormat,
+					aTotalSize);
+				}
+			}
+		else
+			{
+			//gives the result to agent 
+			//this is the normal case, i.e. fetch to item (not property)
+			//and not inside the atomic
+			//However, if atomic has come inside the atomic, the
+			//command buffer finally callst this function with
+			//aSkipCmdBuf==ERrue -> execution comes to this branch
+			iCallBack->SetResultsL(aResultsRef,aObject,aType,aFormat,
+				aTotalSize);
+			}
+		}
+	}
+
+// ----------------------------------------------------------------------------
+// CNSmlDmModule::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.
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CNSmlDmModule::DisconnectFromOtherServers()
+	{
+	iDDF->DisconnectFromOtherServers();
+	}
+
+// FOTA
+// ----------------------------------------------------------------------------
+// CNSmlDmModule::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.
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CNSmlDmModule::MarkGenAlertsSentL()
+	{
+	iDDF->MarkGenAlertsSentL();
+	}
+// FOTA end
+
+// ----------------------------------------------------------------------------
+// CNSmlDmModule::MarkGenAlertsSentL(const TDesC8& aURI)
+//	When the generic alerts are successfully sent to the remote 
+//	server, the repective adapter needs to be informed about this.
+//	This command is chained through the DM engine.
+//  This function is used if DM 1.2 version is enabled
+// ----------------------------------------------------------------------------
+//
+EXPORT_C void CNSmlDmModule::MarkGenAlertsSentL(const TDesC8& aURI)
+	{
+	_DBG_FILE(" CNSmlDmModule::MarkGenAlertsSentL (TDesC8& aURI )calling iDDF->MarkgenAlert  ");
+   	iDDF->MarkGenAlertsSentL(aURI);
+	}
+
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::HandlePropertyResultsL(TInt aIndex,
+// CBufBase& aObject)
+// Sets the property result in case that property fetched
+// ----------------------------------------------------------------------------
+TInt CNSmlDmModule::HandlePropertyResultsL(TInt aIndex, CBufBase& aObject)
+	{
+	TInt status = KNSmlDmStatusOK;
+	if(iPropResults[aIndex]->iProp==EPropACL)
+		{
+		aObject.Reset();
+		iDDF->GetAclL(*iPropResults[aIndex]->iUri,aObject);
+		}
+	else if(iPropResults[aIndex]->iProp==EPropFormat)
+		{
+		aObject.Reset();
+		HBufC8* format8 = iDDF->GetFormatAllocL(*iPropResults[aIndex]->iUri);
+		CleanupStack::PushL(format8); //format8
+		aObject.InsertL(0,*format8);
+		CleanupStack::PopAndDestroy(); //format8
+		}
+	else if(iPropResults[aIndex]->iProp==EPropName)
+		{
+		aObject.Reset();
+		aObject.InsertL(0,NSmlDmURI::LastURISeg(*iPropResults[aIndex]->iUri));
+		}
+	else if(iPropResults[aIndex]->iProp==EPropSize)
+		{
+		}
+	else if(iPropResults[aIndex]->iProp==EPropType)
+		{
+		aObject.Reset();
+		iDDF->GetMimeTypeL(*iPropResults[aIndex]->iUri,aObject);
+		}
+	
+	else if(iPropResults[aIndex]->iProp==EPropCaseSense)
+		{
+		if(!FeatureManager::FeatureSupported( KFeatureIdSyncMlDm112  ))
+		{
+		aObject.Reset();
+		iDDF->GetCaseSenseL(*iPropResults[aIndex]->iUri,aObject);
+		}
+		else
+		{
+		status = KNSmlDmStatusOptionalFeatureNotSupported;
+		}
+		
+		}
+	else
+		{
+		status = KNSmlDmStatusOptionalFeatureNotSupported;
+		}
+	return status;
+	}
+
+// ----------------------------------------------------------------------------
+// void CNSmlDmModule::ConstructL( )
+// Second phase constructor
+// ----------------------------------------------------------------------------
+void CNSmlDmModule::ConstructL()
+	{
+	_DBG_FILE("CNSmlDmModule::ConstructL( ) : begin");
+	iDDF = CNSmlDmDDF::NewL(*this);
+	iDDFCrc = iDDF->IsDDFChangedL();
+	FeatureManager::InitializeLibL();
+	_DBG_FILE("CNSmlDmModule::ConstructL( ) : end");
+	}
+
+
+// ===========================================================================
+// CNSmlGetPropertyElement
+// ===========================================================================
+// ----------------------------------------------------------------------------
+// CNSmlGetPropertyElement::CNSmlGetPropertyElement( )
+// ----------------------------------------------------------------------------
+CNSmlGetPropertyElement::~CNSmlGetPropertyElement()
+	{
+	delete iUri;
+	}
+
+// End of file
+