PECengine/JanitorPlugin2/Src/CPEngListObserver.cpp
changeset 0 094583676ce7
--- /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