mmdevicefw/speechrecogsupport/ASR/src/SpeechRecognitionUtilityBody.cpp
changeset 0 40261b775718
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mmdevicefw/speechrecogsupport/ASR/src/SpeechRecognitionUtilityBody.cpp	Tue Feb 02 01:56:55 2010 +0200
@@ -0,0 +1,787 @@
+// Copyright (c) 2003-2009 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:
+// SpeechRecognitionUtility.cpp
+// 
+//
+
+#include <e32base.h>
+#include <mmf/common/mmfcontroller.h>
+#include <mmf/common/speechrecognitioncustomcommands.h>
+#include <mmf/common/speechrecognitiondatacommon.h>
+
+#include <speechrecognitionutility.h>
+#include "SpeechRecognitionUtilityBody.h"
+
+//_LIT(KMMFSpeechRecognitionUtilityPanic,"Speech Recognition Utility Bad State");
+enum ASRPanics 
+	{
+	KMMFSpeechRecognitionUtilityPanicBadState,
+	KMMFSpeechRecognitionUtilityPanicUnrecognisedEvent
+	};
+
+CSpeechRecognitionUtility::CBody* CSpeechRecognitionUtility::CBody::NewL( TUid aClientUid, MSpeechRecognitionUtilityObserver& aSpeechRecognitionUtilityObserver)
+	{
+	CSpeechRecognitionUtility::CBody* self = CSpeechRecognitionUtility::CBody::NewLC(aClientUid, aSpeechRecognitionUtilityObserver);
+	CleanupStack::Pop(self);
+	return self;
+	}
+	
+CSpeechRecognitionUtility::CBody* CSpeechRecognitionUtility::CBody::NewLC(TUid aClientUid, MSpeechRecognitionUtilityObserver& aSpeechRecognitionUtilityObserver)
+	{
+	CSpeechRecognitionUtility::CBody* self = new(ELeave) CSpeechRecognitionUtility::CBody(aClientUid, aSpeechRecognitionUtilityObserver);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+	
+void CSpeechRecognitionUtility::CBody::ConstructL()
+	{
+	iAudioPriority = EMdaPriorityNormal;
+	iTrainPreference = EMdaPriorityPreferenceNone;
+	iRecognitionPreference = EMdaPriorityPreferenceNone;
+	iPlaybackPreference = EMdaPriorityPreferenceNone;
+	
+	iPrioritySettings.iPriority = iAudioPriority; 
+	iPrioritySettings.iPref = iTrainPreference;
+
+	iControllerEventMonitor = CMMFControllerEventMonitor::NewL(*this, iMMFController);
+	
+	RMMFControllerImplInfoArray controllers;
+	CleanupResetAndDestroyPushL(controllers);
+
+	CMMFControllerPluginSelectionParameters* cSelect = CMMFControllerPluginSelectionParameters::NewLC();
+
+	// Select the media IDs to allow
+	RArray<TUid> mediaIds;
+	CleanupClosePushL(mediaIds);
+	User::LeaveIfError(mediaIds.Append(KUidMediaTypeASR));
+	cSelect->SetMediaIdsL(mediaIds,CMMFPluginSelectionParameters::EAllowOnlySuppliedMediaIds);
+	CleanupStack::PopAndDestroy(&mediaIds);
+
+	cSelect->ListImplementationsL(controllers);	
+	
+	//[ Open and configure a controller]
+	iControllerEventMonitor->Cancel();
+	iMMFController.Close();
+	//[check controller array is not empty]
+    if( ! controllers.Count() )
+		User::Leave( KErrNotFound );
+
+	//[ simply open the first controller in the array ]
+	User::LeaveIfError( iMMFController.Open(controllers[0]->Uid(), iPrioritySettings));
+	iControllerEventMonitor->Start();
+	
+	iSrCustomCommands.SetClientUid(iClientUid);
+
+	CleanupStack::PopAndDestroy(2, &controllers);//controllers, cSelect
+	
+	}
+
+CSpeechRecognitionUtility::CBody::CBody(TUid aClientUid, MSpeechRecognitionUtilityObserver& aSpeechRecognitionUtilityObserver)
+	: iSrCustomCommands(iMMFController),
+	  iSpeechRecognitionUtilityObserver(&aSpeechRecognitionUtilityObserver),
+	  iClientUid(aClientUid)
+	{
+	}
+	
+CSpeechRecognitionUtility::CBody::~CBody()
+	{
+	if (iControllerEventMonitor)
+		{
+		iControllerEventMonitor->Cancel();
+		delete iControllerEventMonitor;
+		}
+	iMMFController.Close();
+	}
+
+TInt CSpeechRecognitionUtility::CBody::GetEngineProperties(const RArray<TInt>& aPropertyIDs, RArray<TInt>& aPropertyValues)
+	{
+	aPropertyValues.Reset();
+	return iSrCustomCommands.GetEngineProperties(aPropertyIDs, aPropertyValues);
+	}
+
+TInt CSpeechRecognitionUtility::CBody::AddPronunciation(TLexiconID aLexiconID, TModelBankID aModelBankID, TModelID aModelID, TPronunciationID& aPronunciationID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.AddPronunciation(aLexiconID, aModelBankID, aModelID, aPronunciationID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy=ETrue;
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::AddRule(TGrammarID aGrammarID, TLexiconID aLexiconID, TPronunciationID aPronunciationID, TRuleID& aRuleID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.AddRule(aGrammarID, aLexiconID, aPronunciationID, aRuleID);
+
+	if (err == KErrNone)
+		iAsyncCallBusy=ETrue;
+	return err;
+
+	}
+
+void CSpeechRecognitionUtility::CBody::Cancel()
+	{
+	iSrCustomCommands.Cancel();
+	// Now cancel has been called, so remove any pointers storing references to arrays to be filled
+	// These arrays are not owned by this object, so they must not be destroyed
+	iPronunciationIDs = NULL;
+	iRuleIDs = NULL;
+	iModelIDs = NULL;
+	iAsyncCallBusy = EFalse;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::CommitChanges()
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	return iSrCustomCommands.CommitChanges();
+	}
+
+TInt CSpeechRecognitionUtility::CBody::CreateGrammar(TGrammarID& aGrammarID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+	TInt err = iSrCustomCommands.CreateGrammar(aGrammarID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy=ETrue;
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::CreateLexicon(TLexiconID& aLexiconID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+	TInt err = iSrCustomCommands.CreateLexicon(aLexiconID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy=ETrue;
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::LoadModels(TModelBankID aModelBankID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.LoadModels(aModelBankID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy=ETrue;
+		
+	return err;
+	}
+	
+TInt CSpeechRecognitionUtility::CBody::LoadGrammar(TGrammarID aGrammarID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.LoadGrammar(aGrammarID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy=ETrue;
+		
+	return err;
+
+	}
+
+TInt CSpeechRecognitionUtility::CBody::LoadLexicon(TLexiconID aLexiconID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.LoadLexicon(aLexiconID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy=ETrue;
+		
+	return err;
+
+	}
+
+
+TInt CSpeechRecognitionUtility::CBody::GetUtteranceDuration(TModelBankID aModelBankID, TModelID aModelID, TTimeIntervalMicroSeconds32& aDuration)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.GetUtteranceDuration(aModelBankID, aModelID, aDuration);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy=ETrue;
+		
+	return err;
+	}
+
+
+TInt CSpeechRecognitionUtility::CBody::PlayUtterance(TModelBankID aModelBankID, TModelID aModelID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+		
+	iPrioritySettings.iPriority = iAudioPriority;
+	iPrioritySettings.iPref = iPlaybackPreference;
+	
+	TInt err = iMMFController.SetPrioritySettings(iPrioritySettings);
+	
+	if (err == KErrNone)
+		err = iSrCustomCommands.PlayUtterance(aModelBankID, aModelID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy=ETrue;
+		
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::GetModelCount(TModelBankID aModelBankID, TInt& aModelCount)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.GetModelCount(aModelBankID, aModelCount);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy=ETrue;
+		
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::StartRecSession(TRecognitionMode aMode)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+	
+	return iSrCustomCommands.StartRecSession(aMode);
+	}
+	
+TInt CSpeechRecognitionUtility::CBody::EndRecSession()
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+		
+	return iSrCustomCommands.EndRecSession();
+	}
+
+TInt CSpeechRecognitionUtility::CBody::Recognize(CSDClientResultSet& aResultSet)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+		
+	ASSERT(iResultSet==NULL); // this should be NULL unless we have problems
+	
+	iPrioritySettings.iPriority = iAudioPriority;
+	iPrioritySettings.iPref = iRecognitionPreference;
+	TInt err = iMMFController.SetPrioritySettings(iPrioritySettings);
+	
+	if (err == KErrNone)
+		err =  iSrCustomCommands.Recognize(aResultSet);
+
+	if (err == KErrNone)
+		{
+		iResultSet = &aResultSet;
+		iAsyncCallBusy = ETrue;
+		}
+	return err;	
+	}
+
+TInt CSpeechRecognitionUtility::CBody::Record(TTimeIntervalMicroSeconds32 aRecordTime)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.Record(aRecordTime);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy=ETrue;
+		
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::RemoveGrammar(TGrammarID aGrammarID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.RemoveGrammar(aGrammarID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy = ETrue;
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::RemovePronunciation(TLexiconID aLexiconID, TPronunciationID aPronunciationID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.RemovePronunciation(aLexiconID, aPronunciationID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy = ETrue;
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::RemoveLexicon(TLexiconID aLexiconID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.RemoveLexicon(aLexiconID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy = ETrue;
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::RemoveModel(TModelBankID aModelBankID, TModelID aModelID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.RemoveModel(aModelBankID, aModelID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy = ETrue;
+		
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::RemoveRule(TGrammarID aGrammarID, TRuleID aRuleID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.RemoveRule(aGrammarID, aRuleID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy = ETrue;
+		
+	return err;
+
+	}
+TInt CSpeechRecognitionUtility::CBody::Train(TModelBankID aModelBankID, TModelID& aModelID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+		
+	iPrioritySettings.iPriority = iAudioPriority;
+	iPrioritySettings.iPref = iTrainPreference;
+	TInt err = iMMFController.SetPrioritySettings(iPrioritySettings);
+
+	if (err == KErrNone)
+		err = iSrCustomCommands.Train(aModelBankID, aModelID);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy = ETrue;
+
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::UnloadRule(TGrammarID aGrammarID, TRuleID aRuleID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.UnloadRule(aGrammarID, aRuleID); 
+	
+	if (err == KErrNone)
+		iAsyncCallBusy = ETrue;
+		
+	return err;
+
+	}
+
+void CSpeechRecognitionUtility::CBody::SetEventHandler(MSpeechRecognitionUtilityObserver* aSpeechRecognitionUtilityObserver)
+	{
+	iSpeechRecognitionUtilityObserver = aSpeechRecognitionUtilityObserver;
+	}
+	
+
+TInt CSpeechRecognitionUtility::CBody::GetAllPronunciationIDs(TLexiconID aLexiconID, RArray <TPronunciationID>& aPronunciationIDs)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	ASSERT(iPronunciationIDs==NULL);
+
+	TInt err = iSrCustomCommands.GetAllPronunciationIDs(aLexiconID);
+	
+	if (err==KErrNone)
+		{
+		iPronunciationIDs = &aPronunciationIDs;
+		iPronunciationIDs->Reset();
+		iAsyncCallBusy = ETrue;
+		}
+		
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::GetAllModelIDs(TModelBankID aModelBankID, RArray <TModelID>& aModelIDs)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	ASSERT(iModelIDs==NULL);
+	
+	TInt err = iSrCustomCommands.GetAllModelIDs(aModelBankID);
+	
+	if (err==KErrNone) 
+		{
+		iModelIDs = &aModelIDs;
+		iModelIDs->Reset();
+		iAsyncCallBusy = ETrue;
+		}
+	return err;
+	}
+
+
+TInt CSpeechRecognitionUtility::CBody::GetAllRuleIDs(TGrammarID aGrammarID, RArray <TRuleID>& aRuleIDs)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	ASSERT(iRuleIDs==NULL);
+		
+	TInt err = iSrCustomCommands.GetAllRuleIDs(aGrammarID);
+	
+	if (err==KErrNone)	
+		{
+		iRuleIDs = &aRuleIDs;
+		iRuleIDs->Reset();
+		iAsyncCallBusy = ETrue;
+		}
+	return err;
+	}
+	
+	
+TInt CSpeechRecognitionUtility::CBody::GetAllClientLexiconIDs(RArray <TLexiconID>& aLexiconIDs)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	ASSERT(iLexiconIDs==NULL);
+
+	TInt err = iSrCustomCommands.GetAllClientLexiconIDs();
+	
+	if (err==KErrNone)
+		{
+		iLexiconIDs = &aLexiconIDs;
+		iLexiconIDs->Reset();
+		iAsyncCallBusy = ETrue;
+		}
+		
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::GetAllClientModelBankIDs(RArray <TModelBankID>& aModelBankIDs)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	ASSERT(iModelBankIDs==NULL);
+	
+	TInt err = iSrCustomCommands.GetAllClientModelBankIDs();
+	
+	if (err==KErrNone) 
+		{
+		iModelBankIDs = &aModelBankIDs;
+		iModelBankIDs->Reset();
+		iAsyncCallBusy = ETrue;
+		}
+	return err;
+	}
+
+
+TInt CSpeechRecognitionUtility::CBody::GetAllClientGrammarIDs(RArray <TGrammarID>& aGrammarIDs)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	ASSERT(iGrammarIDs==NULL);
+		
+	TInt err = iSrCustomCommands.GetAllClientGrammarIDs();
+	
+	if (err==KErrNone)	
+		{
+		iGrammarIDs = &aGrammarIDs;
+		iGrammarIDs->Reset();
+		iAsyncCallBusy = ETrue;
+		}
+	return err;
+	}
+	
+	
+TInt CSpeechRecognitionUtility::CBody::GetAllLexiconIDs(RArray <TLexiconID>& aLexiconIDs)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	ASSERT(iLexiconIDs==NULL);
+
+	TInt err = iSrCustomCommands.GetAllLexiconIDs();
+	
+	if (err==KErrNone)
+		{
+		iLexiconIDs = &aLexiconIDs;
+		iLexiconIDs->Reset();
+		iAsyncCallBusy = ETrue;
+		}
+		
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::GetAllModelBankIDs(RArray <TModelBankID>& aModelBankIDs)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	ASSERT(iModelBankIDs==NULL);
+	
+	TInt err = iSrCustomCommands.GetAllModelBankIDs();
+	
+	if (err==KErrNone) 
+		{
+		iModelBankIDs = &aModelBankIDs;
+		iModelBankIDs->Reset();
+		iAsyncCallBusy = ETrue;
+		}
+	return err;
+	}
+
+
+TInt CSpeechRecognitionUtility::CBody::GetAllGrammarIDs(RArray <TGrammarID>& aGrammarIDs)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	ASSERT(iGrammarIDs==NULL);
+		
+	TInt err = iSrCustomCommands.GetAllGrammarIDs();
+	
+	if (err==KErrNone)	
+		{
+		iGrammarIDs = &aGrammarIDs;
+		iGrammarIDs->Reset();
+		iAsyncCallBusy = ETrue;
+		}
+	return err;
+	}
+
+	
+TInt CSpeechRecognitionUtility::CBody::GetRuleValidity(TGrammarID aGrammarID, TRuleID aRuleID, TBool& aValid)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.GetRuleValidity(aGrammarID, aRuleID, aValid);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy = ETrue;
+	return err;
+	} 
+
+
+TInt CSpeechRecognitionUtility::CBody::CreateModelBank(TModelBankID& aModelBankID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+	TInt err = iSrCustomCommands.CreateModelBank(aModelBankID);
+	if (err == KErrNone)
+		iAsyncCallBusy = ETrue;
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::RemoveModelBank(TModelBankID aModelBankID)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+
+	TInt err = iSrCustomCommands.RemoveModelBank(aModelBankID);
+	if (err == KErrNone)
+		iAsyncCallBusy = ETrue;
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::GetAvailableStorage(TInt& aAvailableStorage) 
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+		
+	TInt err = iSrCustomCommands.GetAvailableStorage(aAvailableStorage);
+	
+	if (err == KErrNone)
+		iAsyncCallBusy = ETrue;
+		
+	return err;
+	}
+
+TInt CSpeechRecognitionUtility::CBody::LoadEngineParameters(const RArray<TInt>& aParameterId, const RArray<TInt>& aParameterValue)
+	{
+	if (iAsyncCallBusy)
+		return KErrInUse;
+		
+	return iSrCustomCommands.LoadEngineParameters(aParameterId, aParameterValue);
+	}
+
+TInt CSpeechRecognitionUtility::CBody::SetAudioPriority(TInt aPriority, TInt aTrainPreference, TInt aPlaybackPreference, TInt aRecognitionPreference)
+	{
+	iAudioPriority = aPriority;
+	iTrainPreference = (TMdaPriorityPreference)aTrainPreference;
+	iPlaybackPreference = (TMdaPriorityPreference)aPlaybackPreference;
+	iRecognitionPreference = (TMdaPriorityPreference)aRecognitionPreference;
+	
+	return KErrNone;	
+	}
+
+void CSpeechRecognitionUtility::CBody::HandleEvent(const TMMFEvent& aEvent)
+	{
+	TBool cancelled = EFalse;
+	TBool asyncCallComplete = ETrue;
+
+	TUid event = aEvent.iEventType;
+	TInt errorCode = aEvent.iErrorCode;
+	
+		
+	switch (event.iUid)
+		{
+		case KUidAsrEventGetAllPronunciationIDsVal :
+			{
+			if (iPronunciationIDs)
+				{
+				if (errorCode==KErrNone)
+					TRAP(errorCode, iSrCustomCommands.GetPronunciationIDArrayL(*iPronunciationIDs));
+				// async operation complete, so get rid of reference to array
+				iPronunciationIDs = NULL;
+				}
+			else 
+				cancelled = ETrue;
+			} 
+			break;
+		case KUidAsrEventGetAllRuleIDsVal :
+			{
+			if (iRuleIDs)
+				{
+				if (errorCode==KErrNone)
+					TRAP(errorCode, iSrCustomCommands.GetRuleIDArrayL(*iRuleIDs));		
+				// async operation complete, so get rid of reference to array
+				iRuleIDs = NULL;
+				}
+			else
+				cancelled = ETrue;
+			}
+			break;
+		case KUidAsrEventGetAllModelIDsVal :
+			{
+			if (iModelIDs)
+				{
+				if (errorCode==KErrNone)
+					TRAP(errorCode, iSrCustomCommands.GetModelIDArrayL(*iModelIDs));
+				// async operation complete, so get rid of reference to array
+				iModelIDs = NULL;
+				}
+			else
+				cancelled = ETrue;
+			}
+			break;
+		case KUidAsrEventGetAllClientModelBankIDsVal :
+		case KUidAsrEventGetAllModelBankIDsVal :
+			{
+			if (iModelBankIDs)
+				{
+				if (errorCode==KErrNone)
+					TRAP(errorCode, iSrCustomCommands.GetModelBankIDArrayL(*iModelBankIDs));
+				// async operation complete, so get rid of reference to array
+				iModelBankIDs = NULL;
+				}
+			else
+				cancelled = ETrue;
+			}
+			break;
+		case KUidAsrEventGetAllClientGrammarIDsVal :
+		case KUidAsrEventGetAllGrammarIDsVal :
+			{
+			if (iGrammarIDs)
+				{
+				if (errorCode==KErrNone)
+					TRAP(errorCode, iSrCustomCommands.GetGrammarIDArrayL(*iGrammarIDs));
+				// async operation complete, so get rid of reference to array
+				iGrammarIDs = NULL;
+				}
+			else
+				cancelled = ETrue;
+			}
+			break;
+		case KUidAsrEventGetAllClientLexiconIDsVal :
+		case KUidAsrEventGetAllLexiconIDsVal :
+			{
+			if (iLexiconIDs)
+				{
+				if (errorCode==KErrNone)
+					TRAP(errorCode, iSrCustomCommands.GetLexiconIDArrayL(*iLexiconIDs));
+				// async operation complete, so get rid of reference to array
+				iLexiconIDs = NULL;
+				}
+			else
+				cancelled = ETrue;
+			}
+			break;
+
+		case KUidAsrEventRecognitionVal :
+			{
+			if (iResultSet)
+				{
+				if (errorCode==KErrNone)
+					TRAP(errorCode, iSrCustomCommands.GetResultSetL(*iResultSet));
+				iResultSet = NULL;
+				}
+			else
+				cancelled = ETrue;
+			}
+			break;
+		case KUidAsrEventTrainVal:
+			break;
+		case KUidAsrEventPlayStartedVal:
+		case KUidAsrEventRecordStartedVal:
+			asyncCallComplete = EFalse;
+			break;
+		default:
+			break;
+
+			}
+		if (event == KMMFErrorCategoryControllerGeneralError)
+			{
+			// clear these, as the error callback
+			iPronunciationIDs = NULL;
+			iRuleIDs = NULL;
+			iModelIDs = NULL;
+			iLexiconIDs = NULL;
+			iGrammarIDs = NULL;
+			iModelBankIDs = NULL;
+			}
+		if (asyncCallComplete)
+			iAsyncCallBusy = EFalse;
+			
+		if (iSpeechRecognitionUtilityObserver && !cancelled)
+			iSpeechRecognitionUtilityObserver->MsruoEvent(event, errorCode);
+
+	}
+