diff -r 000000000000 -r 094583676ce7 PECengine/ListLibrary2/ContactListSrc/CPEngContactListModChangeMonitor.cpp --- /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 +#include + + +// ============================= 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 + + + + + + + + + + + + + + + + + + + + + +