diff -r 000000000000 -r b497e44ab2fc syncmlfw/common/sosserver/src/NSmlTask.cpp --- /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* filterArray; + + // Initialize data providers. + RArray idArray; + RArray 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* aFilterArray ) +// -------------------------------------------------------------------------- +// +void CNSmlTask::PackFilterArrayL( RPointerArray& 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 idArray; + RArray 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* filterArray = new ( ELeave ) RPointerArray(); + 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 dbCaps; + CArrayFix* filterInfoArr = new (ELeave) CArrayFixFlat (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(); + }