diff -r 000000000000 -r b497e44ab2fc syncmlfw/common/sosserver_clientapi/src/NSmlClientAPIActiveCallback.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/common/sosserver_clientapi/src/NSmlClientAPIActiveCallback.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,547 @@ +/* +* 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) !! +#ifndef SYNCML_V3 +#define SYNCML_V3 +#endif + +#include +#include + +#include "NSmlClientAPIDefs.h" +#include "NSmlClientAPIUtils.h" +#include "NSmlClientAPIActiveCallback.h" +#include "nsmlsosserverdefs.h" +#include "NSmlErrorCodeConversion.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// +// CSmlActiveCallback +// + + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::CSmlActiveCallback() +// ----------------------------------------------------------------------------- +// +CSmlActiveCallback::CSmlActiveCallback( RSyncMLSession& aSession ) + : iSession( aSession ) + { + } + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::~CSmlActiveCallback() +// Destructor. +// ----------------------------------------------------------------------------- +// +CSmlActiveCallback::~CSmlActiveCallback() + { + delete iEventCallback; iEventCallback = NULL; + delete iProgressCallback; iProgressCallback = NULL; + } + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::SetEventObserverL() +// Sets the event observer and starts event notification. +// ----------------------------------------------------------------------------- +// +void CSmlActiveCallback::SetEventObserverL( MSyncMLEventObserver& aObserver ) + { + if ( !iEventCallback ) + { + iEventCallback = CSmlActiveEventCallback::NewL( this ); + } + + iEventCallback->SetObserver( aObserver ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::SetProgressObserverL() +// Sets the progress observer. +// ----------------------------------------------------------------------------- +// +void CSmlActiveCallback::SetProgressObserverL( MSyncMLProgressObserver& aObserver ) + { + if ( !iProgressCallback ) + { + iProgressCallback = CSmlActiveProgressCallback::NewL( this ); + } + + iProgressCallback->SetObserver( aObserver ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::CancelEvent() +// Cancels event notification. +// ----------------------------------------------------------------------------- +// +void CSmlActiveCallback::CancelEvent() + { + if ( iEventCallback ) + { + iEventCallback->CancelEvent(); + delete iEventCallback; iEventCallback = NULL; + } + } + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::CancelProgress() +// Cancels progress notification. +// ----------------------------------------------------------------------------- +// +void CSmlActiveCallback::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 CSmlActiveCallback::SendReceive( TInt aCmd, const TIpcArgs& aArgs, TRequestStatus& aStatus ) const + { + iSession.SendReceive( aCmd, aArgs, aStatus ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveCallback::SendReceive() +// Makes a synchronous IPC call to server. Used by event and progress +// notifier objects. +// ----------------------------------------------------------------------------- +// +void CSmlActiveCallback::SendReceive( TInt aCmd ) const + { + iSession.SendReceive( aCmd ); + } + + +// +// CSmlActiveEventCallback +// + + +// ----------------------------------------------------------------------------- +// CSmlActiveEventCallback::NewL() +// Two-phase construction. +// ----------------------------------------------------------------------------- +// +CSmlActiveEventCallback* CSmlActiveEventCallback::NewL( const CSmlActiveCallback* aCallback ) + { + CSmlActiveEventCallback* self = new (ELeave) CSmlActiveEventCallback( aCallback ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CSmlActiveEventCallback::~CSmlActiveEventCallback() +// Destructor. +// ----------------------------------------------------------------------------- +// +CSmlActiveEventCallback::~CSmlActiveEventCallback() + { + Cancel(); + if ( iRequesting ) + { + CancelEvent(); + } + + delete iBuf; + iBuf = NULL; + } + +// ----------------------------------------------------------------------------- +// CSmlActiveEventCallback::SetObserver() +// Sets the observer to be notified. Starts requesting events +// if it is not yet started. +// ----------------------------------------------------------------------------- +// +void CSmlActiveEventCallback::SetObserver( MSyncMLEventObserver& aObserver ) + { + iObserver = &aObserver; + + if ( !iRequesting ) + { + iRequesting = ETrue; + Request(); + } + } + +// ----------------------------------------------------------------------------- +// CSmlActiveEventCallback::CancelEvent() +// Cancels event notification. +// ----------------------------------------------------------------------------- +// +void CSmlActiveEventCallback::CancelEvent() + { + DoCancel(); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveEventCallback::DoCancel() +// Cancels event notification. +// ----------------------------------------------------------------------------- +// +void CSmlActiveEventCallback::DoCancel() + { + // cancel request to server + iCallback->SendReceive( ECmdEventRequestCancel ); + iRequesting = EFalse; + } + +// ----------------------------------------------------------------------------- +// CSmlActiveEventCallback::RunL() +// Processes the data received from server and informs +// observer. In the end sends the request again so that the +// observer will be informed as long as it is registered +// to this object. +// ----------------------------------------------------------------------------- +// +void CSmlActiveEventCallback::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 != ENSmlTypeEvent ) + { + User::Panic( KNSmlClientAPIPanic, KErrArgument ); + } + + // read data and inform observer + MSyncMLEventObserver::TEvent event = static_cast( readStream.ReadInt8L() ); + TInt32 id = readStream.ReadInt32L(); + TInt32 error = readStream.ReadInt32L(); + TInt32 additional = readStream.ReadInt32L(); + + TNSmlErrorConversion errorconv( error ); + error = errorconv.Convert(); + + CleanupStack::PopAndDestroy(); // readStream + + iObserver->OnSyncMLSessionEvent( event, id, error, additional ); + if ( iRequesting ) + { + Request(); + } + } + else if ( iStatus.Int() == KErrServerTerminated ) + { + iObserver->OnSyncMLSessionEvent( MSyncMLEventObserver::EServerTerminated, 0, KErrServerTerminated, 0 ); + } +#ifdef __CLIENT_API_MT_ + else + { + CActiveScheduler::Stop(); + } +#endif + } + +// ----------------------------------------------------------------------------- +// CSmlActiveEventCallback::Request() +// Makes an event request to server. +// ----------------------------------------------------------------------------- +// +void CSmlActiveEventCallback::Request() + { + iBufPtr.Zero(); + + if ( !IsActive() ) + { + SetActive(); + } + + if ( iCallback ) + { + iCallback->SendReceive( ECmdEventRequest, TIpcArgs( &iBufPtr ), iStatus ); + } + } + +// ----------------------------------------------------------------------------- +// CSmlActiveEventCallback::ConstructL() +// Two-phase construction. +// ----------------------------------------------------------------------------- +// +void CSmlActiveEventCallback::ConstructL() + { + iBuf = HBufC8::NewL( KNSmlMaxEventMessageLength ); + iBufPtr.Set( iBuf->Des() ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveEventCallback::CSmlActiveEventCallback( +// Contructor. +// ----------------------------------------------------------------------------- +// +CSmlActiveEventCallback::CSmlActiveEventCallback( const CSmlActiveCallback* aCallback ) + : CActive( EPriorityStandard ), iRequesting( EFalse ), iBufPtr( 0, NULL, 0 ), iCallback( aCallback ) + { + CActiveScheduler::Add( this ); + } + + + +// +// CSmlActiveProgressCallback +// + + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::NewL( +// Two-phase construction. +// ----------------------------------------------------------------------------- +// +CSmlActiveProgressCallback* CSmlActiveProgressCallback::NewL( const CSmlActiveCallback* aCallback ) + { + CSmlActiveProgressCallback* self = new (ELeave) CSmlActiveProgressCallback( aCallback ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); // self + return self; + } + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::~CSmlActiveProgressCallback() +// Destructor. +// ----------------------------------------------------------------------------- +// +CSmlActiveProgressCallback::~CSmlActiveProgressCallback() + { + Cancel(); + if ( iRequesting ) + { + CancelProgress(); + } + + delete iBuf; + iBuf = NULL; + } + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::SetObserver() +// Sets the observer to be notified. Starts requesting progress +// events if it is not yet started. +// ----------------------------------------------------------------------------- +// +void CSmlActiveProgressCallback::SetObserver( MSyncMLProgressObserver& aObserver ) + { + iObserver = &aObserver; + + if ( !iRequesting ) + { + iRequesting = ETrue; + Request(); + } + } + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::CancelProgress() +// Cancels progress notification. +// ----------------------------------------------------------------------------- +// +void CSmlActiveProgressCallback::CancelProgress() + { + DoCancel(); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::DoCancel() +// ----------------------------------------------------------------------------- +// +void CSmlActiveProgressCallback::DoCancel() + { + // cancel request to server + iCallback->SendReceive( ECmdProgressRequestCancel ); + iRequesting = EFalse; + } + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::RunL() +// ----------------------------------------------------------------------------- +// +void CSmlActiveProgressCallback::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 + } + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::Request() +// Sends asynchronous progress event request to server. +// ----------------------------------------------------------------------------- +// +void CSmlActiveProgressCallback::Request() + { + iBufPtr.Zero(); + + if ( !IsActive() ) + { + SetActive(); + } + + if ( iCallback ) + { + iCallback->SendReceive( ECmdProgressRequest, TIpcArgs( &iBufPtr ), iStatus ); + } + } + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::ConstructL() +// ----------------------------------------------------------------------------- +// +void CSmlActiveProgressCallback::ConstructL() + { + iBuf = HBufC8::NewL( KNSmlMaxProgressMessageLength ); + iBufPtr.Set( iBuf->Des() ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::CSmlActiveProgressCallback() +// Contructor. +// ----------------------------------------------------------------------------- +// +CSmlActiveProgressCallback::CSmlActiveProgressCallback( const CSmlActiveCallback* aCallback ) + : CActive( EPriorityStandard ), iRequesting( EFalse ), iBufPtr( 0, NULL, 0 ), iCallback( aCallback ) + { + CActiveScheduler::Add( this ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::NotifyErrorL() +// Reads progress error related data and notifies observer. +// ----------------------------------------------------------------------------- +// +void CSmlActiveProgressCallback::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 ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::NotifyProgressL() +// Reads progress event related data and notifies observer. +// ----------------------------------------------------------------------------- +// +void CSmlActiveProgressCallback::NotifyProgressL( RReadStream& aStream ) const + { + TInt8 status = aStream.ReadInt8L(); + TInt32 info1 = aStream.ReadInt32L(); + TInt32 info2 = aStream.ReadInt32L(); + + iObserver->OnSyncMLSyncProgress( (MSyncMLProgressObserver::TStatus)status, info1, info2 ); + } + +// ----------------------------------------------------------------------------- +// CSmlActiveProgressCallback::NotifyModificationsL() +// Reads progress information of modifications and notifies +// observer. +// ----------------------------------------------------------------------------- +// +void CSmlActiveProgressCallback::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 + } + + + + + + +