diff -r cad71a31b7fc -r e36f3802f733 srsf/nssvasapi/nssvasrecognition/src/nssvasctagselectnotification.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srsf/nssvasapi/nssvasrecognition/src/nssvasctagselectnotification.cpp Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,239 @@ +/* +* Copyright (c) 2003-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: The CNssTagSelectNotification class allows the client to +* register and deregister for a voice tag select event. +* +*/ + + +// INCLUDE FILES +#include +#include "nssvasctagselectnotification.h" +#include "nssvasmtagselecthandler.h" +#include "nssvasctagselectdata.h" +#include "rubydebug.h" + +// ============================ MEMBER FUNCTIONS =============================== + + +// ----------------------------------------------------------------------------- +// CNssTagSelectNotification::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CNssTagSelectNotification* CNssTagSelectNotification::NewL() + { + // version of NewLC which leaves nothing on the cleanup stack + CNssTagSelectNotification* self=NewLC(); + CleanupStack::Pop(self); + return self; + } + +// ----------------------------------------------------------------------------- +// CNssTagSelectNotification::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CNssTagSelectNotification* CNssTagSelectNotification::NewLC() + { + // NewLC with two stage construct + CNssTagSelectNotification* self=new (ELeave) CNssTagSelectNotification(); + // get new, leave if can't + CleanupStack::PushL(self); + // push onto cleanup stack + // (in case self->ConstructL leaves) + self->ConstructL(); // use two-stage construct + return self; + } + +// ----------------------------------------------------------------------------- +// CNssTagSelectNotification::~CNssTagSelectNotification +// Destructor +// ----------------------------------------------------------------------------- +// +CNssTagSelectNotification::~CNssTagSelectNotification() + { + RUBY_DEBUG0( "CNssTagSelectNotification::~CNssTagSelectNotification" ); + + if ( iDBTagSelectNotifier ) + { + iDBTagSelectNotifier->Deregister( this ); + } + + if ( iTagSelectDataList ) + { + iTagSelectDataList->ResetAndDestroy(); + delete iTagSelectDataList; + } + CNssVASDBBuilder::RemoveInstance(); // remove iVasDBBuilder instance + } + +// ----------------------------------------------------------------------------- +// CNssTagSelectNotification::RegisterL +// Method to register for voice tag select notification. +// ----------------------------------------------------------------------------- +// +MNssTagSelectNotification::TNssSelectResult CNssTagSelectNotification::RegisterL( + MNssContext* aContext, + MNssTagSelectHandler* aTagSelectHandler ) + { + RUBY_DEBUG_BLOCK( "CNssTagSelectNotification::RegisterL" ); + + if ( iTagSelectDataList->Count() == 0 ) + { + // register ourself + TInt dbErrorCode; + dbErrorCode = iDBTagSelectNotifier->RegisterForNotification( this ); + if ( dbErrorCode != KErrNone ) + { + return EVasSelectFailed; + } + } + CNssTagSelectData* tagSelectData = CNssTagSelectData::NewL( (CNssContext *) aContext, + aTagSelectHandler ); + + CleanupStack::PushL(tagSelectData); + iTagSelectDataList->AppendL( tagSelectData ); + CleanupStack::Pop(tagSelectData); // do not destroy tagSelectData; it is appended + return EVasErrorNone; + } + +// ----------------------------------------------------------------------------- +// CNssTagSelectNotification::Deregister +// Method to deregister from voice tag select notification +// ----------------------------------------------------------------------------- +// +MNssTagSelectNotification::TNssSelectResult CNssTagSelectNotification::Deregister( + MNssContext* aContext, + MNssTagSelectHandler* aTagSelectHandler ) + { + RUBY_DEBUG0( "CNssTagSelectNotification::Deregister" ); + + // if there is no registration, fail the deregister + if ( iTagSelectDataList->Count() == 0 ) + { + return EVasSelectFailed; + } + + // loop through the TagSelectDataList entries + // for each context match, check if the event handler also matches + // if yes, delete the entry + for ( TInt index=0; index < iTagSelectDataList->Count(); index++ ) + { + + TBool match = CompareContexts( (CNssContext *) aContext, index ); + + MNssTagSelectHandler* tagSelectHandler; + tagSelectHandler = iTagSelectDataList->At( index )->TagSelectHandler(); + + if ( ( match == (TInt)ETrue ) && + (aTagSelectHandler == tagSelectHandler)) + { + CNssTagSelectData* tagSelectData = iTagSelectDataList->At( index ); + iTagSelectDataList->Delete( index ); + delete tagSelectData; + break; // exit the for loop + } + } + if ( iTagSelectDataList->Count() == 0 ) + { + // deregister ourself + TInt dbErrorCode; + dbErrorCode = iDBTagSelectNotifier->Deregister( this ); + if ( dbErrorCode != KErrNone ) + { + RUBY_DEBUG0( "CNssTagSelectNotification, DBTagSelectNotifier->Deregister failed" ); + } + } + return EVasErrorNone; + } + +// ----------------------------------------------------------------------------- +// CNssTagSelectNotification::HandleSelection +// Method called into the client by CNssDBTagSelectNotifier +// ----------------------------------------------------------------------------- +// +void CNssTagSelectNotification::HandleSelection(CNssTag* aTag) + { + RUBY_DEBUG0( "CNssTagSelectNotification::HandleSelection" ); + + // loop through the TagSelectDataList entries + // for each context match, issue a HandleTagSelect response event + for ( TInt index=0; index < iTagSelectDataList->Count(); index++ ) + { + TBool result = CompareContexts((CNssContext *)(aTag->Context()), index); + if ( result == (TInt)ETrue ) + { + // make a copy of the tag for each client which registered for + // the context of aTag + // the client is responsible for deleting clientTag + CNssTag* clientTag=NULL; + TRAPD( err, ( clientTag = aTag->CopyL() ) ); + if ( err != KErrNone ) + { + RUBY_DEBUG0( "CNssTagSelectNotification: TRAPD CNssTag CopyL failed" ); + return; + } + + iTagSelectDataList->At( index )->TagSelectHandler()-> + HandleTagSelect( (MNssTag*)clientTag ); + } + } + } + +// ----------------------------------------------------------------------------- +// CNssTagSelectNotification::CNssTagSelectNotification +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CNssTagSelectNotification::CNssTagSelectNotification() + { + } + +// ----------------------------------------------------------------------------- +// CNssTagSelectNotification::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CNssTagSelectNotification::ConstructL() + { + iTagSelectDataList = new (ELeave) CArrayPtrFlat(1); + + iVasDBBuilder = CNssVASDBBuilder::InstanceL(); + + iDBTagSelectNotifier = iVasDBBuilder->GetTagSelectNotifier(); + } + +// ----------------------------------------------------------------------------- +// CNssTagSelectNotification::CompareContexts +// Method to compare a context with a TagSelectDataList entry context. +// ----------------------------------------------------------------------------- +// +TBool CNssTagSelectNotification::CompareContexts( CNssContext* aContext, TInt aIndex ) + { + CNssContext* context; + context = iTagSelectDataList->At( aIndex )->Context(); + + if ( context->ContextName().Compare( aContext->ContextName() )==0 ) + { + return ETrue; + } + else + { + return EFalse; + } + } + +// End of file