--- /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 <CPEngTrackedPresenceIDs2.h>
+#include <CPEngTrackedPresenceID2.h>
+#include <MPEngPresenceAttrModel2.h>
+#include <E32Std.h>
+
+#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<TUint32>& 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<TUint32>& 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<TUint32>& 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
+
+
+