diff -r 000000000000 -r 094583676ce7 PECengine/ListLibrary2/ContactListSrc/CPEngContactListMngTransAddId.cpp --- /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 ) + { + // + aXmlSerializer.StartTagL( KAddNickList ); + + // fill add nick array + RPointerArray addNickList; + DoFillNickListLC( addNickList ); + + TInt count( addNickList.Count() ); + for ( TInt x( 0 ); x < count ; ++x ) + { + // + // + aXmlSerializer.StartTagL( KNickName + ).StartTagL( KName ); + // Nick name value + // + aXmlSerializer.UnicodeTextL( addNickList[ x ]->NickName() + ).EndTagL( KName ); + + // + // contact Id value + // + // + aXmlSerializer.StartTagL( KUserIDXMLTag + ).WvAddressL( addNickList[ x ]->Id() + ).EndTagL( KUserIDXMLTag + ).EndTagL( KNickName ); + } + CleanupStack::PopAndDestroy(); // 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 + + // + 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++ ) + { + // + // + aXmlSerializer.StartTagL( KUser + ).StartTagL( KUserIDXMLTag ); + + // subscribed contact + aXmlSerializer.WvAddressL( addedNicks.MdcaPoint( x ) ); + + // + // + aXmlSerializer.EndTagL( KUserIDXMLTag + ).EndTagL( KUser ); + } + + // append set of presence attributes to be subscribed + NListLibTools::AppendAttributesForSubscriptionXmlL( + iContactList.Settings().SubscriptionAttributes(), + aXmlSerializer, + iSessionSlotId, + iCSPVersion ); + + // + 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& aNickList ) + { + CleanupClosePushL( aNickList ); + iContactList.FillAddNickListL( aNickList ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransAddId::DoCompleteContactListUpdateL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransAddId::DoCompleteContactListUpdateL() + { + iContactList.CommitAddContactsL(); + } + +// End of File