diff -r 000000000000 -r b497e44ab2fc syncmlfw/common/sosserver_clientapi/src/NSmlDSClientAPI.cpp --- /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 +#include +#include + +#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 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 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 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 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& 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 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& 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 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& 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 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& 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 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 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& RSyncMLDataSyncJob::TaskIDs() const + { + return static_cast(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 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& 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( aProfile.Session() ); + User::LeaveIfError( CreateSubSession( session, ECmdCreateTask, args ) ); + + CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup + + iData = CTaskSessionData::NewL( ETrue ); + static_cast(iData)->SetProfile( aProfile.Identifier() ); + static_cast(iData)->SetDataProvider( aDataProviderId ); + static_cast(iData)->SetServerDataSourceL( aServerDataSource ); + static_cast(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& aFilterArray ) + { + _DBG_FILE("RSyncMLTask::CreateL(): begin"); + + // check that we're allowed to write + if ( aProfile.IsReadOnly() ) + { + User::Leave( KErrLocked ); + } + + CClientSessionData::PanicIfAlreadyCreated( iData ); + + TPckgBuf dataSize; + + TIpcArgs args( aProfile.Identifier(), aDataProviderId, &dataSize ); + + // create sub-session and new task + RSessionBase session = static_cast( aProfile.Session() ); + User::LeaveIfError( CreateSubSession( session, ECmdCreateTask, args ) ); + + CleanupClosePushL( *this ); // if leave occures, Close is called by cleanup + + iData = CTaskSessionData::NewL( ETrue ); + static_cast(iData)->SetProfile( aProfile.Identifier() ); + static_cast(iData)->SetDataProvider( aDataProviderId ); + static_cast(iData)->SetServerDataSourceL( aServerDataSource ); + static_cast(iData)->SetClientDataSourceL( aClientDataSource ); + + if ( aProfile.ProtocolVersion() == ESmlVersion1_2 ) + { + //Copy filters + static_cast(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 dataSize; + TIpcArgs args( &dataSize, aProfile.Identifier(), aTaskId ); + + // open the sub-session + RSessionBase session = static_cast( 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(iData)->Identifier(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::Profile() +// Returns the id of the profile this task belongs to. +// ----------------------------------------------------------------------------- +// +EXPORT_C TSmlProfileId RSyncMLTask::Profile() const + { + return static_cast(iData)->Profile(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::CreatorId() +// Returns creator id. +// ----------------------------------------------------------------------------- +// +EXPORT_C TSmlCreatorId RSyncMLTask::CreatorId() const + { + return static_cast(iData)->CreatorId(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::DisplayName() +// Returns display name. +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC& RSyncMLTask::DisplayName() const + { + return static_cast(iData)->DisplayName(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::ServerDataSource() +// Returns the name of the remote data source. +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC& RSyncMLTask::ServerDataSource() const + { + return static_cast(iData)->ServerDataSource(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::ClientDataSource() +// Returns the name of the local data source. +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC& RSyncMLTask::ClientDataSource() const + { + return static_cast(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(iData)->DataProvider(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::DefaultSyncType() +// Returns default sync type. +// ----------------------------------------------------------------------------- +// +EXPORT_C TSmlSyncType RSyncMLTask::DefaultSyncType() const + { + return static_cast(iData)->DefaultSyncType(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::FilterMatchType() +// Not supported. +// ----------------------------------------------------------------------------- +// +EXPORT_C TSyncMLFilterMatchType RSyncMLTask::FilterMatchType() const + { + return static_cast(iData)->FilterMatchType(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::Enabled() +// Returns whether or not this task is enabled. +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool RSyncMLTask::Enabled() const + { + return static_cast(iData)->Enabled(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::SetCreatorId() +// Sets the creator id. +// ----------------------------------------------------------------------------- +// +EXPORT_C void RSyncMLTask::SetCreatorId( TSmlCreatorId aCreatorId ) + { + static_cast(iData)->SetCreatorId( aCreatorId ); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::SetDisplayNameL() +// Sets the display name. +// ----------------------------------------------------------------------------- +// +EXPORT_C void RSyncMLTask::SetDisplayNameL( const TDesC& aDisplayName ) + { + static_cast(iData)->SetDisplayNameL( aDisplayName ); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::SetDefaultSyncTypeL() +// Sets default sync type. +// ----------------------------------------------------------------------------- +// +EXPORT_C void RSyncMLTask::SetDefaultSyncTypeL( TSmlSyncType aSyncType ) + { + static_cast(iData)->SetDefaultSyncType( aSyncType ); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::SetFilterMatchTypeL() +// Not supported. +// ----------------------------------------------------------------------------- +// +EXPORT_C void RSyncMLTask::SetFilterMatchTypeL( TSyncMLFilterMatchType aType ) const + { + static_cast(iData)->SetFilterMatchType( aType ); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::SetEnabledL() +// Sets whether or not this task is enabled. +// ----------------------------------------------------------------------------- +// +EXPORT_C void RSyncMLTask::SetEnabledL( TBool aEnabled ) + { + static_cast(iData)->SetEnabled( aEnabled ); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::SupportedServerFiltersL() +// Not supported. +// ----------------------------------------------------------------------------- +// +EXPORT_C RPointerArray& RSyncMLTask::SupportedServerFiltersL( TSyncMLFilterChangeInfo& aChangeInfo ) const + { + TPckgBuf dataSize; + TInt taskId( static_cast(iData)->Identifier() ); + + TIpcArgs args( &dataSize, taskId ); + User::LeaveIfError( SendReceive( ECmdTaskFilterBufferSize, args ) ); + + // Create data buffer + static_cast(iData)->SetFilterBufSize( dataSize() ); + iData->SetBufferSizeL( static_cast(iData)->FilterBufSize() ); + + TPtr8 bufPtr = iData->DataBufferPtr(); + + TIpcArgs args2( &bufPtr ); + User::LeaveIfError( SendReceive( ECmdTaskSupportedFilters, args2 ) ); + + static_cast(iData)->SetTaskSupportedFiltersL( bufPtr ); + + aChangeInfo = static_cast(iData)->FilterChangeInfo(); + return static_cast(iData)->FilterArray(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLTask::SupportsUserSelectableMatchType() +// Not supported. +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool RSyncMLTask::SupportsUserSelectableMatchType() const + { + return static_cast(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(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(iData)->FilterDataSize(); + static_cast(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 id; + TIpcArgs args( &id, &bufPtr ); + User::LeaveIfError( SendReceive( ECmdTaskSet, args ) ); + + static_cast(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 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(iData)->Identifier(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLDataProvider::Version() +// Return the version of this data provider. +// ----------------------------------------------------------------------------- +// +EXPORT_C TVersion RSyncMLDataProvider::Version() const + { + return static_cast(iData)->Version(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLDataProvider::DisplayName() +// Returns the display name of this data provider. +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC& RSyncMLDataProvider::DisplayName() const + { + return static_cast(iData)->DisplayName(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLDataProvider::MimeTypeCount() +// Returns the amount of mime types this data provider has. +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt RSyncMLDataProvider::MimeTypeCount() const + { + return static_cast(iData)->MimeTypeCount(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLDataProvider::MimeType() +// Return the mime type in given index. +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC& RSyncMLDataProvider::MimeType( TInt aIndex ) const + { + return static_cast(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(iData)->MimeVersion( aIndex ); + } + +// ----------------------------------------------------------------------------- +// RSyncMLDataProvider::DefaultDataStoreName() +// Return the name of the default data store. +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC& RSyncMLDataProvider::DefaultDataStoreName() const + { + return static_cast(iData)->DefaultDataStoreName(); + } + +// ----------------------------------------------------------------------------- +// RSyncMLDataProvider::AllowsMultipleDataStores() +// Returns whether or not this data provider supports multiple data stores. +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool RSyncMLDataProvider::AllowsMultipleDataStores() const + { + return static_cast(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(iData)->GetDataStoreNamesL( aArray ); + } + +// ----------------------------------------------------------------------------- +// RSyncMLDataProvider::RequiredProtocolVersionL() +// Returns the protocol version this data provider requires. +// ----------------------------------------------------------------------------- +// +EXPORT_C TSmlProtocolVersion RSyncMLDataProvider::RequiredProtocolVersionL() const + { + return static_cast(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"); + } + + + + + + +