PECengine/ListLibrary2/AttrListSrc/CPEngAttributeListTransactionManager.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/ListLibrary2/AttrListSrc/CPEngAttributeListTransactionManager.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,839 @@
+/*
+* 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:  Attribute list transaction manager
+*
+*/
+
+// INCLUDE FILES
+#include "CPEngAttributeListTransactionManager.h"
+#include "PEngListLibraryFactory.h"
+#include "MPEngListLibFactory.h"
+#include "PEngPresenceEngineConsts2.h"
+#include "CPEngContactListTransactionManager.h"
+#include "CPEngContactListSettings.h"
+#include "CPEngAttributeListItem.h"
+#include "CPEngAttributeListTransCreateAttrList.h"
+#include "CPEngAttributeListTransDeleteAttrList.h"
+#include "MPEngStorageManager.h"
+#include "PEngAttrLibFactory.h"
+#include "MPEngPresenceAttrManager.h"
+#include "PEngMessagePacker.h"
+#include "PresenceDebugPrint.h"
+#include <e32std.h>
+
+
+// MACROS
+#define CONTINUE_IF( a )\
+    if ( a )\
+        {\
+        continue;\
+        }
+
+
+//Default granurality for ID lists
+const TInt KAttributeListIdGranurality = 3;
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CPEngAttributeListTransactionManager()
+// -----------------------------------------------------------------------------
+//
+CPEngAttributeListTransactionManager::CPEngAttributeListTransactionManager(
+    MPEngListLibFactory& aFactory,
+    TPEngWVCspVersion& aCSPVersion )
+        : CPEngAttributeListManager( aFactory ),
+        iCSPVersion( aCSPVersion )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::ConstructL(
+    const CPEngSessionSlotId& aSessionSlot )
+    {
+    CPEngAttributeListManager::ConstructL( aSessionSlot );
+    iContactListTransManager = static_cast <CPEngContactListTransactionManager*>
+                               ( PEngListLibraryFactory::ContactListTransactionManagerLC( aSessionSlot ) );
+
+    CleanupStack::Pop();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::NewL()
+// -----------------------------------------------------------------------------
+//
+CPEngAttributeListTransactionManager* CPEngAttributeListTransactionManager::NewL(
+    MPEngListLibFactory& aFactory,
+    const CPEngSessionSlotId& aSessionSlot,
+    TPEngWVCspVersion& aCSPVersion )
+    {
+    CPEngAttributeListTransactionManager* self = NewLC( aFactory,
+                                                        aSessionSlot,
+                                                        aCSPVersion );
+    CleanupStack::Pop();
+
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::NewLC()
+// -----------------------------------------------------------------------------
+//
+CPEngAttributeListTransactionManager* CPEngAttributeListTransactionManager::NewLC(
+    MPEngListLibFactory& aFactory,
+    const CPEngSessionSlotId& aSessionSlot,
+    TPEngWVCspVersion& aCSPVersion )
+    {
+    CPEngAttributeListTransactionManager* self =
+        new( ELeave ) CPEngAttributeListTransactionManager( aFactory,
+                                                            aCSPVersion );
+
+    CleanupClosePushL( *self );
+    self->ConstructL( aSessionSlot );
+
+    return self;
+    }
+
+
+//   Destructor
+CPEngAttributeListTransactionManager::~CPEngAttributeListTransactionManager()
+    {
+    if ( iContactListTransManager )
+        {
+        iContactListTransManager->Close();
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::Close()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::Close()
+    {
+    iAccessCount--;
+    if ( iAccessCount == 0 )
+        {
+        iFactory.RemoveAttrListTransManager( this );
+        delete this;
+        }
+    }
+
+
+
+// =============================================================================
+// ============ Functions of the MPEngTransactionFactory class ===============
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::IncomingTransactionHandlerL()
+// -----------------------------------------------------------------------------
+//
+MPEngIncomingTransactionHandler*
+CPEngAttributeListTransactionManager::IncomingTransactionHandlerL(
+    const TDesC8& /* aIncomingRequest */ )
+    {
+    return NULL;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::OutgoingTransactionHandlerL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::OutgoingTransactionHandlerL(
+    TInt aOperation,
+    const TDesC& /*aData*/,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngAttributeListTransactionManager::OutgoingTransactionHandlerL()" ) );
+
+    switch ( aOperation )
+        {
+        case EPEngTransOpAttrListPublish:
+            {
+            // Make sure that we are handling most up-to-date data
+            iStorageManager->RetrieveL( *this );
+
+            if ( !iSynchronized )
+                {
+                GetSyncHandlersL( aHandlers, aOperation );
+                }
+            else
+                {
+                GetAttributeListsUpdateHandlersL( aHandlers, aOperation );
+                }
+
+            break;
+            }
+
+        default:
+            {
+            }
+        }
+    }
+
+
+
+// =============================================================================
+// ============ From MPEngAttributeListTransactionManager ======================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::AttributeListCreated()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::AttributeListCreated(
+    const RArray<TUint32>& aAttrList )
+    {
+    TInt index ( FindAttributeList( aAttrList ) );
+    if ( index != KErrNotFound )
+        {
+        iAttributeLists[ index ]->SetSynchronization( ETrue );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::AttributeEngineSynchronizedL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::AttributeEngineSynchronizedL()
+    {
+    iSyncHandlerCount--;
+    if ( !iSyncHandlerCount )
+        {
+        iSynchronized = ETrue;
+        StoreChangesL();
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CommitContactL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::CommitContactListL(
+    const TDesC& aContactList )
+    {
+    CommitContactL( aContactList,
+                    &CPEngAttributeListItem::CommitContactListL,
+                    iDeleteAttrListContactLists );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CommitContactIdL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::CommitContactIdL(
+    const TDesC& aContactId )
+    {
+    CommitContactL( aContactId,
+                    &CPEngAttributeListItem::CommitContactIdL,
+                    iDeleteAttrListContactIDs );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::RollBackContactListL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::RollBackContactListL(
+    const TDesC& aContactList )
+    {
+    RollBackOneContactL( aContactList,
+                         CPEngAttributeListItem::ENewContactLists,
+                         iDeleteAttrListContactLists );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::RollBackContactIdL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::RollBackContactIdL(
+    const TDesC& aContactId )
+    {
+    RollBackOneContactL( aContactId,
+                         CPEngAttributeListItem::ENewContactIDs,
+                         iDeleteAttrListContactIDs );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CommitDefaultL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::CommitDefaultL()
+    {
+    // go through all Attribute lists and commit Default flag
+    // if attribute list is without any contact after commiting
+    // and it isn't default or to be new default,
+    // this attribute list will be deleted in CompressAtrrListArray function
+    for ( TInt x ( iAttributeLists.Count() - 1 ) ;  x >= 0 ; x-- )
+        {
+        // commit default to each
+        iAttributeLists[x]->CommitDefault();
+        }
+    iDeleteDefaultAttrList = EFalse;
+
+    // now compress array
+    CompressArrListArray();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::RollBackDefaultL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::RollBackDefaultL()
+    {
+    // go through all Attribute lists and commit Default flag
+    // if attribute list is without any contact after commiting and it is not default
+    // or to be new default, this attribute list will be deleted in CompressAtrrListArray function
+    for ( TInt x ( iAttributeLists.Count() - 1 ) ;  x >= 0 ; x-- )
+        {
+        // commit default to each
+        iAttributeLists[x]->SetNewDefault( EFalse );
+        }
+    iDeleteDefaultAttrList = EFalse;
+
+    // now compress array
+    CompressArrListArray();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CommitDefinedAttributeList()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::CommitDefinedContactsL(
+    const CDesCArray* aContactLists,
+    const CDesCArray* aContactIds )
+    {
+    // commit all contacts IDs and contact lists
+    if ( aContactLists )
+        {
+        TInt count ( aContactLists->Count() );
+        for ( TInt ii( 0 ) ; ii < count ; ii++ )
+            {
+            CommitContactListL( aContactLists->MdcaPoint( ii ) );
+            }
+        }
+
+
+    if ( aContactIds )
+        {
+        TInt count ( aContactIds->Count() );
+        for ( TInt i( 0 ) ; i < count ; i++ )
+            {
+            CommitContactIdL( aContactIds->MdcaPoint( i ) );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::RollBackDefinedContactsL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::RollBackDefinedContactsL(
+    const CDesCArray* aContactLists,
+    const CDesCArray* aContactIds )
+    {
+    // RollBack all contacts IDs and contact lists
+    if ( aContactLists )
+        {
+        TInt count ( aContactLists->Count() );
+        for ( TInt ii( 0 ) ; ii < count ; ii++ )
+            {
+            RollBackContactListL( aContactLists->MdcaPoint( ii ) );
+            }
+        }
+
+
+    if ( aContactIds )
+        {
+        TInt count ( aContactIds->Count() );
+        for ( TInt i( 0 ) ; i < count ; i++ )
+            {
+            RollBackContactIdL( aContactIds->MdcaPoint( i ) );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::StoreChangesToStoreL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::StoreChangesToStoreL()
+    {
+    User::LeaveIfError( StoreChangesL() );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::GetSyncHandlersL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::GetSyncHandlersL(
+    RPointerArray<MPEngOutgoingTransactionHandler>& aTransactionHandlers,
+    TInt aOperationId )
+    {
+    // Commit all items in the lists before they are synchronized,
+    // so desired changes are synchronized right a way
+    CommitAllAttributeListL();
+    StoreChangesL();
+
+    // now create SyncAttributes list handlers
+    iSyncHandlerCount = 0;
+    TInt count ( iAttributeLists.Count() );
+    for ( TInt y( 0 ) ;  y < count ; y++ )
+        {
+        // create attribute list only if it needed
+        if ( CheckAttributeListServerValidityCurrent( *( iAttributeLists[y] ) ) )
+            {
+            // ETrue => this is sync handler
+            CPEngAttributeListTransCreateAttrList* newHandler =
+                CPEngAttributeListTransCreateAttrList::NewLC(
+                    *( iAttributeLists[y] ),
+                    *this,
+                    *iContactListTransManager,
+                    *iAttributeManager,
+                    iCSPVersion,
+                    aOperationId,
+                    ETrue );
+
+            aTransactionHandlers.AppendL( newHandler );
+            CleanupStack::Pop(); // newHandler
+            iSyncHandlerCount++;
+            }
+        }
+
+    // now check if there are some attribute lists to be deleted
+    // GetDeleteAttributeListsHandlersL( aTransactionHandlers, aOperationId );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::GetAttributeListsUpdateHandlersL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::GetAttributeListsUpdateHandlersL(
+    RPointerArray<MPEngOutgoingTransactionHandler>& aTransactionHandlers,
+    TInt aOperationId )
+    {
+    // go through all attributes and create all handlers which are necessary
+    TInt count ( iAttributeLists.Count() );
+    for ( TInt x( 0 ) ; x < count ; x++ )
+        {
+        if ( CheckAttributeListCreateNewValidity( *( iAttributeLists[x] ) ) )
+            {
+            // there is something to update, create handler
+            CPEngAttributeListTransCreateAttrList* newHandler =
+                CPEngAttributeListTransCreateAttrList::NewLC(
+                    *( iAttributeLists[ x ] ),
+                    *this,
+                    *iContactListTransManager,
+                    *iAttributeManager,
+                    iCSPVersion,
+                    aOperationId );
+            aTransactionHandlers.AppendL( newHandler );
+            CleanupStack::Pop(); // newHandler
+            }
+
+        else
+            {
+            // Commit attribute list
+            CommitAttributeListL( *( iAttributeLists[x]  ) );
+            }
+        }
+
+    // now check if there are some attribute lists to be deleted
+    GetDeleteAttributeListsHandlersL( aTransactionHandlers, aOperationId );
+    StoreChangesL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CompressArrListArray()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::GetDeleteAttributeListsHandlersL(
+    RPointerArray<MPEngOutgoingTransactionHandler>& aTransactionHandlers,
+    TInt aOperationId )
+    {
+    if ( CheckAttributeListDeleteValidity() )
+        {
+        // there is something to delete from server, create handler
+        CPEngAttributeListTransDeleteAttrList* newHandler;
+        newHandler = CPEngAttributeListTransDeleteAttrList::NewLC(
+                         *this,
+                         *iContactListTransManager,
+                         iDeleteAttrListContactLists,
+                         iDeleteAttrListContactIDs,
+                         iDeleteDefaultAttrList,
+                         iCSPVersion,
+                         aOperationId );
+
+        aTransactionHandlers.AppendL( newHandler );
+        CleanupStack::Pop(); // newHandler
+        }
+    else
+        {
+        CommitDeleteAttributeListL();
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CompressArrListArray()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::CompressArrListArray()
+    {
+    // go through array from the end and delete all attribute lists
+    // which does not hold any contact
+    for ( TInt x ( iAttributeLists.Count() - 1 ) ; x >= 0 ; x-- )
+        {
+        if ( 0 == iAttributeLists[ x ]->ContactsCount() )
+            {
+            // no more contacts, delete attribute list
+            delete iAttributeLists[ x ];
+            iAttributeLists.Remove( x );
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::AppendDesArrayContentL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::AppendDesArrayContentL(
+    const CDesC16Array& aOriginalDesArray,
+    CDesC16Array& aNewDesArray )
+    {
+    TInt count ( aOriginalDesArray.Count() );
+    for ( TInt x ( 0 ) ; x < count ; x++ )
+        {
+        aNewDesArray.AppendL( aOriginalDesArray[ x ] );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::AppendDesArrayContentL()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngAttributeListTransactionManager::CheckAttributeListServerValidityCurrent(
+    const CPEngAttributeListItem& aAttributeList )
+    {
+    return CheckAttributeListValidity( aAttributeList,
+                                       CPEngAttributeListItem::ECurrentContactIDs,
+                                       CPEngAttributeListItem::ECurrentContactLists,
+                                       &CPEngAttributeListItem::CurrentlyDefault,
+                                       EFalse );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CheckAttributeListCreateNewValidity()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngAttributeListTransactionManager::CheckAttributeListCreateNewValidity(
+    const CPEngAttributeListItem& aAttributeList )
+    {
+    return CheckAttributeListValidity( aAttributeList,
+                                       CPEngAttributeListItem::ENewContactIDs,
+                                       CPEngAttributeListItem::ENewContactLists,
+                                       &CPEngAttributeListItem::NewDefault,
+                                       EFalse );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CheckAttributeListDeleteValidity()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngAttributeListTransactionManager::CheckAttributeListDeleteValidity()
+    {
+    TBool attrListValid( ETrue );
+    if ( ( iDeleteAttrListContactIDs.Count() == 0 ) && !iDeleteDefaultAttrList )
+        {
+        attrListValid = EFalse;
+        TInt cntListCount ( iDeleteAttrListContactLists.Count() );
+        for ( TInt i ( 0 ) ; i < cntListCount ; i++ )
+            {
+            CPEngContactListSettings* cntSettings =
+                iContactListTransManager->ContactListSettingsOrNull(
+                    iDeleteAttrListContactLists[ i ] );
+
+            CONTINUE_IF( !cntSettings );
+
+            attrListValid += cntSettings->Property( KPEngListExistsOnServer,
+                                                    KPEngCntLstPropertyNativeCached );
+
+            // if list exists, break away
+            if ( attrListValid )
+                {
+                return ETrue;
+                }
+            }
+        }
+
+    return attrListValid;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CommitAttributeList()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::CommitAttributeListL(
+    const CPEngAttributeListItem& aAttributeList )
+    {
+    CDesCArraySeg* newContactIDs = new ( ELeave ) CDesCArraySeg( KAttributeListIdGranurality );
+    CleanupStack::PushL( newContactIDs );
+
+    AppendDesArrayContentL( aAttributeList.ArrayOfContacts(
+                                CPEngAttributeListItem::ENewContactIDs ),
+                            *newContactIDs );
+
+
+    CDesCArraySeg* newContactLists =  new ( ELeave ) CDesCArraySeg( KAttributeListIdGranurality );
+    CleanupStack::PushL( newContactLists );
+
+    AppendDesArrayContentL( aAttributeList.ArrayOfContacts(
+                                CPEngAttributeListItem::ENewContactLists ),
+                            *newContactLists );
+
+
+    TBool newDefaulFlag( EFalse );
+    if ( aAttributeList.NewDefault() )
+        {
+        newDefaulFlag = ETrue;
+        }
+
+
+    // commit all new contacts IDs and contact lists
+    CommitDefinedContactsL( newContactIDs, newContactLists );
+    CleanupStack::PopAndDestroy( 2 ); // newContactLists, newContactIDs
+    if ( newDefaulFlag )
+        {
+        CommitDefaultL();
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CommitAttributeList()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::CommitAllAttributeListL()
+    {
+    CDesCArraySeg* newContactIDs = new ( ELeave ) CDesCArraySeg( KAttributeListIdGranurality );
+    CleanupStack::PushL( newContactIDs );
+
+    CDesCArraySeg* newContactLists =  new ( ELeave ) CDesCArraySeg( KAttributeListIdGranurality );
+    CleanupStack::PushL( newContactLists );
+    TBool newDefaulFlag( EFalse );
+
+
+    TInt count ( iAttributeLists.Count() );
+    for ( TInt x ( 0 ) ; x < count ; x++ )
+        {
+        AppendDesArrayContentL( iAttributeLists[ x ]->ArrayOfContacts(
+                                    CPEngAttributeListItem::ENewContactIDs ),
+                                *newContactIDs );
+
+        AppendDesArrayContentL( iAttributeLists[ x ]->ArrayOfContacts(
+                                    CPEngAttributeListItem::ENewContactLists ),
+                                *newContactLists );
+
+        if ( iAttributeLists[ x ]->NewDefault() )
+            {
+            newDefaulFlag = ETrue;
+            }
+        }
+
+
+    CommitDefinedContactsL( newContactLists, newContactIDs );
+    CleanupStack::PopAndDestroy( 2 ); // newContactLists, newContactIDs
+
+
+    if ( newDefaulFlag )
+        {
+        CommitDefaultL();
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CommitDeleteAttributeListL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::CommitDeleteAttributeListL()
+    {
+    CDesCArraySeg* contacts = new ( ELeave ) CDesCArraySeg( KAttributeListIdGranurality );
+    CleanupStack::PushL( contacts );
+
+    AppendDesArrayContentL( iDeleteAttrListContactIDs, *contacts );
+    CommitDefinedContactsL( contacts, NULL );
+
+    contacts->Reset();
+
+    AppendDesArrayContentL( iDeleteAttrListContactLists, *contacts );
+    CommitDefinedContactsL( NULL, contacts );
+
+    CleanupStack::PopAndDestroy( ); // contacts
+
+    if ( iDeleteDefaultAttrList )
+        {
+        CommitDefaultL();
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CommitContactL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::CommitContactL(
+    const TDesC& aContact,
+    CommitCall aCommitCall,
+    CDesCArray& aDeleteArray )
+    {
+    // go through all Attribute lists and commit contact list to them
+    // if attribute list is without any contact after commiting and it isn's
+    // default or to be new default,
+    // this attribute list will be deleted in  CompressAtrrListArray function
+    for ( TInt x ( iAttributeLists.Count() - 1 ) ;  x >= 0 ; x-- )
+        {
+        ( iAttributeLists[x]->*aCommitCall )( aContact );
+        }
+
+
+    // now compress array
+    // check if contact list was in to be deleted ones
+    TInt position( 0 );
+    TInt err ( aDeleteArray.FindIsq( aContact , position, ECmpFolded ) );
+    if ( err == KErrNone )
+        {
+        aDeleteArray.Delete( position );
+        }
+
+    CompressArrListArray();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::RollBackOneContactL()
+// -----------------------------------------------------------------------------
+//
+void CPEngAttributeListTransactionManager::RollBackOneContactL(
+    const TDesC& aContact,
+    CPEngAttributeListItem::TPEngAttrListItemArrays aNewCommitArray,
+    CDesCArray& aDeleteArray )
+    {
+    // go through all Attribute lists and delete contact which does not exist
+    // if attribute list is without any contact after commiting and
+    // it is not default or to be new default, this attribute
+    // list will be deleted in CompressAtrrListArray function
+
+    // increment by one, this will remove that invalid contact also from
+    // current
+    CPEngAttributeListItem::TPEngAttrListItemArrays nextArray(
+        static_cast<CPEngAttributeListItem::TPEngAttrListItemArrays>
+        ( aNewCommitArray + 1 ) );
+
+    for ( TInt x ( iAttributeLists.Count() - 1 ) ;  x >= 0 ; x-- )
+        {
+        // Delete contact from currect and also new
+        iAttributeLists[x]->DeleteContactFromList( aContact, aNewCommitArray );
+        iAttributeLists[x]->DeleteContactFromList( aContact, nextArray );
+        }
+
+
+    // check if contact list was in to be deleted ones
+    TInt position( 0 );
+    TInt err ( aDeleteArray.FindIsq( aContact , position, ECmpFolded ) );
+    if ( err == KErrNone )
+        {
+        aDeleteArray.Delete( position );
+        }
+
+    // now compress array
+    CompressArrListArray();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngAttributeListTransactionManager::CheckAttributeListValidity()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngAttributeListTransactionManager::CheckAttributeListValidity(
+    const CPEngAttributeListItem& aAttributeList,
+    CPEngAttributeListItem::TPEngAttrListItemArrays aIDsArray,
+    CPEngAttributeListItem::TPEngAttrListItemArrays aCntListArray,
+    ItemDefaultSet aDefaultSetCall,
+    TBool aSynchronizeFlagIncluded )
+    {
+    // check is handler is needed, if any of the contact in the contact list
+    // does not exist on the server an attr list
+    // is not default, there is no need for transaction.
+    TBool attrListValid( ETrue );
+    if ( ( aAttributeList.ArrayOfContacts( aIDsArray ).Count() == 0 ) &&
+         !( aAttributeList.*aDefaultSetCall )() )
+        {
+        attrListValid =  EFalse ;
+        const CDesCArray& cntLstArray =
+            aAttributeList.ArrayOfContacts( aCntListArray );
+        TInt cntListCount ( cntLstArray.Count() );
+        for ( TInt i ( 0 ) ; i < cntListCount ; i++ )
+            {
+            CPEngContactListSettings* cntSettings =
+                iContactListTransManager->ContactListSettingsOrNull( cntLstArray[ i ] );
+
+            CONTINUE_IF( ( !cntSettings
+                           ||
+                           !( cntSettings->Property( KPEngListExistsOnServer,
+                                                     KPEngCntLstPropertyNativeCached ) )
+                         ) );
+
+            attrListValid += ( !aSynchronizeFlagIncluded || cntSettings->Synchronized() );
+
+            // if list exists, break the loop
+            if ( attrListValid )
+                {
+                return ETrue;
+                }
+            }
+        }
+
+    return attrListValid;
+    }
+
+//  End of File
+