PECengine/ListLibrary2/ContactListSrc/CPEngContactListTransactionManager.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListTransactionManager.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,871 @@
+/*
+* 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 list transaction manager
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPEngContactListTransactionManager.h"
+
+#include "PEngListLibraryFactory.h"
+#include "MPEngListLibFactory.h"
+#include "PEngPresenceEngineConsts2.h"
+
+#include "CPEngContactListModBase.h"
+#include "CPEngContactListSettings.h"
+#include "CPEngContactListModChangeMonitor.h"
+
+#include "CPEngContactListMngTransAddId.h"
+#include "CPEngContactListMngTransRemoveId.h"
+#include "CPEngContactListMngTransProperties.h"
+#include "CPEngContactListMngTransSubcription.h"
+#include "CPEngContactListDeleteTrans.h"
+#include "CPEngGetWatchersTransaction.h"
+#include "CPEngStartSyncTransaction.h"
+
+#include "CPEngContactListTransCreate.h"
+#include "CPEngContactListTransSync.h"
+
+#include "PEngContactIdsTools.h"
+#include "PEngListLibTools.h"
+
+#include "MPEngStorageManager.h"
+#include "PEngMessagePacker.h"
+
+#include "CPEngSessionSlotId.h"
+
+#include "PresenceDebugPrint.h"
+#include <e32std.h>
+
+
+// CONSTANTS
+_LIT( KPEngUnsubscribe, "UNSUB" );
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::CPEngContactListTransactionManager()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListTransactionManager::CPEngContactListTransactionManager(
+    MPEngListLibFactory& aFactory,
+    TPEngWVCspVersion& aCSPVersion )
+        : CPEngContactListManagerBase( aFactory ),
+        iCSPVersion( aCSPVersion )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::ConstructL(
+    const CPEngSessionSlotId& aSessionSlot )
+    {
+    CPEngContactListManagerBase::ConstructL( aSessionSlot );
+    InitializePlainUserId();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::NewL()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListTransactionManager* CPEngContactListTransactionManager::NewLC(
+    MPEngListLibFactory& aFactory,
+    const CPEngSessionSlotId& aSessionSlot,
+    TPEngWVCspVersion& aCSPVersion )
+    {
+    CPEngContactListTransactionManager* self =
+        new ( ELeave ) CPEngContactListTransactionManager( aFactory,
+                                                           aCSPVersion );
+
+    CleanupClosePushL( *self );
+    self->ConstructL( aSessionSlot );
+
+    return self;
+    }
+
+
+// Destructor
+CPEngContactListTransactionManager::~CPEngContactListTransactionManager()
+    {
+    }
+
+
+
+// =============================================================================
+// ===============Function from MPEngTransactionFactory ======================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::Release()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::Close()
+    {
+    iAccessCount--;
+    if ( iAccessCount == 0 )
+        {
+        iFactory.RemoveCntListTransManager( this );
+        delete this;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetIncomingNwTransactionHandlersL()
+// -----------------------------------------------------------------------------
+//
+MPEngIncomingTransactionHandler* CPEngContactListTransactionManager::IncomingTransactionHandlerL(
+    const TDesC8& /* aIncomingRequest */ )
+    {
+    return NULL;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetOutgoingNwTransactionHandlersL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::OutgoingTransactionHandlerL(
+    TInt aOperation,
+    const TDesC& aData,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngContactListTransactionManager::OutgoingTransactionHandlerL() [%d]" ),
+             aOperation );
+
+    switch ( aOperation )
+        {
+        case EPEngTransOpCntListUpdateList:
+        case EPEngTransOpCntListSyncList:
+            {
+            if ( !iEnviromentSynchronized )
+                {
+                User::Leave( KErrNotReady );
+                }
+
+            //Create handlers
+            GetOutGoingTransactionHandlersL( aData,
+                                             aHandlers,
+                                             aOperation );
+            break;
+            }
+
+
+        case EPEngTransOpCntListBaseSync:
+            {
+            if ( iEnviromentSynchronized )
+                {
+                // already done, no need for it
+                return;
+                }
+
+            TBool needToUnsubscribe( EFalse );
+            if ( aData.Compare( KPEngUnsubscribe ) == 0 )
+                {
+                needToUnsubscribe = ETrue;
+                }
+
+            CPEngStartSyncTransaction* startSync =
+                CPEngStartSyncTransaction::NewLC( *this,
+                                                  iCSPVersion,
+                                                  aOperation,
+                                                  needToUnsubscribe );
+
+            aHandlers.AppendL( startSync );
+            CleanupStack::Pop(); //newHandler
+
+            break;
+            }
+
+        default:
+            {
+            }
+        }
+    }
+
+
+// =============================================================================
+// =============== from MPEngContactListTransactionManager =====================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::CompleteEnviromentSyncL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::CompleteEnviromentSyncL(
+    CDesCArray& aExistingLists,
+    const TDesC& aDefaultList,
+    TBool aListsUnsubscribed )
+    {
+    //Generate array of plain list names
+    //+1 to prevent having count 0
+    const TInt existingCount = aExistingLists.Count();
+    CPtrCArray* planeNames = new ( ELeave ) CPtrCArray( existingCount + 1 );
+    CleanupStack::PushL( planeNames );
+
+    for ( TInt i( 0 ) ; i < existingCount ; ++i )
+        {
+        TPtrC name( aExistingLists[ i ] );
+        NContactListIdsTools::ExtractPureContactListName( name,
+                                                          iPlainUserName );
+        planeNames->AppendL( name );
+        }
+
+
+    //Process all known contact list settings,
+    //wether thay exist on the server or not
+    for ( TInt x( iContactListSettings.Count() - 1 ) ; x >= 0 ; --x )
+        {
+        // For future: what if is it master and default
+        // Update is needed
+        CPEngContactListSettings* sett = iContactListSettings[ x ];
+
+        sett->DeletePropertyL( KPEngCntLstDefault,
+                               KPEngCntLstPropertyNativePermanent );
+        sett->DeletePropertyL( KPEngHasBeenSynchronized,
+                               KPEngCntLstPropertyNativeCached );
+
+
+        //Try locate list from plain names array
+        //If list is found, remove it from plain names and parameter array
+        TInt cn( planeNames->Count() - 1 );
+        for ( ; cn >= 0 ; --cn )
+            {
+            if ( KErrNone == NContactListIdsTools::CompareContactListIds( sett->Name(),
+                                                                          ( *planeNames )[ cn ] ) )
+                {
+                sett->SetPropertyL( KPEngListExistsOnServer,
+                                    KPEngCntLstPropertyNativeCached,
+                                    ETrue );
+                if ( aListsUnsubscribed )
+                    {
+                    sett->DeletePropertyL( KPEngCntLstSubscribe,
+                                           KPEngCntLstPropertyNativePermanent );
+
+                    sett->DeletePropertyL( KPEngSubcriptionUpdate,
+                                           KPEngCntLstPropertyNativeCached );
+                    }
+                aExistingLists.Delete( cn );
+                planeNames->Delete( cn );
+                break;
+                }
+            }
+
+
+        //Process the case that list was not among server lists
+        if ( cn == -1 )
+            {
+            //List was not found from plain names
+            if ( !sett->Property( KPEngCntLstSyncMaster, KPEngCntLstPropertyNativePermanent ) &&
+                 sett->Property( KPEngCntLstMustExistOnServer, KPEngCntLstPropertyNativePermanent ) )
+                {
+                CompleteCntListDeletionL( sett->Name() );
+                }
+            else
+                {
+                sett->DeletePropertyL( KPEngListExistsOnServer, KPEngCntLstPropertyNativeCached );
+                }
+            }
+        }
+
+
+    //Process those lists which were left over in the existing lists array
+    //=> those are new ones that needs to be registered to local system
+    const TInt remainingCount( aExistingLists.Count() );
+    for ( TInt y( 0 ) ; y < remainingCount ; ++y )
+        {
+        CPEngContactListSettings* sett =
+            CPEngContactListSettings::NewServerLC( ( *planeNames )[ y ],
+                                                   aExistingLists[ y ],
+                                                   *this );
+
+        CPEngContactListManagerBase::InsertContactListSettingsL( *sett );
+        CleanupStack::Pop( sett );
+
+        sett->SetPropertyL( KPEngListExistsOnServer,
+                            KPEngCntLstPropertyNativeCached,
+                            ETrue );
+        }
+
+
+    //List of lists handled
+    CleanupStack::PopAndDestroy(); // planeNames
+    iEnviromentSynchronized = ETrue;
+
+
+
+    // Handle the default contact list
+    TPtrC defaultList( aDefaultList );
+    NContactListIdsTools::ExtractPureContactListName( defaultList,
+                                                      iPlainUserName );
+
+    CPEngContactListSettings* sett = ContactListSettingsOrNull( defaultList );
+    if ( sett )
+        {
+        sett->SetPropertyL( KPEngCntLstDefault,
+                            KPEngCntLstPropertyNativePermanent,
+                            ETrue );
+        }
+    else
+        {
+        //Force store of contact list manager,
+        //to distribute the enviroment sync state
+        StoreL();
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::UserDomain()
+// -----------------------------------------------------------------------------
+//
+const TDesC& CPEngContactListTransactionManager::UserDomain()
+    {
+    return iUserDomain;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::DefaultCntListSettingsOrNull()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListSettings* CPEngContactListTransactionManager::DefaultCntListSettingsOrNull()
+    {
+    return CPEngContactListManagerBase::DefaultCntListSettingsOrNull();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::CompleteCntListDeletionL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::CompleteCntListDeletionL(
+    const TDesC& aContactList )
+    {
+    DeleteContactListSettingsL( aContactList );
+    }
+
+
+
+// =============================================================================
+// =============== From main class =============================================
+// =============================================================================
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetOutGoingTransactionHandlersL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::GetOutGoingTransactionHandlersL(
+    const TDesC& aData,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TInt aOperationId )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngContactListTransactionManager::GetOutGoingTransactionHandlersL()" ) );
+    if ( aData.Length() == 0 )
+        {
+        return;
+        }
+
+    // unpack SIDs, creates sIds and its count
+    CDesC16Array* sIds = PEngMessagePacker::UnpackDesArrayLC( aData );
+    TInt countStoreIDs( sIds->Count() );
+
+    // loop going through all requested Store IDs
+    for ( TInt x( 0 ) ; x < countStoreIDs ; x++ )
+        {
+        // try to load contact list from store
+        CPEngContactListModBase* volatile model = NULL;
+        TRAPD( e, model = &( LoadContactListModelL( sIds->MdcaPoint( x ),
+                                                    ETrue,
+                                                    ETrue ) ) );
+
+        // if list does not exists, continue for next SID
+        if ( e == KErrNotFound )
+            {
+            continue;
+            }
+
+        User::LeaveIfError( e );
+        CleanupClosePushL( *model );
+
+        // is update already in progress?
+        if ( model->UpdateInProgress() )
+            {
+            User::Leave( KErrInUse );
+            }
+
+        // clean change monitor
+        model->ChangeMonitor().Reset();
+        model->StoreEntryL();
+
+
+        // is it watcher list?
+        if ( KErrNone ==  sIds->MdcaPoint( x ).CompareF( KPEngWatcherList ) )
+            {
+            GetWatcherListHandlerL( *model,
+                                    aHandlers,
+                                    aOperationId );
+            CleanupStack::PopAndDestroy(); // model
+            continue;
+            }
+
+
+        // is this delete contact list request
+        if ( model->Settings().Property( KPEngContactListDeleteNeeded,
+                                         KPEngCntLstPropertyNativeCached ) )
+            {
+            GetDeleteCntListHandlerL( *model,
+                                      aHandlers,
+                                      aOperationId );
+            CleanupStack::PopAndDestroy(); // model
+            continue;
+            }
+
+
+        // is list synchronized
+        if ( model->Settings().Synchronized() )
+            {
+            GetContactListsUpdateHandlersL( *model,
+                                            aHandlers,
+                                            aOperationId );
+            }
+        else
+            {
+            GetContactListsSyncHandlersL( *model,
+                                          aHandlers,
+                                          aOperationId );
+            }
+        CleanupStack::PopAndDestroy(); // model
+        }
+
+    CleanupStack::PopAndDestroy( sIds );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetContactListUpdateHandlersL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::GetContactListsUpdateHandlersL(
+    CPEngContactListModBase& aContactList,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TInt aOperationId )
+    {
+    CPEngContactListSettings& settings = aContactList.Settings();
+    if ( settings.Property( KPEngListExistsOnServer,
+                            KPEngCntLstPropertyNativeCached ) )
+        {
+        GetUpdateHandlersForExistingCntListL( aContactList,
+                                              aHandlers,
+                                              aOperationId );
+
+        // check if subscription needs some update
+        if ( settings.Property( KPEngSubcriptionUpdate,
+                                KPEngCntLstPropertyNativeCached ) )
+            {
+            GetSubscriptionUpdateHandlerL( aContactList,
+                                           aHandlers,
+                                           aOperationId );
+            }
+
+        // is property update needed
+        if ( settings.Property( KPEngPropertiesUpdateNeeded,
+                                KPEngCntLstPropertyNativeCached ) )
+            {
+            GetUpdateCntListPropertiesHandlerL( aContactList,
+                                                aHandlers,
+                                                aOperationId  );
+            }
+        }
+
+    else
+        {
+        GetUpdateHandlersForNotExistingCntListL( aContactList,
+                                                 aHandlers,
+                                                 aOperationId );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetContactListSyncHandlersL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::GetContactListsSyncHandlersL(
+    CPEngContactListModBase& aContactList,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TInt aOperationId )
+    {
+    // check if there is need to created any handler
+    CPEngContactListSettings& settings = aContactList.Settings();
+
+    if ( // list must exists on the server -> need transaction
+        ( settings.Property( KPEngCntLstMustExistOnServer,
+                             KPEngCntLstPropertyNativePermanent ) )
+        ||
+        // list exists on the server -> need of transaction
+        ( settings.Property( KPEngListExistsOnServer,
+                             KPEngCntLstPropertyNativeCached ) )
+        ||
+        // is anything in the contact list -> sync it
+        ( aContactList.Count() != 0 ) )
+        {
+        // create sync handler
+        CleanContactListSettingsForListCreationL( aContactList.Settings() );
+        GetSynchronizeOneCntListHandlerL( aContactList,
+                                          aHandlers,
+                                          aOperationId );
+        }
+    else
+        {
+        // there was no need to create sync transaction for
+        // the contact list, set it as synchronized
+        settings.SetPropertyL( KPEngHasBeenSynchronized,
+                               KPEngCntLstPropertyNativeCached,
+                               ETrue );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetDeleteCntListHandlerL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::GetDeleteCntListHandlerL(
+    CPEngContactListModBase& aModel,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TInt aOperationId )
+    {
+    // check if contact list exists on the presence server, can be that it is just
+    // lazy initialized
+    if ( aModel.Settings().Property( KPEngListExistsOnServer,
+                                     KPEngCntLstPropertyNativeCached ) )
+        {
+        // handler is needed, create it here
+        CreateHandler2ParamL < CPEngContactListDeleteTrans,
+        CPEngContactListModBase&,
+        MPEngContactListTransactionManager& > ( aHandlers,
+                                                aModel,
+                                                *this,
+                                                iCSPVersion,
+                                                aOperationId );
+        }
+    else
+        {
+        // no need to create handler, just commit change on the store
+        CompleteCntListDeletionL( aModel.Settings().Name() );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetUpdateCntListPropertiesHandlerL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::GetUpdateCntListPropertiesHandlerL(
+    CPEngContactListModBase& aModel,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TInt aOperationId )
+    {
+    CreateHandler2ParamL < CPEngContactListMngTransProperties,
+    CPEngContactListModBase&,
+    MPEngContactListTransactionManager& > ( aHandlers,
+                                            aModel,
+                                            *this,
+                                            iCSPVersion,
+                                            aOperationId );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetUpdateHandlersForExistingCntListL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::GetUpdateHandlersForExistingCntListL(
+    CPEngContactListModBase& aModel,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TInt aOperationId )
+    {
+    RPointerArray<CPEngContactListModItemContainer> nickList;
+    CleanupClosePushL( nickList );
+
+    // check is there is something to update
+    aModel.FillAddNickListL( nickList );
+    if ( 0 != nickList.Count() )
+        {
+        // something to update => create update handler
+        CreateHandler2ParamL < CPEngContactListMngTransAddId,
+        CPEngContactListModBase&,
+        CPEngSessionSlotId& > ( aHandlers,
+                                aModel,
+                                *iSessionId,
+                                iCSPVersion,
+                                aOperationId );
+        }
+
+
+    nickList.Reset();
+    aModel.FillRemoveNickListL( nickList );
+    if ( 0 != nickList.Count() )
+        {
+        // something to update => create update handler
+        CreateHandler2ParamL < CPEngContactListMngTransRemoveId,
+        CPEngContactListModBase&,
+        CPEngSessionSlotId& > ( aHandlers,
+                                aModel,
+                                *iSessionId,
+                                iCSPVersion,
+                                aOperationId );
+        }
+
+    CleanupStack::PopAndDestroy(); // nickList
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetUpdateHandlersForNotExistingCntListL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::GetUpdateHandlersForNotExistingCntListL(
+    CPEngContactListModBase& aModel,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TInt aOperationId )
+    {
+    // delete properties which are not needed
+    CleanContactListSettingsForListCreationL( aModel.Settings() );
+
+    if ( aModel.Count() != 0 )
+        {
+        // something to update => create update handler
+        CreateHandler3ParamL < CPEngContactListTransCreate,
+        CPEngContactListModBase&,
+        CPEngSessionSlotId&,
+        MPEngContactListTransactionManager& > ( aHandlers,
+                                                aModel,
+                                                *iSessionId,
+                                                *this,
+                                                iCSPVersion,
+                                                aOperationId );
+        }
+    else
+        {
+        // Harmonize default contact list settings if list was configured as new one
+        NListLibTools::HarmonizeDefaultContactListSettingsL( aModel.Settings(), *this );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetWatcherListHandlerL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::GetWatcherListHandlerL(
+    CPEngContactListModBase& aModel,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TInt aOperationId )
+    {
+    CreateHandler1ParamL < CPEngGetWatchersTransaction,
+    CPEngContactListModBase& > ( aHandlers,
+                                 aModel,
+                                 iCSPVersion,
+                                 aOperationId );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetSynchronizeOneCntListHandlerL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::GetSynchronizeOneCntListHandlerL(
+    CPEngContactListModBase& aModel,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TInt aOperationId )
+    {
+
+    if ( aModel.Settings().Property( KPEngListExistsOnServer,
+                                     KPEngCntLstPropertyNativeCached ) )
+        {
+        CreateHandler3ParamL < CPEngContactListTransSync,
+        CPEngContactListModBase&,
+        CPEngSessionSlotId&,
+        MPEngContactListTransactionManager& > ( aHandlers,
+                                                aModel,
+                                                *iSessionId,
+                                                *this,
+                                                iCSPVersion,
+                                                aOperationId );
+
+        }
+
+    else
+        {
+        CreateHandler3ParamL < CPEngContactListTransCreate,
+        CPEngContactListModBase&,
+        CPEngSessionSlotId&,
+        MPEngContactListTransactionManager& > ( aHandlers,
+                                                aModel,
+                                                *iSessionId,
+                                                *this,
+                                                iCSPVersion,
+                                                aOperationId );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::GetSubscriptionUpdateHandlerL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::GetSubscriptionUpdateHandlerL(
+    CPEngContactListModBase& aModel,
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TInt aOperationId )
+    {
+    CreateHandler2ParamL < CPEngContactListMngTransSubcription,
+    CPEngContactListModBase&,
+    CPEngSessionSlotId& > ( aHandlers,
+                            aModel,
+                            *iSessionId,
+                            iCSPVersion,
+                            aOperationId );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::CreateHandler1ParamL()
+// -----------------------------------------------------------------------------
+//
+template < class THandlerClass,
+class TParam1 >
+void CPEngContactListTransactionManager::CreateHandler1ParamL(
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TParam1 aParam1,
+    TPEngWVCspVersion& aParam2,
+    TInt aParam3 )
+    {
+    // create start synchronization handler
+    THandlerClass* newHandler = THandlerClass::NewLC( aParam1,
+                                                      aParam2,
+                                                      aParam3 );
+
+    aHandlers.AppendL( newHandler );
+    CleanupStack::Pop(); // newHandler
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::CreateHandler2ParamL()
+// -----------------------------------------------------------------------------
+//
+template < class THandlerClass,
+class TParam1,
+class TParam2 >
+void CPEngContactListTransactionManager::CreateHandler2ParamL(
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TParam1 aParam1,
+    TParam2 aParam2,
+    TPEngWVCspVersion& aParam3,
+    TInt aParam4 )
+    {
+    THandlerClass* newHandler = THandlerClass::NewLC( aParam1,
+                                                      aParam2,
+                                                      aParam3,
+                                                      aParam4 );
+
+    aHandlers.AppendL( newHandler );
+    CleanupStack::Pop(); //newHandler
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::CreateHandler3ParamL()
+// -----------------------------------------------------------------------------
+//
+template < class THandlerClass,
+class TParam1,
+class TParam2,
+class TParam3 >
+void CPEngContactListTransactionManager::CreateHandler3ParamL(
+    RPointerArray<MPEngOutgoingTransactionHandler>& aHandlers,
+    TParam1 aParam1,
+    TParam2 aParam2,
+    TParam3 aParam3,
+    TPEngWVCspVersion& aParam4,
+    TInt aParam5 )
+    {
+    THandlerClass* newHandler = THandlerClass::NewLC( aParam1,
+                                                      aParam2,
+                                                      aParam3,
+                                                      aParam4,
+                                                      aParam5 );
+
+    aHandlers.AppendL( newHandler );
+    CleanupStack::Pop(); // newHandler
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::InitializePlainUserId()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::InitializePlainUserId()
+    {
+    TChar add( '@' );
+    TInt offset( iSessionId->UserId().Locate( add ) );
+    // remove domain
+    if ( KErrNotFound != offset )
+        {
+        iPlainUserName.Set( iSessionId->UserId().Left( offset ) );
+        }
+    else
+        {
+        iPlainUserName.Set( iSessionId->UserId() );
+        }
+
+    // remove wv ID begining wv:
+    if ( KErrNone == iPlainUserName.Left( KPEngWVIDPrefixLength
+                                        ).CompareF( KPEngWVIDPrefix ) )
+        {
+        iPlainUserName.Set( iPlainUserName.Mid( KPEngWVIDPrefixLength ) );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransactionManager::CleanContactListSettingsForListCreationL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransactionManager::CleanContactListSettingsForListCreationL(
+    CPEngContactListSettings& aSettings )
+    {
+    // Clean contact list settings which are not needed when contact
+    // list will be created
+    aSettings.DeletePropertyL( KPEngSubcriptionUpdate,
+                               KPEngCntLstPropertyNativeCached );
+    aSettings.DeletePropertyL( KPEngPropertiesUpdateNeeded,
+                               KPEngCntLstPropertyNativeCached );
+    }
+
+//  End of File
+
+
+
+
+