diff -r 000000000000 -r 094583676ce7 PECengine/StorageManager2/ClientSrc/CPEngObserverContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/StorageManager2/ClientSrc/CPEngObserverContainer.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,344 @@ +/* +* Copyright (c) 2002 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: Storage Id change observer container +* +*/ + + + +// INCLUDE FILES +#include +#include "CPEngObserverContainer.h" +#include "MPEngSIDChangeObserver.h" +#include "MPEngSIdContainer.h" + + +// MACROS +#define RETURN_IF_ERROR( aErrorCode )\ + TInt eC( aErrorCode );\ + if ( eC != KErrNone )\ + {\ + return eC;\ + } + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::CPEngObserverContainer +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CPEngObserverContainer::CPEngObserverContainer( + MPEngSIDChangeObserver& aChangeObserver, + TInt aPriority ) + : iObserver( aChangeObserver ), + iObserverPriority( aPriority ), + iSuspended( EFalse ), + iChangedSIds( 1 ), // usually probably one SID at time + iProcessing( EFalse ) + + { + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPEngObserverContainer::ConstructL( ) + { + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngObserverContainer* CPEngObserverContainer::NewLC( + MPEngSIDChangeObserver& aChangeObserver, + TInt aPriority ) + { + CPEngObserverContainer* self = new( ELeave ) CPEngObserverContainer( + aChangeObserver, + aPriority ); + + CleanupStack::PushL( self ); + self->ConstructL( ); + + return self; + } + + +// Destructor +CPEngObserverContainer::~CPEngObserverContainer() + { + ResetEngagedIdsArray(); + iChangedSIds.Reset(); + if ( iAliveFlag ) + { + ( *iAliveFlag ) = EFalse; + } + } + + +// ============================================================================= +// Another function of the CPEngObserverContainer +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::SIdHasChangedL() +// ----------------------------------------------------------------------------- +// +void CPEngObserverContainer::SIdHasChangedL( + const TDesC& aChangedSId ) + { + TKeyArrayFix comparison( 0, ECmpNormal ); + // do not update if: Processing is in progress(notification of itself), + // or suspended + if ( !iProcessing && !iSuspended ) + { + iChangedSIds.InsertIsqL( aChangedSId, comparison ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::RemoveSIdContainer() +// ----------------------------------------------------------------------------- +// +void CPEngObserverContainer::RemoveSIdContainer( + MPEngSIdContainer* aSIdContainer ) + { + TInt index( 0 ); + if ( KErrNone == iEngagedSIds.FindInAddressOrder( aSIdContainer, index ) ) + { + iEngagedSIds.Remove( index ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::NotifySIdsChanges() +// ----------------------------------------------------------------------------- +// +void CPEngObserverContainer::NotifySIdsChanges( + TInt aPriority ) + { + // return if priority does not match + if ( aPriority != iObserverPriority ) + { + return; + } + if ( !iProcessing && ( iChangedSIds.Count() != 0 ) ) + { + iProcessing = ETrue; + + TBool alive( ETrue ); + iAliveFlag = &alive; + + TRAPD( e, iObserver.HandleSIDsChangeL( iChangedSIds ) ); + + if ( !alive ) + { + return; + } + iAliveFlag = NULL; + + iProcessing = EFalse; + if ( e != KErrNone ) + { + iObserver.HandleSIDNotifyError( e ); + } + iChangedSIds.Reset(); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::NotifySIdListenError() +// ----------------------------------------------------------------------------- +// +void CPEngObserverContainer::NotifySIdListenError( + TInt aError ) + { + iProcessing = ETrue; + iObserver.HandleSIDNotifyError( aError ); + iChangedSIds.Reset(); + iProcessing = EFalse; + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::UpdateSIdsContainersL() +// ----------------------------------------------------------------------------- +// +TInt CPEngObserverContainer::UpdateSIdsContainers( + const RPointerArray& aSIdContainers, + RPointerArray& aOldSIdContainers, + TBool aKeepOldIds ) + { + aOldSIdContainers.Reset(); + TInt countOld ( iEngagedSIds.Count() ); + for ( TInt x ( 0 ) ; x < countOld ; ++x ) + { + RETURN_IF_ERROR( aOldSIdContainers.Append( iEngagedSIds[x] ) ); + } + + TInt err( UpdateSIdsContainers( aSIdContainers, aKeepOldIds ) ); + if ( err == KErrNone ) + { + return KErrNone; + } + // update failed, return array to previous state - + // no fail since we had that count there before + // pointers are also in address order + + ResetEngagedIdsArray(); + for ( TInt y ( 0 ) ; y < countOld ; ++y ) + { + // this cannot fail, since we had there that count before, + // keep trying for all pointers + iEngagedSIds.Append( aOldSIdContainers[y] ); + } + return err; + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::UpdateSIdsContainers() +// ----------------------------------------------------------------------------- +// +TInt CPEngObserverContainer::UpdateSIdsContainers( + const RPointerArray& aSIdContaners, + TBool aKeepOldIDs ) + { + if ( !aKeepOldIDs ) + { + ResetEngagedIdsArray(); + } + TInt count ( aSIdContaners.Count() ); + for ( TInt x ( 0 ) ; x < count ; ++x ) + { + if ( KErrNone == aSIdContaners[x]->AddObserverContainer( this ) ) + { + TInt err ( iEngagedSIds.InsertInAddressOrder( aSIdContaners[x] ) ); + if ( ( KErrNone != err ) && ( err != KErrAlreadyExists ) ) + { + aSIdContaners[x]->RemoveObserverContainer( this ); + return err; + } + } + } + return KErrNone; + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::RemoveSIdsFromSIdsObserver() +// ----------------------------------------------------------------------------- +// +void CPEngObserverContainer::RemoveSIdsFromSIdsObserver( + const MDesCArray& aSIdsToRemove ) + { + // go through IDs are remove them if needed, engaged needs to be check from end + TInt removeCount( aSIdsToRemove.MdcaCount() ); + for ( TInt i ( 0 ) ; i < removeCount ; ++i ) + { + TPtrC sId( aSIdsToRemove.MdcaPoint( i ) ); + for ( TInt ii( iEngagedSIds.Count() - 1 ) ; ii >= 0 ; --ii ) + { + if ( KErrNone + == + sId.CompareF( iEngagedSIds[ ii ]->SId() ) + ) + { + iEngagedSIds[ ii ]->RemoveObserverContainer( this ); + iEngagedSIds.Remove( ii ); + break; + } + } + } + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::RestartObserver() +// ----------------------------------------------------------------------------- +// +void CPEngObserverContainer::RestartObserver() + { + for ( TInt x( iEngagedSIds.Count() - 1 ) ; x >= 0 ; --x ) + { + iEngagedSIds[ x ]->RemoveObserverContainer( this ); + iEngagedSIds.Remove( x ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::EngagedSIdsCount() +// ----------------------------------------------------------------------------- +// +TInt CPEngObserverContainer::EngagedSIdsCount() + { + return iEngagedSIds.Count(); + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::Observer() +// ----------------------------------------------------------------------------- +// +const MPEngSIDChangeObserver* CPEngObserverContainer::Observer( ) const + { + return &iObserver; + } + + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::SetSuspendMode() +// ----------------------------------------------------------------------------- +// +void CPEngObserverContainer::SetSuspendMode( + TBool aSuspendMode ) + { + iSuspended = aSuspendMode; + } + +// ============================================================================= +// ======== NEW PRIVATE FUNCTIONS OF THE CPEngObserverContainer ================ +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngObserverContainer::ResetEngagedIdsArray +// Reset Engaged SIds array, +// Also link of the Store Id containers to the observer +// container is removed +// ----------------------------------------------------------------------------- +// +void CPEngObserverContainer::ResetEngagedIdsArray() + { + TInt count ( iEngagedSIds.Count() ); + for ( TInt x ( 0 ) ; x < count ; ++x ) + { + iEngagedSIds[ x ]->RemoveObserverContainer( this ); + } + iEngagedSIds.Reset(); + } + + +// End of File