--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/JanitorPlugin2/Src/CPEngListObserver.cpp Thu Dec 17 08:41:52 2009 +0200
@@ -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 <e32std.h>
+#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<MPEngContactList2>& 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<MPEngContactList2>& 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