diff -r 000000000000 -r e6b17d312c8b ximpfw/presence/srcpresencedatamodel/presencewatching/presentitypresencesubscriptionitem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ximpfw/presence/srcpresencedatamodel/presencewatching/presentitypresencesubscriptionitem.cpp Thu Dec 17 08:54:49 2009 +0200 @@ -0,0 +1,361 @@ +/* +* Copyright (c) 2006 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: Presence Service Connection group list subscription implementation. +* +*/ + + +#include "presentitypresencesubscriptionitem.h" +#include "presenceinfofilterimp.h" +#include "ximpitemparent.h" +#include "ximppanics.h" +#include "ximppsccontext.h" +#include "documentutils.h" +#include "presentitypresenceeventimp.h" +#include "ximpdatasubscriptionstateimp.h" +#include "ximpidentityimp.h" +#include "ximpobjecthelpers.h" +#include +#include + +#include "ximptrace.h" + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::CPresentityPresenceSubscriptionItem() +// --------------------------------------------------------------------------- +// +CPresentityPresenceSubscriptionItem::CPresentityPresenceSubscriptionItem( MXIMPItemParentBase& aParent ) +: CXIMPSubscriptionItemBase( aParent ) + { + } + + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::ConstructL() +// --------------------------------------------------------------------------- +// +void CPresentityPresenceSubscriptionItem::ConstructL( const CXIMPIdentityImp& aIdentity ) + { + BaseConstructL(); + + iIdentity = TXIMPObjectCloner< CXIMPIdentityImp >::CloneL( aIdentity ); + } + + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::NewLC() +// --------------------------------------------------------------------------- +// +CPresentityPresenceSubscriptionItem* + CPresentityPresenceSubscriptionItem::NewLC( MXIMPItemParentBase& aParent, const CXIMPIdentityImp& aIdentity ) + { + CPresentityPresenceSubscriptionItem* self = + new( ELeave ) CPresentityPresenceSubscriptionItem( aParent ); + CleanupClosePushL( *self ); + self->ConstructL( aIdentity ); + return self; + } + + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::~CPresentityPresenceSubscriptionItem() +// --------------------------------------------------------------------------- +// +CPresentityPresenceSubscriptionItem::~CPresentityPresenceSubscriptionItem() + { + // Remove it also from the external cache + MXIMPItemParent* presCache = static_cast(iParent.GetInterface(PRESENCE_ITEM_PARENT)); + if(presCache) + { + MPresenceCacheWriter* extCache = presCache->ExternalCache(); + if(extCache && iIdentity) + TRAP_IGNORE( extCache->DeletePresenceL( *iIdentity ) ); + presCache->RemoveMe( this ); + } + delete iIdentity; + delete iPresenceInfo; + delete iPif; + } + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::SubscriptionPif() +// --------------------------------------------------------------------------- +// +EXPORT_C CPresenceInfoFilterImp& + CPresentityPresenceSubscriptionItem::SubscriptionPif() + { + TRACE(_L("CPresentityPresenceSubscriptionItem::SubscriptionPif" ) ); + // assert removed + return *iPif; + } + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::SetSubscriptionPif() +// --------------------------------------------------------------------------- +// +EXPORT_C void CPresentityPresenceSubscriptionItem::SetSubscriptionPif( + CPresenceInfoFilterImp* aPif ) + { + TRACE(_L("CPresentityPresenceSubscriptionItem::SetSubscriptionPif" ) ); + if ( !aPif ) + { + TRACE(_L("CPresentityPresenceSubscriptionItem::SetSubscriptionPif aPif NULL" ) ); + } + delete iPif; + iPif = aPif; + } + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::CollectSubscriptionPifWithoutCtxL() +// --------------------------------------------------------------------------- +// +EXPORT_C CPresenceInfoFilterImp* + CPresentityPresenceSubscriptionItem::CollectSubscriptionPifWithoutCtxL( + MXIMPPscContext* aContext ) + { + TRACE(_L("CPresentityPresenceSubscriptionItem::CollectSubscriptionPifWithoutCtxL" ) ); + RPointerArray< CPresenceInfoFilterImp > arrayOfPifs; + CleanupClosePushL( arrayOfPifs ); + + TInt count = iContexts.Count(); + for( TInt a = 0; a < count; ++a ) + { + if( iContexts[ a ] != aContext ) + { + CPresenceInfoFilterImp* filter = iContexts[ a ]->PresenceInfoFilter( + MXIMPPscContext::EPresentityPresenceFilter, iIdentity ); + if ( filter ) + { + arrayOfPifs.AppendL( filter ); + } + } + } + CPresenceInfoFilterImp* pifWithoutCtx = DocumentUtils::InfoFilterUnionL( arrayOfPifs ); + CleanupStack::PopAndDestroy(); // arrayOfPifs + return pifWithoutCtx; + } + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::SetPresenceInfoL() +// --------------------------------------------------------------------------- +// +EXPORT_C void CPresentityPresenceSubscriptionItem::SetPresenceInfoL( + CPresenceInfoImp* aPresenceInfo ) + { + TRACE(_L("CPresentityPresenceSubscriptionItem::SetPresenceInfoL" ) ); + delete iPresenceInfo; + iPresenceInfo = aPresenceInfo; + iSubscriptionState->SetDataStateL( MXIMPDataSubscriptionState::EDataAvailable ); + + // Now let's update the external presence cache + MXIMPItemParent* presCache = static_cast(iParent.GetInterface(PRESENCE_ITEM_PARENT)); + MPresenceCacheWriter* extCache = presCache->ExternalCache(); + MPresenceBuddyInfo* buddyPresence = extCache->NewBuddyPresenceInfoLC(); + + // we need to clonce the parameters since the ownership is transfered + CXIMPIdentityImp* identity = TXIMPObjectCloner::CloneL(*iIdentity); + buddyPresence->SetBuddyId( identity ); + + CPresenceInfoImp* presenceInfo = TXIMPObjectCloner::CloneL(*iPresenceInfo); + buddyPresence->SetPresenceInfo( presenceInfo ); + + // No harm to do this, because the internal cache is still working + // we just lose the external update + TRAP_IGNORE( extCache->WritePresenceL( buddyPresence ) ); + + CleanupStack::PopAndDestroy( 1 ); // buddyPresence + + } + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::Order() +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CPresentityPresenceSubscriptionItem::Order( + const CPresentityPresenceSubscriptionItem& aA, + const CPresentityPresenceSubscriptionItem& aB ) + { + return IdentityOrder( aA.iIdentity, aB ); + } +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::Order() +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CPresentityPresenceSubscriptionItem::IdentityOrder( + const CXIMPIdentityImp* aA, + const CPresentityPresenceSubscriptionItem& aB ) + { + return aA->Compare( *aB.iIdentity ); + } + + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::Identity() +// --------------------------------------------------------------------------- +// +EXPORT_C const MXIMPIdentity& CPresentityPresenceSubscriptionItem::Identity() const + { + return *iIdentity; + } + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::GroupIdentity() +// --------------------------------------------------------------------------- +// +EXPORT_C const MXIMPIdentity* CPresentityPresenceSubscriptionItem::GroupIdentity() const + { + return iGroupIdentity; + } + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::SetIdentity() +// --------------------------------------------------------------------------- +// +EXPORT_C void CPresentityPresenceSubscriptionItem::SetIdentity( + CXIMPIdentityImp* aIdentity ) + { + delete iIdentity; + iIdentity = aIdentity; + } + + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::SetGroupIdentity() +// --------------------------------------------------------------------------- +// +EXPORT_C void CPresentityPresenceSubscriptionItem::SetGroupIdentity( + CXIMPIdentityImp* aGroup ) + { + delete iGroupIdentity; + iGroupIdentity = aGroup; + } + +// --------------------------------------------------------------------------- +// From class MXIMPSubscriptionItem. +// CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventTo() +// --------------------------------------------------------------------------- +// +void CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL( + MXIMPPscContext* aContext, + TBool aForceEvent ) + { + TRACE_1( _L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventTo() aForce=%d"), aForceEvent ); + CXIMPDataSubscriptionStateImp* status = StatusLC( aContext ); // << status + + CPresentityPresenceEventImp* newEvent = NULL; + if( status->DataState() == MXIMPDataSubscriptionState::EDataAvailable ) + { + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL 2" ) ); + __ASSERT_ALWAYS( iPresenceInfo, User::Panic( NXIMPPrivPanic::KCategory, + NXIMPPrivPanic::EPresentityPresencePresenceInfoDoesNotExist ) ); + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL 3" ) ); + // ERIK TODO: Logic is the following: + // 1 - Find all the groups where the iIdentity belongs to + // 2 - Collect the filters from those groups + // 3 - collect the filter from the individual subscription item also own + // 4 - make a union of the filters + + CPresenceInfoFilterImp* groupPif = NULL; + if ( iGroupIdentity ) + { + groupPif = aContext->PresenceInfoFilter( MXIMPPscContext::EPresentityGroupMemberPresenceFilter, iGroupIdentity ); + if ( !iPif ) + { + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL ownPif found" ) ); + iPif = TXIMPObjectCloner< CPresenceInfoFilterImp >::CloneLC( *groupPif ); + CleanupStack::Pop(); + } + } + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL 4_0" ) ); + CPresenceInfoFilterImp* ownPif = aContext->PresenceInfoFilter( MXIMPPscContext::EOwnPresenceFilter, iIdentity ); + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL 4_1" ) ); + CPresenceInfoFilterImp* presentityPif = aContext->PresenceInfoFilter( MXIMPPscContext::EPresentityPresenceFilter, iIdentity ); + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL 4_2" ) ); + RPointerArray< CPresenceInfoFilterImp > arrayOfPifs; // << arrayOfPifs + CleanupClosePushL( arrayOfPifs ); + + if ( groupPif ) + { + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL groupPif found" ) ); + arrayOfPifs.AppendL( groupPif ); + if ( !iPif ) + { + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL iPif created" ) ); + SetSubscriptionPif( groupPif ); + //iPif = TXIMPObjectCloner< CPresenceInfoFilterImp >::CloneLC( groupPif ); + //CleanupStack::Pop(); + } + } + if ( ownPif ) + { + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL ownPif found" ) ); + arrayOfPifs.AppendL( ownPif ); + } + if ( presentityPif ) + { + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL presentityPif found" ) ); + arrayOfPifs.AppendL( presentityPif ); + } + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL 4_3" ) ); + CPresenceInfoFilterImp* unionPif = NULL; + unionPif = DocumentUtils::InfoFilterUnionL( arrayOfPifs ); + if ( unionPif ) + { + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL unionPif found" ) ); + } + CleanupStack::PopAndDestroy(); // >>> arrayOfPifs + CleanupStack::PushL( unionPif ); // << unionPif + + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL 5" ) ); + CPresenceInfoImp* filteredPresenceInfo = + DocumentUtils::CollectFilteredPresenceInfoLC( + *unionPif, + *iPresenceInfo ); // << filteredPresenceInfo + + CleanupStack::Pop( filteredPresenceInfo ); // >> filteredPresenceInfo + CleanupStack::PopAndDestroy( unionPif ); // >>> unionPif + CleanupStack::PushL( filteredPresenceInfo ); // << filteredPresenceInfo + TRACE(_L("CPresentityPresenceSubscriptionItem::SynthesiseSubscriptionEventToL 6" ) ); + newEvent = CPresentityPresenceEventImp::NewL( status ); // CSI: 35 # Event is put to cleanupstack in next branch. + newEvent->SetPresenceInfo( filteredPresenceInfo ); + CleanupStack::Pop( filteredPresenceInfo ); // >> filteredPresenceInfo + CleanupStack::Pop( status ); // >> status + newEvent->SetIdentityL( *iIdentity ); + } + else if( aForceEvent ) + { + newEvent = CPresentityPresenceEventImp::NewL( status ); // CSI: 35 # Event is put to cleanupstack in next branch. + CleanupStack::Pop( status ); + newEvent->SetIdentityL( *iIdentity ); + } + + if( newEvent ) + { + CleanupStack::PushL( newEvent ); + MXIMPItemParent* presCache = static_cast(iParent.GetInterface(PRESENCE_ITEM_PARENT)); + presCache->AddEventL( *newEvent, aContext ); + } + CleanupStack::PopAndDestroy(); //status || newEvent depending on branch + } + +// --------------------------------------------------------------------------- +// CPresentityPresenceSubscriptionItem::CleanExpired() +// --------------------------------------------------------------------------- +// +void CPresentityPresenceSubscriptionItem::CleanExpired() + { + + } + +// End of file