--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/common/sosserver_clientapi/src/NSmlDSClientAPI.cpp Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,1181 @@
+/*
+* 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: Implementation of DS specific client api.
+*
+*/
+
+
+#include <s32mem.h>
+#include <SyncMLClientDS.h>
+#include <nsmldebug.h>
+
+#include "NSmlClientAPIUtils.h"
+#include "nsmlsosserverdefs.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+//
+// RSyncMLDataSyncJob
+//
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::RSyncMLDataSyncJob()
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RSyncMLDataSyncJob::RSyncMLDataSyncJob()
+ : RSyncMLJobBase()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::CreateL()
+// Creates DS job.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncJob::CreateL( RSyncMLSession& aSession, TSmlProfileId aProfileId )
+ {
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL() ECmdDataSyncJobCreateForProfile: begin");
+
+ // check that job is not yet open and ds sync is supported
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+ NSmlClientAPIFeatureHandler::LeaveIfDataSyncNotSupportedL();
+
+ CDataSyncJobSessionData* data = new (ELeave) CDataSyncJobSessionData();
+ CleanupStack::PushL( data );
+
+ // add profile id to parameters and write the buffer
+ data->AddParamL( aProfileId );
+ data->WriteIntegersToBufferL();
+
+ TPtr8 dataPtr = data->DataBufferPtr();
+ TPckgBuf<TInt> jobId;
+ TIpcArgs args( &jobId, &dataPtr );
+
+ // open the sub-session
+ User::LeaveIfError( CreateSubSession( aSession, ECmdDataSyncJobCreateForProfile, args ) );
+
+ data->SetProfile( aProfileId );
+ data->SetIdentifier( jobId() );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::CreateL()
+// Creates DS job, transport override.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncJob::CreateL( RSyncMLSession& aSession, TSmlProfileId aProfileId, TSmlConnectionId aTransportId )
+ {
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL() ECmdDataSyncJobCreateForTransport: begin");
+
+ // check that job is not yet open and ds sync is supported
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+ NSmlClientAPIFeatureHandler::LeaveIfDataSyncNotSupportedL();
+
+ CDataSyncJobSessionData* data = new (ELeave) CDataSyncJobSessionData();
+ CleanupStack::PushL( data );
+
+ // add ids to parameters and write the buffer
+ data->AddParamL( aProfileId );
+ data->AddParamL( aTransportId );
+ data->WriteIntegersToBufferL();
+
+ TPtr8 dataPtr = data->DataBufferPtr();
+ TPckgBuf<TInt> jobId;
+ TIpcArgs args( &jobId, &dataPtr );
+
+ // open the sub-session
+ User::LeaveIfError( CreateSubSession( aSession, ECmdDataSyncJobCreateForTransport, args ) );
+
+ data->SetProfile( aProfileId );
+ data->SetIdentifier( jobId() );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::CreateL()
+// Creates DS job, sync type override.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncJob::CreateL( RSyncMLSession& aSession, TSmlProfileId aProfileId, TSmlSyncType aSyncType )
+ {
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL() ECmdDataSyncJobCreateForProfileST: begin");
+
+ // check that job is not yet open and ds sync is supported
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+ NSmlClientAPIFeatureHandler::LeaveIfDataSyncNotSupportedL();
+
+ CDataSyncJobSessionData* data = new (ELeave) CDataSyncJobSessionData();
+ CleanupStack::PushL( data );
+
+ // add ids to parameters and write the buffer
+ data->AddParamL( aProfileId );
+ data->AddParamL( aSyncType );
+ data->WriteIntegersToBufferL();
+
+ TPtr8 dataPtr = data->DataBufferPtr();
+ TPckgBuf<TInt> jobId;
+ TIpcArgs args( &jobId, &dataPtr );
+
+ // open the sub-session
+ User::LeaveIfError( CreateSubSession( aSession, ECmdDataSyncJobCreateForProfileST, args ) );
+
+ data->SetProfile( aProfileId );
+ data->SetIdentifier( jobId() );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::CreateL()
+// Creates DS job, transport + sync type override.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncJob::CreateL( RSyncMLSession& aSession, TSmlProfileId aProfileId, TSmlConnectionId aTransportId, TSmlSyncType aSyncType )
+ {
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL() ECmdDataSyncJobCreateForTransportST: begin");
+
+ // check that job is not yet open and ds sync is supported
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+ NSmlClientAPIFeatureHandler::LeaveIfDataSyncNotSupportedL();
+
+ CDataSyncJobSessionData* data = new (ELeave) CDataSyncJobSessionData();
+ CleanupStack::PushL( data );
+
+ // add ids to parameters and write the buffer
+ data->AddParamL( aProfileId );
+ data->AddParamL( aTransportId );
+ data->AddParamL( aSyncType );
+ data->WriteIntegersToBufferL();
+
+ TPtr8 dataPtr = data->DataBufferPtr();
+ TPckgBuf<TInt> jobId;
+ TIpcArgs args( &jobId, &dataPtr );
+
+ // open the sub-session
+ User::LeaveIfError( CreateSubSession( aSession, ECmdDataSyncJobCreateForTransportST, args ) );
+
+ data->SetProfile( aProfileId );
+ data->SetIdentifier( jobId() );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::CreateL()
+// Creates DS job, tasks override.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncJob::CreateL( RSyncMLSession& aSession, TSmlProfileId aProfileId, const RArray<TSmlTaskId>& aTasks )
+ {
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL() ECmdDataSyncJobCreateForTasks: begin");
+
+ // check that job is not yet open and ds sync is supported
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+ NSmlClientAPIFeatureHandler::LeaveIfDataSyncNotSupportedL();
+
+ CDataSyncJobSessionData* data = new (ELeave) CDataSyncJobSessionData();
+ CleanupStack::PushL( data );
+
+ // add ids to parameters and write the buffer
+ data->AddParamL( aProfileId );
+ data->WriteIntegersToBufferL( &aTasks );
+
+ TPtr8 dataPtr = data->DataBufferPtr();
+ TPckgBuf<TInt> jobId;
+ TIpcArgs args( &jobId, &dataPtr );
+
+ // open the sub-session
+ User::LeaveIfError( CreateSubSession( aSession, ECmdDataSyncJobCreateForTasks, args ) );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup
+
+ data->SetProfile( aProfileId );
+ data->SetIdentifier( jobId() );
+ data->SetTasksL( aTasks );
+
+ CleanupStack::Pop(); // this
+
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::CreateL()
+// Creates DS job, transport + tasks override.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncJob::CreateL( RSyncMLSession& aSession, TSmlProfileId aProfileId, TSmlConnectionId aTransportId, const RArray<TSmlTaskId>& aTasks )
+ {
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL() ECmdDataSyncJobCreateForTransportAndTasks: begin");
+
+ // check that job is not yet open and ds sync is supported
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+ NSmlClientAPIFeatureHandler::LeaveIfDataSyncNotSupportedL();
+
+ CDataSyncJobSessionData* data = new (ELeave) CDataSyncJobSessionData();
+ CleanupStack::PushL( data );
+
+ // add ids to parameters and write the buffer
+ data->AddParamL( aProfileId );
+ data->AddParamL( aTransportId );
+ data->WriteIntegersToBufferL( &aTasks );
+
+ TPtr8 dataPtr = data->DataBufferPtr();
+ TPckgBuf<TInt> jobId;
+ TIpcArgs args( &jobId, &dataPtr );
+
+ // open the sub-session
+ User::LeaveIfError( CreateSubSession( aSession, ECmdDataSyncJobCreateForTransportAndTasks, args ) );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup
+
+ data->SetProfile( aProfileId );
+ data->SetIdentifier( jobId() );
+ data->SetTasksL( aTasks );
+
+ CleanupStack::Pop(); // this
+
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::CreateL()
+// Creates DS job, sync type + tasks override.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncJob::CreateL( RSyncMLSession& aSession, TSmlProfileId aProfileId, TSmlSyncType aSyncType, const RArray<TSmlTaskId>& aTasks )
+ {
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL() ECmdDataSyncJobCreateForTasksST: begin");
+
+ // check that job is not yet open and ds sync is supported
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+ NSmlClientAPIFeatureHandler::LeaveIfDataSyncNotSupportedL();
+
+ CDataSyncJobSessionData* data = new (ELeave) CDataSyncJobSessionData();
+ CleanupStack::PushL( data );
+
+ // add ids to parameters and write the buffer
+ data->AddParamL( aProfileId );
+ data->AddParamL( aSyncType );
+ data->WriteIntegersToBufferL( &aTasks );
+
+ TPtr8 dataPtr = data->DataBufferPtr();
+ TPckgBuf<TInt> jobId;
+ TIpcArgs args( &jobId, &dataPtr );
+
+ // open the sub-session
+ User::LeaveIfError( CreateSubSession( aSession, ECmdDataSyncJobCreateForTasksST, args ) );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup
+
+ data->SetProfile( aProfileId );
+ data->SetIdentifier( jobId() );
+ data->SetTasksL( aTasks );
+
+ CleanupStack::Pop(); // this
+
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::CreateL()
+// Creates DS job, transport + sync type + tasks override.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncJob::CreateL( RSyncMLSession& aSession, TSmlProfileId aProfileId, TSmlConnectionId aTransportId, TSmlSyncType aSyncType, const RArray<TSmlTaskId>& aTasks )
+ {
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL() ECmdDataSyncJobCreateForTransportAndTasksST: begin");
+
+ // check that job is not yet open and ds sync is supported
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+ NSmlClientAPIFeatureHandler::LeaveIfDataSyncNotSupportedL();
+
+ CDataSyncJobSessionData* data = new (ELeave) CDataSyncJobSessionData();
+ CleanupStack::PushL( data );
+
+ // add ids to parameters and write the buffer
+ data->AddParamL( aProfileId );
+ data->AddParamL( aTransportId );
+ data->AddParamL( aSyncType );
+ data->WriteIntegersToBufferL( &aTasks );
+
+ TPtr8 dataPtr = data->DataBufferPtr();
+ TPckgBuf<TInt> jobId;
+ TIpcArgs args( &jobId, &dataPtr );
+
+ // open the sub-session
+ User::LeaveIfError( CreateSubSession( aSession, ECmdDataSyncJobCreateForTransportAndTasksST, args ) );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup
+
+ data->SetProfile( aProfileId );
+ data->SetIdentifier( jobId() );
+ data->SetTasksL( aTasks );
+
+ CleanupStack::Pop(); // this
+
+ _DBG_FILE("RSyncMLDataSyncJob::CreateL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::OpenL()
+// Opens a job currently in servers job queue. If not found, leaves with
+// KErrNotFound.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncJob::OpenL( RSyncMLSession& aSession, TSmlJobId aJobId )
+ {
+ _DBG_FILE("RSyncMLDataSyncJob::OpenL(): begin");
+
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+
+ CDataSyncJobSessionData* data = new (ELeave) CDataSyncJobSessionData();
+ CleanupStack::PushL( data );
+
+ // open the sub-session and get size of data to be received
+ TPckgBuf<TInt> dataSize;
+ TIpcArgs args( &dataSize, aJobId );
+ User::LeaveIfError( CreateSubSession( aSession, ECmdJobOpen, args ) );
+
+ data->SetIdentifier( aJobId );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup
+
+ // get the data: the profile id and list of task ids
+ GetJobL( dataSize(), EFalse );
+
+ CleanupStack::Pop(); // this
+
+ _DBG_FILE("RSyncMLDataSyncJob::OpenL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::StopL()
+// If this job has started to execute in server, it is stopped and an
+// event is emitted. If the job is still in job queue, it is merely
+// removed from the queue. If not found, leaves with KErrNotFound.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncJob::StopL()
+ {
+ _DBG_FILE("RSyncMLDataSyncJob::StopL(): begin");
+
+ TInt jobId = Identifier();
+ TIpcArgs args( jobId );
+ User::LeaveIfError( SendReceive( ECmdJobStop, args ) );
+
+ _DBG_FILE("RSyncMLDataSyncJob::StopL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncJob::TaskIDs()
+// Returns the task id associated with this job (if given in CreateL).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const RArray<TSmlTaskId>& RSyncMLDataSyncJob::TaskIDs() const
+ {
+ return static_cast<CDataSyncJobSessionData*>(iData)->TaskIds();
+ }
+
+
+//
+// RSyncMLDataSyncProfile
+//
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncProfile::RSyncMLDataSyncProfile()
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RSyncMLDataSyncProfile::RSyncMLDataSyncProfile()
+ : RSyncMLProfileBase()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncProfile::CreateL()
+// Opens a sub-session to server and creates a new profile
+// to server side.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncProfile::CreateL( RSyncMLSession& aSession )
+ {
+ _DBG_FILE("RSyncMLDataSyncProfile::CreateL(): begin");
+
+ // check that profile is not yet open and ds sync is supported
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+ NSmlClientAPIFeatureHandler::LeaveIfDataSyncNotSupportedL();
+
+ CDataSyncProfileSessionData* data = CDataSyncProfileSessionData::NewLC( ETrue );
+
+ // create sub-session and new profile
+ User::LeaveIfError( CreateSubSession( aSession, ECmdProfileCreateDS ) );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ _DBG_FILE("RSyncMLDataSyncProfile::CreateL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncProfile::OpenL()
+// Opens a sub-session to server to an existing profile and
+// gets the profile's data to iData.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncProfile::OpenL( RSyncMLSession& aSession, TSmlProfileId aProfileId, TSmlOpenMode aOpenMode )
+ {
+ _DBG_FILE("RSyncMLDataSyncProfile::OpenL(): begin");
+
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+
+ CDataSyncProfileSessionData* data = CDataSyncProfileSessionData::NewLC();
+
+ TPckgBuf<TInt> dataSize;
+ TIpcArgs args( &dataSize, aProfileId, aOpenMode );
+
+ // open the sub-session
+ User::LeaveIfError( CreateSubSession( aSession, ECmdProfileOpenDS, args ) );
+
+ data->SetIdentifier( aProfileId );
+ data->SetOpenMode( (TSmlOpenMode)aOpenMode );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup
+
+ // dataSize contains now the size of the data buffer that is received next -> get data
+ GetProfileL( dataSize() );
+
+ CleanupStack::Pop(); // this
+
+ _DBG_FILE("RSyncMLDataSyncProfile::OpenL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncProfile::SetCreatorId()
+// Sets creator id.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncProfile::SetCreatorId( TSmlCreatorId aCreatorId )
+ {
+ RSyncMLProfileBase::SetCreatorId( aCreatorId );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncProfile::SetDisplayNameL()
+// Sets display name for this profile.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncProfile::SetDisplayNameL( const TDesC& aDisplayName )
+ {
+ RSyncMLProfileBase::SetDisplayNameL( aDisplayName );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncProfile::SetUserNameL()
+// Sets user name.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncProfile::SetUserNameL( const TDesC8& aUserName )
+ {
+ RSyncMLProfileBase::SetUserNameL( aUserName );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncProfile::SetPasswordL()
+// Sets password.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncProfile::SetPasswordL( const TDesC8& aPassword )
+ {
+ RSyncMLProfileBase::SetPasswordL( aPassword );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncProfile::DeleteConnectionL()
+// Not supported (only one connection per profile).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncProfile::DeleteConnectionL( TSmlTransportId aTransportId )
+ {
+ RSyncMLProfileBase::DeleteConnectionL( aTransportId );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncProfile::ListTasksL()
+// Lists tasks associated with this profile.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncProfile::ListTasksL( RArray<TSmlTaskId>& aArray ) const
+ {
+ _DBG_FILE("RSyncMLDataSyncProfile::ListTasksL(): begin");
+
+ ReceiveArrayL( aArray, ECmdTaskListStart, ECmdTaskListNext );
+
+ _DBG_FILE("RSyncMLDataSyncProfile::ListTasksL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncProfile::DeleteTaskL()
+// Deletes given task.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncProfile::DeleteTaskL( TSmlTaskId aTaskId )
+ {
+ _DBG_FILE("RSyncMLDataSyncProfile::DeleteTaskL(): begin");
+
+ TIpcArgs args( aTaskId );
+ User::LeaveIfError( SendReceive( ECmdTaskDelete, args ) );
+
+ _DBG_FILE("RSyncMLDataSyncProfile::DeleteTaskL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataSyncProfile::UpdateL()
+// Sends profile data to server -> data updated.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataSyncProfile::UpdateL()
+ {
+ RSyncMLProfileBase::UpdateL();
+ }
+
+
+//
+// RSyncMLTask
+//
+
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::RSyncMLTask()
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RSyncMLTask::RSyncMLTask()
+ : iData( NULL )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::CreateL()
+// Creates new task for given profile.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLTask::CreateL( RSyncMLDataSyncProfile& aProfile, TSmlDataProviderId aDataProviderId,
+ const TDesC& aServerDataSource, const TDesC& aClientDataSource )
+ {
+ _DBG_FILE("RSyncMLTask::CreateL(): begin");
+
+ // check that we're allowed to write
+ if ( aProfile.IsReadOnly() )
+ {
+ User::Leave( KErrLocked );
+ }
+
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+
+ TIpcArgs args( aProfile.Identifier(), aDataProviderId );
+
+ // create sub-session and new task
+ RSessionBase session = static_cast<RSessionBase>( aProfile.Session() );
+ User::LeaveIfError( CreateSubSession( session, ECmdCreateTask, args ) );
+
+ CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup
+
+ iData = CTaskSessionData::NewL( ETrue );
+ static_cast<CTaskSessionData*>(iData)->SetProfile( aProfile.Identifier() );
+ static_cast<CTaskSessionData*>(iData)->SetDataProvider( aDataProviderId );
+ static_cast<CTaskSessionData*>(iData)->SetServerDataSourceL( aServerDataSource );
+ static_cast<CTaskSessionData*>(iData)->SetClientDataSourceL( aClientDataSource );
+
+ CleanupStack::Pop(); // this
+
+ _DBG_FILE("RSyncMLTask::CreateL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::CreateL()
+// Creates new task. Filters are copied.
+// Ownership is moved from caller.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLTask::CreateL( RSyncMLDataSyncProfile& aProfile, TSmlDataProviderId aDataProviderId,
+ const TDesC& aServerDataSource, const TDesC& aClientDataSource,
+ RPointerArray<CSyncMLFilter>& aFilterArray )
+ {
+ _DBG_FILE("RSyncMLTask::CreateL(): begin");
+
+ // check that we're allowed to write
+ if ( aProfile.IsReadOnly() )
+ {
+ User::Leave( KErrLocked );
+ }
+
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+
+ TPckgBuf<TInt> dataSize;
+
+ TIpcArgs args( aProfile.Identifier(), aDataProviderId, &dataSize );
+
+ // create sub-session and new task
+ RSessionBase session = static_cast<RSessionBase>( aProfile.Session() );
+ User::LeaveIfError( CreateSubSession( session, ECmdCreateTask, args ) );
+
+ CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup
+
+ iData = CTaskSessionData::NewL( ETrue );
+ static_cast<CTaskSessionData*>(iData)->SetProfile( aProfile.Identifier() );
+ static_cast<CTaskSessionData*>(iData)->SetDataProvider( aDataProviderId );
+ static_cast<CTaskSessionData*>(iData)->SetServerDataSourceL( aServerDataSource );
+ static_cast<CTaskSessionData*>(iData)->SetClientDataSourceL( aClientDataSource );
+
+ if ( aProfile.ProtocolVersion() == ESmlVersion1_2 )
+ {
+ //Copy filters
+ static_cast<CTaskSessionData*>(iData)->CopyTaskSupportedFiltersL( aFilterArray );
+ }
+
+ CleanupStack::Pop(); // this
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::OpenL()
+// Opens given task.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLTask::OpenL( RSyncMLDataSyncProfile& aProfile, TSmlTaskId aTaskId )
+ {
+ _DBG_FILE("RSyncMLTask::OpenL(): begin");
+
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+
+ CTaskSessionData* data = CTaskSessionData::NewLC();
+
+ TPckgBuf<TInt> dataSize;
+ TIpcArgs args( &dataSize, aProfile.Identifier(), aTaskId );
+
+ // open the sub-session
+ RSessionBase session = static_cast<RSessionBase>( aProfile.Session() );
+ User::LeaveIfError( CreateSubSession( session, ECmdTaskOpen, args ) );
+
+ data->SetIdentifier( aTaskId );
+ data->SetProfile( aProfile.Identifier() );
+ if ( aProfile.IsReadOnly() )
+ {
+ data->SetReadOnly( ETrue );
+ }
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup
+
+ // Create data buffer
+ // dataSize contains now the size of the data buffer that is received next
+ iData->SetBufferSizeL( dataSize() );
+ TPtr8 bufPtr = iData->DataBufferPtr();
+
+ TIpcArgs args2( &bufPtr );
+ User::LeaveIfError( SendReceive( ECmdTaskGet, args2 ) );
+
+ // internalize the buffer to iData
+ RDesReadStream readStream;
+ readStream.Open( bufPtr );
+ CleanupClosePushL( readStream );
+
+ iData->InternalizeL( readStream );
+
+ CleanupStack::PopAndDestroy(); // readStream
+ CleanupStack::Pop(); // this
+
+ _DBG_FILE("RSyncMLTask::OpenL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::Identifier()
+// Returns the id of this task.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TSmlTaskId RSyncMLTask::Identifier() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->Identifier();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::Profile()
+// Returns the id of the profile this task belongs to.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TSmlProfileId RSyncMLTask::Profile() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->Profile();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::CreatorId()
+// Returns creator id.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TSmlCreatorId RSyncMLTask::CreatorId() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->CreatorId();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::DisplayName()
+// Returns display name.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& RSyncMLTask::DisplayName() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->DisplayName();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::ServerDataSource()
+// Returns the name of the remote data source.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& RSyncMLTask::ServerDataSource() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->ServerDataSource();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::ClientDataSource()
+// Returns the name of the local data source.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& RSyncMLTask::ClientDataSource() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->ClientDataSource();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::DataProvider()
+// Returns the id of the data provider that is used with this task.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TSmlDataProviderId RSyncMLTask::DataProvider() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->DataProvider();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::DefaultSyncType()
+// Returns default sync type.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TSmlSyncType RSyncMLTask::DefaultSyncType() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->DefaultSyncType();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::FilterMatchType()
+// Not supported.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TSyncMLFilterMatchType RSyncMLTask::FilterMatchType() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->FilterMatchType();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::Enabled()
+// Returns whether or not this task is enabled.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool RSyncMLTask::Enabled() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->Enabled();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::SetCreatorId()
+// Sets the creator id.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLTask::SetCreatorId( TSmlCreatorId aCreatorId )
+ {
+ static_cast<CTaskSessionData*>(iData)->SetCreatorId( aCreatorId );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::SetDisplayNameL()
+// Sets the display name.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLTask::SetDisplayNameL( const TDesC& aDisplayName )
+ {
+ static_cast<CTaskSessionData*>(iData)->SetDisplayNameL( aDisplayName );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::SetDefaultSyncTypeL()
+// Sets default sync type.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLTask::SetDefaultSyncTypeL( TSmlSyncType aSyncType )
+ {
+ static_cast<CTaskSessionData*>(iData)->SetDefaultSyncType( aSyncType );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::SetFilterMatchTypeL()
+// Not supported.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLTask::SetFilterMatchTypeL( TSyncMLFilterMatchType aType ) const
+ {
+ static_cast<CTaskSessionData*>(iData)->SetFilterMatchType( aType );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::SetEnabledL()
+// Sets whether or not this task is enabled.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLTask::SetEnabledL( TBool aEnabled )
+ {
+ static_cast<CTaskSessionData*>(iData)->SetEnabled( aEnabled );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::SupportedServerFiltersL()
+// Not supported.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RPointerArray<CSyncMLFilter>& RSyncMLTask::SupportedServerFiltersL( TSyncMLFilterChangeInfo& aChangeInfo ) const
+ {
+ TPckgBuf<TInt> dataSize;
+ TInt taskId( static_cast<CTaskSessionData*>(iData)->Identifier() );
+
+ TIpcArgs args( &dataSize, taskId );
+ User::LeaveIfError( SendReceive( ECmdTaskFilterBufferSize, args ) );
+
+ // Create data buffer
+ static_cast<CTaskSessionData*>(iData)->SetFilterBufSize( dataSize() );
+ iData->SetBufferSizeL( static_cast<CTaskSessionData*>(iData)->FilterBufSize() );
+
+ TPtr8 bufPtr = iData->DataBufferPtr();
+
+ TIpcArgs args2( &bufPtr );
+ User::LeaveIfError( SendReceive( ECmdTaskSupportedFilters, args2 ) );
+
+ static_cast<CTaskSessionData*>(iData)->SetTaskSupportedFiltersL( bufPtr );
+
+ aChangeInfo = static_cast<CTaskSessionData*>(iData)->FilterChangeInfo();
+ return static_cast<CTaskSessionData*>(iData)->FilterArray();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::SupportsUserSelectableMatchType()
+// Not supported.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool RSyncMLTask::SupportsUserSelectableMatchType() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->FilterMatchType() == ESyncMLMatchDisabled ? EFalse : ETrue;
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::IsReadOnly()
+// Return whether or not this task (sub-session) is in read-only mode.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool RSyncMLTask::IsReadOnly() const
+ {
+ return static_cast<CTaskSessionData*>(iData)->IsReadOnly();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::UpdateL()
+// Updates data to server.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLTask::UpdateL()
+ {
+ _DBG_FILE("RSyncMLTask::UpdateL(): begin");
+
+ // check that we're allowed to write
+ if ( IsReadOnly() )
+ {
+ User::Leave( KErrLocked );
+ }
+
+ //get filter size
+ TInt filterBufSize = static_cast<CTaskSessionData*>(iData)->FilterDataSize();
+ static_cast<CTaskSessionData*>(iData)->SetFilterBufSize( filterBufSize );
+
+ // use iData as a buffer where the data is externalized to
+ iData->SetBufferSizeL();
+
+ RBufWriteStream bufStream( iData->DataBuffer() );
+ CleanupClosePushL( bufStream );
+
+ // externalize
+ iData->ExternalizeL( bufStream );
+
+ TPtr8 bufPtr = iData->DataBufferPtr();
+
+ // update data to server
+ TPckgBuf<TInt> id;
+ TIpcArgs args( &id, &bufPtr );
+ User::LeaveIfError( SendReceive( ECmdTaskSet, args ) );
+
+ static_cast<CTaskSessionData*>(iData)->SetIdentifier( id() );
+
+ CleanupStack::PopAndDestroy(); // bufStream
+
+ _DBG_FILE("RSyncMLTask::UpdateL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLTask::Close()
+// Closes sub-session.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLTask::Close()
+ {
+ _DBG_FILE("RSyncMLTask::Close(): begin");
+
+ CloseSubSession( ECmdTaskClose );
+
+ delete iData;
+ iData = NULL;
+
+ _DBG_FILE("RSyncMLTask::Close(): end");
+ }
+
+
+//
+// RSyncMLDataProvider
+//
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::RSyncMLDataProvider()
+// Constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C RSyncMLDataProvider::RSyncMLDataProvider()
+ : iData( NULL )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::OpenL()
+// Opens given data provider.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataProvider::OpenL( RSyncMLSession& aSession, TSmlDataProviderId aDataProviderId )
+ {
+ _DBG_FILE("RSyncMLDataProvider::OpenL(): begin");
+
+ // check that data provider is not yet open and ds sync is supported
+ CClientSessionData::PanicIfAlreadyCreated( iData );
+ NSmlClientAPIFeatureHandler::LeaveIfDataSyncNotSupportedL();
+
+ CDataProviderSessionData* data = new (ELeave) CDataProviderSessionData();
+ CleanupStack::PushL( data );
+
+ TPckgBuf<TInt> dataSize;
+ TIpcArgs args( &dataSize, aDataProviderId );
+
+ // open the sub-session
+ User::LeaveIfError( CreateSubSession( aSession, ECmdDataProviderOpen, args ) );
+
+ data->SetIdentifier( aDataProviderId );
+
+ iData = data;
+ CleanupStack::Pop(); // data
+
+ CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup
+
+ // dataSize contains now the size of the data buffer that is received next
+ iData->SetBufferSizeL( dataSize() );
+ TPtr8 bufPtr = iData->DataBufferPtr();
+
+ TIpcArgs args2( &bufPtr );
+ User::LeaveIfError( SendReceive( ECmdDataProviderGet, args2 ) );
+
+ // internalize the buffer to data
+ RDesReadStream readStream;
+ readStream.Open( bufPtr );
+ CleanupClosePushL( readStream );
+ iData->InternalizeL( readStream );
+
+ CleanupStack::PopAndDestroy(); // readStream
+ CleanupStack::Pop(); // this
+
+ _DBG_FILE("RSyncMLDataProvider::OpenL(): end");
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::Identifier()
+// Return the id of this data provider.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TSmlDataProviderId RSyncMLDataProvider::Identifier() const
+ {
+ return static_cast<CDataProviderSessionData*>(iData)->Identifier();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::Version()
+// Return the version of this data provider.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TVersion RSyncMLDataProvider::Version() const
+ {
+ return static_cast<CDataProviderSessionData*>(iData)->Version();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::DisplayName()
+// Returns the display name of this data provider.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& RSyncMLDataProvider::DisplayName() const
+ {
+ return static_cast<CDataProviderSessionData*>(iData)->DisplayName();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::MimeTypeCount()
+// Returns the amount of mime types this data provider has.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSyncMLDataProvider::MimeTypeCount() const
+ {
+ return static_cast<CDataProviderSessionData*>(iData)->MimeTypeCount();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::MimeType()
+// Return the mime type in given index.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& RSyncMLDataProvider::MimeType( TInt aIndex ) const
+ {
+ return static_cast<CDataProviderSessionData*>(iData)->MimeType( aIndex );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::MimeVersion()
+// Return the mime version in the given index.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& RSyncMLDataProvider::MimeVersion( TInt aIndex ) const
+ {
+ return static_cast<CDataProviderSessionData*>(iData)->MimeVersion( aIndex );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::DefaultDataStoreName()
+// Return the name of the default data store.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C const TDesC& RSyncMLDataProvider::DefaultDataStoreName() const
+ {
+ return static_cast<CDataProviderSessionData*>(iData)->DefaultDataStoreName();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::AllowsMultipleDataStores()
+// Returns whether or not this data provider supports multiple data stores.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TBool RSyncMLDataProvider::AllowsMultipleDataStores() const
+ {
+ return static_cast<CDataProviderSessionData*>(iData)->AllowsMultipleDataStores();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::GetDataStoreNamesL()
+// On return, aArray contains the names of all supported data stores
+// including the default store which is listed first.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataProvider::GetDataStoreNamesL( CDesCArray& aArray ) const
+ {
+ static_cast<CDataProviderSessionData*>(iData)->GetDataStoreNamesL( aArray );
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::RequiredProtocolVersionL()
+// Returns the protocol version this data provider requires.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TSmlProtocolVersion RSyncMLDataProvider::RequiredProtocolVersionL() const
+ {
+ return static_cast<CDataProviderSessionData*>(iData)->RequiredProtocolVersion();
+ }
+
+// -----------------------------------------------------------------------------
+// RSyncMLDataProvider::Close()
+// Closes the sub-session.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSyncMLDataProvider::Close()
+ {
+ _DBG_FILE("RSyncMLDataProvider::Close(): begin");
+
+ CloseSubSession( ECmdDataProviderClose );
+
+ delete iData;
+ iData = NULL;
+
+ _DBG_FILE("RSyncMLDataProvider::Close(): end");
+ }
+
+
+
+
+
+
+