diff -r 000000000000 -r 2e3d3ce01487 contextframework/cfw/src/cfservices/CFContextSubscriptionImpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contextframework/cfw/src/cfservices/CFContextSubscriptionImpl.cpp Tue Feb 02 10:12:00 2010 +0200 @@ -0,0 +1,461 @@ +/* +* Copyright (c) 2002-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: CCFContextSubscriptionImpl class implementation. +* +*/ + + +#include +#include +#include + +#include "CFContextSubscriptionImpl.h" +#include "CFContextQueryImpl.h" +#include "cfcontextsubscriptionlistener.h" +#include "CFContextIndicationImpl.h" +#include "cfcontextobject.h" +#include "cftrace.h" +#include "CFContextDataProxy.h" + +// CONSTANTS + +#ifdef _DEBUG +// Panic category +_LIT( KPanicCat, "CONTEXTSUBS" ); + +// Panic reasons +enum TPanicReason + { + ENoListenerSet + }; + +// Local panic function +LOCAL_C void Panic( TInt aCode ) + { + User::Panic( KPanicCat, aCode ); + } + +#endif + +// MEMBER FUNCTIONS + +EXPORT_C CCFContextSubscriptionImpl* CCFContextSubscriptionImpl::NewL() + { + FUNC_LOG; + + CCFContextSubscriptionImpl* self = CCFContextSubscriptionImpl::NewLC(); + CleanupStack::Pop( self ); + + return self; + } + +EXPORT_C CCFContextSubscriptionImpl* CCFContextSubscriptionImpl::NewLC() + { + FUNC_LOG; + + CCFContextSubscriptionImpl* self = new( ELeave ) CCFContextSubscriptionImpl; + CleanupStack::PushL( self ); + self->ConstructL(); + + return self; + } + +EXPORT_C CCFContextSubscriptionImpl* CCFContextSubscriptionImpl::NewL( + RReadStream& aStream) + { + FUNC_LOG; + + CCFContextSubscriptionImpl* self = + CCFContextSubscriptionImpl::NewLC( aStream ); + CleanupStack::Pop( self ); + + return self; + } + +EXPORT_C CCFContextSubscriptionImpl* CCFContextSubscriptionImpl::NewLC( + RReadStream& aStream ) + { + FUNC_LOG; + + CCFContextSubscriptionImpl* self = new( ELeave ) CCFContextSubscriptionImpl; + CleanupStack::PushL( self ); + self->ConstructL( aStream ); + + return self; + } + +CCFContextSubscriptionImpl::~CCFContextSubscriptionImpl() + { + FUNC_LOG; + + delete iContextQuery; + } + +CCFContextSubscriptionImpl::CCFContextSubscriptionImpl() + { + FUNC_LOG; + } + +void CCFContextSubscriptionImpl::ConstructL() + { + FUNC_LOG; + + iContextQuery = CCFContextQueryImpl::NewL( KNullDesC, KNullDesC ); + } + +void CCFContextSubscriptionImpl::ConstructL( RReadStream& aStream ) + { + FUNC_LOG; + + ConstructL(); + InternalizeL( aStream ); + } + +// METHODS + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::SetContextTypeL +//----------------------------------------------------------------------------- +// +void CCFContextSubscriptionImpl::SetContextTypeL( + const TDesC& aContextType ) + { + FUNC_LOG; + + iContextQuery->SetTypeL( aContextType ); + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::ContextType +//----------------------------------------------------------------------------- +// +const TDesC& CCFContextSubscriptionImpl::ContextType() const + { + FUNC_LOG; + + return iContextQuery->Type(); + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::SetContextSourceL +//----------------------------------------------------------------------------- +// +void CCFContextSubscriptionImpl::SetContextSourceL( + const TDesC& aContextSource ) + { + FUNC_LOG; + + iContextQuery->SetSourceL( aContextSource ); + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::ContextSource +//----------------------------------------------------------------------------- +// +const TDesC& CCFContextSubscriptionImpl::ContextSource() const + { + FUNC_LOG; + + return iContextQuery->Source(); + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::SubTypeMatch +//----------------------------------------------------------------------------- +// +TBool CCFContextSubscriptionImpl::SubTypeMatch() const + { + FUNC_LOG; + + return iContextQuery->SubTypeMatch(); + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::SetSubTypeMatch +//----------------------------------------------------------------------------- +// +void CCFContextSubscriptionImpl::SetSubTypeMatch( + TBool aMatchSubTypes ) + { + FUNC_LOG; + + iContextQuery->SetSubTypeMatch( aMatchSubTypes ); + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::OnlyChangesIndicated +//----------------------------------------------------------------------------- +// +TBool CCFContextSubscriptionImpl::OnlyChangesIndicated() const + { + FUNC_LOG; + + return iOnlyChangesIndicated; + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::SetOnlyChangesIndicated +//----------------------------------------------------------------------------- +// +void CCFContextSubscriptionImpl::SetOnlyChangesIndicated( + TBool aIndicateChangesOnly ) + { + FUNC_LOG; + + iOnlyChangesIndicated = aIndicateChangesOnly; + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::SetOnlyChangesIndicated +//----------------------------------------------------------------------------- +// +void CCFContextSubscriptionImpl::SetDataObjectEnabled( TBool aEnabled ) + { + FUNC_LOG; + + iDataObjectEnabled = aEnabled; + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::DataObjectEnabled +//----------------------------------------------------------------------------- +// +TBool CCFContextSubscriptionImpl::DataObjectEnabled() const + { + FUNC_LOG; + + return iDataObjectEnabled; + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::ExternalizeL +//----------------------------------------------------------------------------- +// +EXPORT_C void CCFContextSubscriptionImpl::ExternalizeL( + RWriteStream& aStream ) + { + FUNC_LOG; + + // Context query + iContextQuery->ExternalizeL( aStream ); + + // Indicate only changes flag + aStream.WriteInt16L( iOnlyChangesIndicated ); + + // Enable data object + aStream.WriteInt16L( iDataObjectEnabled ); + + // Commit stream + aStream.CommitL(); + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::InternalizeL +//----------------------------------------------------------------------------- +// +EXPORT_C void CCFContextSubscriptionImpl::InternalizeL( + RReadStream& aStream) + { + FUNC_LOG; + + // Context query + iContextQuery->InternalizeL( aStream ); + + // Indicate only changes flag + iOnlyChangesIndicated = aStream.ReadInt16L(); + + // Enable data object + iDataObjectEnabled = aStream.ReadInt16L(); + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::Size +//----------------------------------------------------------------------------- +// +EXPORT_C TInt CCFContextSubscriptionImpl::Size() const + { + FUNC_LOG; + + TInt size = 0; + + // Context query + size += iContextQuery->Size(); + + // Indicate only changes flag + size += sizeof( iOnlyChangesIndicated ); + + // Enable data object flag + size += sizeof( iDataObjectEnabled ); + + return size; + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::SubscriptionListener +//----------------------------------------------------------------------------- +// +EXPORT_C MCFContextSubscriptionListener& + CCFContextSubscriptionImpl::SubscriptionListener() const + { + FUNC_LOG; + + return *iSubscriptionListener; + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::SetSubscriptionListener +//----------------------------------------------------------------------------- +// +EXPORT_C void CCFContextSubscriptionImpl::SetSubscriptionListener( + MCFContextSubscriptionListener& aListener ) + { + FUNC_LOG; + + iSubscriptionListener = &aListener; + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::EvaluateContextChangeL +//----------------------------------------------------------------------------- +// +EXPORT_C void CCFContextSubscriptionImpl::EvaluateContextChangeL( + const CCFContextObject& aNewContext, + const CCFContextObject& /*aOldContext*/, + TBool aValueChanged ) const + { + FUNC_LOG; + + __ASSERT_DEBUG( iSubscriptionListener, Panic( ENoListenerSet ) ); + + if( NotificationNeeded( aNewContext, aValueChanged ) ) + { + CCFContextIndicationImpl* indication = + CCFContextIndicationImpl::NewLC( KNullUid ); + indication->SetContextL( aNewContext ); + iSubscriptionListener->ContextIndicationL( indication ); + CleanupStack::Pop( indication ); + } + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::EvaluateContextChangeL +//----------------------------------------------------------------------------- +// +EXPORT_C void CCFContextSubscriptionImpl::EvaluateContextChangeL( + const CCFContextObject& aNewContext, + CCFContextDataObject& aData, + TBool aValueChanged ) const + { + FUNC_LOG; + + __ASSERT_DEBUG( iSubscriptionListener, Panic( ENoListenerSet ) ); + + if( NotificationNeeded( aNewContext, aValueChanged ) ) + { + CCFContextIndicationImpl* indication = + CCFContextIndicationImpl::NewLC( aData.Uid() ); + indication->SetContextL( aNewContext ); + + // If data object associated and it is required by the subscriber, add + // it in the context indication. + if( iDataObjectEnabled ) + { + // Stream data object + HBufC8* data = HBufC8::NewLC( aData.Size() ); + TPtr8 dataPtr( data->Des() ); + RDesWriteStream writeStream( dataPtr ); + writeStream.PushL(); + aData.ExternalizeL( writeStream ); + writeStream.CommitL(); + indication->SetDataObject( data ); + + // Clean up + CleanupStack::PopAndDestroy( &writeStream ); + CleanupStack::Pop( data ); + } + iSubscriptionListener->ContextIndicationL( indication ); + CleanupStack::Pop( indication ); + } + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::IsSame +//----------------------------------------------------------------------------- +// +EXPORT_C TBool CCFContextSubscriptionImpl::IsSame( + const CCFContextSubscriptionImpl& aSubscription ) const + { + FUNC_LOG; + + // Check if we have the same session + if( &aSubscription.SubscriptionListener() != iSubscriptionListener ) + { + return EFalse; + } + + if( CCFContextQueryImpl::IsSame( + *iContextQuery, + *aSubscription.iContextQuery ) ) + { + return ETrue; + } + + return EFalse; + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::Matches +//----------------------------------------------------------------------------- +// +EXPORT_C TBool CCFContextSubscriptionImpl::Matches( + const TDesC& aContextType ) const + { + FUNC_LOG; + + return iContextQuery->Type() == aContextType; + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::Matches +//----------------------------------------------------------------------------- +// +EXPORT_C TBool CCFContextSubscriptionImpl::Matches( const TDesC& aContextType, + const TDesC& aContextSource ) const + { + FUNC_LOG; + + return iContextQuery->Matches( aContextType, aContextSource ); + } + +//----------------------------------------------------------------------------- +// CCFContextSubscriptionImpl::NotificationNeeded +//----------------------------------------------------------------------------- +// +TBool CCFContextSubscriptionImpl::NotificationNeeded( + const CCFContextObject& aNewContext, + TBool aValueChanged ) const + { + FUNC_LOG; + + TBool need = EFalse; + if( !iOnlyChangesIndicated || ( iOnlyChangesIndicated && aValueChanged ) ) + { + if( iContextQuery->Matches( aNewContext.Type(), aNewContext.Source() ) ) + { + need = ETrue; + } + } + + return need; + }