diff -r 000000000000 -r 094583676ce7 PECengine/ListLibrary2/ContactListSrc/CPEngStartSyncTransaction.cpp
--- /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 );
+
+ //
+ NListLibTools::AppendTransactionContentTagXmlL( *xmlSerializer, iCSPVersion );
+
+ switch ( iSynchronizationState )
+ {
+ case EPEngGetListOfLists:
+ {
+ GetXMLGetListOfContactListsL( *xmlSerializer );
+ break;
+ }
+
+ case EPEngUnSubscribe:
+ {
+ GetXMLUnsubscribeAllL( *xmlSerializer );
+ break;
+ }
+
+ default:
+ {
+ User::Leave( KErrCorrupt );
+ break;
+ }
+ }
+
+ // end of transaction
+ //
+ 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& /*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 )
+ {
+ //
+ aXmlSerializer.StartTagL( KUnsubscribePresence );
+
+ // add all contact lists which are on the server
+ TInt count( iServerCntLists.Count() );
+ for ( TInt x( 0 ) ; x < count ; x++ )
+ {
+ //
+ // append name of the contact list
+ //
+ aXmlSerializer.StartTagL( KContactList
+ ).WvAddressL( iServerCntLists[ x ]
+ ).EndTagL( KContactList );
+ }
+
+ //
+ 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