diff -r 000000000000 -r 094583676ce7 PECengine/ListLibrary2/ContactListSrc/CPEngContactListMngTransSubcription.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/ListLibrary2/ContactListSrc/CPEngContactListMngTransSubcription.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,396 @@ +/* +* 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 update contact list subscription. +* +*/ + +// INCLUDE FILES +#include "CPEngContactListMngTransSubcription.h" + +#include "MPEngContactListSettingsManager.h" +#include "CPEngContactListSettings.h" +#include "CPEngContactListModBase.h" + +#include "PEngListLibTools.h" +#include "MPEngXMLSerializer.h" +#include "MPEngXMLParser.h" +#include "CPEngTransactionStatus.h" +#include "PEngWVPresenceErrors2.h" +#include "PresenceDebugPrint.h" + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::CPEngContactListMngTransSubcription() +// ----------------------------------------------------------------------------- +// +CPEngContactListMngTransSubcription::CPEngContactListMngTransSubcription( + CPEngContactListModBase& aContactList, + CPEngSessionSlotId& aSessionSlotId, + TPEngWVCspVersion& aCSPVersion, + TInt aOperationId ) + : iContactList ( aContactList ), + iSessionSlotId( aSessionSlotId ), + iTransactionCompleted( EFalse ), + iCSPVersion( aCSPVersion ), + iOperationId( aOperationId ) + + { + PENG_DP( D_PENG_LIT( "CPEngContactListMngTransSubcription::CPEngContactListMngTransSubcription() [%S]" ), + &( iContactList.ListProperties().Name() ) ); + + iContactList.Open(); // CSI: 65 # + iContactList.Lock( EStorageLockLevelHigh ); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::ConstructL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransSubcription::ConstructL() + { + iTransactionStatus = CPEngTransactionStatus::NewL(); + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::NewLC() +// ----------------------------------------------------------------------------- +// +CPEngContactListMngTransSubcription* CPEngContactListMngTransSubcription::NewLC( + CPEngContactListModBase& aContactList, + CPEngSessionSlotId& aSessionSlotId, + TPEngWVCspVersion& aCSPVersion, + TInt aOperationId ) + { + CPEngContactListMngTransSubcription* self = + new ( ELeave ) CPEngContactListMngTransSubcription( aContactList, + aSessionSlotId, + aCSPVersion, + aOperationId ); + CleanupStack::PushL( self ); + self->ConstructL( ); + + return self; + } + + +// Destructor +CPEngContactListMngTransSubcription::~CPEngContactListMngTransSubcription() + { + iContactList.Unlock(); + iContactList.Close(); + delete iTransactionStatus; + } + + + +// =========================================================================== +// =============Function from MPEngOutgoingTransactionHandler ================ +// =========================================================================== + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::RequestL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransSubcription::RequestL( + TDes8& aSendBuffer ) + { + aSendBuffer.Zero(); + MPEngXMLSerializer* xmlSerializer = CreateXmlSerializerL( aSendBuffer ); + CleanupClosePushL( *xmlSerializer ); + + // + NListLibTools::AppendTransactionContentTagXmlL( *xmlSerializer, iCSPVersion ); + + // check if contact list needs to be re-subscribed, or unsubscribed + if ( iContactList.Settings().Property( KPEngCntLstSubscribe, + KPEngCntLstPropertyNativePermanent ) ) + { + GetXMLSubscribeListL( *xmlSerializer ); + } + else + { + GetXMLUnsubscribeListL( *xmlSerializer ); + } + + // end of transaction + // + xmlSerializer->EndTagL( KTransactionContent ); + CleanupStack::PopAndDestroy( ); // xmlSerializer + } + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::LastRunningTransactionHandler() +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransSubcription::LastRunningTransactionHandler() + { + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::ProcessResponseL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransSubcription::ProcessResponseL( + const TDesC8& aResponse, + TRequestStatus& /* aStatus */ ) + { + MPEngXMLParser* XMLparser = CreateXMLParserLC(); + + // try if there were some errors + // check what kind of the request was it + if ( iContactList.Settings().Property( KPEngCntLstSubscribe , + KPEngCntLstPropertyNativePermanent ) ) + { + ParseSubscribeListResponseL( aResponse, *XMLparser ); + } + else + { + ParseUnsubscribeListResponseL( aResponse, *XMLparser ); + } + + + CleanupStack::PopAndDestroy(); // XMLparser + iTransactionCompleted = ETrue; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::CancelProcessing() +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransSubcription::CancelProcessing() + { + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::NewTransactionHandlersL() +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransSubcription::NewTransactionHandlersL( + RPointerArray& /* aTransactionsArray*/ ) + { + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::TransactionCompleted() +// ----------------------------------------------------------------------------- +// +TBool CPEngContactListMngTransSubcription::TransactionCompleted() + { + return iTransactionCompleted; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::TransactionResult() +// ----------------------------------------------------------------------------- +// +CPEngTransactionStatus* CPEngContactListMngTransSubcription::TransactionResult() + { + CPEngTransactionStatus* temp = iTransactionStatus; + iTransactionStatus = NULL; + return temp; + } + + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::ReleaseHandler() +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransSubcription::ReleaseHandler() + { + iTransactionCompleted = ETrue; + } + + +// ============================================================================= +// ==============NEW FUNCTIONS of the base class =============================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::GetXMLContactListUpdateL() +// Creates XML message to unsubscribe contact lists +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransSubcription::GetXMLUnsubscribeListL( + MPEngXMLSerializer& aXmlSerializer ) + { + // + aXmlSerializer.StartTagL( KUnsubscribePresence ); + + NListLibTools::AppendContactListNameXmlL( aXmlSerializer, iContactList.Settings() ); + + // + aXmlSerializer.EndTagL( KUnsubscribePresence ); + } + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::GetXMLSubscribeList() +// Creates XML message to re-subscribe contact list +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransSubcription::GetXMLSubscribeListL( + MPEngXMLSerializer& aXmlSerializer ) + { + // + aXmlSerializer.StartTagL( KSubscribePresence ); + + NListLibTools::AppendContactListNameXmlL( aXmlSerializer, + iContactList.Settings() ); + + NListLibTools::AppendAttributesForSubscriptionXmlL( + iContactList.Settings().SubscriptionAttributes(), + aXmlSerializer, + iSessionSlotId, + iCSPVersion ); + + // if server supports 1.2 CSP, use autosubscribe + if ( iCSPVersion == EWVCspV12 ) + { + // T + aXmlSerializer.StartTagL( KAutoSubscribe ). + NarrowTextL( KXMLValueTrue ). + EndTagL( KAutoSubscribe ); + } + + + // + aXmlSerializer.EndTagL( KSubscribePresence ); + + // init attribute models + TPEngContactlistDesViewWraper contacts( iContactList ); + NListLibTools::ActivatePresenceAttributesL( contacts, iSessionSlotId ); + } + +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::ParseUnsubscreAllResponseL() +// Parse XML Unsubscribe contact list response +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransSubcription::ParseUnsubscribeListResponseL( + const TDesC8& aResponse, + MPEngXMLParser& aXMLparser ) + { + // if contact list was not unsubscribed successfully, + // just relax, it will be done by next log in anyway + TInt err ( aXMLparser.ParseResultL( aResponse, + iOperationId, + *iTransactionStatus ) ); + // ignore + switch ( err ) + { + case KErrNone: + // partial success is same as success in this case + case KPEngNwErrPartiallySuccessful: + { + iContactList.Settings().DeletePropertyL( + KPEngSubcriptionUpdate, + KPEngCntLstPropertyNativeCached ); + TPEngContactlistDesViewWraper contacts( iContactList ); + NListLibTools::DeactivatePresenceAttributesL( contacts, iSessionSlotId ); + break; + } + default: + { + // client will be notified about fail by Transaction Status + break; + } + } + } +// ----------------------------------------------------------------------------- +// CPEngContactListMngTransSubcription::ParseSubscribeListResponseL() +// Parse XML re-subscribe contact list response +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngContactListMngTransSubcription::ParseSubscribeListResponseL( + const TDesC8& aResponse, + MPEngXMLParser& aXMLparser ) + { + TInt err ( aXMLparser.ParseContactListResultL( aResponse, + iOperationId, + iContactList.StorageId(), + *iTransactionStatus ) ); + switch ( err ) + { + // + case KPEngNwErrPartiallySuccessful: + { + // only wrong contact Ids are checked here + NListLibTools::MarkForRemoveBadContactsL( *iTransactionStatus, iContactList ); + break; + } + + case KErrNone: + { + // Contact list was subscribed successfully + iContactList.Settings().DeletePropertyL( + KPEngSubcriptionUpdate, + KPEngCntLstPropertyNativeCached ); + break; + } + + case KPEngNwErrUnknownUser: + { + // deactivate attribute models + TPEngContactlistDesViewWraper contacts( iContactList ); + NListLibTools::DeactivatePresenceAttributesL( contacts, iSessionSlotId ); + // all contact Ids are wrong, remove them + iContactList.ResetLocalView(); + break; + } + case KPEngNwErrContactListDoesNotExist: + { + iContactList.Settings().DeletePropertyL( + KPEngListExistsOnServer, + KPEngCntLstPropertyNativeCached ); + break; + } + // ignore all other errors + default: + { + } + } + } + +// End of File + + + + + + + + + + + + + + + + + + +