diff -r cad71a31b7fc -r e36f3802f733 voiceui/voiceuivoicerecognition/src/vuicverificationtrainingstate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/voiceui/voiceuivoicerecognition/src/vuicverificationtrainingstate.cpp Wed Sep 01 12:29:17 2010 +0100 @@ -0,0 +1,340 @@ +/* +* 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: +* +*/ + + +// INCLUDE FILES +#include +#include + +#include + +#include + +#include + +#include "vuicstate.h" +#include "vuicverificationtrainingstate.h" +#include "vuictutorialstate.h" +#include "vuicerrorstate.h" + +#include "vuicdatastorage.h" + +#include "vuicvoicerecogdialogimpl.h" + +#include "rubydebug.h" + +// Constants + +static const TInt KCommandIds[] = + { + R_QAN_VC_VERIFICATION_SELECT, + R_QAN_VC_VERIFICATION_OTHER, + R_QAN_VC_VERIFICATION_CANCEL + }; + +// ----------------------------------------------------------------------------- +// CVerificationTrainingState::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CVerificationTrainingState* CVerificationTrainingState::NewL( CDataStorage& aDataStorage, CUiModel& aUiModel ) + { + CVerificationTrainingState* self = new (ELeave) CVerificationTrainingState( aDataStorage, aUiModel ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// Destructor +CVerificationTrainingState::~CVerificationTrainingState() + { + RUBY_DEBUG0( "CVerificationTrainingState::~CVerificationTrainingState START" ); + + delete iVasDbManager; + iContextManager = NULL; + iTagManager = NULL; + + if ( iTags ) + { + iTags->ResetAndDestroy(); + } + delete iTags; + + delete iTrainingParameters; + + SaveLanguage(); + + RUBY_DEBUG0( "CVerificationTrainingState::~CVerificationTrainingState EXIT" ); + } + +// --------------------------------------------------------- +// CVerificationTrainingState::HandleEventL +// --------------------------------------------------------- +// +void CVerificationTrainingState::HandleEventL( TInt aEvent ) + { + RUBY_DEBUG_BLOCK( "CVerificationTrainingState::HandleEventL" ); + + CState* nextState = NULL; + + switch( aEvent ) + { + case KErrNone: + + if ( iInternalState == EStarted ) + { + nextState = this; + iInternalState = EContextDeleted; + } + else if ( iInternalState == EContextDeleted ) + { + nextState = this; + iInternalState = EContextReady; + } + else if ( iInternalState == EContextReady ) + { + --iExpectedCallbacks; + + if ( iExpectedCallbacks == KErrNone ) + { + nextState = this; + iInternalState = ECommandsTrained; + } + } + else + { + --iExpectedCallbacks; + + if ( iExpectedCallbacks == KErrNone ) + { + nextState = CTutorialState::NewL( DataStorage(), UiModel() ); + iInternalState = ECommandsSaved; + } + } + break; + + default: + + nextState = CErrorState::NewL( DataStorage(), UiModel(), aEvent ); + break; + } + + DataStorage().VoiceRecognitionImpl()->ChangeState( nextState ); + } + +// --------------------------------------------------------- +// CVerificationTrainingState::ExecuteL +// --------------------------------------------------------- +// +void CVerificationTrainingState::ExecuteL() + { + RUBY_DEBUG_BLOCK( "CVerificationTrainingState::ExecuteL" ); + + if ( iInternalState == ENotStarted ) + { + iInternalState = EStarted; + + // Delete context if already exists + if ( DataStorage().Context()->ContextName() == KVoiceVerificationContext ) + { + if ( iContextManager->DeleteContext( DataStorage().VoiceRecognitionImpl(), + DataStorage().Context() ) != KErrNone ) + { + RUBY_ERROR0( "CVerificationTrainingState::ExecuteL - DeleteContext call failed" ); + HandleEventL( KErrGeneral ); + } + } + else + { + HandleEventL( KErrNone ); + } + } + else if ( iInternalState == EContextDeleted ) + { + // Create new context + MNssContext* vasContext = iContextManager->CreateContextL(); + DataStorage().SetContext( vasContext ); + + vasContext->SetNameL( KVoiceVerificationContext ); + vasContext->SetGlobal( EFalse ); + + if ( iContextManager->SaveContext( DataStorage().VoiceRecognitionImpl(), + vasContext ) != KErrNone ) + { + RUBY_ERROR0( "CVerificationTrainingState::ExecuteL - SaveContext call failed" ); + HandleEventL( KErrGeneral ); + } + } + else if ( iInternalState == EContextReady ) + { + TrainTagsL(); + } + else if ( iInternalState == ECommandsTrained ) + { + SaveTagsL(); + } + } + +// --------------------------------------------------------- +// CVerificationTrainingState::CVerificationTrainingState +// --------------------------------------------------------- +// +CVerificationTrainingState::CVerificationTrainingState( CDataStorage& aDataStorage, CUiModel& aUiModel ) + : CState( aDataStorage, aUiModel ), iInternalState( ENotStarted ), iTags(), + iExpectedCallbacks( 0 ) + { + } + +// --------------------------------------------------------- +// CVerificationTrainingState::ConstructL +// --------------------------------------------------------- +// +void CVerificationTrainingState::ConstructL() + { + RUBY_DEBUG_BLOCK( "CVerificationTrainingState::ConstructL" ); + + CState::ConstructL(); + + iVasDbManager = CNssVASDBMgr::NewL(); + iVasDbManager->InitializeL(); + iTagManager = iVasDbManager->GetTagMgr(); + iContextManager = iVasDbManager->GetContextMgr(); + } + +// --------------------------------------------------------- +// CVerificationTrainingState::CreateTagsL +// --------------------------------------------------------- +// +void CVerificationTrainingState::CreateTagsL() + { + RUBY_DEBUG_BLOCK( "CVerificationTrainingState::CreateTagsL" ); + + iTags = new ( ELeave ) RPointerArray; + + for ( int i = 0; i < KVerificationCommands; ++i ) + { + iTags->Append( iTagManager->CreateTagL( DataStorage().Context() ) ); + } + } + +// --------------------------------------------------------- +// CVerificationTrainingState::ConstructTrainingParametersL +// --------------------------------------------------------- +// +void CVerificationTrainingState::ConstructTrainingParametersL() + { + RUBY_DEBUG_BLOCK( "CVerificationTrainingState::ConstructTrainingParametersL" ); + + RArray* languageArray = new ( ELeave ) RArray; + CleanupDeletePushL( languageArray ); // Protect [allocated on the heap] array itself + CleanupClosePushL( *languageArray ); // Protect the array elements + + // Always generate a pronunciation in UI language + User::LeaveIfError( languageArray->Append( User::Language() ) ); + + iTrainingParameters = CNssTrainingParameters::NewL(); + + iTrainingParameters->SetLanguages( languageArray ); + + // For array elements pushed via CleanupClosePushL + CleanupStack::Pop( languageArray ); + CleanupStack::Pop( languageArray ); + } + +// --------------------------------------------------------- +// CVerificationTrainingState::TrainTagsL +// --------------------------------------------------------- +// +void CVerificationTrainingState::TrainTagsL() + { + RUBY_DEBUG_BLOCK( "CVerificationTrainingState::TrainTagsL" ); + + CreateTagsL(); + + ConstructTrainingParametersL(); + + iExpectedCallbacks = KVerificationCommands; + + for ( int i = 0; i < KVerificationCommands; ++i ) + { + HBufC* text = StringLoader::LoadLC( KCommandIds[ i ] ); + + MNssSpeechItem* speechItem = static_cast( (*iTags)[ i ] )->SpeechItem(); + speechItem->SetTextL( *text ); + + CleanupStack::PopAndDestroy( text ); + + MNssRRD* rrd = static_cast( (*iTags)[ i ] )->RRD(); + + rrd->IntArray()->AppendL( i ); + + MNssSpeechItem::TNssSpeechItemResult result = + speechItem->TrainTextL( DataStorage().VoiceRecognitionImpl(), + iTrainingParameters ); + + if ( result != MNssSpeechItem::EVasErrorNone ) + { + RUBY_ERROR1( "CVerificationTrainingState::TrainTagsL - Training start failed with the nss code [%d]", result ); + + HandleEventL( KErrGeneral ); + } + } + } + +// --------------------------------------------------------- +// CVerificationTrainingState::SaveTagsL +// --------------------------------------------------------- +// +void CVerificationTrainingState::SaveTagsL() + { + RUBY_DEBUG_BLOCK( "CVerificationTrainingState::SaveTagsL" ); + + iExpectedCallbacks = KVerificationCommands; + + for ( int i = 0; i < KVerificationCommands; ++i ) + { + TInt result = + iTagManager->SaveTag( DataStorage().VoiceRecognitionImpl(), + static_cast( (*iTags)[ i ] ) ); + if ( result != KErrNone ) + { + RUBY_ERROR1( "CVerificationTrainingState::SaveTagsL - Savetag start failed with the nss code [%d]", result ); + + HandleEventL( KErrGeneral ); + } + } + } + +// --------------------------------------------------------- +// CVerificationTrainingState::SaveLanguage +// --------------------------------------------------------- +// +void CVerificationTrainingState::SaveLanguage() + { + RUBY_DEBUG0( "CVerificationTrainingState::SaveLanguage START" ); + + TRAP_IGNORE( + CRepository* client = CRepository::NewLC( KCRUidSRSFSettings ); + client->Set( KSRSFVoiceUiLanguage, User::Language() ); + CleanupStack::PopAndDestroy( client ) ); + + RUBY_DEBUG0( "CVerificationTrainingState::SaveLanguage EXIT" ); + } + +// End of File +