diff -r 000000000000 -r 094583676ce7 PECengine/ListLibrary2/ContactListSrc/CPEngContactListModItemContainer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListModItemContainer.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,776 @@ +/* +* 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: Container of the one contact list item. +* +*/ + +// INCLUDE FILES +#include "PEngContactIdsTools.h" +#include "CPEngContactListModItemContainer.h" +#include "MPEngContactListModStore.h" +#include "CPEngStoreEntry.h" +#include "CPEngContactListProperty.h" +#include "PEngListLibraryPanics.h" +#include + + +// CONSTANTS +const TInt KIntStreamBytes = 4; + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::CPEngContactListModItemContainer() +// ----------------------------------------------------------------------------- +// +CPEngContactListModItemContainer::CPEngContactListModItemContainer( + MPEngContactListModStore& aStoreEntry ) + : iStoreEntry( aStoreEntry ), + iAccessCount( 1 ), // initial access count + iSize( aStoreEntry.StoreSizeCount() ), + iFresh( EFalse ) + { + // Initial size of numbers stored for managing the item + iSize += KIntStreamBytes * 5; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::ConstructL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::ConstructL( + const TDesC& aContactId, + const TDesC* aNickName ) + { + iContactId = aContactId.AllocL(); + iSize += aContactId.Length(); + if ( aNickName ) + { + iNickName = aNickName->AllocL(); + iSize += aNickName->Length(); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::ConstructNewNickL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::ConstructNewNickL( + const TDesC& aContactId, + const TDesC& aNewNickName ) + { + iContactId = aContactId.AllocL(); + iSize += aContactId.Length(); + iNewNickName = aNewNickName.AllocL(); + iSize += aNewNickName.Length(); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::NewLC() +// ----------------------------------------------------------------------------- +// +CPEngContactListModItemContainer* CPEngContactListModItemContainer::NewLC( + MPEngContactListModStore& aStoreEntry, + const TDesC& aContactId, + const TDesC* aNickName ) + { + CPEngContactListModItemContainer* self = + new( ELeave ) CPEngContactListModItemContainer( aStoreEntry ); + + CleanupClosePushL( *self ); + self->ConstructL( aContactId, aNickName ); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::NewNewNickLC() +// ----------------------------------------------------------------------------- +// +CPEngContactListModItemContainer* CPEngContactListModItemContainer::NewNewNickLC( + MPEngContactListModStore& aStoreEntry, + const TDesC& aContactId, + const TDesC& aNewNickName ) + { + CPEngContactListModItemContainer* self = + new( ELeave ) CPEngContactListModItemContainer( aStoreEntry ); + + CleanupClosePushL( *self ); + self->ConstructNewNickL( aContactId, aNewNickName ); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::NewLC() +// ----------------------------------------------------------------------------- +// +CPEngContactListModItemContainer* CPEngContactListModItemContainer::NewLC( + MPEngContactListModStore& aStoreEntry, + RReadStream& aStream ) + { + CPEngContactListModItemContainer* self = + new( ELeave ) CPEngContactListModItemContainer( aStoreEntry ); + + CleanupClosePushL( *self ); + self->InternalizeL( aStream, EPEngStorageBasicPermanent ); + + return self; + } + + +// Destructor +CPEngContactListModItemContainer::~CPEngContactListModItemContainer() + { + // panic if object is still accessed + __ASSERT_DEBUG( iAccessCount == 0 , Panic( ERefAccessedObjectDeleted ) ); + + // decrease size since object is deleted + iSize -= KIntStreamBytes * 3; + if ( iContactId ) + { + iSize += iContactId->Length(); + } + + delete iContactId; + delete iNickName; + delete iNewNickName; + + iProperties.ResetAndDestroy(); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::Id() +// ----------------------------------------------------------------------------- +// +const TDesC& CPEngContactListModItemContainer::Id() const + { + return *iContactId; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::NickName() +// ----------------------------------------------------------------------------- +// +const TDesC& CPEngContactListModItemContainer::NickName() const + { + if ( iNewNickName ) + { + return *iNewNickName; + } + + if ( iNickName ) + { + return *iNickName; + } + + return KNullDesC; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::UpdateNickNameL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::UpdateNickNameL( const TDesC& aNickName ) + { + TInt size( iNewNickName ? iNewNickName->Length() : KIntStreamBytes * 2 ); + delete iNewNickName; + iNewNickName = NULL; + + if ( !iNickName || ( KErrNone != iNickName->Compare( aNickName ) ) ) + { + iNewNickName = aNickName.AllocL(); + size -= iNewNickName->Length(); + } + + iSize -= size; + iStoreEntry.StoreEntryL(); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::GetProperty() +// ----------------------------------------------------------------------------- +// +TInt CPEngContactListModItemContainer::GetProperty( TUint aName, + TUint aLevel, + TInt& aValue ) const + + { + return PEngPropertyManager::GetProperty( iProperties, + aName, + aLevel, + aValue ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::GetProperty() +// ----------------------------------------------------------------------------- +// +TInt CPEngContactListModItemContainer::GetProperty( TUint aName, + TUint aLevel, + TPtrC8& aValue ) const + { + return PEngPropertyManager::GetProperty( iProperties, + aName, + aLevel, + aValue ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::GetProperty() +// ----------------------------------------------------------------------------- +// +TInt CPEngContactListModItemContainer::GetProperty( TUint aName, + TUint aLevel, + TPtrC16& aValue ) const + { + return PEngPropertyManager::GetProperty( iProperties, + aName, + aLevel, + aValue ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::Property() +// ----------------------------------------------------------------------------- +// +TInt CPEngContactListModItemContainer::Property( TUint aName, + TUint aLevel ) const + { + return PEngPropertyManager::PropertyOrZero( iProperties, + aName, + aLevel ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::SetPropertyL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::SetPropertyL( TUint aName, + TUint aLevel, + TInt aValue ) + { + PEngPropertyManager::SetPropertyL( iProperties, + aName, + aLevel, + aValue, + iSize ); + iStoreEntry.StoreEntryL(); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::SetPropertyL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::SetPropertyL( TUint aName, + TUint aLevel, + const TDesC8& aValue ) + { + PEngPropertyManager::SetPropertyL( iProperties, + aName, + aLevel, + aValue, + iSize ); + iStoreEntry.StoreEntryL(); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::SetPropertyL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::SetPropertyL( TUint aName, + TUint aLevel, + const TDesC16& aValue ) + { + PEngPropertyManager::SetPropertyL( iProperties, + aName, + aLevel, + aValue, + iSize ); + iStoreEntry.StoreEntryL(); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::DeletePropertyL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::DeletePropertyL( TUint aName, + TUint aLevel ) + { + if ( PEngPropertyManager::DeletePropertyL( + iProperties, + aName, + aLevel, + iSize ) ) + { + iStoreEntry.StoreEntryL(); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::GetPermanentValue() +// ----------------------------------------------------------------------------- +// +TInt CPEngContactListModItemContainer::GetPermanentValue( const TDesC& /*aKey*/, + TPtrC8& /*aValue*/ ) const + { + return KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::GetCachedValue() +// ----------------------------------------------------------------------------- +// +TInt CPEngContactListModItemContainer::GetCachedValue( const TDesC& /*aKey*/, + TPtrC8& /*aValue*/ ) const + { + return KErrNotFound; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::SetPermanentValueL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::SetPermanentValueL( const TDesC& /*aKey*/, + const TDesC8& /*aValue*/ ) + { + User::Leave( KErrNotSupported ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::SetCachedValueL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::SetCachedValueL( const TDesC& /*aKey*/, + const TDesC8& /*aValue*/ ) + { + User::Leave( KErrNotSupported ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::DeletePermanentValueL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::DeletePermanentValueL( const TDesC& /*aKey*/ ) + { + User::Leave( KErrNotSupported ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::DeleteCachedValueL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::DeleteCachedValueL( const TDesC& /*aKey*/ ) + { + User::Leave( KErrNotSupported ); + } + + +// ============================================================================= +// ===============Functions of main class ====================================== +// ============================================================================= + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::Compare() +// ----------------------------------------------------------------------------- +// +TInt CPEngContactListModItemContainer::Compare( + const CPEngContactListModItemContainer& aFirst, + const CPEngContactListModItemContainer& aSecond ) + { + return NContactIdsTools::CompareContactIds( *( aFirst.iContactId ), + *( aSecond.iContactId ) ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::Open() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::Open( TInt aRefType ) + { + iAccessCount++; + iRefDefinitions |= aRefType; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::CloseRef() +// ----------------------------------------------------------------------------- +CPEngContactListModItemContainer* CPEngContactListModItemContainer::CloseRef( + TInt aRefType /* 0 */ ) + { + iRefDefinitions &= ~aRefType; + + // access count will be decreased by 1, get pointer + CPEngContactListModItemContainer* self = ( iAccessCount - 1 ) ? this : NULL; + Close(); + + return self; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::RefActive() +// ----------------------------------------------------------------------------- +TBool CPEngContactListModItemContainer::RefActive( TInt aRefType /* 0 */ ) + { + return iRefDefinitions & aRefType; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::Close() +// ----------------------------------------------------------------------------- +void CPEngContactListModItemContainer::Close() + { + --iAccessCount; + + if ( !iAccessCount ) + { + delete this; + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::ExternalizeL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::ExternalizeL( RWriteStream& aStream, + TInt aType ) const + { + switch ( aType ) + { + case EPEngStorageBasicPermanent: + { + // reference definitions + aStream.WriteInt32L( iRefDefinitions ); + aStream.WriteInt32L( iServerIndex ); + + // WV Id + aStream.WriteInt32L( iContactId->Length() ); + aStream << *iContactId; + + // nickname + if ( iNickName ) + { + aStream.WriteInt32L( iNickName->Length() ); + aStream << *iNickName; + } + else + { + // no nick name, save -1 to signal NULL pointer + aStream.WriteInt32L( -1 ); + } + + //Fresh status + aStream.WriteInt32L( iFresh ); + + // Detailed properties + PEngPropertyManager::ExternalizePropertiesL( iProperties, + aStream, + aType ); + break; + } + + + case EPEngStorageBasicCached: + { + // the new nickname + if ( iNewNickName ) + { + aStream.WriteInt32L( iNewNickName->Length() ); + aStream << *iNewNickName; + } + else + { + // no new nickname, save -1 to signal NULL pointer + aStream.WriteInt32L( -1 ); + } + + + // Detailed properties + PEngPropertyManager::ExternalizePropertiesL( iProperties, + aStream, + aType ); + + break; + } + + default: + { + } + } + } + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::InternalizeL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::InternalizeL( RReadStream& aStream, + TInt aType ) + { + switch ( aType ) + { + case EPEngStorageBasicPermanent: + { + iProperties.ResetAndDestroy(); + + iRefDefinitions = aStream.ReadInt32L(); + iServerIndex = aStream.ReadInt32L(); + + // first WV Id + TInt size( 2 * KIntStreamBytes ); + TInt length( aStream.ReadInt32L() ); + iContactId = HBufC::NewL( aStream, length ); + size += iContactId->Length(); + + // read nickname + length = aStream.ReadInt32L(); + size += KIntStreamBytes; + if ( length != -1 ) // just to signal NULL pointer + { + iNickName = HBufC::NewL( aStream, length ); + size += iNickName->Length(); + } + else + { + iNickName = NULL; + } + + + //Fresh status + iFresh = aStream.ReadInt32L(); + + + // Detailed properties + PEngPropertyManager::InternalizePropertiesL( iProperties, + aStream, + size ); + + iSize += size; + TInt& entrySize = iStoreEntry.StoreSizeCount(); + entrySize += size; + break; + } + + + case EPEngStorageBasicCached: + { + // always 4 numbers stored in the store beside other data + TInt size ( 4 * KIntStreamBytes ); + + // New nickname + TInt length ( aStream.ReadInt32L() ); + if ( length != -1 ) // just to signal NULL pointer + { + delete iNewNickName; + iNewNickName = NULL; + iNewNickName = HBufC::NewL( aStream, length ); + size += iNewNickName->Length(); + } + else + { + delete iNewNickName; + iNewNickName = NULL; + } + + // Detailed properties + PEngPropertyManager::InternalizePropertiesL( iProperties, + aStream, + size ); + + iSize += size; + TInt& entrySize = iStoreEntry.StoreSizeCount(); + entrySize += size; + break; + } + + default: + { + } + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::UpdateContactId() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::UpdateContactId( HBufC* aId ) // CSI: 60 # + { + __ASSERT_DEBUG( aId, Panic( ENullParameter ) ); + + iSize -= iContactId->Length(); + delete iContactId; + iContactId = aId; + iSize += iContactId->Length(); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::NewNick() +// ----------------------------------------------------------------------------- +// +const HBufC* CPEngContactListModItemContainer::NewNick() const + { + return iNewNickName; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::CurrecntNick() +// ----------------------------------------------------------------------------- +// +const HBufC* CPEngContactListModItemContainer::CurrentNick() const + { + return iNickName; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::SetCurrentNickname() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::SetCurrentNickname( HBufC* aNickName ) // CSI: 60 # + { + if ( iNickName ) + { + iSize -= iNickName->Length(); + delete iNickName; + } + + iNickName = aNickName; + + if ( iNickName ) + { + iSize += iNickName->Length(); + } + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::AdoptCurrentNickAsNew() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::AdoptCurrentNickAsNew() + { + if ( iNewNickName ) + { + iSize -= iNewNickName->Length(); + delete iNewNickName; + } + iNewNickName = iNickName; + iNickName = NULL; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::RollBackNickname() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::RollBackNickname() + { + if ( iNewNickName ) + { + iSize -= iNewNickName->Length(); + delete iNewNickName; + } + + iNewNickName = NULL; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::CommitNickName() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::CommitNickName() + { + if ( iNickName ) + { + iSize -= iNickName->Length(); + delete iNickName; + } + + iNickName = iNewNickName; + iNewNickName = NULL; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::ServerIndex() +// ----------------------------------------------------------------------------- +TInt CPEngContactListModItemContainer::ServerIndex() const + { + return iServerIndex; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::SetServerIndex() +// ----------------------------------------------------------------------------- +void CPEngContactListModItemContainer::SetServerIndex( TInt aIndex ) + { + iServerIndex = aIndex; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::IsFreshContact() +// ----------------------------------------------------------------------------- +// +TBool CPEngContactListModItemContainer::IsFreshContact() + { + return iFresh; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListModItemContainer::SetFreshContact() +// ----------------------------------------------------------------------------- +// +void CPEngContactListModItemContainer::SetFreshContact( TBool aFresh ) + { + iFresh = aFresh; + } + + +// End of File +