phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CContactArray.cpp
changeset 0 e686773b3f54
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phonebookengines/VirtualPhonebook/VPbkSimStoreImpl/src/CContactArray.cpp	Tue Feb 02 10:12:17 2010 +0200
@@ -0,0 +1,206 @@
+/*
+* Copyright (c) 2002-2007 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:  An array of sim contacts
+*
+*/
+
+
+
+// INCLUDE FILES
+#include "CContactArray.h"
+#include "VPbkSimStoreImplError.h"
+#include "CVPbkSimContactBase.h"
+#include "CVPbkSimCntField.h"
+#include <VPbkSimStoreTemplateFunctions.h>
+#include <VPbkSimStoreCommon.h>
+
+namespace VPbkSimStoreImpl {
+
+// CONSTANTS
+
+// expands memory with this amount if array gets too small
+const TInt KCntArrayGranularity = 50;
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CContactArray::CContactArray
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CContactArray::CContactArray() : iCntArray( KCntArrayGranularity )
+    {
+    }
+    
+// Destructor
+CContactArray::~CContactArray()
+    {
+    iObservers.Close();
+    iCntArray.ResetAndDestroy();
+    iCntArray.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CContactArray::AddOrReplaceL
+// -----------------------------------------------------------------------------
+//
+void CContactArray::AddOrReplaceL( MVPbkSimContact* aSimContact )
+    {
+    // SIM contacts must have a valid SIM index because this array is ordered
+    // by the SIM index.
+    __ASSERT_DEBUG( aSimContact && aSimContact->SimIndex() >= 
+        KVPbkSimStoreFirstETelIndex,
+        VPbkSimStoreImpl::Panic( ECContactArrayAddOrReplaceL_NullSimContact ) );
+    if ( !aSimContact || 
+         aSimContact->SimIndex() < KVPbkSimStoreFirstETelIndex )
+        {
+        User::Leave( KErrArgument );
+        }
+    
+    // If array is not big enough, enlarge it.
+    ReserveL( aSimContact->SimIndex() );
+    TInt arrayIndex = aSimContact->SimIndex() - 1;
+
+    // Take a pointer to the possible old contact. There must not be
+    // any leaving operations after this.
+    MVPbkSimContact* cnt = iCntArray[arrayIndex];
+    // Replace the possible existing contact
+    iCntArray[arrayIndex] = aSimContact;
+    if ( cnt )
+        {
+        SendObserverMessageRR( iObservers,
+            &MContactArrayObserver::ContactChanged, *cnt, *aSimContact );
+        // Delete old contact
+        delete cnt;
+        }
+    else
+        {
+        SendObserverMessageR( iObservers, &MContactArrayObserver::ContactAdded,
+            *aSimContact );
+        }        
+    }
+
+// -----------------------------------------------------------------------------
+// CContactArray::Delete
+// -----------------------------------------------------------------------------
+//
+void CContactArray::Delete( TInt aFromSimIndex, TInt aToSimIndex )
+    {
+    TInt indexFrom = aFromSimIndex - 1;
+    TInt indexTo = aToSimIndex - 1;
+    if ( indexTo < indexFrom )
+        {
+        indexTo = indexFrom;
+        }
+
+    TInt size = Size();
+    TInt simIndex = aFromSimIndex;
+    for ( TInt i = indexFrom; i < size && i <= indexTo; 
+        ++i, ++simIndex )
+        {
+        if ( iCntArray[i] )
+            {
+            // There must not be any leaving operation after this
+            MVPbkSimContact* cnt = iCntArray[i];
+            iCntArray[i] = NULL;
+            SendObserverMessageR( iObservers, 
+                &MContactArrayObserver::ContactRemoved, *cnt );
+            delete cnt;
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CContactArray::At
+// -----------------------------------------------------------------------------
+//
+MVPbkSimContact* CContactArray::At( TInt aSimIndex ) const
+    {
+    // indexes start from 0 in the array and from 1 in the sim
+    TInt arrayIndex = aSimIndex - 1;
+    __ASSERT_DEBUG( arrayIndex < iCntArray.Count(),
+        VPbkSimStoreImpl::Panic( EInvalidSimIndex ) );
+    
+    if ( arrayIndex < iCntArray.Count() )
+        {
+        return iCntArray[arrayIndex];
+        }
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CContactArray::ResetAndCompress
+// -----------------------------------------------------------------------------
+//
+void CContactArray::DeleteAll()
+    {
+    const TInt firstSimIndex = 1;
+    const TInt lastSimIndex = iCntArray.Count();
+    Delete( firstSimIndex, lastSimIndex );
+    }
+
+// -----------------------------------------------------------------------------
+// CContactArray::AddObserverL
+// -----------------------------------------------------------------------------
+//
+void CContactArray::AddObserverL( MContactArrayObserver& aObserver )
+    {
+    iObservers.AppendL( &aObserver );
+    }
+
+// -----------------------------------------------------------------------------
+// CContactArray::AddObserverL
+// -----------------------------------------------------------------------------
+//
+void CContactArray::RemoveObserver( MContactArrayObserver& aObserver )
+    {
+    TInt pos = iObservers.Find( &aObserver );
+    if ( pos >= 0 )
+        {
+        iObservers.Remove( pos );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CContactArray::ReserveL
+// -----------------------------------------------------------------------------
+//
+void CContactArray::ReserveL( TInt aSize )
+    {
+    while ( iCntArray.Count() < aSize )
+        {
+        iCntArray.AppendL( NULL );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CContactArray::FirstEmptySlot
+// -----------------------------------------------------------------------------
+//
+TInt CContactArray::FirstEmptySlot() const
+    {
+    TInt slot = iCntArray.Find(NULL);
+    if ( slot != KErrNotFound )
+        {
+        // SIM indexes start from 1.
+        ++slot;
+        }
+    return slot;
+    }
+
+} // namespace VPbkSimStoreImpl
+//  End of File