--- /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 <s32strm.h>
+#include <s32mem.h>
+#include <cfcontextdataobject.h>
+
+#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;
+ }