PECengine/PresenceManager2/SrcAttribute/CPEngTrackedPresenceIDCollection.cpp
changeset 0 094583676ce7
--- /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
+
+
+