PECengine/ListLibrary2/ContactListSrc/CPEngContactListTransSync.cpp
branchRCL_3
changeset 13 a941bc465d9f
parent 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListTransSync.cpp	Wed Sep 01 12:31:13 2010 +0100
@@ -0,0 +1,372 @@
+/*
+* 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:  Handler to synchronize contact list
+*
+*/
+
+// INCLUDE FILES
+#include "CPEngContactListTransSync.h"
+
+#include "CPEngContactListModItemContainer.h"
+#include "CPEngContactListSettings.h"
+#include "CPEngContactListModBase.h"
+
+#include "PEngListLibTools.h"
+#include "MPEngXMLSerializer.h"
+#include "MPEngXMLParser.h"
+
+#include "CPEngTransactionStatus.h"
+#include "PEngWVPresenceErrors2.h"
+
+#include "CPEngContactListMngTransProperties.h"
+#include "CPEngContactListMngTransAddId.h"
+#include "CPEngContactListMngTransRemoveId.h"
+
+#include "PresenceDebugPrint.h"
+
+
+//Default granurality for list of additional handlers
+const TInt KHandlerListGranurality = 3;
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransSync::CPEngContactListTransSync()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListTransSync::CPEngContactListTransSync(
+    CPEngContactListModBase& aContactList,
+    CPEngSessionSlotId& aSessionSlotId,
+    MPEngContactListTransactionManager& aManager,
+    TPEngWVCspVersion& aCSPVersion,
+    TInt aOperationId )
+        : CPEngContactListTransBase( aContactList,
+                                     aSessionSlotId,
+                                     aManager,
+                                     aCSPVersion,
+                                     aOperationId ),
+        iAdditionalHandlers( KHandlerListGranurality )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngContactListTransSync::CPEngContactListTransSync() [%S]" ),
+             &( iContactList.ListProperties().Name() ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransSync::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransSync::ConstructL( )
+    {
+    CPEngContactListTransBase::ConstructL();
+    iContactListSyncState = EPEngCntListFetch;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransSync::NewLC()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListTransSync* CPEngContactListTransSync::NewLC(
+    CPEngContactListModBase& aContactList,
+    CPEngSessionSlotId& aSessionSlotId,
+    MPEngContactListTransactionManager& aManager,
+    TPEngWVCspVersion& aCSPVersion,
+    TInt aOperationId )
+    {
+    CPEngContactListTransSync* self = new ( ELeave ) CPEngContactListTransSync(
+        aContactList,
+        aSessionSlotId,
+        aManager,
+        aCSPVersion,
+        aOperationId );
+
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    return self;
+    }
+
+
+// Destructor
+CPEngContactListTransSync::~CPEngContactListTransSync()
+    {
+    iAdditionalHandlers.ResetAndDestroy();
+    }
+
+
+// =============================================================================
+// =============== From MPEngOutgoingTransactionHandler ========================
+// =============================================================================
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransSync::NewTransactionHandlersL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransSync::NewTransactionHandlersL(
+    RPointerArray<MPEngOutgoingTransactionHandler>& aTransactionsArray )
+    {
+    for ( TInt x( iAdditionalHandlers.Count() - 1 ) ; x >= 0 ; --x )
+        {
+        aTransactionsArray.AppendL( iAdditionalHandlers[ x ] );
+        iAdditionalHandlers.Remove( x );
+        }
+    }
+
+
+
+// =============================================================================
+// =============== From CPEngSyncContactList ===================================
+// =============================================================================
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransSync::DoGetXMLCreateCntListL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransSync::DoGetXMLCreateCntListL(
+    MPEngXMLSerializer& /*aXmlSerializer*/ )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransSync::DoParseCreateCntListResponseL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransSync::DoParseCreateCntListResponseL(
+    const TDesC8& /*aResponse*/,
+    MPEngXMLParser& /*aXMLparser*/ )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransSync::DoGetXMLFetchCntListL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransSync::DoGetXMLFetchCntListL(
+    MPEngXMLSerializer& aXmlSerializer )
+    {
+    // <ListManage-Request>
+    aXmlSerializer.StartTagL( KListMnageRequest );
+
+    NListLibTools::AppendContactListNameXmlL( aXmlSerializer, iContactList.Settings() );
+
+    // <ReceiveList>T</ReceiveList>
+    NListLibTools::ApppendReceiveListTagL( aXmlSerializer, iCSPVersion, ETrue );
+
+    // </ListManage-Request>
+    aXmlSerializer.EndTagL( KListMnageRequest );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransSync::DoParseFetchCntListResponseL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransSync::DoParseFetchCntListResponseL(
+    const TDesC8& aResponse,
+    MPEngXMLParser& aXMLparser )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngContactListTransSync::DoParseFetchCntListResponseL() [%S]" ),
+             &( iContactList.ListProperties().Name() ) );
+
+
+    RReffArray<CPEngContactListModItemContainer> newContacts;
+    CleanupClosePushL( newContacts );
+
+    if ( aXMLparser.DecodeL( aResponse, KCodeXMLTag, EFalse ) )
+        {
+        if ( 0 == aXMLparser.ResultL().CompareF( K200Code ) )
+            {
+            MPEngXMLParser* secondXMLparser = CreateXMLParserLC();
+
+            // Nick name update flag
+            TBool updateNickNames( !( iContactList.Settings().Property( KPEngCntLstSyncMaster,
+                                                                        KPEngCntLstPropertyNativePermanent ) ) );
+
+            // parse nick list of the contact list
+            NListLibTools::ParseContactListNickListL( aResponse,
+                                                      newContacts,
+                                                      iContactList,
+                                                      aXMLparser,
+                                                      *secondXMLparser,
+                                                      updateNickNames );
+
+            ParsePropertiesL( aResponse,
+                              aXMLparser,
+                              *secondXMLparser );
+
+            CleanupStack::PopAndDestroy( ); // secondXMLparser
+            }
+        else
+            {
+            iTransactionStatus->AddDetailedResultL( iOperationId,
+                                                    KPEngNwErrContactListDoesNotExist,
+                                                    NULL,
+                                                    NULL,
+                                                    &( iContactList.StorageId() ),
+                                                    NULL );
+
+            iTransactionStatus->SetStatus( KPEngNwErrContactListDoesNotExist );
+
+            iContactList.Settings().DeletePropertyL( KPEngListExistsOnServer,
+                                                     KPEngCntLstPropertyNativeCached );
+            iContactListSyncState = EPEngTransactionCompleted;
+
+            CleanupStack::PopAndDestroy(); // newContacts
+
+            PENG_DP( D_PENG_LIT( "CPEngContactListTransSync::DoParseFetchCntListResponseL() [%S] done with error" ),
+                     &( iContactList.ListProperties().Name() ) );
+            return;
+            }
+        }
+    else
+        {
+        // No code
+        iTransactionStatus->AddDetailedResultL( iOperationId,
+                                                KPEngNwErrContactListDoesNotExist,
+                                                NULL,
+                                                NULL,
+                                                &( iContactList.StorageId() ),
+                                                NULL );
+
+        iTransactionStatus->SetStatus( KPEngNwErrContactListDoesNotExist );
+        iContactListSyncState = EPEngTransactionCompleted;
+        CleanupStack::PopAndDestroy(); // newContacts
+        PENG_DP( D_PENG_LIT( "CPEngContactListTransSync::DoParseFetchCntListResponseL() [%S] no response" ),
+                 &( iContactList.ListProperties().Name() ) );
+        return;
+        }
+
+
+    // Figure what is new and what has happened
+    if ( iContactList.Settings().Property( KPEngCntLstSyncMaster,
+                                           KPEngCntLstPropertyNativePermanent ) )
+        {
+        iContactList.AdoptNetworkViewL( newContacts );
+        CreateMasterCntListUpdateHandlersL();
+        }
+    else
+        {
+        iContactList.AdoptNewContactsL( newContacts );
+        }
+    CleanupStack::PopAndDestroy(); //  newContacts
+
+
+    // resolve new step for the handler
+    if ( iContactList.Settings().Property( KPEngCntLstSubscribe,
+                                           KPEngCntLstPropertyNativePermanent ) )
+        {
+        iContactListSyncState = EPEngSubscribeCntList;
+        }
+    else
+        {
+        CompleteCntListTransactionL();
+        }
+
+    PENG_DP( D_PENG_LIT( "CPEngContactListTransSync::DoParseFetchCntListResponseL() done [%S]" ),
+             &( iContactList.ListProperties().Name() ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransSync::ParsePropertiesL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransSync::ParsePropertiesL( const TDesC8& aResponse,
+                                                  MPEngXMLParser& aXMLparser1,
+                                                  MPEngXMLParser& aXMLparser2 )
+    {
+    if ( NListLibTools::ParseContactListPropertiesL( aResponse,
+                                                     iContactList.Settings(),
+                                                     aXMLparser1,
+                                                     aXMLparser2 ) )
+        {
+        MPEngOutgoingTransactionHandler* newHandler =
+            CPEngContactListMngTransProperties::NewLC( iContactList,
+                                                       iManager,
+                                                       iCSPVersion,
+                                                       iOperationId );
+
+        iAdditionalHandlers.AppendL( newHandler );
+        CleanupStack::Pop(); // newHandler
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListTransSync::CreateMasterCntListUpdateHandlersL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListTransSync::CreateMasterCntListUpdateHandlersL()
+    {
+    RPointerArray<CPEngContactListModItemContainer> nickList;
+    CleanupClosePushL( nickList );
+
+    iContactList.FillAddNickListL( nickList );
+    if ( 0 != nickList.Count() )
+        {
+        MPEngOutgoingTransactionHandler* newHandler =
+            CPEngContactListMngTransAddId::NewLC( iContactList,
+                                                  iSessionSlotId,
+                                                  iCSPVersion,
+                                                  iOperationId );
+        iAdditionalHandlers.AppendL( newHandler );
+        CleanupStack::Pop(); // newHandler
+        }
+
+
+    nickList.Reset();
+    iContactList.FillRemoveNickListL( nickList );
+    if ( 0 != nickList.Count() )
+        {
+        MPEngOutgoingTransactionHandler* newHandler =
+            CPEngContactListMngTransRemoveId::NewLC( iContactList,
+                                                     iSessionSlotId,
+                                                     iCSPVersion,
+                                                     iOperationId );
+
+        iAdditionalHandlers.AppendL( newHandler );
+        CleanupStack::Pop(); // newHandler
+        }
+
+
+    CleanupStack::PopAndDestroy(); // nickList
+    }
+
+
+//  End of File
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+