diff -r 000000000000 -r 094583676ce7 PECengine/PresenceManager2/SrcAttribute/CPEngTrackedPresenceIDCollection.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/PresenceManager2/SrcAttribute/CPEngTrackedPresenceIDCollection.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,427 @@ +/* +* 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: Tracked Presence ID collection. +* +*/ + +// INCLUDE FILES +#include +#include +#include +#include + +#include "CPEngTrackedPresenceIDCollection.h" +#include "CPEngTrackedPresenceIDEntry.h" +#include "CPEngTrackedPresenceIDEntryLookUp.h" +#include "TPEngTrackedPresenceEntryFilter.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::NewL() +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngTrackedPresenceIDCollection* CPEngTrackedPresenceIDCollection::NewL() + { + CPEngTrackedPresenceIDCollection* self = new ( ELeave ) CPEngTrackedPresenceIDCollection; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + + +// Destructor +CPEngTrackedPresenceIDCollection::~CPEngTrackedPresenceIDCollection() + { + delete iInterface; + delete iPresenceIdLookup; + delete iEntryListFilter; + // Ondra, remove all tracked Ids + RemoveAllTrackedIds(); + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::CPEngTrackedPresenceIDCollection +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPEngTrackedPresenceIDCollection::CPEngTrackedPresenceIDCollection() + { + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::ConstructL() +// Symbian OS constructor. +// ----------------------------------------------------------------------------- +// +void CPEngTrackedPresenceIDCollection::ConstructL() + { + iInterface = new ( ELeave ) CPEngTrackedPresenceIDs2( *this ); + iPresenceIdLookup = CPEngTrackedPresenceIDEntryLookUp::NewL(); + iEntryListFilter = new ( ELeave ) TPEngTrackedPresenceEntryFilter( iTrackedIDs, + EIncludedToList ); + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::Interface() +// ----------------------------------------------------------------------------- +// +CPEngTrackedPresenceIDs2& CPEngTrackedPresenceIDCollection::Interface() + { + return *iInterface; + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::TrackedPresenceIDsCount() +// Tracked presence IDs. +// ----------------------------------------------------------------------------- +// +TInt CPEngTrackedPresenceIDCollection::TrackedPresenceIDsCount() const + { + return iTrackedIDs.Count(); + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::FindTrackedPresenceID() +// Tracked presence IDs. +// ----------------------------------------------------------------------------- +// +const CPEngTrackedPresenceIDEntry* CPEngTrackedPresenceIDCollection::FindTrackedPresenceID( + const TDesC& aPresenceID ) const + { + TLinearOrder< CPEngTrackedPresenceIDEntry > order ( CPEngTrackedPresenceIDEntry::Compare ); + iPresenceIdLookup->SetLookupKey( aPresenceID ); + TInt index = iTrackedIDs.FindInOrder( iPresenceIdLookup, order ); + iPresenceIdLookup->Reset(); + + const CPEngTrackedPresenceIDEntry* presenceID = NULL; + if ( index != KErrNotFound ) + { + presenceID = iTrackedIDs[ index ]; + } + + return presenceID; + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::TrackedPresenceID() +// Tracked presence IDs. +// ----------------------------------------------------------------------------- +// +const CPEngTrackedPresenceIDEntry& CPEngTrackedPresenceIDCollection::TrackedPresenceID( + TInt aIndex ) const + { + return *iTrackedIDs[ aIndex ]; + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::NextTrackedPresenceID() +// Tracked presence IDs. +// ----------------------------------------------------------------------------- +// +CPEngTrackedPresenceID2* CPEngTrackedPresenceIDCollection::NextTrackedPresenceID( + TInt& aIterIx ) + { + CPEngTrackedPresenceID2* idInterface = NULL; + + if ( iTrackedIDs.Count() > aIterIx ) + { + idInterface = &iTrackedIDs[ aIterIx ]->Interface(); + aIterIx++; + } + + return idInterface; + } + + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::AddTrackedIdsL() +// Tracked presence IDs. +// ----------------------------------------------------------------------------- +// +void CPEngTrackedPresenceIDCollection::AddTrackedIdsL( const MDesCArray& aPresenceIDs, + const TArray& aTypes ) + { + __ASSERT_ALWAYS( aTypes.Count() > 0, User::Leave( KErrArgument ) ); + + + const TInt idCount = aPresenceIDs.MdcaCount(); + for ( TInt idIx = 0; idIx < idCount; idIx++ ) + { + TPtrC presenceID( aPresenceIDs.MdcaPoint( idIx ) ); + TLinearOrder< CPEngTrackedPresenceIDEntry > order + ( CPEngTrackedPresenceIDEntry::Compare ); + TInt entryIx = KErrNotFound; + + iPresenceIdLookup->SetLookupKey( presenceID ); + TInt entryExists = iTrackedIDs.FindInOrder( iPresenceIdLookup, entryIx, order ); + iPresenceIdLookup->Reset(); + + if ( entryExists == KErrNotFound ) + { + CPEngTrackedPresenceIDEntry* entry = CPEngTrackedPresenceIDEntry::NewLC( + presenceID, + aTypes, + ENotIncludedToList ); + User::LeaveIfError( iTrackedIDs.Insert( entry, entryIx ) ); + CleanupStack::Pop( entry ); + } + else + { + CPEngTrackedPresenceIDEntry* entry = iTrackedIDs[ entryIx ]; + entry->AddTrackedAttributesL( aTypes ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::RemoveTrackedIds() +// Tracked presence IDs. +// ----------------------------------------------------------------------------- +// +void CPEngTrackedPresenceIDCollection::RemoveTrackedIds( const MDesCArray& aPresenceIDs ) + { + const TInt idCount = aPresenceIDs.MdcaCount(); + for ( TInt idIx = 0; idIx < idCount; idIx++ ) + { + TPtrC presenceID( aPresenceIDs.MdcaPoint( idIx ) ); + TLinearOrder< CPEngTrackedPresenceIDEntry > order + ( CPEngTrackedPresenceIDEntry::Compare ); + TInt entryIx = KErrNotFound; + + iPresenceIdLookup->SetLookupKey( presenceID ); + TInt entryExists = iTrackedIDs.FindInOrder( iPresenceIdLookup, entryIx, order ); + iPresenceIdLookup->Reset(); + + if ( entryExists == KErrNone ) + { + delete iTrackedIDs[ entryIx ]; + iTrackedIDs.Remove( entryIx ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::RemoveTrackedIds() +// Tracked presence IDs. +// ----------------------------------------------------------------------------- +// +void CPEngTrackedPresenceIDCollection::RemoveTrackedIds( const TArray& aTypes ) + { + //go from end to start ==> remove is safe + for ( TInt entryIx = ( iTrackedIDs.Count() - 1 ) ; entryIx >= 0; entryIx-- ) + { + CPEngTrackedPresenceIDEntry* entry = iTrackedIDs[ entryIx ]; + entry->RemoveTrackedAttributes( aTypes ); + if ( !entry->AttributesTracked() ) + { + delete entry; + iTrackedIDs.Remove( entryIx ); + } + } + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::RemoveTrackedIds() +// Tracked presence IDs. +// ----------------------------------------------------------------------------- +// +void CPEngTrackedPresenceIDCollection::RemoveTrackedIds( const MDesCArray& aPresenceIDs, + const TArray& aTypes ) + { + const TInt idCount = aPresenceIDs.MdcaCount(); + for ( TInt idIx = 0; idIx < idCount; idIx++ ) + { + TPtrC presenceID( aPresenceIDs.MdcaPoint( idIx ) ); + TLinearOrder< CPEngTrackedPresenceIDEntry > order + ( CPEngTrackedPresenceIDEntry::Compare ); + TInt entryIx = KErrNotFound; + + iPresenceIdLookup->SetLookupKey( presenceID ); + TInt entryExists = iTrackedIDs.FindInOrder( iPresenceIdLookup, entryIx, order ); + iPresenceIdLookup->Reset(); + + if ( entryExists == KErrNone ) + { + CPEngTrackedPresenceIDEntry* entry = iTrackedIDs[ entryIx ]; + entry->RemoveTrackedAttributes( aTypes ); + if ( !entry->AttributesTracked() ) + { + delete entry; + iTrackedIDs.Remove( entryIx ); + } + } + } + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::RemoveTrackedIds() +// Tracked presence IDs. +// ----------------------------------------------------------------------------- +// +void CPEngTrackedPresenceIDCollection::RemoveAllTrackedIds() + { + iTrackedIDs.ResetAndDestroy(); + } + + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::ResetPresenceChangeMarks() +// List of changed presences +// ----------------------------------------------------------------------------- +// +void CPEngTrackedPresenceIDCollection::ResetPresenceChangeMarks() + { + const TInt entryCount = iTrackedIDs.Count(); + for ( TInt entryIx = 0; entryIx < entryCount; entryIx++ ) + { + CPEngTrackedPresenceIDEntry* entry = iTrackedIDs[ entryIx ]; + entry->ResetChangeMarks(); + } + } + + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::MarkPresenceChange() +// List of changed presences +// ----------------------------------------------------------------------------- +// +void CPEngTrackedPresenceIDCollection::MarkPresenceChange( const TDesC& aPresenceID ) + { + TLinearOrder< CPEngTrackedPresenceIDEntry > order + ( CPEngTrackedPresenceIDEntry::Compare ); + TInt entryIx = KErrNotFound; + + iPresenceIdLookup->SetLookupKey( aPresenceID ); + TInt entryExists = iTrackedIDs.FindInOrder( iPresenceIdLookup, entryIx, order ); + iPresenceIdLookup->Reset(); + + if ( entryExists == KErrNone ) + { + iTrackedIDs[ entryIx ]->MarkAllAttributesChanged(); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::NextChangeMarkedPresenceID() +// List of changed presences +// ----------------------------------------------------------------------------- +// +CPEngTrackedPresenceID2* CPEngTrackedPresenceIDCollection::NextChangeMarkedPresenceID( + TInt& aIterIx ) + + { + CPEngTrackedPresenceID2* idInterface = NULL; + + while ( aIterIx < iTrackedIDs.Count() ) + { + CPEngTrackedPresenceIDEntry* trackedId = iTrackedIDs[ aIterIx ]; + + if ( trackedId->AttributesChanged() ) + { + idInterface = &trackedId->Interface(); + aIterIx++; + break; + } + + aIterIx++; + } + + return idInterface; + } + + + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::ResetFilteredList() +// Filtered list. +// ----------------------------------------------------------------------------- +// + +void CPEngTrackedPresenceIDCollection::ResetFilteredList() + { + const TInt entryCount = iTrackedIDs.Count(); + for ( TInt entryIx = 0; entryIx < entryCount; entryIx++ ) + { + CPEngTrackedPresenceIDEntry* entry = iTrackedIDs[ entryIx ]; + entry->SetFilterFlag( ENotIncludedToList ); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::IncludeToFilteredList() +// Filtered list. +// ----------------------------------------------------------------------------- +// +void CPEngTrackedPresenceIDCollection::IncludeToFilteredList( TInt aIndex ) + { + iTrackedIDs[ aIndex ]->SetFilterFlag( EIncludedToList ); + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::FilteredList() +// Filtered list. +// ----------------------------------------------------------------------------- +// +const MDesCArray& CPEngTrackedPresenceIDCollection::FilteredList() const + { + return *iEntryListFilter; + } + + +// ----------------------------------------------------------------------------- +// CPEngTrackedPresenceIDCollection::ResetTrackedEntriesIterators() +// ----------------------------------------------------------------------------- +// +void CPEngTrackedPresenceIDCollection::ResetTrackedEntriesIterators() + { + const TInt trackedIDsCount = iTrackedIDs.Count(); + for ( TInt ii = 0; ii < trackedIDsCount; ii++ ) + { + CPEngTrackedPresenceID2& idInterface = iTrackedIDs[ ii ]->Interface(); + idInterface.ResetTrackedIterator(); + idInterface.ResetChangedIterator(); + } + } + + + + +// End of File + + +