--- /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