PECengine/ListLibrary2/ContactListSrc/CPEngContactListMngTransAddId.cpp
changeset 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListMngTransAddId.cpp	Thu Dec 17 08:41:52 2009 +0200
@@ -0,0 +1,364 @@
+/*
+* 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 add contact handler.
+*
+*/
+
+
+// INCLUDE FILES
+#include "CPEngContactListMngTransAddId.h"
+
+#include "CPEngContactListModChangeMonitor.h"
+#include "CPEngContactListSettings.h"
+#include "CPEngTransactionStatus.h"
+
+#include "PEngListLibTools.h"
+#include "MPEngXMLSerializer.h"
+#include "MPEngXMLParser.h"
+
+#include "PEngWVPresenceErrors2.h"
+
+#include "PresenceDebugPrint.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransAddId::CPEngContactListMngTransAddId()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListMngTransAddId::CPEngContactListMngTransAddId(
+    CPEngContactListModBase& aContactList,
+    CPEngSessionSlotId& aSessionSlotId,
+    TPEngWVCspVersion& aCSPVersion,
+    TInt aOperationId )
+        : CPEngContactListMngTransBase( aContactList,
+                                        aSessionSlotId,
+                                        aCSPVersion,
+                                        aOperationId )
+
+    {
+    PENG_DP( D_PENG_LIT( "CPEngContactListMngTransAddId::CPEngContactListMngTransAddId() [%S]" ),
+             &( iContactList.ListProperties().Name() ) );
+
+    iUpdateState = EPEngListContentUpdate;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransAddId::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransAddId::ConstructL()
+    {
+    CPEngContactListMngTransBase::ConstructL( );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransAddId::NewLC()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListMngTransAddId* CPEngContactListMngTransAddId::NewLC(
+    CPEngContactListModBase& aContactList,
+    CPEngSessionSlotId& aSessionSlotId,
+    TPEngWVCspVersion& aCSPVersion,
+    TInt aOperationId )
+    {
+    CPEngContactListMngTransAddId* self =
+        new ( ELeave ) CPEngContactListMngTransAddId( aContactList,
+                                                      aSessionSlotId,
+                                                      aCSPVersion,
+                                                      aOperationId );
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+    return self;
+    }
+
+
+// Destructor
+CPEngContactListMngTransAddId::~CPEngContactListMngTransAddId()
+    {
+    }
+
+
+// =============================================================================
+// =============== Functions from CPEngContactListMngTransBase =================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransAddId::DoAppendListNickUpdateL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransAddId::DoAppendListNickUpdateL(
+    MPEngXMLSerializer& aXmlSerializer )
+    {
+    // <AddNickList>
+    aXmlSerializer.StartTagL( KAddNickList );
+
+    // fill add nick array
+    RPointerArray<CPEngContactListModItemContainer> addNickList;
+    DoFillNickListLC( addNickList );
+
+    TInt count( addNickList.Count() );
+    for ( TInt x( 0 ); x < count ; ++x )
+        {
+        // <NickName>
+        // <Name>
+        aXmlSerializer.StartTagL( KNickName
+                                ).StartTagL( KName );
+        // Nick name value
+        // </Name>
+        aXmlSerializer.UnicodeTextL( addNickList[ x ]->NickName()
+                                   ).EndTagL( KName );
+
+        // <UserID>
+        // contact Id value
+        // </UserID>
+        // </NickName>
+        aXmlSerializer.StartTagL( KUserIDXMLTag
+                                ).WvAddressL( addNickList[ x ]->Id()
+                                            ).EndTagL( KUserIDXMLTag
+                                                     ).EndTagL( KNickName );
+        }
+    CleanupStack::PopAndDestroy(); // addNickList
+    // </AddNickList>
+    aXmlSerializer.EndTagL( KAddNickList );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransAddId::DoGetXMLSubscriptionUpdateL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransAddId::DoGetXMLSubscriptionUpdateL(
+    MPEngXMLSerializer& aXmlSerializer )
+    {
+    // update subscription for new contacts,since server does not
+    // act dynamically and subscription will be updated at next log In
+
+    // <SubscribePresence-Request>
+    aXmlSerializer.StartTagL( KSubscribePresence );
+
+    const MDesCArray& addedNicks = iContactList.ChangeMonitor().AddedContactIds();
+
+    // add contacts who needs to be subscribed
+    TInt listCount( addedNicks.MdcaCount() );
+    for ( TInt x( 0 ) ; x < listCount ; x++ )
+        {
+        // <User>
+        // <UserID>
+        aXmlSerializer.StartTagL( KUser
+                                ).StartTagL( KUserIDXMLTag );
+
+        // subscribed contact
+        aXmlSerializer.WvAddressL( addedNicks.MdcaPoint( x ) );
+
+        // </UserID>
+        // </User>
+        aXmlSerializer.EndTagL( KUserIDXMLTag
+                              ).EndTagL( KUser );
+        }
+
+    // append set of presence attributes to be subscribed
+    NListLibTools::AppendAttributesForSubscriptionXmlL(
+        iContactList.Settings().SubscriptionAttributes(),
+        aXmlSerializer,
+        iSessionSlotId,
+        iCSPVersion );
+
+    // </SubscribePresence-Request>
+    aXmlSerializer.EndTagL( KSubscribePresence );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransAddId::DoParseSubscriptionUpdateResponseL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransAddId::DoParseSubscriptionUpdateResponseL(
+    const TDesC8& aResponse )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngContactListMngTransAddId::ParseSubscriptionUpdateResponseL() [%S]" ),
+             &( iContactList.ListProperties().Name() ) );
+
+    // new added contact are in the monitor
+    CPEngContactListModChangeMonitor& changeMonitor = iContactList.ChangeMonitor();
+
+    CPEngTransactionStatus* transactionStatus = CPEngTransactionStatus::NewL();
+    CleanupClosePushL( *transactionStatus );
+
+    MPEngXMLParser* xMLparser = CreateXMLParserLC();
+    TInt err ( xMLparser->ParseContactListResultL( aResponse,
+                                                   iOperationId,
+                                                   iContactList.StorageId(),
+                                                   *transactionStatus ) );
+
+    CleanupStack::PopAndDestroy(); // xMLparser
+
+    switch ( err )
+        {
+        case KErrNone:
+            {
+            // transaction was successful
+            DoUpdateTransactionState();
+            break;
+            }
+
+
+        case KPEngNwErrPartiallySuccessful:
+            {
+            // partial success
+            // check just wrong contact WV IDs
+            TInt count ( transactionStatus->DetailedResultCount() );
+            for ( TInt i ( 0 ) ; i < count ; i++ )
+                {
+                const MPEngDetailedResultEntry2& detailedResult =
+                    transactionStatus->DetailedResult( i );
+
+                // what ever error, rollback that WV ID
+                if ( !iRollBackIDsArray ) // create rollback array if needed
+                    {
+                    iRollBackIDsArray = new ( ELeave ) CDesCArrayFlat( count );
+                    }
+
+                // if contact Id was not subscribed, then remove it
+                iUpdateState = EPEngRollBack; // rollback will be needed
+                TPtrC badContactId;
+                if ( KErrNone == detailedResult.GetDetailedDesc( badContactId, EPEngDTPresenceID ) )
+                    {
+                    // mark bad contact Id for rollback
+                    iRollBackIDsArray->AppendL( badContactId );
+                    changeMonitor.RemoveAddedContactId( badContactId );
+                    iContactList.RemoveContactL( badContactId );
+                    iUpdateState = EPEngRollBack;
+                    }
+                }
+            break;
+            }
+
+
+        case KPEngNwErrUnknownUser:
+        default: // any other error means something wrong, need of rollback
+            {
+            // all contacts are bad, mark contacts for removing
+            TInt idCount ( changeMonitor.CountAddedContactIds() );
+            if ( !idCount )
+                {
+                // nothing to roll back, completed
+                iUpdateState = EPEngTransactionCompleted;
+                break;
+                }
+
+
+            // create rollback array if needed
+            if ( !iRollBackIDsArray )
+                {
+                iRollBackIDsArray = new ( ELeave ) CDesCArrayFlat( idCount );
+                }
+
+
+            for ( TInt ii ( 0 ) ; ii < idCount ; ii++ )
+                {
+                // store wrong contact ids to the container
+                TPtrC badContactId ( changeMonitor.AddedContactIds().MdcaPoint( ii ) );
+                iTransactionStatus->AddDetailedResultL( iOperationId,
+                                                        KPEngNwErrUnknownUser,
+                                                        NULL,
+                                                        &badContactId,
+                                                        &( iContactList.StorageId() ),
+                                                        NULL );
+
+                // mark bad contact Id for rollback
+                iRollBackIDsArray->AppendL( badContactId );
+                changeMonitor.RemoveAddedContactId( badContactId );
+                iContactList.RemoveContactL( badContactId );
+                }
+            iUpdateState = EPEngRollBack;
+            }
+        }
+
+
+    // import transaction status, takes ownership
+    iTransactionStatus->ImportStatusFrom( *transactionStatus );
+    CleanupStack::Pop(); // transactionStatus
+
+    PENG_DP( D_PENG_LIT( "CPEngContactListMngTransAddId::ParseSubscriptionUpdateResponseL() done [%S]" ),
+             &( iContactList.ListProperties().Name() ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransAddId::DoUpdateTransactionState()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransAddId::DoUpdateTransactionState()
+    {
+    switch ( iUpdateState )
+        {
+        case EPEngListContentUpdate:
+            {
+            // in CSP version 1.2 auto subscribe is enabled
+            if ( iContactList.Settings().Property( KPEngCntLstSubscribe,
+                                                   KPEngCntLstPropertyNativePermanent )
+                 && iNewIdsCount
+                 && ( iCSPVersion == EWVCspV11 ) )
+                {
+                iUpdateState = EPEngSubscriptionUpdate;
+                }
+            else
+                {
+                iUpdateState = EPEngActivateAttributes;
+                }
+            break;
+            }
+
+
+        // Subscription and rollback both are treated same
+        case EPEngSubscriptionUpdate:
+        case EPEngRollBack:
+            {
+            iUpdateState = EPEngTransactionCompleted;
+            break;
+            }
+
+        default:
+            {
+            break;
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransAddId::DoFillNickListLC()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransAddId::DoFillNickListLC(
+    RPointerArray<CPEngContactListModItemContainer>& aNickList )
+    {
+    CleanupClosePushL( aNickList );
+    iContactList.FillAddNickListL( aNickList );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransAddId::DoCompleteContactListUpdateL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransAddId::DoCompleteContactListUpdateL()
+    {
+    iContactList.CommitAddContactsL();
+    }
+
+//  End of File