diff -r 6ca72c0fe49a -r a941bc465d9f PECengine/ListLibrary2/ContactListSrc/CPEngContactListTransCreate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListTransCreate.cpp Wed Sep 01 12:31:13 2010 +0100 @@ -0,0 +1,311 @@ +/* +* 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: Handler to create contact list +* +*/ + + +// INCLUDE FILES +#include "CPEngContactListTransCreate.h" + +#include "CPEngContactListModItemContainer.h" +#include "CPEngContactListSettings.h" +#include "MPEngContactListTransactionManager.h" + +#include "PEngListLibTools.h" +#include "MPEngXMLSerializer.h" +#include "MPEngXMLParser.h" + +#include "CPEngTransactionStatus.h" +#include "PEngWVPresenceErrors2.h" +#include "PresenceDebugPrint.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngContactListTransCreate::CPEngContactListTransCreate() +// ----------------------------------------------------------------------------- +// +CPEngContactListTransCreate::CPEngContactListTransCreate( + CPEngContactListModBase& aContactList, + CPEngSessionSlotId& aSessionSlotId, + MPEngContactListTransactionManager& aManager, + TPEngWVCspVersion& aCSPVersion, + TInt aOperationId ) + : CPEngContactListTransBase( aContactList, + aSessionSlotId, + aManager, + aCSPVersion, + aOperationId ) + { + PENG_DP( D_PENG_LIT( "PEngContactListTransCreate::CPEngContactListTransCreate() [%S]" ), + &( iContactList.ListProperties().Name() ) ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransCreate::ConstructL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransCreate::ConstructL( ) + { + CPEngContactListTransBase::ConstructL( ); + iContactListSyncState = EPEngCntListCreate; + } + + +// ----------------------------------------------------------------------------- +// CPEngStartSyncTransaction::NewLC() +// ----------------------------------------------------------------------------- +// +CPEngContactListTransCreate* CPEngContactListTransCreate::NewLC( + CPEngContactListModBase& aContactList, + CPEngSessionSlotId& aSessionSlotId, + MPEngContactListTransactionManager& aManager, + TPEngWVCspVersion& aCSPVersion, + TInt aOperationId ) + { + CPEngContactListTransCreate* self = + new ( ELeave ) CPEngContactListTransCreate( aContactList, + aSessionSlotId, + aManager, + aCSPVersion, + aOperationId ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + + +// Destructor +CPEngContactListTransCreate::~CPEngContactListTransCreate() + { + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransCreate::DoGetXMLCreateCntListL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransCreate::DoGetXMLCreateCntListL( + MPEngXMLSerializer& aXmlSerializer ) + { + // + aXmlSerializer.StartTagL( KCreateList ); + + NListLibTools::AppendContactListNameXmlL( aXmlSerializer, + iContactList.Settings() ); + + TInt count( iContactList.Count() ); + if ( count != 0 ) + { + // + aXmlSerializer.StartTagL( KNickList ); + + for ( TInt x( 0 ); x < count ; x++ ) + { + MPEngContactItem& contactItem = iContactList.ContactItem( x ); + + // + // + aXmlSerializer.StartTagL( KNickName + ).StartTagL( KName ); + + // Nick name + // + aXmlSerializer.UnicodeTextL( contactItem.NickName() + ).EndTagL( KName ); + + // + // contact Id + // + // + aXmlSerializer.StartTagL( KUserIDXMLTag + ).WvAddressL( contactItem.Id() + ).EndTagL( KUserIDXMLTag + ).EndTagL( KNickName ); + } + // + aXmlSerializer.EndTagL( KNickList ); + } + + // add properties of the contact list + NListLibTools::AppendContactListPropertiesXmlL( aXmlSerializer, + iContactList.Settings() ); + + // + aXmlSerializer.EndTagL( KCreateList ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransCreate::DoParseCreateCntListResponseL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransCreate::DoParseCreateCntListResponseL( + const TDesC8& aResponse, + MPEngXMLParser& aXMLparser ) + { + PENG_DP( D_PENG_LIT( "PEngContactListTransCreate::DoParseCreateCntListResponseL() [%S]" ), + &( iContactList.ListProperties().Name() ) ); + + CPEngTransactionStatus* transactionStatus = CPEngTransactionStatus::NewL(); + + CleanupClosePushL( *transactionStatus ); + TInt err ( aXMLparser.ParseContactListResultL( aResponse, + iOperationId, + iContactList.StorageId(), + *transactionStatus ) ); + + switch ( err ) + { + // parse KErrNone and partial success in same way + case KErrNone: + case KPEngNwErrPartiallySuccessful: + { + MPEngXMLParser* secondXMLparser = CreateXMLParserLC(); + + RReffArray newContacts; + CleanupClosePushL( newContacts ); + + if ( NListLibTools::ParseContactListNickListL( aResponse, + newContacts, + iContactList, + aXMLparser, + *secondXMLparser, + ETrue ) ) + { + iContactList.AdoptNewContactsL( newContacts ); + } + else + { + // nick list was not there, consume result manually + // commit changes and parse wrong IDs if any + iContactList.CommitRemoveContactsL(); + iContactList.CommitAddContactsL(); + NListLibTools::RemoveBadContactsL( *transactionStatus, iContactList ); + } + + CleanupStack::PopAndDestroy( ); // newContacts + NListLibTools::ParseContactListPropertiesL( aResponse, + iContactList.Settings(), + aXMLparser, + *secondXMLparser ); + CleanupStack::PopAndDestroy(); // secondXMLparser + + + // update behavior + iContactList.Settings().SetPropertyL( KPEngListExistsOnServer, + KPEngCntLstPropertyNativeCached, + ETrue ); + + // if this was to be new default contact list, do update + NListLibTools::HarmonizeDefaultContactListSettingsL( iContactList.Settings(), + iManager ); + + + // resolve next step - do we need to subscribe this lists + if ( iContactList.Settings().Property( KPEngCntLstSubscribe, + KPEngCntLstPropertyNativePermanent ) ) + { + iContactListSyncState = EPEngSubscribeCntList; + } + else + { + CompleteCntListTransactionL(); + } + break; + } + + + case KPEngNwErrUnknownUser: + { + // remove all contact ids and repeat creation of the contact list + TInt count ( iContactList.Count() - 1 ); + for ( ; count >= 0 ; --count ) + { + // add bad contact it to the transaction status + TPtrC badContactId( iContactList.ContactItem( count ).Id() ); + + iTransactionStatus->AddDetailedResultL( iOperationId, + KPEngNwErrUnknownUser, + NULL, + &badContactId, + &( iContactList.StorageId() ), + NULL ); + iContactList.RemoveBadContactL( badContactId ); + } + break; + } + + + default: + { + iManager.CompleteCntListDeletionL( iContactList.Settings().Name() ); + iContactListSyncState = EPEngTransactionCompleted; + break; + } + } + + // update transaction status + iTransactionStatus->ImportStatusFrom( *transactionStatus ); + CleanupStack::Pop(); // transactionStatus + } + + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransCreate::DoGetXMLFetchCntListL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransCreate::DoGetXMLFetchCntListL( + MPEngXMLSerializer& /*aXmlSerializer*/ ) + { + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListTransCreate::DoParseFetchCntListResponseL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListTransCreate::DoParseFetchCntListResponseL( + const TDesC8& /*aResponse*/, + MPEngXMLParser& /*aXMLparser*/ ) + { + } + + +// End of File + + + + + + + + + + + + + + + + + + + + +