syncmlfw/common/sosserver/src/NSmlTask.cpp
changeset 0 b497e44ab2fc
child 16 915074efc433
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/common/sosserver/src/NSmlTask.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,449 @@
+/*
+* Copyright (c) 2004 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:  Symbian OS Server source.
+*
+*/
+
+
+#include "nsmlagentlog.h"
+#include "nsmlsosserver.h"
+#include "nsmldshostclient.h"
+
+// --------------------------------------------------------------------------
+// CNSmlTask::CNSmlTask( const TInt aProfId, TBool aNewTask )
+// --------------------------------------------------------------------------
+//
+CNSmlTask::CNSmlTask( const TInt aProfId, TBool aNewTask, CNSmlSOSSession& aSession) 
+: iProfId(aProfId), iCreatingNew(aNewTask), iSession(aSession), iDataPtr(NULL, 0, 0), iFilterBufPtr(NULL, 0, 0) 
+    {    
+    }
+
+// --------------------------------------------------------------------------
+// CNSmlTask::~CNSmlTask()
+// --------------------------------------------------------------------------
+//
+CNSmlTask::~CNSmlTask()
+    {
+    delete iBuffer;
+   	delete iFilterBuffer;
+    }
+
+// --------------------------------------------------------------------------
+// void CNSmlTask::SetDataProviderId(  const TInt aTaskUID )
+// --------------------------------------------------------------------------
+//
+void CNSmlTask::SetDataProviderId(  const TInt aTaskUID )
+    {
+    iTaskUID = aTaskUID;
+    }
+
+
+// --------------------------------------------------------------------------
+// void CNSmlTask::SetCreatorId( const TInt aCreatorId )
+// --------------------------------------------------------------------------
+//
+void CNSmlTask::SetCreatorId( const TInt aCreatorId )
+    {
+    iCreatorId = aCreatorId;
+    }
+
+// --------------------------------------------------------------------------
+// TInt CNSmlTask::FetchDataL( const TInt aTaskId )
+// --------------------------------------------------------------------------
+//
+TInt CNSmlTask::FetchDataL( const TInt aTaskId )
+    {
+    TInt ret(KErrNotFound);
+    CNSmlDSProfile* prof = iSession.DSSettings().ProfileL( iProfId );
+    if ( prof )
+        {
+        CleanupStack::PushL(prof);
+
+        CNSmlDSContentType* ctype = prof->ContentTypeId( aTaskId ); // Table id used when fetching data.
+        // content type is deleted in CNSmlDSProfile destructor.
+        if ( ctype )
+            {
+            TInt namelen = ctype->StrValue( EDSAdapterDisplayName ).Size();
+            TInt rdblen =  ctype->StrValue( EDSAdapterServerDataSource ).Size();
+            TInt ldblen =  ctype->StrValue( EDSAdapterClientDataSource ).Size();
+            
+            CBufFlat* buffer = CBufFlat::NewL( KDefaultNSmlBufferGranularity );
+	        CleanupStack::PushL( buffer );
+	        RBufWriteStream stream( *buffer );  
+	        
+            CleanupClosePushL(stream);
+
+            stream.WriteInt32L( rdblen );
+            stream << ctype->StrValue( EDSAdapterServerDataSource );
+            stream.WriteInt32L( ldblen );
+            stream << ctype->StrValue( EDSAdapterClientDataSource );
+
+			iTaskUID = ctype->IntValue( EDSAdapterImplementationId );
+            stream.WriteInt32L( iTaskUID );
+                        
+            stream.WriteInt8L( ctype->IntValue( EDSAdapterEnabled ) );
+            stream.WriteInt32L( ctype->IntValue( EDSAdapterCreatorId ));
+
+            stream.WriteInt32L( namelen );
+            stream << ctype->StrValue( EDSAdapterDisplayName );
+
+            stream.WriteInt8L( ctype->IntValue( EDSAdapterSyncType ) );
+
+            CleanupStack::PopAndDestroy(&stream);
+            
+            delete iBuffer;
+	        iBuffer = buffer;
+	        CleanupStack::Pop( buffer );    
+	            
+            ret = KErrNone;
+            }
+        CleanupStack::PopAndDestroy(prof);
+        }
+    return ret;
+    }
+
+// --------------------------------------------------------------------------
+// TInt CNSmlTask::DataSize()
+// --------------------------------------------------------------------------
+//
+TInt CNSmlTask::DataSize()
+    {
+    return iBuffer->Size();
+    }
+
+// --------------------------------------------------------------------------
+// const TPtr8& CNSmlTask::ReadData()
+// --------------------------------------------------------------------------
+//
+const TPtr8& CNSmlTask::ReadData()
+    {
+    if ( iBuffer )
+        {
+        iDataPtr.Set( iBuffer->Ptr(0) );    
+        }    
+    return iDataPtr;
+    }
+
+// --------------------------------------------------------------------------
+// TInt CNSmlTask::FilterSize()
+// --------------------------------------------------------------------------
+//
+TInt CNSmlTask::FilterSize()
+    {
+    if ( iFilterBuffer )
+        {
+        return iFilterBuffer->Size();    
+        }
+    return 0;
+    }
+
+// --------------------------------------------------------------------------
+// const TPtr8& CNSmlTask::ReadFilter()
+// --------------------------------------------------------------------------
+//
+const TPtr8& CNSmlTask::ReadFilter()
+    {
+    if ( iFilterBuffer )
+        {
+        iFilterBufPtr.Set(iFilterBuffer->Ptr(0));    
+        }    
+    return iFilterBufPtr;
+    }
+    
+// --------------------------------------------------------------------------
+// TInt CNSmlTask::UpdateDataL( TInt& aId, const TDesC8& aData )
+// --------------------------------------------------------------------------
+//
+TInt CNSmlTask::UpdateDataL( TInt& aId, const TDesC8& aData )
+    {
+    CNSmlDSProfile* prof = iSession.DSSettings().ProfileL( iProfId );
+    CleanupStack::PushL(prof);
+   
+    RDesReadStream stream;
+    stream.Open(aData);
+    CleanupClosePushL(stream);
+   
+    TInt maxlen(0);
+
+    maxlen = stream.ReadInt32L();
+    HBufC* serverDS = HBufC::NewLC( stream, maxlen );
+
+    maxlen = stream.ReadInt32L();
+    HBufC* clientDS = HBufC::NewLC( stream, maxlen );
+
+    CNSmlDSContentType* ctype;
+
+    if ( iCreatingNew )
+        {
+        ctype = prof->AddContentTypeL( iTaskUID, *clientDS, *serverDS ); // Implementation UID used when creating/updating task.
+    
+        if ( !ctype )
+        	{
+        	User::Leave( KErrAlreadyExists);
+        	}
+        }
+    else
+        {
+        ctype = prof->ContentType( iTaskUID );
+    
+        if ( !ctype )
+        	{
+        	User::Leave( KErrNotFound );
+        	}
+        }
+        
+    // Save profile to create id for a new task.
+    TInt ret = prof->SaveL();
+    
+    CleanupStack::PopAndDestroy(clientDS);
+    CleanupStack::PopAndDestroy(serverDS);
+ 
+    User::LeaveIfError( ret );
+ 
+    ctype->SetIntValue( EDSAdapterEnabled, stream.ReadInt8L() );
+	ctype->SetIntValue( EDSAdapterCreatorId, stream.ReadInt32L() );
+
+    maxlen = stream.ReadInt32L();
+    ctype->SetStrValue( EDSAdapterDisplayName, HBufC::NewLC(stream,maxlen)->Des() );    
+    CleanupStack::PopAndDestroy(); // display name
+
+    ctype->SetIntValue( EDSAdapterSyncType, stream.ReadInt8L() );
+    
+    ctype->SetIntValue( EDSAdapterFilterMatchType, stream.ReadInt8L() );    
+    
+    if ( (TSmlProtocolVersion)prof->IntValue( EDSProfileProtocolVersion ) == ESmlVersion1_2 )  
+    	{
+    	maxlen = stream.ReadInt32L();
+	    RWriteStream filterStream = ctype->FilterWriteStreamL();
+	    CleanupClosePushL(filterStream);
+	    
+	    filterStream.WriteInt32L(stream.ReadInt32L());
+
+	    if ( maxlen )
+	    	{
+	    	filterStream.WriteL( stream );
+	    	}
+	            
+	    CleanupStack::PopAndDestroy(&filterStream);
+	    ctype->WriteStreamCommitL();
+    	}
+
+    ret = prof->SaveL();
+
+    aId = ctype->IntValue( EDSAdapterTableId );
+
+    CleanupStack::PopAndDestroy(&stream);
+    CleanupStack::PopAndDestroy(prof);
+
+    return ret;
+    }
+    
+// --------------------------------------------------------------------------
+// TInt CNSmlTask::GetSupportedFiltersL()
+// --------------------------------------------------------------------------
+//        
+TInt CNSmlTask::GetSupportedFiltersL()
+	{
+    CNSmlDSHostClient& dsClient = iSession.HostClient();    
+    
+    TInt resultCode(0);
+    TSyncMLFilterMatchType matchType = ESyncMLMatchDisabled;
+    TSyncMLFilterChangeInfo changeInfo = ESyncMLDefault;
+
+	RPointerArray<CSyncMLFilter>* filterArray;
+	
+	// Initialize data providers.
+    RArray<TInt> idArray;
+    RArray<TInt> resultArray;
+    CleanupClosePushL(resultArray);
+    CleanupClosePushL(idArray);
+    idArray.AppendL(iTaskUID);
+    
+    dsClient.CreateDataProvidersL( idArray, resultArray );
+
+    TInt res = resultArray[0];
+    User::LeaveIfError( res );
+
+    CleanupStack::PopAndDestroy(&idArray);
+    CleanupStack::PopAndDestroy(&resultArray);
+	
+	filterArray = dsClient.SupportedServerFiltersL( iTaskUID, matchType, changeInfo, resultCode );
+
+	if ( filterArray )
+		{
+		CleanupStack::PushL(filterArray);
+		PackFilterArrayL( *filterArray, (TInt)matchType, (TInt)changeInfo );
+		filterArray->ResetAndDestroy();
+		CleanupStack::PopAndDestroy(filterArray);
+		}
+	else // No filters, write NULL values to the filter buffer.
+		{
+		    
+		CBufFlat* filterBuffer = CBufFlat::NewL( KDefaultNSmlBufferGranularity );
+	    CleanupStack::PushL( filterBuffer );
+	    RBufWriteStream stream( *filterBuffer );  
+	            
+	    CleanupClosePushL(stream);
+	    
+	    stream.WriteInt8L( changeInfo );
+	    stream.WriteInt8L( matchType );
+	    stream.WriteInt32L( 0 ); // filter count
+
+		CleanupStack::PopAndDestroy(&stream);		
+		
+		delete iFilterBuffer;
+	    iFilterBuffer = filterBuffer;
+	    CleanupStack::Pop( filterBuffer );    
+		}		
+
+	return resultCode;
+	}
+	
+// --------------------------------------------------------------------------
+// void CNSmlTask::PackFilterArrayL( RPointerArray<CSyncMLFilter>* aFilterArray )
+// --------------------------------------------------------------------------
+// 	
+void CNSmlTask::PackFilterArrayL( RPointerArray<CSyncMLFilter>& aFilterArray, TInt aMatchType, TInt aChangeInfo )
+	{
+	TInt count = aFilterArray.Count();
+
+    CBufFlat* filterBuffer = CBufFlat::NewL( KDefaultNSmlBufferGranularity );
+	CleanupStack::PushL( filterBuffer );
+	RBufWriteStream stream( *filterBuffer );  
+    CleanupClosePushL(stream);
+    
+    stream.WriteInt8L( aChangeInfo );
+    stream.WriteInt8L( aMatchType );
+    
+    stream.WriteInt32L( count );
+
+	for ( TInt i = 0 ; i < count ; i++ )
+		{
+		aFilterArray[i]->ExternalizeL( stream );
+ 		}
+
+	CleanupStack::PopAndDestroy(&stream);
+	delete iFilterBuffer;
+	iFilterBuffer = filterBuffer;
+	CleanupStack::Pop( filterBuffer );  
+	}	
+
+// --------------------------------------------------------------------------
+// void CNSmlTask::PrepareFilterBufferL()
+// --------------------------------------------------------------------------
+// 
+TInt CNSmlTask::PrepareFilterBufferL( const TInt aTaskId )
+    {    
+    CNSmlDSProfile* prof = iSession.DSSettings().ProfileL( iProfId );
+    if ( prof )
+        {
+        CleanupStack::PushL(prof);
+
+        CNSmlDSContentType* ctype = prof->ContentTypeId( aTaskId ); // Table id used when fetching data.
+        // content type is deleted in CNSmlDSProfile destructor.
+        if ( ctype )
+            {                                        
+			TSyncMLFilterMatchType matchType(ESyncMLMatchDisabled);
+			TSyncMLFilterChangeInfo changeInfo(ESyncMLDefault);			
+			
+    		TInt resultCode(0);
+    		
+    		// Initialize data providers.
+    		RArray<TInt> idArray;
+    		RArray<TInt> resultArray;
+    		CleanupClosePushL(resultArray);
+    		CleanupClosePushL(idArray);
+		    idArray.AppendL(iTaskUID);
+            
+    		iSession.HostClient().CreateDataProvidersL( idArray, resultArray );
+            
+    		TInt res = resultArray[0];
+    		User::LeaveIfError( res );
+
+    		CleanupStack::PopAndDestroy(&idArray);
+    		CleanupStack::PopAndDestroy(&resultArray);
+
+			// Filters
+			RReadStream filterStream = ctype->FilterReadStreamL();
+			CleanupClosePushL( filterStream );
+			RPointerArray<CSyncMLFilter>* filterArray = new ( ELeave ) RPointerArray<CSyncMLFilter>();
+			CleanupStack::PushL( filterArray );
+			TInt count(0);
+			TRAPD(error, count = filterStream.ReadInt32L() );
+			if ( error == KErrNone )
+				{
+				for ( TInt i(0) ; i < count ; i++ )
+					{
+					filterArray->AppendL( CSyncMLFilter::NewLC( filterStream ) );
+					CleanupStack::Pop();
+					}
+				}
+			else if ( prof->IntValue( EDSProfileProtocolVersion ) == ESmlVersion1_2 )
+				{
+				CleanupStack::Pop(); // filterArray;
+				filterArray->ResetAndDestroy();
+				delete filterArray;
+				filterArray = iSession.HostClient().SupportedServerFiltersL( iTaskUID, matchType, changeInfo, resultCode );				
+				CleanupStack::PushL( filterArray );
+				}
+		    
+			iSession.HostClient().CheckServerFiltersL( iTaskUID, *filterArray, changeInfo, resultCode );
+			
+            CNSmlDSAgentLog* agentLog = CNSmlDSAgentLog::NewLC();
+						
+			TRAPD( err, agentLog->SetAgentLogKeyL( iTaskUID, 
+									   			   ctype->StrValue( EDSAdapterClientDataSource ),
+									               prof->StrValue( EDSProfileServerId ),
+									               ctype->StrValue( EDSAdapterServerDataSource ) ) );
+            
+            if ( err == KErrNone )
+				{
+				RPointerArray<CNSmlDbCaps> dbCaps;
+				CArrayFix<TNSmlFilterCapData>* filterInfoArr = new (ELeave) CArrayFixFlat<TNSmlFilterCapData> (1);
+							
+				agentLog->GetServerDeviceInfoL( dbCaps );				
+				CleanupClosePushL( dbCaps );
+				
+				agentLog->GetServerFilterInfoL( filterInfoArr );				
+				CleanupStack::PushL( filterInfoArr );			
+				
+				CNSmlDbCaps* dbCapab = NULL;
+				if ( dbCaps.Count() )
+					{
+					dbCapab = dbCaps[0];	
+					// Send arrays to the data provider for update.					
+					iSession.HostClient().CheckSupportedServerFiltersL( iTaskUID, *dbCapab, *filterInfoArr, *filterArray, changeInfo, resultCode );				
+					}								
+								
+				// Read updated array.				
+				PackFilterArrayL( *filterArray, ctype->IntValue( EDSAdapterFilterMatchType ), (TInt) changeInfo );
+				
+				CleanupStack::PopAndDestroy(filterInfoArr);
+            	CleanupStack::PopAndDestroy(&dbCaps);	
+				}
+				
+            CleanupStack::PopAndDestroy(agentLog);
+            
+            filterArray->ResetAndDestroy();            
+			CleanupStack::PopAndDestroy(filterArray);            	
+            CleanupStack::PopAndDestroy(&filterStream);            
+            }
+        else
+            {
+            GetSupportedFiltersL();    
+            }
+        CleanupStack::PopAndDestroy(prof);
+        }
+    return FilterSize();
+    }