PECengine/ListLibrary2/ContactListSrc/CPEngContactListMngTransRemoveId.cpp
branchRCL_3
changeset 17 a941bc465d9f
parent 0 094583676ce7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListMngTransRemoveId.cpp	Wed Sep 01 12:31:13 2010 +0100
@@ -0,0 +1,315 @@
+/*
+* 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:  Update handler to remove contacts from contact list
+*
+*/
+
+// INCLUDE FILES
+#include "CPEngContactListMngTransRemoveId.h"
+#include "CPEngContactListModItemContainer.h"
+#include "CPEngContactListModChangeMonitor.h"
+#include "CPEngContactListSettings.h"
+#include "MPEngXMLParser.h"
+#include "MPEngXMLSerializer.h"
+#include "PEngXMLTags.h"
+
+#include "CPEngTransactionStatus.h"
+#include "PEngWVPresenceErrors2.h"
+
+#include "PEngAttrLibFactory.h"
+#include "MPEngPresenceAttrTransactionEnv.h"
+
+#include "PresenceDebugPrint.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransRemoveId::CPEngContactListMngTransRemoveId()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListMngTransRemoveId::CPEngContactListMngTransRemoveId(
+    CPEngContactListModBase& aContactList,
+    CPEngSessionSlotId& aSessionSlot,
+    TPEngWVCspVersion& aCSPVersion,
+    TInt aOperationId )
+        : CPEngContactListMngTransBase( aContactList,
+                                        aSessionSlot,
+                                        aCSPVersion,
+                                        aOperationId )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngContactListMngTransRemoveId::CPEngContactListMngTransRemoveId() [%S]" ),
+             &( iContactList.ListProperties().Name() ) );
+
+
+    // if server supports CSP 1.2 => no need to unsubscribe, it is done automaticaly
+    if ( iContactList.Settings().Property( KPEngCntLstSubscribe ,
+                                           KPEngCntLstPropertyNativePermanent ) &&
+         ( iCSPVersion == EWVCspV11 ) )
+        {
+        iUpdateState = EPEngSubscriptionUpdate;
+        }
+
+    else
+        {
+        iUpdateState = EPEngListContentUpdate;
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransRemoveId::ConstructL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransRemoveId::ConstructL()
+    {
+    CPEngContactListMngTransBase::ConstructL( );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransRemoveId::NewLC()
+// -----------------------------------------------------------------------------
+//
+CPEngContactListMngTransRemoveId* CPEngContactListMngTransRemoveId::NewLC(
+    CPEngContactListModBase& aContactList,
+    CPEngSessionSlotId& aSessionSlot,
+    TPEngWVCspVersion& aCSPVersion,
+    TInt aOperationId )
+    {
+    // first push aContact to cleanUpStack
+    CPEngContactListMngTransRemoveId* self = new ( ELeave )
+    CPEngContactListMngTransRemoveId(
+        aContactList,
+        aSessionSlot,
+        aCSPVersion,
+        aOperationId );
+    CleanupStack::PushL( self );
+    self->ConstructL( );
+
+    return self;
+    }
+
+
+// Destructor
+CPEngContactListMngTransRemoveId::~CPEngContactListMngTransRemoveId()
+    {
+    }
+
+
+
+// =============================================================================
+// =============== Functions from CPEngContactListMngTransBase =================
+// =============================================================================
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransRemoveId::DoAppendListNickUpdateL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransRemoveId::DoAppendListNickUpdateL(
+    MPEngXMLSerializer& aXmlSerializer )
+    {
+    // <RemoveNickList>
+    aXmlSerializer.StartTagL( KRemoveNickList );
+
+    RPointerArray<CPEngContactListModItemContainer> removeNickList;
+    DoFillNickListLC( removeNickList  );
+
+    // insert contact Id to remove
+    TInt count( removeNickList.Count() );
+
+    for ( TInt x( 0 ); x < count ; x++ )
+        {
+        // <UserID>
+        // contact Id value
+        // </UserID>
+        aXmlSerializer.StartTagL( KUserIDXMLTag
+                                ).WvAddressL( removeNickList[ x ]->Id()
+                                            ).EndTagL( KUserIDXMLTag );
+        }
+    CleanupStack::PopAndDestroy(); // removeNickList
+    // </RemoveNickList>
+    aXmlSerializer.EndTagL( KRemoveNickList );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransRemoveId::DoGetXMLSubscriptionUpdateL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransRemoveId::DoGetXMLSubscriptionUpdateL(
+    MPEngXMLSerializer& aXmlSerializer )
+    {
+    // remove subscription from removed contacts,since server does not
+    // act dynamically and subscription will be removed  at next log In
+
+    // <UnsubscribePresence-Request>
+    aXmlSerializer.StartTagL( KUnsubscribePresence );
+
+    RPointerArray<CPEngContactListModItemContainer> removeNickList;
+    DoFillNickListLC( removeNickList );
+
+    // add those fellas we do not need anymore te be subscribed
+    TInt count( removeNickList.Count() );
+    for ( TInt x( 0 ) ; x < count ; x++ )
+        {
+        // <User>
+        // <UserID>
+        aXmlSerializer.StartTagL( KUser
+                                ).StartTagL( KUserIDXMLTag );
+
+        // now fella we wanna unsubscribe
+        aXmlSerializer.WvAddressL( removeNickList[ x ]->Id() );
+
+        // </UserID>
+        // </User>
+        aXmlSerializer.EndTagL( KUserIDXMLTag
+                              ).EndTagL( KUser );
+        }
+
+    CleanupStack::PopAndDestroy(); // removeNickList
+    // </UnsubscribePresence-Request>
+    aXmlSerializer.EndTagL( KUnsubscribePresence );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransRemoveId::DoParseSubscriptionUpdateResponseL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransRemoveId::DoParseSubscriptionUpdateResponseL(
+    const TDesC8& aResponse )
+    {
+    PENG_DP( D_PENG_LIT( "CPEngContactListMngTransRemoveId::DoParseSubscriptionUpdateResponseL() [%S]" ),
+             &( iContactList.ListProperties().Name() ) );
+
+    MPEngXMLParser* XMLparser = CreateXMLParserLC();
+    // try if there were some errors
+    CPEngTransactionStatus* transactionStatus = CPEngTransactionStatus::NewL();
+    CleanupClosePushL( *transactionStatus );
+    TInt err ( XMLparser->ParseContactListResultL( aResponse,
+                                                   iOperationId,
+                                                   iContactList.StorageId(),
+                                                   *transactionStatus ) );
+
+    // clean all attribute models for all contacts we are trying to delete
+    RPointerArray<CPEngContactListModItemContainer> removeNickList;
+    DoFillNickListLC( removeNickList );
+
+    MPEngPresenceAttrTransactionEnv* attributeManager =
+        PEngAttrLibFactory::AttributeTransEnvInstanceLC( iSessionSlotId );
+
+    TInt count ( removeNickList.Count() );
+    for ( TInt x( 0 ) ; x < count ; ++x )
+        {
+        attributeManager->RemoveSubscriptionL( removeNickList[ x ]->Id() );
+        }
+    CleanupStack::PopAndDestroy( 2 ); // attributeManager, removeNickList
+
+
+    iTransactionStatus->ImportStatusFrom( *transactionStatus );
+    CleanupStack::Pop(); // transactionStatus
+    CleanupStack::PopAndDestroy( ); // XMLparser
+
+
+    // was it one the errors that we can continue with request?
+    if ( ( err == KErrNone )
+         || ( err == KPEngNwErrPartiallySuccessful )
+         || ( err == KPEngNwErrUnknownUser )
+         || ( err == KPEngNwErrServiceUnavailable ) )
+        {
+        // Continue with next step
+        DoUpdateTransactionState();
+        }
+    else
+        {
+        // Error was something bigger, terminate transaction
+        iUpdateState = EPEngTransactionCompleted;
+        }
+
+
+    PENG_DP( D_PENG_LIT( "CPEngContactListMngTransRemoveId::DoParseSubscriptionUpdateResponseL() done [%S]" ),
+             &( iContactList.ListProperties().Name() ) );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransRemoveId::DoUpdateTransactionState()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransRemoveId::DoUpdateTransactionState()
+    {
+    switch ( iUpdateState )
+        {
+        case EPEngListContentUpdate:
+            {
+            if ( iContactList.Settings().Property( KPEngCntLstSubscribe,
+                                                   KPEngCntLstPropertyNativePermanent )
+                 && ( iCSPVersion == EWVCspV12 ) )
+                {
+                iUpdateState = EPEngDeActivateAttributes;
+                }
+            else
+                {
+                iUpdateState = EPEngTransactionCompleted;
+                }
+            break;
+            }
+
+
+        case EPEngSubscriptionUpdate:
+            {
+            iUpdateState = EPEngListContentUpdate;
+            break;
+            }
+
+
+        case EPEngRollBack:
+            {
+            iUpdateState = EPEngTransactionCompleted;
+            }
+
+
+        default:
+            {
+            break;
+            }
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransRemoveId::DoFillNickListLC()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransRemoveId::DoFillNickListLC(
+    RPointerArray<CPEngContactListModItemContainer>& aNickList )
+    {
+    CleanupClosePushL( aNickList );
+    iContactList.FillRemoveNickListL( aNickList );
+    }
+
+
+// -----------------------------------------------------------------------------
+// CPEngContactListMngTransRemoveId::DoCompleteContactListUpdateL()
+// -----------------------------------------------------------------------------
+//
+void CPEngContactListMngTransRemoveId::DoCompleteContactListUpdateL()
+    {
+    iContactList.CommitRemoveContactsL();
+    }
+
+
+//  End of File
+