diff -r cad71a31b7fc -r e36f3802f733 voiceui/voiceuivoicerecognition/src/vuicvoicerecogdialogimpl.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/voiceui/voiceuivoicerecognition/src/vuicvoicerecogdialogimpl.cpp Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,721 @@ +/* +* Copyright (c) 2004-2007 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 Voice Recognition dialog implementation +* +*/ + + +// INCLUDE FILES +#include + +#include + +#include "vuivoicerecognition.hrh" + +#include "vuicvoicerecogdialogimpl.h" + +#include "vuicpropertyhandler.h" + +#include "vuicdatastorage.h" +#include "vuicuimodel.h" + +#include "vuicprecheckstate.h" + +#include "vuimvoicerecogdialogcallback.h" + +#include "rubydebug.h" + + +// ================= MEMBER FUNCTIONS ======================= + + +// ----------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVoiceRecognitionDialogImpl* CVoiceRecognitionDialogImpl::NewL( MVoiceRecognitionDialogCallback* aObserver ) + { + RUBY_DEBUG_BLOCK( "CVoiceRecognitionDialogImpl::NewL" ); + + CVoiceRecognitionDialogImpl* self = new (ELeave) CVoiceRecognitionDialogImpl( aObserver ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// Destructor +CVoiceRecognitionDialogImpl::~CVoiceRecognitionDialogImpl() + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::~CVoiceRecognitionDialogImpl START" ); + + iObserver = NULL; + + iMutex.Close(); + + Cancel(); + + // If states are equal only one can be deleted + if ( iState != iNextState ) + { + delete iState; + delete iNextState; + } + else + { + delete iState; + } + + delete iDataStorage; + delete iUiModel; + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::~CVoiceRecognitionDialogImpl EXIT" ); + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::ExecuteL +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::ExecuteL() + { + RUBY_DEBUG_BLOCK( "CVoiceRecognitionDialogImpl::ExecuteL" ); + + ChangeState( CPrecheckState::NewL( *iDataStorage, *iUiModel ) ); + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::SetDeviceLockMode +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::SetOnlyCallsAllowed() + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::SetOnlyCallsAllowed START" ); + + iDataStorage->SetDeviceLockMode( ETrue ); + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::SetOnlyCallsAllowed EXIT" ); + } + +// ----------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::CVoiceRecognitionDialogImpl +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CVoiceRecognitionDialogImpl::CVoiceRecognitionDialogImpl( MVoiceRecognitionDialogCallback* aObserver ) + : CActive( EPriorityStandard ), iObserver( aObserver ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::CVoiceRecognitionDialogImpl START" ); + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::CVoiceRecognitionDialogImpl EXIT" ); + } + +// ----------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::ConstructL() + { + RUBY_DEBUG_BLOCK( "CVoiceRecognitionDialogImpl::ConstructL" ); + + CActiveScheduler::Add( this ); + + iDataStorage = CDataStorage::NewL( this ); + + iUiModel = CUiModel::NewL(); + + iMutex.CreateLocal(); + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::RunL +// Handle a change event. +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::RunL() + { + RUBY_DEBUG_BLOCK( "CVoiceRecognitionDialogImpl::RunL" ); + + if ( iState != iNextState ) + { + delete iState; + iState = iNextState; + } + iNextState = NULL; + + if ( iMutex.IsHeld() ) + { + iMutex.Signal(); + } + + TRAPD( error, iState->ExecuteL() ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::RunL - State execution failed with error [%d]", error ); + Exit(); + } + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::DoCancel +// Cancel the request to receive events. +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::DoCancel() + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::DoCancel START" ); + + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::DoCancel EXIT" ); + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::HandleKeypressL +// Called when a key is pressed +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::HandleKeypressL( TInt aSoftkey ) + { + RUBY_DEBUG_BLOCK( "CVoiceRecognitionDialogImpl::HandleKeypressL" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( aSoftkey ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::HandleKeypressL - Event handling failed with error [%d]", error ); + Exit(); + } + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::HandleRecognizeInitComplete +// Called when HandleRecognizeInit() completes +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::HandleRecognizeInitComplete( TNssRecognizeInitError aErrorCode ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleRecognizeInitComplete START" ); + + CheckState(); + + TInt errorCode = KErrNone; + + if ( aErrorCode == MNssRecognizeInitCompleteHandler::EVasRecognizeInitFailed ) + { + errorCode = KErrInit; + } + else if ( aErrorCode == MNssRecognizeInitCompleteHandler::EVasNoTagInContexts ) + { + errorCode = KErrNoContacts; + } + else if ( aErrorCode != MNssRecognizeInitCompleteHandler::EVasErrorNone ) + { + errorCode = KErrGeneral; + } + + TRAPD( error, iState->HandleEventL( errorCode ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::HandleRecognizeInitComplete - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleRecognizeInitComplete EXIT" ); + } + +#ifndef __WINS__ +#ifdef __FULLDUPLEX_CHANGE +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::HandlePreSamplingStarted +// Called when HandlePreSamplingStarted() completes +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::HandlePreSamplingStarted( TInt aErrorCode ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandlePreSamplingStarted START" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( aErrorCode ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::HandlePreSamplingStarted - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandlePreSamplingStarted EXIT" ); + } +#endif // __FULLDUPLEX_CHANGE +#endif // __WINS__ + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::HandleRecordStarted +// Called when recording has started +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::HandleRecordStarted() + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleRecordStarted START" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( KErrNone ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::HandleRecordStarted - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleRecordStarted EXIT" ); + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::HandleEouDetected +// Called when end-of-utterance is detected +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::HandleEouDetected() + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleEouDetected START" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( KErrNone ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::HandleEouDetected - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleEouDetected EXIT" ); + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::HandleRecognizeComplete +// Called when recognition ends +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::HandleRecognizeComplete( CArrayPtrFlat* aTagList, + TNssRecognizeError aErrorCode ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleRecognizeComplete START" ); + + CheckState(); + + TInt errorCode = KErrNone; + + if ( aErrorCode == MNssRecognizeEventHandler::EVasRecognitionFailedNoMatch ) + { + errorCode = KErrNoMatch; + } + else if ( aErrorCode == MNssRecognizeEventHandler::EVasRecognizeAccessDeny ) + { + errorCode = KErrAbort; + } + else if ( aErrorCode == MNssRecognizeEventHandler::EVasRecognizeFailed ) + { + errorCode = KErrRecogFailed; + } + else if ( aErrorCode == MNssRecognizeEventHandler::EVasRecognitionFailedNoSpeech ) + { + errorCode = KErrNoSpeech; + } + else if ( aErrorCode == MNssRecognizeEventHandler::EVasRecognitionFailedTooEarly ) + { + errorCode = KErrTooEarly; + } + else if ( aErrorCode == MNssRecognizeEventHandler::EVasRecognitionFailedTooLong ) + { + errorCode = KErrTooLong; + } + else if ( aErrorCode == MNssRecognizeEventHandler::EVasRecognitionFailedTooShort ) + { + errorCode = KErrTooShort; + } + else if ( aErrorCode != MNssRecognizeEventHandler::EVasErrorNone ) + { + errorCode = KErrGeneral; + } + + // If complete tag list has been set then results are voice verification results + // and should be put to additional tag list + if ( !iDataStorage->CompleteTagList() ) + { + iDataStorage->SetCompleteTagList( aTagList ); + } + else + { + iDataStorage->SetAdditionalTagList( aTagList ); + } + + TRAPD( error, iState->HandleEventL( errorCode ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::HandleRecognizeComplete - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleRecognizeComplete EXIT" ); + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::HandleAdaptComplete +// Called when the adaptation is complete +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::HandleAdaptComplete( TInt aErrorCode ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleAdaptComplete START" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( aErrorCode ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::HandleAdaptComplete - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleAdaptComplete EXIT" ); + } + +// --------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::MapcInitComplete +// CMdaAudioPlayerUtility initialization complete +// --------------------------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::MapcInitComplete( TInt aError, + const TTimeIntervalMicroSeconds& aDuration ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::MapcInitComplete START" ); + + CheckState(); + + iDataStorage->SetPlayDuration( aDuration ); + + TRAPD( error, iState->HandleEventL( aError ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::MapcInitComplete - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::MapcInitComplete EXIT" ); + } + +// --------------------------------------------------------------------------- +// CVoiceRecogPlaybackDialog::MapcPlayComplete +// Playback complete, notify observer +// --------------------------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::MapcPlayComplete( TInt aError ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::MapcPlayComplete START" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( aError ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::MapcPlayComplete - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::MapcPlayComplete EXIT" ); + } + +// --------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::MapcCustomCommandEvent +// Called when asynchronous custom command finishes. +// --------------------------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::MapcCustomCommandEvent( TInt /*aEvent*/, TInt aError ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::MapcCustomCommandEvent START" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( aError ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::MapcCustomCommandEvent - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::MapcCustomCommandEvent EXIT" ); + } + +// ----------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::GetContextCompleted +// ----------------------------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::GetContextCompleted( MNssContext* aContext, TInt aErrorCode ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::GetContextCompleted START" ); + + CheckState(); + + iDataStorage->SetContext( aContext ); + + TRAPD( error, iState->HandleEventL( aErrorCode ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::GetContextCompleted - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::GetContextCompleted EXIT" ); + } + +// ----------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::GetContextListCompleted +// ----------------------------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::GetContextListCompleted( MNssContextListArray* /*aContextList*/, + TInt aErrorCode ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::GetContextListCompleted START" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( aErrorCode ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::GetContextListCompleted - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::GetContextListCompleted EXIT" ); + } + +// ----------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::GetTagListCompleted +// ----------------------------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::GetTagListCompleted( MNssTagListArray* aTagList, TInt aErrorCode ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::GetTagListCompleted START" ); + + CheckState(); + + iDataStorage->SetAdditionalTagList( aTagList ); + + TRAPD( error, iState->HandleEventL( aErrorCode ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::GetTagListCompleted - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::GetTagListCompleted EXIT" ); + } + +// ----------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::SaveContextCompleted +// ----------------------------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::SaveContextCompleted( TInt aErrorCode ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::SaveContextCompleted START" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( aErrorCode ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::SaveContextCompleted - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::SaveContextCompleted EXIT" ); + } + +// ----------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::HandleTrainComplete +// ----------------------------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::HandleTrainComplete( TInt aErrorCode ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleTrainComplete START" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( aErrorCode ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::HandleTrainComplete - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandleTrainComplete EXIT" ); + } + +// ----------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::SaveTagCompleted +// ----------------------------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::SaveTagCompleted( TInt aErrorCode ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::SaveTagCompleted START" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( aErrorCode ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::SaveTagCompleted - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::SaveTagCompleted EXIT" ); + } + +// ----------------------------------------------------------------------------- +// CVoiceRecognitionDialogImpl::DeleteContextCompleted +// ----------------------------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::DeleteContextCompleted( TInt aErrorCode ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::DeleteContextCompleted START" ); + + CheckState(); + + TRAPD( error, iState->HandleEventL( aErrorCode ) ); + + if ( error != KErrNone ) + { + RUBY_DEBUG1( "CVoiceRecognitionDialogImpl::DeleteContextCompleted - Event handling failed with error [%d]", error ); + Exit(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::DeleteContextCompleted EXIT" ); + } + +// ---------------------------------------------------- +// CVoiceRecognitionDialog::HandlePropertyValueChange +// Handle property value change event. +// ---------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::HandlePropertyValueChange( TInt aValue ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandlePropertyValueChange START" ); + + CheckState(); + + switch( aValue ) + { + // Short press of a headset key + case KVoiceUiShortPressEvent: + { + TRAP_IGNORE( iState->HandleEventL( EShortKeypress ) ); + break; + } + + // Long press of a headset key + case KVoiceUiLongPressEvent: + { + TRAP_IGNORE( iState->HandleEventL( ELongKeypress ) ); + break; + } + + default: + { + // pass + break; + } + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::HandlePropertyValueChange EXIT" ); + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::ChangeState +// Change current state and set object active +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::ChangeState( CState* aNextState ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::ChangeState START" ); + + if ( aNextState ) + { + CheckState(); + + iNextState = aNextState; + + if ( !IsActive() ) + { + TRequestStatus* pRS = &iStatus; + User::RequestComplete( pRS, KErrNone ); + SetActive(); + } + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::ChangeState EXIT" ); + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::CheckState +// Check if state can be changed and if it can't starts waiting +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::CheckState() + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::CheckState START" ); + + if ( iNextState ) + { + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::CheckState - Start waiting" ); + iMutex.Wait(); + } + + RUBY_DEBUG0( "CVoiceRecognitionDialogImpl::CheckState EXIT" ); + } + +// --------------------------------------------------------- +// CVoiceRecognitionDialogImpl::Exit +// +// --------------------------------------------------------- +// +void CVoiceRecognitionDialogImpl::Exit() + { + if ( iObserver ) + { + iObserver->DialogDismissed(); + + iObserver = NULL; + } + } + +// End of File