PECengine/ListLibrary2/ContactListSrc/CPEngContactListModChangeMonitor.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListModChangeMonitor.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,378 @@
+/*
+* Copyright (c) 2005 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:  Monitors contact list changes.
+*
+*/
+
+// INCLUDE FILES
+#include "PEngContactIdsTools.h"
+#include "CPEngContactListModChangeMonitor.h"
+#include "MPEngContactListModStore.h"
+#include "PEngListLibraryPanics.h"
+#include <s32strm.h>
+#include <e32std.h>
+
+
+// ============================= LOCAL FUNCTIONS ==============================
+/**
+ * Helper to grow RBuf buffer if needed.
+ */
+void GrowBufferIfRequiredL( RBuf& aBuffer, TInt aRequiredLength )
+    {
+    if ( aRequiredLength > aBuffer.MaxLength() )
+        {
+        aBuffer.ReAllocL( aRequiredLength );
+        }
+
+    aBuffer.Zero();
+    }
+
+
+//Default granurality for change monitor arrays
+const TInt KChangeMonitorGranurality = 5;
+
+//Byte size needed to stream TInt type data => 4 bytes
+const TInt KIntStreamBytes = 4;
+
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::CPEngContactListModChangeMonitor()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListModChangeMonitor::CPEngContactListModChangeMonitor(
+    MPEngContactListModStore& aStoreEntry )
+        : iAddedContactIds( KChangeMonitorGranurality ),
+        iRemovedContactIds( KChangeMonitorGranurality ),
+        iStoreEntry( aStoreEntry )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::NewL()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListModChangeMonitor* CPEngContactListModChangeMonitor::NewL(
+    MPEngContactListModStore& aStoreEntry  )
+    {
+    CPEngContactListModChangeMonitor* self =
+        new ( ELeave ) CPEngContactListModChangeMonitor( aStoreEntry );
+    return self;
+    }
+
+
+
+// Destructor
+CPEngContactListModChangeMonitor::~CPEngContactListModChangeMonitor()
+
+    {
+    iAddedContactIds.Reset();
+    iRemovedContactIds.Reset();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::AddedContactIds()
+// -----------------------------------------------------------------------------
+//
+const MDesCArray& CPEngContactListModChangeMonitor::AddedContactIds() const
+    {
+    return iAddedContactIds;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::RemovedContactIds()
+// -----------------------------------------------------------------------------
+//
+const MDesCArray& CPEngContactListModChangeMonitor::RemovedContactIds() const
+    {
+    return iRemovedContactIds;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::CountAddedContactIds()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngContactListModChangeMonitor::CountAddedContactIds() const
+    {
+    return iAddedContactIds.Count();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::CountRemovedContactIds()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngContactListModChangeMonitor::CountRemovedContactIds() const
+    {
+    return iRemovedContactIds.Count();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::FindContactIdInAdded()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngContactListModChangeMonitor::FindContactIdInAdded(
+    const TDesC& aContactId,
+    const TDesC& aUserDomain ) const
+    {
+    return NContactIdsTools::FindContactIdInArray( iAddedContactIds,
+                                                   aContactId,
+                                                   aUserDomain );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::FindContactIdInRemoved()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngContactListModChangeMonitor::FindContactIdInRemoved(
+    const TDesC& aContactId,
+    const TDesC& aUserDomain ) const
+    {
+    return NContactIdsTools::FindContactIdInArray( iRemovedContactIds,
+                                                   aContactId,
+                                                   aUserDomain );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::ExternalizeL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListModChangeMonitor::ExternalizeArrayL(
+    RWriteStream& aStream ) const
+    {
+    // first list of added WV IDs
+    TInt count( iAddedContactIds.MdcaCount() );
+    aStream.WriteInt32L( count );
+    for ( TInt i( 0 ); i < count; i++ )
+        {
+        aStream.WriteInt32L( iAddedContactIds.MdcaPoint( i ).Length() );
+        aStream.WriteL( iAddedContactIds.MdcaPoint( i ) );
+        }
+
+
+    // now store removed WV IDs
+    count = iRemovedContactIds.Count();
+    aStream.WriteInt32L( count );
+    for ( TInt ii( 0 ) ; ii < count ; ii++ )
+        {
+        aStream.WriteInt32L( iRemovedContactIds.MdcaPoint( ii ).Length() );
+        aStream.WriteL( iRemovedContactIds.MdcaPoint( ii ) );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::InternalizeL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListModChangeMonitor::InternalizeArrayL(
+    RReadStream& aStream )
+    {
+    iAddedContactIds.Reset();
+    iRemovedContactIds.Reset();
+    TInt& storeSize = iStoreEntry.StoreSizeCount();
+    storeSize += KIntStreamBytes * 2 ; // two counts of the arrays
+
+
+    RBuf buffer;
+    buffer.CleanupClosePushL();
+
+
+    // internalize array of Added WV IDs
+    TInt count ( aStream.ReadInt32L() );
+    for ( TInt x ( 0 ); x < count; x++ )
+        {
+        TInt size = aStream.ReadInt32L();
+        GrowBufferIfRequiredL( buffer, size );
+        aStream.ReadL( buffer, size );
+
+        // array was stored in order
+        iAddedContactIds.AppendL( buffer );
+        storeSize += size + KIntStreamBytes; // length
+        }
+
+
+    // internalize array of Added WV IDs
+    count = aStream.ReadInt32L();
+    for ( TInt y( 0 ) ; y < count; y++ )
+        {
+        TInt size = aStream.ReadInt32L();
+        GrowBufferIfRequiredL( buffer, size );
+        aStream.ReadL( buffer, size );
+
+        iRemovedContactIds.AppendL( buffer );
+        storeSize += size + KIntStreamBytes; // length
+        }
+
+
+    CleanupStack::PopAndDestroy(); // buffer
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::InsertAddedContactIdL()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngContactListModChangeMonitor::InsertAddedContactIdL(
+    const TDesC& aContactId )
+    {
+    RemoveRemovedContactId( aContactId );
+
+    // insert WV ID into the array
+    TInt position( NContactIdsTools::AddContactIdToArrayL( iAddedContactIds,
+                                                           aContactId ) );
+
+    // was WV already existing
+    if ( position == KErrAlreadyExists )
+        {
+        return NContactIdsTools::FindContactIdInArray( iAddedContactIds,
+                                                       aContactId );
+        }
+    else
+        {
+        // added successfully
+        TInt& entrySize = iStoreEntry.StoreSizeCount();
+        entrySize += aContactId.Size() + KIntStreamBytes; // length
+        return position;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::RemoveAddedContactId()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListModChangeMonitor::RemoveAddedContactId(
+    const TDesC& aContactId )
+    {
+    TInt err = NContactIdsTools::RemoveContactIdFromArray( iAddedContactIds,
+                                                           aContactId );
+    if ( err == KErrNone )
+        {
+        TInt& entrySize = iStoreEntry.StoreSizeCount();
+        entrySize -= aContactId.Size() - KIntStreamBytes; // length
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::ResetAddedContactId()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListModChangeMonitor::ResetAddedContactId()
+    {
+    iAddedContactIds.Reset();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::InsertRemovedContactIdL()
+// -----------------------------------------------------------------------------
+//
+TInt CPEngContactListModChangeMonitor::InsertRemovedContactIdL(
+    const TDesC& aContactId )
+    {
+    RemoveAddedContactId( aContactId );
+
+    // insert WV ID into the array
+    TInt position = NContactIdsTools::AddContactIdToArrayL( iRemovedContactIds,
+                                                            aContactId );
+    // was WV already existing
+    if ( position == KErrAlreadyExists )
+        {
+        return NContactIdsTools::FindContactIdInArray( iRemovedContactIds,
+                                                       aContactId );
+        }
+
+    else
+        {
+        // added successfully
+        TInt& entrySize = iStoreEntry.StoreSizeCount();
+        entrySize += aContactId.Size() + KIntStreamBytes; // length
+        return position;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::RemoveRemovedContactId()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListModChangeMonitor::RemoveRemovedContactId(
+    const TDesC& aContactId )
+    {
+    TInt err = NContactIdsTools::RemoveContactIdFromArray( iRemovedContactIds,
+                                                           aContactId );
+    if ( err == KErrNone )
+        {
+        TInt& entrySize = iStoreEntry.StoreSizeCount();
+        entrySize -= aContactId.Size() - KIntStreamBytes;// length
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::ResetRemovedContactIds()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListModChangeMonitor::ResetRemovedContactIds()
+    {
+    iRemovedContactIds.Reset();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListModChangeMonitor::Reset()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListModChangeMonitor::Reset()
+    {
+    iAddedContactIds.Reset();
+    iRemovedContactIds.Reset();
+    }
+
+
+//  End of File
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+