diff -r 000000000000 -r b497e44ab2fc syncmlfw/common/sosserver_clientapi/src/NSmlClientContactSuiteAPIActiveCallback.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/common/sosserver_clientapi/src/NSmlClientContactSuiteAPIActiveCallback.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,328 @@ +/* +* 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 for event/progress notifiers +* +*/ + + +// This define should be moved somewhere else (symbian headers) !! +#include +#include + +#include "NSmlClientAPIDefs.h" +#include "NSmlClientAPIUtils.h" +#include "NSmlClientAPIActiveCallback.h" +#include "NSmlClientContactSuiteAPIActiveCallback.h" +#include "nsmlsosserverdefs.h" +#include "NSmlErrorCodeConversion.h" + + +// +// CSmlActiveContactSuiteProgressCallback +// + + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::NewL( +// Two-phase construction. +// ----------------------------------------------------------------------------- +// +CSmlActiveContactSuiteProgressCallback* CSmlActiveContactSuiteProgressCallback::NewL( const CSmlContactSuiteActiveCallback* aCallback ) + { + CSmlActiveContactSuiteProgressCallback* self = new (ELeave) CSmlActiveContactSuiteProgressCallback( aCallback ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::~CSmlActiveContactSuiteProgressCallback() +// Destructor. +// ----------------------------------------------------------------------------- +// +CSmlActiveContactSuiteProgressCallback::~CSmlActiveContactSuiteProgressCallback() + { + Cancel(); + if ( iRequesting ) + { + CancelProgress(); + } + + delete iBuf; + iBuf = NULL; + } + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::SetObserver() +// Sets the observer to be notified. Starts requesting progress +// events if it is not yet started. +// ----------------------------------------------------------------------------- +// +void CSmlActiveContactSuiteProgressCallback::SetObserver( MSyncMLProgressObserver& aObserver ) + { + iObserver = &aObserver; + + if ( !iRequesting ) + { + iRequesting = ETrue; + Request(); + } + } + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::CancelProgress() +// Cancels progress notification. +// ----------------------------------------------------------------------------- +// +void CSmlActiveContactSuiteProgressCallback::CancelProgress() + { + DoCancel(); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::DoCancel() +// ----------------------------------------------------------------------------- +// +void CSmlActiveContactSuiteProgressCallback::DoCancel() + { + // cancel request to server + iCallback->SendReceive( ECmdContactSuiteProgressRequestCancel ); + iRequesting = EFalse; + } + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::RunL() +// ----------------------------------------------------------------------------- +// +void CSmlActiveContactSuiteProgressCallback::RunL() + { + // check status + if ( iStatus.Int() == KErrNone ) + { + // open a readstream to iEventBuf's data + RDesReadStream readStream( iBufPtr ); + CleanupClosePushL( readStream ); + + // read the fist interger in databuffer -> the type of message + TInt8 type = readStream.ReadInt8L(); + if ( type != ENSmlTypeProgressEvent ) + { + User::Panic( KNSmlClientAPIPanic, KErrArgument ); + } + + // check which progress event was received, and notify observer + TNSmlProgressEventType eventType = (TNSmlProgressEventType)readStream.ReadInt8L(); + switch( eventType ) + { + case ENSmlSyncError: + NotifyErrorL( readStream ); + break; + case ENSmlSyncProgress: + NotifyProgressL( readStream ); + break; + case ENSmlModifications: + NotifyModificationsL( readStream ); + break; + default: + User::Panic( KNSmlClientAPIPanic, KErrArgument ); + break; + } + + CleanupStack::PopAndDestroy(); // readStream + + if ( iRequesting ) + { + Request(); + } + } +#ifdef __CLIENT_API_MT_ + else + { + CActiveScheduler::Stop(); + } +#endif + } + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::Request() +// Sends asynchronous progress event request to server. +// ----------------------------------------------------------------------------- +// +void CSmlActiveContactSuiteProgressCallback::Request() + { + iBufPtr.Zero(); + + if ( !IsActive() ) + { + SetActive(); + } + + if ( iCallback ) + { + iCallback->SendReceive( ECmdContactSuiteProgressRequest, TIpcArgs( &iBufPtr ), iStatus ); + } + } + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::ConstructL() +// ----------------------------------------------------------------------------- +// +void CSmlActiveContactSuiteProgressCallback::ConstructL() + { + iBuf = HBufC8::NewL( KNSmlMaxProgressMessageLength ); + iBufPtr.Set( iBuf->Des() ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::CSmlActiveContactSuiteProgressCallback() +// Contructor. +// ----------------------------------------------------------------------------- +// +CSmlActiveContactSuiteProgressCallback::CSmlActiveContactSuiteProgressCallback( const CSmlContactSuiteActiveCallback* aCallback ) + : CActive( EPriorityStandard ), iRequesting( EFalse ), iBufPtr( 0, NULL, 0 ), iCallback( aCallback ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::NotifyErrorL() +// Reads progress error related data and notifies observer. +// ----------------------------------------------------------------------------- +// +void CSmlActiveContactSuiteProgressCallback::NotifyErrorL( RReadStream& aStream ) const + { + TInt8 errorLevel = aStream.ReadInt8L(); + TInt32 error = aStream.ReadInt32L(); + TInt32 taskId = aStream.ReadInt32L(); + TInt32 info1 = aStream.ReadInt32L(); + TInt32 info2 = aStream.ReadInt32L(); + + TNSmlErrorConversion errorconv( error ); + error = errorconv.Convert(); + + iObserver->OnSyncMLSyncError( (MSyncMLProgressObserver::TErrorLevel)errorLevel, error, taskId, info1, info2 ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::NotifyProgressL() +// Reads progress event related data and notifies observer. +// ----------------------------------------------------------------------------- +// +void CSmlActiveContactSuiteProgressCallback::NotifyProgressL( RReadStream& aStream ) const + { + TInt8 status = aStream.ReadInt8L(); + TInt32 info1 = aStream.ReadInt32L(); + TInt32 info2 = aStream.ReadInt32L(); + + iObserver->OnSyncMLSyncProgress( (MSyncMLProgressObserver::TStatus)status, info1, info2 ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveContactSuiteProgressCallback::NotifyModificationsL() +// Reads progress information of modifications and notifies +// observer. +// ----------------------------------------------------------------------------- +// +void CSmlActiveContactSuiteProgressCallback::NotifyModificationsL( RReadStream& aStream ) + { +#ifdef SYNCML_V3 + TInt32 taskId = aStream.ReadInt32L(); + + iClientMods.iNumAdded = aStream.ReadInt32L(); + iClientMods.iNumReplaced = aStream.ReadInt32L(); + iClientMods.iNumMoved = aStream.ReadInt32L(); + iClientMods.iNumDeleted = aStream.ReadInt32L(); + iClientMods.iNumFailed = aStream.ReadInt32L(); + + iServerMods.iNumAdded = aStream.ReadInt32L(); + iServerMods.iNumReplaced = aStream.ReadInt32L(); + iServerMods.iNumMoved = aStream.ReadInt32L(); + iServerMods.iNumDeleted = aStream.ReadInt32L(); + iServerMods.iNumFailed = aStream.ReadInt32L(); + + iObserver->OnSyncMLDataSyncModifications( taskId, iClientMods, iServerMods ); +#endif + } +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::CSmlActiveCallback() +// ----------------------------------------------------------------------------- +// +CSmlContactSuiteActiveCallback::CSmlContactSuiteActiveCallback( RSyncMLSession& aSession ) + : iContactSuiteSession( aSession ), iActiveCallback(aSession) + { + } + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::~CSmlActiveCallback() +// Destructor. +// ----------------------------------------------------------------------------- +// +CSmlContactSuiteActiveCallback::~CSmlContactSuiteActiveCallback() + { + //delete iEventCallback; iEventCallback = NULL; + delete iProgressCallback; iProgressCallback = NULL; + } + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::SetProgressObserverL() +// Sets the progress observer. +// ----------------------------------------------------------------------------- +// +void CSmlContactSuiteActiveCallback::SetProgressObserverL( MSyncMLProgressObserver& aObserver ) + { + if ( !iProgressCallback ) + { + iProgressCallback = CSmlActiveContactSuiteProgressCallback::NewL( this ); + } + + iProgressCallback->SetObserver( aObserver ); + } + + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::CancelProgress() +// Cancels progress notification. +// ----------------------------------------------------------------------------- +// +void CSmlContactSuiteActiveCallback::CancelProgress() + { + if ( iProgressCallback ) + { + iProgressCallback->CancelProgress(); + delete iProgressCallback; iProgressCallback = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::SendReceive() +// Makes an asynchronous IPC call to server. Used by event and progress +// notifier objects. +// ----------------------------------------------------------------------------- +// +void CSmlContactSuiteActiveCallback::SendReceive( TInt aCmd, const TIpcArgs& aArgs, TRequestStatus& aStatus ) const + { + iActiveCallback.SendReceive( aCmd, aArgs , aStatus ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::SendReceive() +// Makes a synchronous IPC call to server. Used by event and progress +// notifier objects. +// ----------------------------------------------------------------------------- +// +void CSmlContactSuiteActiveCallback::SendReceive( TInt aCmd ) const + { + iActiveCallback.SendReceive( aCmd ); + }