PECengine/ListLibrary2/ContactListSrc/CPEngStartSyncTransaction.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/ListLibrary2/ContactListSrc/CPEngStartSyncTransaction.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,431 @@
+/*
+* 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:  Transction handler to do basic synchronization
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPEngStartSyncTransaction.h"
+
+#include "MPEngContactListTransactionManager.h"
+#include "CPEngContactListSettings.h"
+#include "CPEngContactListModBase.h"
+
+#include "MPEngTransactionFactory.h"
+
+#include "PEngListLibTools.h"
+#include "MPEngXMLSerializer.h"
+#include "MPEngXMLParser.h"
+
+#include "PEngContactIdsTools.h"
+#include "CPEngTransactionStatus.h"
+#include "PEngWVPresenceErrors2.h"
+#include "PresenceDebugPrint.h"
+
+
+//Default granurality for list of lists
+const TInt KListOfListGranurality = 5;
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::CPEngStartSyncTransaction()
+// -----------------------------------------------------------------------------
+//
+CPEngStartSyncTransaction::CPEngStartSyncTransaction(
+    MPEngContactListTransactionManager& aCntLstSettingsManager,
+    TPEngWVCspVersion& aCSPVersion,
+    TInt aOperationId,
+    TBool aNeedToUnsubscribe )
+        : iContactListManager( aCntLstSettingsManager ),
+        iSynchronizationState( EPEngGetListOfLists ),
+        iServerCntLists( KListOfListGranurality ),
+        iCSPVersion( aCSPVersion ),
+        iOperationId( aOperationId ),
+        iUnsubscribe( aNeedToUnsubscribe )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngStartSyncTransaction::CPEngStartSyncTransaction()" ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CPEngStartSyncTransaction::ConstructL()
+    {
+    iTransactionStatus =  CPEngTransactionStatus::NewL();
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::NewLC()
+// -----------------------------------------------------------------------------
+//
+CPEngStartSyncTransaction* CPEngStartSyncTransaction::NewLC(
+    MPEngContactListTransactionManager& aCntLstSettingsManager,
+    TPEngWVCspVersion& aCSPVersion,
+    TInt aOperationId,
+    TBool aNeedToUnsubscribe )
+    {
+    CPEngStartSyncTransaction* self = new ( ELeave ) CPEngStartSyncTransaction(
+        aCntLstSettingsManager,
+        aCSPVersion,
+        aOperationId,
+        aNeedToUnsubscribe );
+
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+
+    return self;
+    }
+
+
+// Destructor
+CPEngStartSyncTransaction::~CPEngStartSyncTransaction()
+    {
+    PENG_DP( D_PENG_LIT( "CPEngStartSyncTransaction::~CPEngStartSyncTransaction()" ) );
+    delete iTransactionStatus;
+    iServerCntLists.Reset();
+    delete iDefaultCntList;
+    }
+
+
+// ==============================================================================
+// ============= Functions from MPEngOutgoingTransactionHandler =================
+// ==============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::RequestL()
+// -----------------------------------------------------------------------------
+//
+void CPEngStartSyncTransaction::RequestL( TDes8& aSendBuffer )
+    {
+    aSendBuffer.Zero();
+    MPEngXMLSerializer* xmlSerializer = CreateXmlSerializerL( aSendBuffer );
+    CleanupClosePushL( *xmlSerializer );
+
+    // <TransactionContent xmlns="http://www.wireless -village.org/TRC1.1">
+    NListLibTools::AppendTransactionContentTagXmlL( *xmlSerializer, iCSPVersion );
+
+    switch ( iSynchronizationState )
+        {
+        case EPEngGetListOfLists:
+            {
+            GetXMLGetListOfContactListsL( *xmlSerializer );
+            break;
+            }
+
+        case EPEngUnSubscribe:
+            {
+            GetXMLUnsubscribeAllL( *xmlSerializer );
+            break;
+            }
+
+        default:
+            {
+            User::Leave( KErrCorrupt );
+            break;
+            }
+        }
+
+    // end of transaction
+    // </TransactionContent>
+    xmlSerializer->EndTagL( KTransactionContent );
+    CleanupStack::PopAndDestroy( ); // xmlSerializer
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::LastRunningTransactionHandler()
+// -----------------------------------------------------------------------------
+//
+void CPEngStartSyncTransaction::LastRunningTransactionHandler()
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::ProcessResponseL()
+// -----------------------------------------------------------------------------
+//
+void CPEngStartSyncTransaction::ProcessResponseL( const TDesC8& aResponse,
+                                                  TRequestStatus& /* aStatus */ )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngStartSyncTransaction::ProcessResponseL()" ) );
+
+    // transaction to server was successful
+    MPEngXMLParser* XMLparser = CreateXMLParserLC();
+
+    switch ( iSynchronizationState )
+        {
+        case EPEngGetListOfLists:
+            {
+            ParseGetListOfListsResponseL( aResponse, XMLparser );
+            break;
+            }
+
+        case EPEngUnSubscribe:
+            {
+            ParseUnsubscreAllResponseL( aResponse, XMLparser );
+            break;
+            }
+
+        default:
+            {
+            User::Leave( KErrCorrupt );
+            }
+        }
+
+    CleanupStack::PopAndDestroy(); // XMLparser
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::ProcessResponseL()
+// -----------------------------------------------------------------------------
+//
+void CPEngStartSyncTransaction::CancelProcessing()
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::NewTransactionHandlersL()
+// -----------------------------------------------------------------------------
+//
+void CPEngStartSyncTransaction::NewTransactionHandlersL(
+    RPointerArray<MPEngOutgoingTransactionHandler>& /*aTransactionsArray*/ )
+    {
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::TransactionCompleted()
+// -----------------------------------------------------------------------------
+//
+TBool CPEngStartSyncTransaction::TransactionCompleted()
+    {
+    return ( iSynchronizationState == EPEngTransactionCompleted );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngGetWatchersTransaction::TransactionResult()
+// -----------------------------------------------------------------------------
+//
+CPEngTransactionStatus*  CPEngStartSyncTransaction::TransactionResult()
+    {
+    CPEngTransactionStatus* temp = iTransactionStatus;
+    iTransactionStatus = NULL;
+    return temp;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::ReleaseHandler()
+// -----------------------------------------------------------------------------
+//
+void CPEngStartSyncTransaction::ReleaseHandler()
+    {
+    iSynchronizationState = EPEngTransactionCompleted;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::GetXMLContactListUpdateL()
+// -----------------------------------------------------------------------------
+//
+void CPEngStartSyncTransaction::GetXMLGetListOfContactListsL(
+    MPEngXMLSerializer& aXmlSerializer )
+    {
+    // get lists of the contact lists of the server
+    aXmlSerializer.StartTagL( KGetListOfList ).EndTagL( KGetListOfList );
+    }
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::GetXMLContactListUpdateL()
+// -----------------------------------------------------------------------------
+//
+void CPEngStartSyncTransaction::GetXMLUnsubscribeAllL(
+    MPEngXMLSerializer& aXmlSerializer )
+    {
+    // <UnsubscribePresence-Request>
+    aXmlSerializer.StartTagL( KUnsubscribePresence );
+
+    // add all contact lists which are on the server
+    TInt count( iServerCntLists.Count() );
+    for ( TInt x( 0 ) ; x < count ; x++ )
+        {
+        // <ContactList>
+        // append name of the contact list
+        // </ContactList>
+        aXmlSerializer.StartTagL( KContactList
+                                ).WvAddressL( iServerCntLists[ x ]
+                                            ).EndTagL( KContactList );
+        }
+
+    //  </UnsubscribePresence-Request>
+    aXmlSerializer.EndTagL( KUnsubscribePresence );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::ParseGetListOfListsResponseL()
+// -----------------------------------------------------------------------------
+//
+void CPEngStartSyncTransaction::ParseGetListOfListsResponseL(
+    const TDesC8& aResponse,
+    MPEngXMLParser* aXMLparser )
+    {
+    iServerCntLists.Reset();
+
+    // initialize to EFalse, we don't necessarily need the result
+    TBool result( EFalse );
+    aXMLparser->ParseResultL( aResponse,
+                              iOperationId,
+                              *iTransactionStatus,
+                              result );
+
+    //if it was found anyway
+    if ( result )
+        {
+        iSynchronizationState = EPEngTransactionCompleted;
+        return;
+        }
+
+    // Is there default contact list
+    if ( aXMLparser->DecodeL( aResponse, KDefaultContactList, EFalse ) )
+        {
+        iDefaultCntList = aXMLparser->ResultAsUnicodeTextL();
+        iDefaultCntList->Des().Fold();
+        iServerCntLists.AppendL( *iDefaultCntList );
+        }
+    else
+        {
+        iDefaultCntList = KNullDesC().AllocL();
+        }
+
+
+    const TDesC& domain = iContactListManager.UserDomain();
+    if ( aXMLparser->DecodeL( aResponse, KContactList, EFalse ) )
+        {
+        TInt countResults( aXMLparser->Count() );
+        for ( TInt i( 0 ) ; i < countResults; ++i )
+            {
+            // convert to 16 unicode
+            HBufC16* listName = aXMLparser->ResultAsUnicodeTextL( i );
+            CleanupStack::PushL( listName );
+            listName->Des().Fold();
+            NContactIdsTools::AddContactIdToArrayL( iServerCntLists,
+                                                    *listName,
+                                                    domain );
+            CleanupStack::PopAndDestroy();
+            }
+        }
+
+    if ( iUnsubscribe )
+        {
+        iSynchronizationState = EPEngUnSubscribe;
+        }
+    else
+        {
+        iSynchronizationState = EPEngTransactionCompleted;
+        iContactListManager.CompleteEnviromentSyncL( iServerCntLists,
+                                                     KNullDesC,
+                                                     EFalse );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngStartSyncTransaction::ParseUnsubscreAllResponseL()
+// -----------------------------------------------------------------------------
+//
+void CPEngStartSyncTransaction::ParseUnsubscreAllResponseL(
+    const TDesC8& aResponse,
+    MPEngXMLParser* aXMLparser )
+    {
+    CPEngTransactionStatus* transactionStatus = CPEngTransactionStatus::NewL();
+    CleanupClosePushL( *transactionStatus );
+    TInt err ( aXMLparser->ParseResultL( aResponse,
+                                         iOperationId,
+                                         *transactionStatus ) );
+
+    switch ( err )
+        {
+        case KErrNone:
+            {
+            break;
+            }
+
+
+        case KPEngNwErrPartiallySuccessful:
+            {
+            // partially success
+            // remove not existing contact lists, though, should not happen
+            TInt count ( transactionStatus->DetailedResultCount() );
+            for ( TInt x ( 0 ) ; x < count ; x++ )
+                {
+                const MPEngDetailedResultEntry2& detailedResult =
+                    transactionStatus->DetailedResult( x );
+
+                // ignore if there are some errors, except wrong contact list
+                if ( detailedResult.Error() == KPEngNwErrContactListDoesNotExist )
+                    {
+                    // not existing contact list, remove it from list
+                    // of server lists
+                    TPtrC wrongContactLst;
+                    detailedResult.GetDetailedDesc( wrongContactLst,
+                                                    EPEngDTContactListID );
+                    TInt pos( KErrNotFound );
+                    if ( KErrNone == iServerCntLists.Find( wrongContactLst, pos ) )
+                        {
+                        iServerCntLists.Delete( pos );
+                        }
+                    }
+                }
+
+            break;
+            }
+
+
+        case KPEngNwErrContactListDoesNotExist:
+            {
+            iServerCntLists.Reset();
+            delete iDefaultCntList;
+            iDefaultCntList = NULL;
+            iDefaultCntList = KNullDesC().AllocL();
+            break;
+            }
+
+        default:
+            {
+            break;
+            }
+        }
+
+    iTransactionStatus->ImportStatusFrom( *transactionStatus );
+    CleanupStack::Pop( ); // transactionStatus
+
+    iContactListManager.CompleteEnviromentSyncL( iServerCntLists,
+                                                 *iDefaultCntList,
+                                                 ETrue );
+
+    iSynchronizationState = EPEngTransactionCompleted;
+    }
+
+//  End of File