syncmlfw/dm/treemodule/src/nsmldmhostclient.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/dm/treemodule/src/nsmldmhostclient.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,906 @@
+/*
+* 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 <s32mem.h>
+#include <smldmadapter.h>
+#include <data_caging_path_literals.hrh>
+
+#include <nsmlconstants.h>
+#include "nsmldmhostclient.h"
+#include "nsmldmcmdarghandler.h"
+#include "nsmldmtreedtd.h"
+#include "nsmldmddf.h"
+// FOTA
+#include "nsmldmimpluids.h"
+// FOTA end
+
+const TInt KNSmlMinChunk = 4096;
+
+//********************************
+//RNSmlDMDataSession
+//********************************
+
+// ------------------------------------------------------------------------------------------------
+//void RNSmlDMDataSession::RNSmlDMDataSession()
+// ------------------------------------------------------------------------------------------------
+RNSmlDMDataSession::RNSmlDMDataSession() :
+    iCallback( NULL ),
+	iMapUris( NULL ),
+	iMapLuids( NULL ),
+	iServerId( 0 ),
+	iLargeObjectUri( NULL )
+	{
+	}
+
+// ------------------------------------------------------------------------------------------------
+//void RNSmlDMDataSession::~RNSmlDMDataSession()
+// ------------------------------------------------------------------------------------------------
+RNSmlDMDataSession::~RNSmlDMDataSession()
+	{
+	if(iMapUris!=0)
+		{
+		iMapUris->ResetAndDestroy();
+		delete iMapUris;
+		}
+	if(iMapLuids!=0)
+		{
+		iMapLuids->ResetAndDestroy();
+		delete iMapLuids;
+		}
+	delete iLargeObjectUri;
+	}
+
+// ------------------------------------------------------------------------------------------------
+//void RNSmlDMDataSession::Connect()
+// Connect to the  server - default number of message slots is four
+// ------------------------------------------------------------------------------------------------
+TInt RNSmlDMDataSession::ConnectL(const TDesC& aServerName,
+	CNSmlDmDDF* aCallback)
+	{
+	iCallback = aCallback;
+	
+	TInt result( KErrNone );
+	TVersion ver ( KNSmlDmHostServerVerMajor, KNSmlDmHostServerVerMinor,
+		KNSmlDmHostServerVerBuild );
+
+	result = CreateSession( aServerName, ver );
+	if(result!=KErrNone)
+		{
+		if(aServerName.Compare(KNSmlDmHostServer1Name)==0)
+			{
+			result = LaunchServerL( KNSmlDmHostServer1Exe );
+			iServerId = 1;
+			}
+		else if(aServerName.Compare(KNSmlDmHostServer2Name)==0)
+			{
+			result = LaunchServerL( KNSmlDmHostServer2Exe );
+			iServerId = 2;
+			}
+		else if(aServerName.Compare(KNSmlDmHostServer3Name)==0)
+			{
+			result = LaunchServerL( KNSmlDmHostServer3Exe );
+			iServerId = 3;
+			}
+		else if(aServerName.Compare(KNSmlDmHostServer4Name)==0)
+			{
+			result = LaunchServerL( KNSmlDmHostServer4Exe );
+			iServerId = 4;
+			}
+		if ( result == KErrNone )
+			{
+			result = CreateSession( aServerName, ver );
+			}
+		}
+	
+	return result; 
+	}
+	
+
+// ------------------------------------------------------------------------------------------------
+// void RNSmlDMDataSession::Version()
+// Return the version number
+// ------------------------------------------------------------------------------------------------
+TVersion RNSmlDMDataSession::Version(void) const
+	{
+	TVersion ver ( KNSmlDmHostServerVerMajor, KNSmlDmHostServerVerMinor,
+		KNSmlDmHostServerVerBuild );
+
+	return ver;
+	}
+
+
+// ------------------------------------------------------------------------------------------------
+// void RNSmlDMDataSession::Close()
+// Close the session; makes call to server which deletes the object
+// container and object index for this session
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::Close()
+	{
+	iChunk.Close();
+	SendReceive(ENSmlDMCloseSession,TIpcArgs());
+	RHandleBase::Close();
+	if(iMapUris)
+		{
+		iMapUris->ResetAndDestroy();
+		delete iMapUris;
+		iMapUris = NULL;
+		}
+	if(iMapLuids)
+		{
+		iMapLuids->ResetAndDestroy();
+		delete iMapLuids;
+		iMapLuids = NULL;
+		}
+	delete iLargeObjectUri;
+	iLargeObjectUri = NULL;
+	}
+
+
+// ------------------------------------------------------------------------------------------------
+//void RNSmlDMDataSession::LaunchServer( const TDesC& aServerExeName )
+// ------------------------------------------------------------------------------------------------
+TInt RNSmlDMDataSession::LaunchServerL( const TDesC& aServerExeName )
+	{
+	TInt result( KErrNone );
+	TParse parser;
+	parser.Set ( aServerExeName, &KDC_PROGRAMS_DIR, NULL );
+
+	RProcess server;
+	result = server.Create( parser.FullName(), KNullDesC );
+
+	// Process creation failed.
+	User::LeaveIfError( result );
+	
+	TRequestStatus status;
+	server.Rendezvous( status );
+
+	if ( status != KRequestPending )
+		{
+		server.Kill( 0 );	// abort startup
+		server.Close();
+		return KErrGeneral;	// status can be KErrNone: don't return status.Int()
+		}
+	else
+		{
+		server.Resume();	// logon OK - start the server
+		}
+		
+	User::WaitForRequest( status );
+	
+	result = status.Int();
+	
+	if ( status == KErrNone )
+		{
+		server.Close();
+		}
+
+	return result;
+	}
+
+
+// ------------------------------------------------------------------------------------------------
+//TInt RNSmlDMDataSession::DDFStructureL(MSmlDmDDFObject& aDDF)
+// ------------------------------------------------------------------------------------------------
+TInt RNSmlDMDataSession::DDFStructureL(CNSmlDmMgmtTree& aRoot)
+	{
+	iChunk.Close();
+	User::LeaveIfError(iChunk.CreateGlobal( KNullDesC,
+		KNSmlDmHostChunkMinSize, KNSmlDmHostChunkMaxSize ));
+	SendChunkHandle();
+	
+	RArray<TUint32> loadedAdapters;
+	aRoot.FindLoadedAdaptersL(loadedAdapters);
+
+	TUint8 count = loadedAdapters.Count();
+	
+	//1 byte for count and 4 bytes/implUid
+	HBufC8* adaptersBuffer = HBufC8::NewLC(1+4*count);
+	
+	TPtr8 adapterBufPtr = adaptersBuffer->Des();
+	RDesWriteStream writeStream(adapterBufPtr);
+	CleanupClosePushL(writeStream);
+	writeStream.WriteUint8L(count);
+	for(TUint8 i=0;i<count;i++)
+		{
+		TUint32 uid = loadedAdapters[i];
+		writeStream.WriteUint32L(uid);
+		}
+	loadedAdapters.Reset();
+	loadedAdapters.Close();
+	
+	TPckgBuf<TInt> checkSum;
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	
+	TIpcArgs args(&adapterBufPtr,0,&checkSum,&callbackCalled);
+	CleanupStack::PopAndDestroy(); //writeStream
+	
+	TInt errCode = SendReceive( ENSmlDMGetDDF, args );
+	
+	CleanupStack::PopAndDestroy(); //adaptersBuf
+	
+	if(errCode!=KErrNone)
+		{
+		return 0;
+		}
+
+	RMemReadStream readStream( iChunk.Base(), iChunk.Size() );
+	CleanupClosePushL( readStream );
+	
+	aRoot.ParseWBXMLL(readStream);	
+	CleanupStack::PopAndDestroy(); // readStream
+	
+	return checkSum();	
+	}
+
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::HandleCallbacks(TNSmlDmHostCallbackType aCallbackType)
+// handles callbacks
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::HandleCallbacksL(
+	TNSmlDmHostCallbackType aCallbackType)
+	{
+	TNSmlDmHostCallbackType callbackType=aCallbackType;
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	
+	while(callbackType!=ENSmlDmCallbackNone)
+		{
+		if(callbackType==ENSmlDmCallbackMappings)
+			{
+           	_DBG_FILE("CNSmlDmDDF::HandleCallbacksL():mappings");
+			TIpcArgs args(0,0,0,&callbackCalled);
+			SendReceive( ENSmlDMGetMappings,args);
+
+			callbackType = callbackCalled();
+			RMemReadStream readStream( iChunk.Base(), iChunk.Size() );
+			CleanupClosePushL( readStream );
+			
+			if(iMapUris==0)
+				{
+				iMapUris = new (ELeave) CArrayPtrSeg <HBufC8> (4);
+				}
+			if(iMapLuids==0)
+				{
+				iMapLuids = new (ELeave) CArrayPtrSeg <HBufC8> (4);
+				}
+
+			
+			NSmlDmCmdArgHandler::ParseMappingsL(readStream,*iMapUris,
+				*iMapLuids);
+				
+			for(TInt i=0;i<iMapUris->Count();i++)
+				{
+				if(iMapUris->At(i)->Length()&&iMapLuids->At(i)->Length())
+					{
+					iCallback->SetMappingL(*iMapUris->At(i),*iMapLuids->At(i));
+					}
+				}
+				
+			iMapUris->ResetAndDestroy();
+			iMapLuids->ResetAndDestroy();
+							
+			CleanupStack::PopAndDestroy(); // readStream
+			}
+		else if(callbackType==ENSmlDmCallbackStatuses)
+			{
+           	_DBG_FILE("CNSmlDmDDF::HandleCallbacksL():statuses");
+			TIpcArgs args(0,0,0,&callbackCalled);
+			SendReceive( ENSmlDMGetStatuses,args);
+
+			callbackType = callbackCalled();
+			RMemReadStream readStream( iChunk.Base(), iChunk.Size() );
+			CleanupClosePushL( readStream );
+			
+			RArray<TNSmlDmStatusElement> statusArray;
+			CleanupClosePushL(statusArray);
+			NSmlDmCmdArgHandler::ParseStatusesL(readStream,statusArray);
+
+			for(TInt i=0;i<statusArray.Count();i++)
+				{
+				iCallback->SetStatusL(statusArray[i].iStatusRef,
+					statusArray[i].iStatus);
+				}
+			CleanupStack::PopAndDestroy(2); // readStream, statusArray
+			}
+		else if(callbackType==ENSmlDmCallbackResults)
+			{
+           	_DBG_FILE("CNSmlDmDDF::HandleCallbacksL():results");
+			TPckgBuf<TInt> dataLength;
+			TIpcArgs args(0,0,&dataLength,&callbackCalled);
+			SendReceive( ENSmlDMGetResults,args);
+
+			callbackType = callbackCalled();
+			RMemReadStream readStream( iChunk.Base(), iChunk.Size() );
+			CleanupClosePushL( readStream );
+			
+			RPointerArray<CNSmlDmResultElement> resultArray;
+			CleanupStack::PushL ( PtrArrCleanupItemRArr ( CNSmlDmResultElement, &resultArray ) );
+
+			NSmlDmCmdArgHandler::ParseResultsL(readStream,resultArray);
+			
+			if(callbackType==ENSmlDmCallbackChunkFull)
+			    {
+               	_DBG_FILE("CNSmlDmDDF::HandleCallbacksL():results chunk full");
+			    for(TInt i=0;i<resultArray.Count();i++)
+				    {
+				    iCallback->SetResultsL(resultArray[i]->iResultRef,
+					    *resultArray[i]->iResult,*resultArray[i]->iMimeType,
+					    dataLength(),iServerId-1);
+    				}
+			    }
+			else
+			    {
+    			for(TInt i=0;i<resultArray.Count();i++)
+    				{
+    				iCallback->SetResultsL(resultArray[i]->iResultRef,
+    					*resultArray[i]->iResult,*resultArray[i]->iMimeType,
+    					resultArray[i]->iResult->Size(),iServerId-1);
+    				}
+				}
+			CleanupStack::PopAndDestroy(2); // readStream,resultArray
+			}
+		else if(callbackType==ENSmlDmCallbackChunkFull)
+			{
+			callbackType=ENSmlDmCallbackNone;
+			}
+		else
+			{
+			callbackType=ENSmlDmCallbackNone;
+			}
+		} // end while
+	}
+
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::SendChunkHandle
+// Sends Chunk handle to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+TInt RNSmlDMDataSession::SendChunkHandle()
+	{
+	TIpcArgs args;
+ 	args.Set(0, iChunk);
+ 	args.Set(1, iServerId);
+ 	const TInt error = SendReceive( ENSmlDMChunkHandle, args );
+ 	return error;
+	}
+
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::UpdateLeafL
+// Sends update leaf IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::UpdateLeafL(TUint32 aAdapterId,
+	const TDesC8& aLuid,
+	const TInt32 aStatusRef,
+	const TDesC8& aURI,
+	const TDesC8& aObject,
+	const TDesC8& aType,
+	const TBool aLargeItem,
+	// FOTA
+	const TInt aTotSizeOfLarge
+	// FOTA end
+	)
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled(ENSmlDmCallbackNone);
+	TInt dataLen = aObject.Length()
+		+aURI.Length()+aType.Length()+aLuid.Length()+16;
+		//16=4*4bytes, TInt = 4 bytes, each datasize must be stored to stream 
+	if(dataLen<KNSmlMinChunk)
+		{
+		iChunk.Adjust(KNSmlMinChunk);
+		}
+	else
+		{
+		iChunk.Adjust(dataLen);
+		}
+	RMemWriteStream writeStream( iChunk.Base(), iChunk.Size() );
+	CleanupClosePushL( writeStream );
+	
+	NSmlDmCmdArgHandler::PacketDataL(writeStream,aLuid,aObject,aURI,aType);
+	CleanupStack::PopAndDestroy(); // writeStream
+	TInt ret(KErrNone);
+		
+	if(aLargeItem)
+		{
+		if(iLargeObjectUri)
+			{
+			if(iLargeObjectUri->Compare(aURI)==0)
+				{
+				TIpcArgs args(aAdapterId,aStatusRef,EFalse,&callbackCalled);
+				ret = SendReceive( ENSmlDMUpdateLeafLarge,args);
+				}
+			else
+				{
+				ret = KErrGeneral;
+				}
+			}
+		else
+			{
+			iLargeObjectUri=aURI.AllocL();
+			// FOTA
+			if ( aTotSizeOfLarge && aAdapterId == KNSmlDMFotaAdapterImplUid )
+				{
+				// For the FOTA adapter the third parameter is overloaded.
+				// It contains the overall size of the large object.
+				// The size information is sent only with the first chunk.
+				TIpcArgs args(aAdapterId,aStatusRef,aTotSizeOfLarge,&callbackCalled);
+				ret = SendReceive( ENSmlDMUpdateLeafLarge,args);
+				}
+			else
+				{
+				TIpcArgs args(aAdapterId,aStatusRef,EFalse,&callbackCalled);			
+				ret = SendReceive( ENSmlDMUpdateLeafLarge,args);
+				}
+			// FOTA end
+			}
+		}
+	else
+		{
+		if(iLargeObjectUri)
+			{
+			delete iLargeObjectUri;
+			iLargeObjectUri=NULL;
+			TIpcArgs args(aAdapterId,aStatusRef,ETrue,&callbackCalled);
+			ret = SendReceive( ENSmlDMUpdateLeafLarge,args);
+			}
+		else
+			{
+			TIpcArgs args(aAdapterId,aStatusRef,0,&callbackCalled);
+			ret = SendReceive( ENSmlDMUpdateLeaf,args);
+			}
+		}	
+
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+	// FOTA
+	if ( aAdapterId == KNSmlDMFotaAdapterImplUid && ret == KErrTooBig )
+		{
+		iCallback->SetStatusL(aStatusRef,MSmlDmAdapter::ETooLargeObject);
+		delete iLargeObjectUri;
+		iLargeObjectUri=NULL;		
+		}
+	// FOTA end
+	else if(ret!=KErrNone)
+		{
+		iCallback->SetStatusL(aStatusRef,MSmlDmAdapter::EError);
+		delete iLargeObjectUri;
+		iLargeObjectUri=NULL;
+		}
+	}
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::AddNodeL
+// Sends add node IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::AddNodeL(const TUint32 aAdapterId,
+	const TDesC8& aLuid,
+	const TInt32 aStatusRef,
+	const TDesC8& aURI)
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	iChunk.Adjust(KNSmlMinChunk);
+		
+	TIpcArgs args(aAdapterId,aStatusRef,0,&callbackCalled);
+	RMemWriteStream writeStream( iChunk.Base(), iChunk.Size() );
+	CleanupClosePushL( writeStream );
+	
+	NSmlDmCmdArgHandler::PacketDataL(writeStream,aLuid,KNullDesC8,
+		aURI,KNullDesC8);
+	CleanupStack::PopAndDestroy(); // writeStream
+			
+	SendReceive( ENSmlDMAddNode,args);
+
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+	}
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::ExecuteCommandL
+// Sends execute IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::ExecuteCommandL(const TUint32 aAdapterId,
+	const TDesC8& aLuid,
+	const TInt32 aStatusRef,
+	const TDesC8& aURI,
+	const TDesC8& aObject,
+	const TDesC8& aType,
+	const TBool aLargeItem)
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled(ENSmlDmCallbackNone);
+
+	TInt dataLen = aObject.Length()
+		+aURI.Length()+aType.Length()+aLuid.Length()+16;
+		//16=4*4bytes, TInt = 4 bytes, each datasize must be stored to stream 
+		
+	if(dataLen<KNSmlMinChunk)
+		{
+		iChunk.Adjust(KNSmlMinChunk);
+		}
+	else
+		{
+		iChunk.Adjust(dataLen);
+		}
+		
+	RMemWriteStream writeStream( iChunk.Base(), iChunk.Size() );
+	CleanupClosePushL( writeStream );
+	
+	NSmlDmCmdArgHandler::PacketDataL(writeStream,aLuid,aObject,aURI,aType);
+	CleanupStack::PopAndDestroy(); // writeStream
+	TInt ret = KErrNone;
+			
+	if(aLargeItem)
+		{
+		if(iLargeObjectUri)
+			{
+			if(iLargeObjectUri->Compare(aURI)==0)
+				{
+				TIpcArgs args(aAdapterId,aStatusRef,EFalse,&callbackCalled);
+				ret = SendReceive( ENSmlDMExecuteLarge,args);
+				}
+			else
+				{
+				ret = KErrGeneral;
+				}
+			}
+		else
+			{
+			iLargeObjectUri=aURI.AllocL();
+			TIpcArgs args(aAdapterId,aStatusRef,EFalse,&callbackCalled);
+			ret = SendReceive( ENSmlDMExecuteLarge,args);
+			}
+		}
+	else
+		{
+		if(iLargeObjectUri)
+			{
+			delete iLargeObjectUri;
+			iLargeObjectUri=NULL;
+			TIpcArgs args(aAdapterId,aStatusRef,ETrue,&callbackCalled);
+			ret = SendReceive( ENSmlDMExecuteLarge,args);
+			}
+		else
+			{
+			TIpcArgs args(aAdapterId,aStatusRef,0,&callbackCalled);
+			ret = SendReceive( ENSmlDMExecute,args);
+			}
+		}	
+
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+	if(ret!=KErrNone)
+		{
+		iCallback->SetStatusL(aStatusRef,MSmlDmAdapter::EError);
+		}
+	}
+
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::CopyCommandL
+// Sends copy IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::CopyCommandL(const TUint32 aAdapterId,
+	const TDesC8& aTargetLuid,
+	const TDesC8& aTargetURI,
+	const TDesC8& aSourceLuid,
+	const TDesC8& aSourceURI,
+	const TInt32 aStatusRef,
+	const TDesC8& aType)
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	iChunk.Adjust(KNSmlMinChunk);
+		
+	TIpcArgs args(aAdapterId,aStatusRef,0,&callbackCalled);
+	RMemWriteStream writeStream( iChunk.Base(), iChunk.Size() );
+	CleanupClosePushL( writeStream );
+	
+	NSmlDmCmdArgHandler::PacketCopyArgumentsL(writeStream,
+		aTargetLuid,aTargetURI,aSourceLuid,aSourceURI,aType);
+		
+	CleanupStack::PopAndDestroy(); // writeStream
+			
+	TInt ret = SendReceive( ENSmlDMCopy,args);
+
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+	if(ret!=KErrNone)
+		{
+		iCallback->SetStatusL(aStatusRef,MSmlDmAdapter::EError);
+		}
+	}
+
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::DeleteObjectL
+// Sends delete IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::DeleteObjectL(const TUint32 aAdapterId,
+	const TDesC8& aLuid,
+	const TInt32 aStatusRef,
+	const TDesC8& aURI)
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	iChunk.Adjust(KNSmlMinChunk);
+		
+	TIpcArgs args(aAdapterId,aStatusRef,0,&callbackCalled);
+	RMemWriteStream writeStream( iChunk.Base(), iChunk.Size() );
+	CleanupClosePushL( writeStream );
+	
+	NSmlDmCmdArgHandler::PacketDataL(writeStream,
+		aLuid,KNullDesC8,aURI,KNullDesC8);
+		
+	CleanupStack::PopAndDestroy(); // writeStream
+			
+	TInt ret = SendReceive( ENSmlDMDelete,args);
+
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+	if(ret!=KErrNone)
+		{
+		iCallback->SetStatusL(aStatusRef,MSmlDmAdapter::EError);
+		}
+
+	}
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::FetchLeafObjectL
+// Sends fetch IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::FetchLeafObjectL(const TUint32 aAdapterId,
+	const TDesC8& aURI,
+	const TDesC8& aLuid,
+	const TDesC8& aType,
+	const TInt aResultsRef,
+	const TInt aStatusRef )
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	TIpcArgs args(aAdapterId,aStatusRef,aResultsRef,&callbackCalled);
+	iChunk.Adjust(KNSmlMinChunk);
+	RMemWriteStream writeStream( iChunk.Base(), iChunk.Size() );
+	CleanupClosePushL( writeStream );
+	CArrayFixFlat<TSmlDmMappingInfo>* mapArray =
+		new (ELeave) CArrayFixFlat<TSmlDmMappingInfo>(1);
+		
+	CleanupStack::PushL(mapArray);
+	NSmlDmCmdArgHandler::PacketFetchArgumentsL(writeStream,aLuid,
+		aURI,aType,*mapArray);
+		
+	CleanupStack::PopAndDestroy(2); // writeStream,mapArray
+			
+	TInt ret = SendReceive( ENSmlDMFetchLeaf,args);
+
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+	if(ret!=KErrNone)
+		{
+		iCallback->SetStatusL(aStatusRef,MSmlDmAdapter::EError);
+		}
+
+	}
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::FetchLeafObjectSizeL
+// Sends fetch size IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::FetchLeafObjectSizeL(const TUint32 aAdapterId,
+	const TDesC8& aURI,
+	const TDesC8& aLuid,
+	const TDesC8& aType,
+	const TInt aResultsRef,
+	const TInt aStatusRef )
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	TIpcArgs args(aAdapterId,aStatusRef,aResultsRef,&callbackCalled);
+	iChunk.Adjust(KNSmlMinChunk);
+	RMemWriteStream writeStream( iChunk.Base(), iChunk.Size() );
+	CleanupClosePushL( writeStream );
+	CArrayFixFlat<TSmlDmMappingInfo>* mapArray =
+		new (ELeave) CArrayFixFlat<TSmlDmMappingInfo>(1);
+	CleanupStack::PushL(mapArray);
+	
+	NSmlDmCmdArgHandler::PacketFetchArgumentsL(writeStream,aLuid,aURI,
+		aType,*mapArray);
+		
+	CleanupStack::PopAndDestroy(2); // writeStream,mapArray
+			
+	TInt ret = SendReceive( ENSmlDMFetchLeafSize,args);
+
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+	if(ret!=KErrNone)
+		{
+		iCallback->SetStatusL(aStatusRef,MSmlDmAdapter::EError);
+		}
+	}
+
+
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::ChildURIListL
+// Sends child urilist IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::ChildURIListL(const TUint32 aAdapterId,
+	const TDesC8& aURI,
+	const TDesC8& aLuid,
+	const CArrayFixFlat<TSmlDmMappingInfo>& aPreviousURISegmentList,
+	const TInt aResultsRef,const TInt aStatusRef )
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	TIpcArgs args(aAdapterId,aStatusRef,aResultsRef,&callbackCalled);
+	iChunk.Adjust(KNSmlMinChunk);
+	RMemWriteStream writeStream( iChunk.Base(), iChunk.Size() );
+	CleanupClosePushL( writeStream );
+	
+	NSmlDmCmdArgHandler::PacketFetchArgumentsL(writeStream,aLuid,
+		aURI,KNullDesC8,aPreviousURISegmentList);
+		
+	CleanupStack::PopAndDestroy(); // writeStream
+			
+	TInt ret = SendReceive( ENSmlDMChildUriList,args);
+
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+	if(ret!=KErrNone)
+		{
+		iCallback->SetStatusL(aStatusRef,MSmlDmAdapter::EError);
+		}
+	}
+
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::CompleteOutstandingCmdsL
+// Sends CompleteOutstandingCmds IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::CompleteOutstandingCmdsL()
+	{
+   	_DBG_FILE("CNSmlDmDDF::CompleteOutstandingCmdsL():begin");
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	TIpcArgs args(0,0,0,&callbackCalled);
+	SendReceive( ENSmlDMCompleteCommands,args);
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+   	_DBG_FILE("CNSmlDmDDF::CompleteOutstandingCmdsL():end");
+	}
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::MoreDataL
+// Sends get more data IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::MoreDataL(CBufBase*& aData)
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	TIpcArgs args(0,0,0,&callbackCalled);
+	SendReceive( ENSmlDMGetMore,args);
+	RMemReadStream readStream( iChunk.Base(), iChunk.Size() );
+	CleanupClosePushL( readStream );
+			
+	RPointerArray<CNSmlDmResultElement> resultArray;
+	CleanupStack::PushL ( PtrArrCleanupItemRArr ( CNSmlDmResultElement, &resultArray ) );
+
+	NSmlDmCmdArgHandler::ParseResultsL(readStream,resultArray);
+	
+
+	RBufWriteStream writeStream(*aData,aData->Size());
+	CleanupClosePushL(writeStream);
+	
+	if(resultArray.Count()>0)
+		{
+		writeStream.WriteL(resultArray[0]->iResult->Ptr(0),
+			resultArray[0]->iResult->Size());
+		}
+	CleanupStack::PopAndDestroy(3); //writeStream, readStream, resultArray
+	}
+
+
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::StartAtomicL
+// Sends start atomic IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::StartAtomicL()
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	TIpcArgs args(0,0,0,&callbackCalled);
+	SendReceive( ENSmlDMStartAtomic,args);
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+
+	}
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::CommitAtomicL
+// Sends commit atomic IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::CommitAtomicL()
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	TIpcArgs args(0,0,0,&callbackCalled);
+	SendReceive( ENSmlDMCommitAtomic,args);
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+	}
+
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::RollbackAtomic
+// Sends rollback atomic IPC call to SyncML DM Host Servers.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::RollbackAtomicL()
+	{
+	TPckgBuf<TNSmlDmHostCallbackType> callbackCalled;
+	TIpcArgs args(0,0,0,&callbackCalled);
+	SendReceive( ENSmlDMRollbackAtomic,args);
+	TNSmlDmHostCallbackType callbackType = callbackCalled();
+	if(callbackType!=ENSmlDmCallbackNone)
+		{
+		HandleCallbacksL(callbackType);
+		}
+	}
+
+// FOTA
+// ------------------------------------------------------------------------------------------------
+// RNSmlDMDataSession::MarkGenAlertsSent()
+// 	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.
+//  In this function a request is issued as an IPC call.
+// ------------------------------------------------------------------------------------------------
+void RNSmlDMDataSession::MarkGenAlertsSent()
+	{
+	SendReceive ( ENSmlDMGenericAlertsSent,TIpcArgs ( TIpcArgs::ENothing ) );
+	}
+
+
+void RNSmlDMDataSession::MarkGenAlertsSent(const TDesC8 &aURI)
+	{
+	
+	_DBG_FILE(" RNSmlDMDataSession::MarkGenAlertsSent calling with the URI ");
+	SendReceive ( ENSmlDMGenericAlertsSent,TIpcArgs ( &aURI ) );
+	}
+// FOTA end