diff -r 6ca72c0fe49a -r a941bc465d9f PECengine/JanitorPlugin2/Src/CPEngListObserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/JanitorPlugin2/Src/CPEngListObserver.cpp Wed Sep 01 12:31:13 2010 +0100 @@ -0,0 +1,329 @@ +/* +* 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: Contact Database observer +* +*/ + + + +// INCLUDE FILES +#include +#include "CPEngListObserver.h" + +#include "CPEngNWSessionSlotID2.h" +#include "CPEngContactListNotifier2.h" +#include "CPEngContactListStore2.h" +#include "MPEngContactList2.h" +#include "MPEngContactListProperties.h" +#include "MPEngContactItem.h" +#include "PEngWVContactListExtensions2.h" + +#include "MPEngContactMapper.h" + + +// LOCAL CLASS DEFINITION +NONSHARABLE_CLASS( TPEngContactListNameWrapper ) : public MDesC16Array + { +public: + TPEngContactListNameWrapper( + RPointerArray& aContactLists ) + : iContactLists( aContactLists ) + { + } +public: // from MDesC16Array + TInt MdcaCount() const + { + return iContactLists.Count(); + } + + TPtrC16 MdcaPoint( TInt aIndex ) const + { + return iContactLists[ aIndex ]->ListProperties().Name(); + } + +public: // data + RPointerArray& iContactLists; + }; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngListObserver::CPEngListObserver +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CPEngListObserver::CPEngListObserver( + MPEngContactMapper& aMapper ) + : iContactMapper( aMapper ) + + { + } + +// ----------------------------------------------------------------------------- +// CPEngListObserver::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPEngListObserver::ConstructL( + const CPEngNWSessionSlotID2& aSessionId ) + { + iSessionId = aSessionId.CloneL(); + iListStore = CPEngContactListStore2::NewL( aSessionId ); + iListNotifier = CPEngContactListNotifier2::NewL( aSessionId ); + User::LeaveIfError( iListNotifier->AddObserver( *this ) ); + RefreshSupportedListsL(); + } + +// ----------------------------------------------------------------------------- +// CPEngListObserver::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngListObserver* CPEngListObserver::NewLC( + MPEngContactMapper& aMapper, + const CPEngNWSessionSlotID2& aSessionId ) + + { + CPEngListObserver* self = new( ELeave ) CPEngListObserver( aMapper ); + + CleanupStack::PushL( self ); + self->ConstructL( aSessionId ); + + return self; + } + +// Destructor +CPEngListObserver::~CPEngListObserver() + { + iContactLists.Reset(); + delete iListNotifier; + delete iListStore; + delete iSessionId; + } + +// ============================================================================= +// ===============Functions of MPEngContactListObserver2 class ======================== +// ============================================================================= +// ----------------------------------------------------------------------------- + +// ----------------------------------------------------------------------------- +// CPEngListObserver::HandleContactListChangeL() +// Contact list change handler +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngListObserver::HandleContactListChangeL( + CPEngContactListNotifier2& /* aNotifier */, + const TDesC& aContactListName ) + { + // was it contact list store changed? + if ( aContactListName == KNullDesC ) + { + RefreshSupportedListsL(); + return; + } + RemapContactListL( ContactListL( aContactListName ) ); + } + + +// ----------------------------------------------------------------------------- +// CPEngListObserver::HandleContactListError() +// Notification failure handler. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngListObserver::HandleContactListError( + TInt /*aError*/, + CPEngContactListNotifier2& /*aNotifier*/ ) + { + // no error handling + } + +// ============================================================================= +// ===============Functions of the base class ================================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngListObserver::UpdateMappingL() +// Update mapping for gived WV Id +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngListObserver::UpdateMappingL( + const TDesC& aWVId, + const CContactIdArray* aContactIds ) + { + TInt count( iContactLists.Count() ); + for ( TInt x( 0 ) ; x < count ; ++x ) + { + MPEngContactList2& contactList = *( iContactLists[ x ] ); + TInt index( contactList.FindContact( aWVId ) ); + if ( index != KErrNotFound ) + { + RemapContactItemL( contactList.ContactItem( index ), aContactIds ); + } + } + } + +// ----------------------------------------------------------------------------- +// CPEngListObserver::ReMappAllContactsL() +// Do full re-mapping of all contact list +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngListObserver::ReMappAllContactsL() + { + TInt count( iContactLists.Count() ); + for ( TInt x( 0 ) ; x < count ; ++x ) + { + RemapContactListL( *iContactLists[ x ], ETrue ); + } + } + +// ----------------------------------------------------------------------------- +// CPEngListObserver::SessionId() +// Session slot Id +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +const CPEngNWSessionSlotID2& CPEngListObserver::SessionId() const + { + return *iSessionId; + } + +// ----------------------------------------------------------------------------- +// CPEngListObserver::RefreshSupportedListsL +// Build list of supported contact lists +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngListObserver::RefreshSupportedListsL() + { + iContactLists.Reset(); + iListNotifier->Stop(); + const MDesC16Array& lists = iListStore->AllContactListsL(); + TInt count( lists.MdcaCount() ); + for ( TInt x( 0 ) ; x < count ; ++x ) + { + if ( EFalse != iListStore->ContactListPropertiesL( + lists.MdcaPoint( x ) + ).Property( + KPEngContactToContactDbMapping, + KPEngCntLstPropertyExternalPermanent ) + ) + { + MPEngContactList2& contactList = iListStore->ContactListL( + lists.MdcaPoint( x ) ); + iContactLists.AppendL( &contactList ); + RemapContactListL( contactList ); + } + } + TPEngContactListNameWrapper listNames( iContactLists ); + User::LeaveIfError( iListNotifier->Start( listNames ) ); + } + +// ----------------------------------------------------------------------------- +// CPEngListObserver::ContactListL +// Find Contact list +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +MPEngContactList2& CPEngListObserver::ContactListL( + const TDesC& aContactList ) + { + TInt count( iContactLists.Count() ); + for ( TInt x( 0 ) ; x < count ; ++x ) + { + if ( KErrNone + == + aContactList.CompareF( + iContactLists[ x ]->ListProperties().Name() ) + ) + { + return *( iContactLists[ x ] ); + } + } + User::Leave( KErrNotFound ); + // just for compiler + return *( iContactLists[ 0 ] ); + } + + +// ----------------------------------------------------------------------------- +// CPEngListObserver::RemapContactListL +// Remap whole contact list +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngListObserver::RemapContactListL( + MPEngContactList2& aContactList, + TBool aForceUpdate /* EFalse */ ) + { + aContactList.SuspendUpdateNotification(); + TInt count ( aContactList.Count() ); + for ( TInt x( 0 ) ; x < count ; ++x ) + { + MPEngContactItem& contact = aContactList.ContactItem( x ); + TPtrC8 value; + if ( aForceUpdate + || + ( KErrNotFound == contact.GetProperty( + KPEngCntItemExtensionMappedContactDbIds, + KPEngCntItemPropertyExternalCached, + value ) ) + ) + { + // not mapped yet, map + CContactIdArray* contactIds = + iContactMapper.MapWvIdToContactIdLC( contact.Id() ); + RemapContactItemL( contact, contactIds ); + CleanupStack::PopAndDestroy( contactIds ); + } + } + aContactList.ReleaseUpdateNotification(); + } + +// ----------------------------------------------------------------------------- +// CPEngListObserver::RemapContactListL +// Remap one Contact Item with given contact db ids +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngListObserver::RemapContactItemL( + MPEngContactItem& aContactItem, + const CContactIdArray* aContactIds ) + { + if ( aContactIds ) + { + HBufC8* packedIds = + PEngContactItemExtensionCodec2::PackContactIdsLC( + *aContactIds ); + aContactItem.SetPropertyL( KPEngCntItemExtensionMappedContactDbIds, + KPEngCntItemPropertyExternalCached, + *packedIds ); + + CleanupStack::PopAndDestroy( packedIds ); + } + else + { + aContactItem.SetPropertyL( KPEngCntItemExtensionMappedContactDbIds, + KPEngCntItemPropertyExternalCached, + KNullDesC8 ); + } + aContactItem.DeletePropertyL( KPEngCntItemExtensionMappingCleaning, + KPEngCntItemPropertyExternalCached ); + } + +// End of File