srsf/sicc/src/nsssispeechrecognitioncustomcommands.cpp
changeset 0 bf1d17376201
child 11 6347473a7bb2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srsf/sicc/src/nsssispeechrecognitioncustomcommands.cpp	Thu Dec 17 08:46:30 2009 +0200
@@ -0,0 +1,1301 @@
+/*
+* Copyright (c) 2004-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:  This is the implementation of the client interface for the
+*               speaker independent custom commands.
+*
+*/
+
+
+// INCLUDE FILES
+#include "srsfbldvariant.hrh"
+#include "nsssispeechrecognitioncustomcommands.h"
+#include <nsssispeechrecognitiondatacommon.h>
+#include <badesca.h>
+#include "nsssispeechrecognitioncustomcommandcommon.h"
+#include "nsssicustomcommanddata.h"
+#include "rubydebug.h"
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::RSISpeechRecognitionCustomCommands
+// C++ constructor.
+// -----------------------------------------------------------------------------
+
+EXPORT_C RSISpeechRecognitionCustomCommands::RSISpeechRecognitionCustomCommands(
+	RMMFController& aController) :
+	RMMFCustomCommandsBase(aController, 
+	KUidInterfaceSpeakerIndependent)
+	{
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::AddRule
+// Sends a command to the controller to add a rule.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::AddRule(
+	TSIGrammarID aGrammarID, 
+	TSILexiconID aLexiconID, 
+	TSIPronunciationID aPronunciationID, 
+	TSIRuleID& aRuleID)
+	{
+
+	TSrsAddRule srsAddRule(aGrammarID, aLexiconID, aPronunciationID, &aRuleID);
+	TSrsAddRulePckg pckg(srsAddRule);
+	return iController.CustomCommandSync(iDestinationPckg, ESrAddRule,
+											pckg, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::Cancel
+// Sends a command to the controller to cancel the currect asynchronous 
+// operation.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSISpeechRecognitionCustomCommands::Cancel()
+	{
+
+	iController.CustomCommandSync(iDestinationPckg, ESrCancel,
+											KNullDesC8, KNullDesC8);
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::CommitChanges
+// Sends a command to the controller to commit the current changes.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::CommitChanges()
+	{
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrCommitChanges,
+											KNullDesC8, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::CreateGrammar
+// Sends a command to the controller to create a grammar.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::CreateGrammar(
+	TSIGrammarID& aGrammarID)
+	{
+
+	TSrsGrammarIDPtrPckg srsGrammarIDPtrPckg = &aGrammarID;
+	return iController.CustomCommandSync(iDestinationPckg, ESrCreateGrammar,
+											srsGrammarIDPtrPckg, KNullDesC8);
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::CreateLexicon
+// Sends a command to the controller to create a lexicon.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::CreateLexicon(
+	TSILexiconID& aLexiconID)
+	{
+
+	TSrsLexiconIDPtrPckg srsLexiconIDPtrPckg = &aLexiconID;
+	return iController.CustomCommandSync(iDestinationPckg, ESrCreateLexicon,
+											srsLexiconIDPtrPckg, KNullDesC8);
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::CreateModelBank
+// Sends a command to the controller to create a model bank.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::CreateModelBank(
+	TSIModelBankID& aModelBankID)
+	{
+
+	TSrsModelBankIDPtrPckg modelBankIDPtrPckg = &aModelBankID;
+	return iController.CustomCommandSync(iDestinationPckg, ESrCreateModelBank,
+											modelBankIDPtrPckg, KNullDesC8);
+	
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::EndRecSession
+// Sends a command to the controller to end the current recognition session and 
+// free the allocated resources.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::EndRecSession()
+	{
+
+	TInt err = iController.CustomCommandSync(iDestinationPckg, ESrEndRecSession,
+											KNullDesC8, KNullDesC8);
+	return err;
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetAllClientGrammarIDs
+// Calls the controller plugin to get all client grammar IDs.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetAllClientGrammarIDs()
+	{
+
+	return iController.CustomCommandSync(iDestinationPckg, 
+			ESrGetAllClientGrammarIDs, KNullDesC8, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetAllClientLexiconIDs
+// Calls the controller plugin to get all client lexicon IDs.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetAllClientLexiconIDs()
+	{
+
+	return iController.CustomCommandSync(iDestinationPckg, 
+			ESrGetAllClientLexiconIDs, KNullDesC8, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetAllClientModelBankIDs
+// Calls the controller plugin to get all client model bank IDs.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetAllClientModelBankIDs()
+	{
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrGetAllClientModelBankIDs,
+							KNullDesC8, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetAllGrammarIDs
+// Calls the controller plugin to get all grammar IDs for all clients.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetAllGrammarIDs()
+	{
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrGetAllGrammarIDs,
+							KNullDesC8, KNullDesC8); // Async
+	
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetAllLexiconIDs
+// Calls the controller plugin to get all lexicon IDs for all clients.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetAllLexiconIDs()
+	{	
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrGetAllLexiconIDs,
+							KNullDesC8, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetAllModelBankIDs
+// Calls the controller plugin to get all model bank IDs.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetAllModelBankIDs()
+	{
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrGetAllModelBankIDs,
+							KNullDesC8, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetAllModelIDs
+// Sends a command to the controller to get all model IDs from a model bank.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetAllModelIDs(
+	TSIModelBankID aModelBankID)
+	{
+
+	TSrsModelBankIDPckg modelBankIDPckg = aModelBankID;
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrGetAllModelIDs,
+							modelBankIDPckg, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetAllPronunciationIDs
+// Sends a command to the controller to get all pronunciation IDs from a lexicon.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetAllPronunciationIDs(
+	TSILexiconID aLexiconID)
+	{
+
+	TSrsLexiconIDPckg lexiconIDPckg = aLexiconID;
+	return iController.CustomCommandSync(iDestinationPckg, 
+						ESrGetAllPronunciationIDs,
+						lexiconIDPckg, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetAllRuleIDs
+// Sends a command to the controller to get all rule IDs from a grammar.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetAllRuleIDs(
+	TSIGrammarID aGrammarID)
+	{
+
+	TSrsGrammarIDPckg grammarIDPckg = aGrammarID;
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrGetAllRuleIDs,
+							grammarIDPckg, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetEngineProperties
+// Sends a command to the controller to get the engine properties.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetEngineProperties(
+	const RArray<TInt>& aPropertyId, 
+	RArray<TInt>& aPropertyValue)
+	{
+
+	TRAPD(err, DoGetEnginePropertiesL(aPropertyId, aPropertyValue));
+	return err;	
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetModelCount
+// Sends a command to the controller to get the number of models in a model bank.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetModelCount(
+	TSIModelBankID aModelBankID, TInt& aModelCount)
+	{
+
+	TSrsModelBankIDPckg modelBankPckg = aModelBankID;
+	TSrsIntPtrPckg modelCountPtrPckg = &aModelCount;
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrGetModelCount,
+											modelBankPckg, modelCountPtrPckg);
+
+	}
+
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetRuleValidity
+// Sends a command to the controller to determine if a rule is valid.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::GetRuleValidity(
+	TSIGrammarID aGrammarID, 
+	TSIRuleID aRuleID, TBool& aValid)
+	{
+
+	TSrsRuleValidity srsRuleValidity(aGrammarID, aRuleID, &aValid);
+	TSrsRuleValidityPckg srsRuleValidityPckg(srsRuleValidity);
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrGetRuleValidity,
+											srsRuleValidityPckg, KNullDesC8);
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::LoadGrammar
+// Sends a command to the controller to load the specified grammar.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::LoadGrammar(
+	TSIGrammarID aGrammarID)
+	{
+
+	TSrsGrammarIDPckg pckg = aGrammarID;
+	return iController.CustomCommandSync(iDestinationPckg, ESrLoadGrammar,
+											pckg, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::ActivateGrammar
+// Sends a command to the controller to activate a grammar
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::ActivateGrammar(
+	TSIGrammarID aGrammarID)
+	{
+	TSrsGrammarIDPckg pckg = aGrammarID;
+	return iController.CustomCommandSync( iDestinationPckg, ESrActivateGrammar,
+                                          pckg, KNullDesC8 ); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::DeactivateGrammar
+// Sends a command to the controller to deactivate a gramamr
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::DeactivateGrammar(
+	TSIGrammarID aGrammarID)
+	{
+	TSrsGrammarIDPckg pckg = aGrammarID;
+	return iController.CustomCommandSync( iDestinationPckg, ESrDeactivateGrammar,
+                                          pckg, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::LoadLexicon
+// Sends a command to the controller to load the specified lexican.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::LoadLexicon(
+	TSILexiconID aLexiconID)
+	{
+
+	TSrsLexiconIDPckg pckg = aLexiconID;
+	return iController.CustomCommandSync(iDestinationPckg, ESrLoadLexicon,
+											pckg, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::LoadModels
+// Sends a command to the controller to load all models from a model bank.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::LoadModels(
+	TSIModelBankID aModelBankID)
+	{
+
+	TSrsModelIDPckg pckg = aModelBankID;
+	return iController.CustomCommandSync(iDestinationPckg, ESrLoadModels,
+											pckg, KNullDesC8);  // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::Record
+// Sends a command to the controller to start recording an utterance for either 
+// training or recognition
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::Record(
+	TTimeIntervalMicroSeconds32 aRecordTime)
+	{
+
+	TSrsTimeIntervalMicroSeconds32Pckg pckg = aRecordTime;
+	return iController.CustomCommandSync(iDestinationPckg, ESrRecord,
+											pckg, KNullDesC8); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::RemoveGrammar
+// Sends a command to the controller to remove a grammar.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::RemoveGrammar(
+	TSIGrammarID aGrammarID)
+	{
+
+	TSrsGrammarIDPckg pckg = aGrammarID;
+	return iController.CustomCommandSync(iDestinationPckg, ESrRemoveGrammar,
+											pckg, KNullDesC8);
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::RemoveLexicon
+// Sends a command to the controller to remove a lexicon.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::RemoveLexicon(
+	TSILexiconID aLexiconID)
+	{
+
+	TSrsLexiconIDPckg pckg = aLexiconID;
+	return iController.CustomCommandSync(iDestinationPckg, ESrRemoveLexicon,
+											pckg, KNullDesC8);
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::RemoveModelBank
+// Sends a command to the controller to remove a model bank and all associated 
+// models.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::RemoveModelBank(
+	TSIModelBankID aModelBankID)
+	{
+
+	TSrsModelBankIDPckg modelBankIDPckg = aModelBankID;
+	return iController.CustomCommandSync(iDestinationPckg, ESrRemoveModelBank,
+											modelBankIDPckg, KNullDesC8);
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::RemoveModel
+// Sends a command to the controller to remove a model from a model bank.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::RemoveModel(
+	TSIModelBankID aModelBankID, 
+	TSIModelID aModelID)
+	{
+
+	TSrsModelBankIDPckg modelBankIDPckg = aModelBankID;
+	TSrsModelIDPckg modelIDPckg = aModelID;
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrRemoveModel,
+										modelBankIDPckg, modelIDPckg); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::RemovePronunciation
+// Sends a command to the controller to remove a pronunciation.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::RemovePronunciation(
+	TSILexiconID aLexiconID, 
+	TSIPronunciationID aPronunciationID)
+	{
+
+	TSrsLexiconIDPckg lexiconIDPckg = aLexiconID;
+	TSrsPronunciationIDPckg pronunciationIDPckg = aPronunciationID;
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrRemovePronunciation,
+										lexiconIDPckg, pronunciationIDPckg); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::RemoveRule
+// Sends a command to the controller to remove a rule.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::RemoveRule(
+	TSIGrammarID aGrammarID, 
+	TSIRuleID aRuleID)
+	{
+
+	TSrsGrammarIDPckg grammarIDPckg = aGrammarID;
+	TSrsRuleIDPckg ruleIDPckg = aRuleID;
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrRemoveRule,
+											grammarIDPckg, ruleIDPckg); // Async
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::RemoveRules
+// Sends a command to the controller to remove a rule.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::RemoveRules(
+	TSIGrammarID aGrammarID, 
+	RArray<TSIRuleID>& aRuleIDs)
+	{
+    RUBY_DEBUG1( "RSISpeechRecognitionCustomCommands::RemoveRules GrammarID [%d]", aGrammarID );
+	
+	TSrsGrammarIDPckg grammarIDPckg = aGrammarID;
+
+    CBufFlat* flatBuf = 0;
+    
+    /** @todo Implement externalize, that takes arrays of Uint32? */
+    TRAPD( err, flatBuf
+        = ExternalizeIntArrayL( reinterpret_cast<RArray<TInt>&> ( aRuleIDs ) ) );
+	
+    if ( err != KErrNone )
+       	{
+       	delete flatBuf;
+       	return err;
+       	}
+	// SRS will signal, when the rule IDs are ready.
+	TInt ret = iController.CustomCommandSync(iDestinationPckg, ESrRemoveRules,
+                                             grammarIDPckg, flatBuf->Ptr(0) ); // Async
+    delete flatBuf;
+
+    return( ret );
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::SetClientUid
+// Sends a command to the controller to set the client UID.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::SetClientUid( TUid aClientUid )
+{
+
+	TSrsUidPckg uidPckg = aClientUid;
+	return iController.CustomCommandSync(iDestinationPckg, 
+						ESrSetClientUid, uidPckg, KNullDesC8);
+
+}
+
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::StartRecSession
+// Sends a command to the controller to begin a recognition session.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::StartRecSession(
+	TNSSRecognitionMode aMode)
+	{
+
+	TSrsRecognitionModePckg recognitionModePckg = aMode;
+	TInt err = iController.CustomCommandSync(iDestinationPckg, 
+						ESrStartRecSession, recognitionModePckg, KNullDesC8);
+
+	return err;
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::UnloadRule
+// Sends a command to the controller to add a rule.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::UnloadRule(
+	TSIGrammarID aGrammarID, 
+	TSIRuleID aRuleID)
+	{
+
+	TSrsGrammarIDPckg grammarIDPckg = aGrammarID;
+	TSrsRuleIDPckg ruleIDPtrPckg = aRuleID;
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrUnloadRule,
+											grammarIDPckg, ruleIDPtrPckg);
+	
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::LoadEngineParameters
+// Sends a command to the controller to load the parameters into
+// the engine.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::LoadEngineParameters(
+	const RArray<TInt>& aParameterId, 
+	const RArray<TInt>& aParameterValue)
+	{
+
+	TRAPD(error, DoLoadEngineParametersL(aParameterId, aParameterValue));
+	return error;	
+
+	}
+
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetPronunciationIDArrayL
+// Sends a command to get the pronunciation ID array.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSISpeechRecognitionCustomCommands::GetPronunciationIDArrayL(
+	RArray<TSIPronunciationID>& aPronunciationIDs)
+	{
+	
+	TPckgBuf<TInt> pckgSize;
+	
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+												ESrGetPronunciationIDArraySize, 
+												KNullDesC8,
+												KNullDesC8,
+												pckgSize));
+	
+
+	HBufC8* buf = HBufC8::NewLC(pckgSize()*sizeof(TUint32));
+	TPtr8 ptr = buf->Des();
+
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+													 ESrGetPronunciationIDArrayContents,
+													 KNullDesC8,
+													 KNullDesC8,
+													 ptr));
+													 
+	RDesReadStream stream(ptr);
+	CleanupClosePushL(stream);
+
+	for (TInt i=0; i<pckgSize(); i++)
+		{
+		User::LeaveIfError(aPronunciationIDs.Append(stream.ReadUint32L()));
+		}
+
+	CleanupStack::PopAndDestroy(2);//stream, buf
+		
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetRuleIDArrayL
+// Sends a command to get the rule ID array.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSISpeechRecognitionCustomCommands::GetRuleIDArrayL(
+	RArray<TSIRuleID>& aRuleIDs)
+	{
+
+	TPckgBuf<TInt> pckgSize;
+	
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+												ESrGetRuleIDArraySize, 
+												KNullDesC8,
+												KNullDesC8,
+												pckgSize));
+												
+	HBufC8* buf = HBufC8::NewLC(pckgSize()*sizeof(TUint32));
+	TPtr8 ptr = buf->Des();
+
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+													 ESrGetRuleIDArrayContents,
+													 KNullDesC8,
+													 KNullDesC8,
+													 ptr));
+													 
+	RDesReadStream stream(ptr);
+	CleanupClosePushL(stream);
+
+	for (TInt i=0; i<pckgSize(); i++)
+		{
+		User::LeaveIfError(aRuleIDs.Append(stream.ReadUint32L()));
+		}
+
+	CleanupStack::PopAndDestroy(2);//stream, buf
+	
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetModelIDArrayL
+// Sends a command to get the model ID array.
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void RSISpeechRecognitionCustomCommands::GetModelIDArrayL(
+	RArray<TSIModelID>& aModelIDs)
+	{
+
+	TPckgBuf<TInt> pckgSize;
+	
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+												ESrGetModelIDArraySize, 
+												KNullDesC8,
+												KNullDesC8,
+												pckgSize));
+												
+	HBufC8* buf = HBufC8::NewLC(pckgSize()*sizeof(TUint32));
+	TPtr8 ptr = buf->Des();
+
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+													 ESrGetModelIDArrayContents,
+													 KNullDesC8,
+													 KNullDesC8,
+													 ptr));
+													 
+	RDesReadStream stream(ptr);
+	CleanupClosePushL(stream);
+
+	for (TInt i=0; i<pckgSize(); i++)
+		{
+		User::LeaveIfError( aModelIDs.Append( (TSIModelID)stream.ReadUint32L() ) );
+		}
+
+	CleanupStack::PopAndDestroy( 2 );//stream, buf
+	
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetGrammarIDArrayL
+// Sends a command to get the grammar ID array.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSISpeechRecognitionCustomCommands::GetGrammarIDArrayL(
+	RArray<TSIGrammarID>& aGrammarIDs)
+	{
+
+	TPckgBuf<TInt> pckgSize;
+	
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+												ESrGetGrammarIDArraySize, 
+												KNullDesC8,
+												KNullDesC8,
+												pckgSize));
+												
+	HBufC8* buf = HBufC8::NewLC(pckgSize()*sizeof(TUint32));
+	TPtr8 ptr = buf->Des();
+
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+													 ESrGetGrammarIDArrayContents,
+													 KNullDesC8,
+													 KNullDesC8,
+													 ptr));
+													 
+	RDesReadStream stream(ptr);
+	CleanupClosePushL(stream);
+
+	for ( TInt i = 0; i < pckgSize(); i++ )
+		{
+		User::LeaveIfError( aGrammarIDs.Append( (TSIGrammarID)stream.ReadUint32L() ) );
+		}
+
+	CleanupStack::PopAndDestroy( 2 );//stream, buf
+	
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetLexiconIDArrayL
+// Sends a command to get the lexicon ID array.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSISpeechRecognitionCustomCommands::GetLexiconIDArrayL(
+	RArray<TSILexiconID>& aLexiconIDs)
+	{
+
+	TPckgBuf<TInt> pckgSize;
+
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+												ESrGetLexiconIDArraySize, 
+												KNullDesC8,
+												KNullDesC8,
+												pckgSize));
+
+    TInt size = pckgSize();
+	HBufC8* buf = HBufC8::NewLC(size*sizeof(TUint32));
+	TPtr8 ptr = buf->Des();
+
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+													 ESrGetLexiconIDArrayContents,
+													 KNullDesC8,
+													 KNullDesC8,
+													 ptr));
+
+	RDesReadStream stream(ptr);
+	CleanupClosePushL(stream);
+
+	for ( TInt i = 0; i < pckgSize(); i++ )
+		{
+		User::LeaveIfError( aLexiconIDs.Append( (TSILexiconID)stream.ReadUint32L() ) );
+		}
+
+	CleanupStack::PopAndDestroy(2);//stream, buf
+	
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetLexiconIDArrayL
+// Sends a command to get the lexicon ID array.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void RSISpeechRecognitionCustomCommands::GetModelBankIDArrayL(
+	RArray<TSIModelBankID>& aModelBankIDs)
+	{
+
+	TPckgBuf<TInt> pckgSize;
+	
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+												ESrGetModelBankIDArraySize, 
+												KNullDesC8,
+												KNullDesC8,
+												pckgSize));
+												
+	HBufC8* buf = HBufC8::NewLC(pckgSize()*sizeof(TUint32));
+	TPtr8 ptr = buf->Des();
+
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+													 ESrGetModelBankIDArrayContents,
+													 KNullDesC8,
+													 KNullDesC8,
+													 ptr));
+													 
+	RDesReadStream stream(ptr);
+	CleanupClosePushL(stream);
+
+	for ( TInt i = 0; i < pckgSize(); i++ )
+		{
+		User::LeaveIfError( aModelBankIDs.Append( (TSIModelBankID)stream.ReadUint32L() ) );
+		}
+
+	CleanupStack::PopAndDestroy(2);//stream, buf
+	
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::GetSIResultSetL
+// Sends a command to get the speaker independent recognition result set.
+// -----------------------------------------------------------------------------
+//	
+EXPORT_C void RSISpeechRecognitionCustomCommands::GetSIResultSetL(
+	CSIClientResultSet& aResultSet)
+	{
+	
+	TPckgBuf<TInt> pckgSize;
+	
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+												ESrGetClientResultSetSizeSI, 
+												KNullDesC8,
+												KNullDesC8,
+												pckgSize));
+
+	HBufC8* buf = HBufC8::NewLC( pckgSize() );
+	TPtr8 ptr = buf->Des();
+
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+													 ESrGetClientResultSet,
+													 KNullDesC8,
+													 KNullDesC8,
+													 ptr));
+
+	RDesReadStream stream(ptr);
+	CleanupClosePushL(stream);
+
+	aResultSet.InternalizeL(stream);
+	CleanupStack::PopAndDestroy(2);//stream, buf
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::DoRecognizeL
+// Sends a command to get the recognition result set.
+// -----------------------------------------------------------------------------
+//	
+void RSISpeechRecognitionCustomCommands::DoRecognizeL(CSDClientResultSet& /*aResultSet*/)
+	{
+    RUBY_DEBUG0( "RSISpeechRecognitionCustomCommands::DoRecognizeL is NOT supported" );
+	User::Leave( KErrNotSupported );
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::DoRecognizeSIL
+// Sends a command to get the recognition result set.
+// -----------------------------------------------------------------------------
+//	
+void RSISpeechRecognitionCustomCommands::DoRecognizeSIL(CSIClientResultSet& aResultSet)
+	{
+	CBufFlat* dataCopyBuffer = CBufFlat::NewL(KExpandSize);
+	CleanupStack::PushL(dataCopyBuffer);
+
+	RBufWriteStream stream;
+	stream.Open(*dataCopyBuffer);
+	CleanupClosePushL(stream);
+
+	aResultSet.ExternalizeL(stream);
+
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg,
+												ESrRecognizeSI,
+												dataCopyBuffer->Ptr(0),
+												KNullDesC8));
+
+	CleanupStack::PopAndDestroy(2); //stream,dataCopyBuffer
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::DoGetEnginePropertiesL
+// Sends a command to get the engine properties.
+// -----------------------------------------------------------------------------
+//	
+void RSISpeechRecognitionCustomCommands::DoGetEnginePropertiesL(
+	const RArray<TInt>& aPropertyId, 
+	RArray<TInt>& aPropertyValue)
+	{
+	
+	CBufFlat* param1 = ExternalizeIntArrayL(aPropertyId);
+	CleanupStack::PushL(param1);
+	
+	TInt aNumberResults = aPropertyId.Count(); // same number of values as properties
+	
+	HBufC8* buf = HBufC8::NewLC(aNumberResults *sizeof(TInt));
+	TPtr8 ptr = buf->Des();
+
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+												ESrGetEngineProperties, 
+												param1->Ptr(0),
+												KNullDesC8,
+												ptr));
+
+	
+	InternalizeIntArrayL(ptr,aNumberResults,aPropertyValue);
+	CleanupStack::PopAndDestroy(2);//buf,param1
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::DoLoadEngineParametersL
+// Sends a command to load the engine parameters.
+// -----------------------------------------------------------------------------
+//	
+void RSISpeechRecognitionCustomCommands::DoLoadEngineParametersL(
+	const RArray<TInt>& aParameterId, 
+	const RArray<TInt>& aParameterValue)
+	{
+
+	CBufFlat* param1 = ExternalizeIntArrayL(aParameterId);
+	CleanupStack::PushL(param1);
+	CBufFlat* param2 = ExternalizeIntArrayL(aParameterValue);
+	CleanupStack::PushL(param2);
+	User::LeaveIfError(iController.CustomCommandSync(iDestinationPckg, 
+												ESrLoadEngineParameters, 
+												param1->Ptr(0),
+												param2->Ptr(0)));
+												
+	CleanupStack::PopAndDestroy(2); //param2, param1	
+
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::ExternalizeIntArrayL
+// Externalizes an interger array.
+// -----------------------------------------------------------------------------
+//	
+CBufFlat* RSISpeechRecognitionCustomCommands::ExternalizeIntArrayL(
+	const RArray<TInt>& aArray)
+	{
+
+	CBufFlat* dataCopyBuffer = CBufFlat::NewL(KExpandSize);
+	CleanupStack::PushL(dataCopyBuffer);
+	RBufWriteStream stream;
+	stream.Open(*dataCopyBuffer);
+	CleanupClosePushL(stream);
+	
+	stream.WriteInt32L(aArray.Count());
+	
+	for (TInt i=0;i<aArray.Count();i++)
+		stream.WriteUint32L(aArray[i]);
+
+	CleanupStack::PopAndDestroy(1); //stream
+	CleanupStack::Pop(); //dataCopyBuffer;
+	return dataCopyBuffer;	
+	
+	}
+
+// -----------------------------------------------------------------------------
+// RSISpeechRecognitionCustomCommands::InternalizeIntArrayL
+// Internalizes an interger array.
+// -----------------------------------------------------------------------------
+//
+void RSISpeechRecognitionCustomCommands::InternalizeIntArrayL(
+	TDes8& aDes, 
+	TInt aNumberElements, 
+	RArray<TInt>& aArray)
+	{
+
+	RDesReadStream stream(aDes);
+	CleanupClosePushL(stream);
+
+	for (TInt i=0; i<aNumberElements; i++)
+		{
+		User::LeaveIfError(aArray.Append(stream.ReadInt32L()));
+		}
+
+	CleanupStack::PopAndDestroy();//stream
+
+	}
+
+/************************** New SI functions start here ***********************/
+
+// -----------------------------------------------------------------------------
+// Adapts speaker independent models according using a correct recognition result.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::Adapt(const CSIClientResultSet& aResultSet, TInt aCorrect)
+    {
+    CBufFlat* dataBuf = 0;
+    RBufWriteStream dataStream;
+    TInt ret = KErrNone;
+    TBool forever = ETrue;
+
+    TPckgBuf<TInt> correctPckg( aCorrect );
+
+    while(forever)
+        {
+// Poor man's exception handling: while and break
+#define BREAK( error ) if ( error != KErrNone ) { break; }
+
+        // Allocate buffer for storing CSIClientResultSet
+        TRAP ( ret, dataBuf = CBufFlat::NewL( KExpandSize ) );
+        BREAK( ret );
+
+        // Open a stream to the buffer
+        dataStream.Open( *dataBuf );
+
+        // Pack the data
+        TRAP ( ret, aResultSet.ExternalizeL( dataStream ) );
+        BREAK( ret );
+
+        // Send through MMF
+        ret = iController.CustomCommandSync(
+            iDestinationPckg,
+            ESrAdapt,
+            dataBuf->Ptr( 0 ),
+            correctPckg );
+
+        break;
+        }
+
+    dataStream.Close();
+    delete dataBuf;
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// Adds a pronunciation to the given lexicon.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::AddPronunciation(
+    TSILexiconID aLexiconID,
+    const TDesC& aTrainText,
+    TLanguage aLanguage,
+    TSIPronunciationID& aPronunciationID)
+    {
+    TSrsAddPronunciationSI srsAddPronunciation( aLexiconID, aTrainText.Length(),
+                                                aLanguage, aPronunciationID );
+    TSrsAddPronunciationSIPckg pckg( srsAddPronunciation );
+
+    TInt    trainTextSize( aTrainText.Size() );
+    TUint8* trainTextPtr = (TUint8*)aTrainText.Ptr();
+    TPtrC8  trainTextDes( trainTextPtr, trainTextSize );
+
+    return iController.CustomCommandSync(iDestinationPckg, ESrAddPronunciationSI,
+                                         pckg, trainTextDes );
+    }
+
+// -----------------------------------------------------------------------------
+// Adds a rule variant to a rule in a grammar.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::AddRuleVariant(
+    TSIGrammarID aGrammarID,
+    TSILexiconID aLexiconID,
+    const RArray<TSIPronunciationID>& aPronunciationIDs,
+    TSIRuleID aRuleID,
+    TSIRuleVariantID& aRuleVariantID )
+    {
+    TSrsAddRuleVariant srsAddRuleVariant( aGrammarID,
+                                          aLexiconID,
+                                          aPronunciationIDs.Count(),
+                                          aRuleID,
+                                          &aRuleVariantID );
+    TSrsAddRuleVariantPckg pckg( srsAddRuleVariant );
+
+    TUint8* pronunIdPtr = (TUint8*)&(aPronunciationIDs[0]);
+    TPtrC8  pronunIdDes( pronunIdPtr, 
+                         sizeof( TSIPronunciationID ) * aPronunciationIDs.Count()
+                         );
+
+    return iController.CustomCommandSync(iDestinationPckg, ESrAddRuleVariant,
+                                         pckg, pronunIdDes );
+    }
+
+// -----------------------------------------------------------------------------
+// Trains a voice tag. Adds the text to the lexicon, and creates the required
+// rules and rule variants.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::AddVoiceTag(
+    const MDesCArray& aTrainArray,
+    const RArray<TLanguage>& aLanguageArray,
+    TSILexiconID aLexiconID,
+    TSIGrammarID aGrammarID,
+    TSIRuleID& aRuleID)
+    {
+    TSrsAddVoiceTag srsAddVoiceTagData( aLexiconID, aGrammarID, &aRuleID, aLanguageArray );
+    TSrsAddVoiceTagPckg pckg( srsAddVoiceTagData );
+
+    CBufFlat* flatBuf = 0;
+    TRAPD( err, flatBuf
+        = SICustomCommandData::ExternalizeDesCArrayL( aTrainArray ) );
+
+    if ( err != KErrNone )
+        return( err );
+
+    // SRS will signal, when the rule IDs are ready.
+	TInt ret = iController.CustomCommandSync( iDestinationPckg, ESrAddVoiceTag,
+                                              pckg, flatBuf->Ptr( 0 ) ); // Async
+
+    delete flatBuf;
+
+    return( ret );
+    }
+
+// -----------------------------------------------------------------------------
+// Trains voice tags. If the training fails for some of the names (but not all),
+// it is signaled by setting the Rule ID to KInvalidRuleID.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::AddVoiceTags(
+    const RPointerArray<MDesCArray>& aTrainArray,
+    const RArray<TLanguage>& aLanguageArray,
+    TSILexiconID aLexiconID,
+    TSIGrammarID aGrammarID,
+    RArray<TSIRuleID>& /*aRuleID*/)
+    {
+    TSrsAddVoiceTag srsAddVoiceTagData( aLexiconID, aGrammarID, NULL, aLanguageArray );
+    TSrsAddVoiceTagPckg pckg( srsAddVoiceTagData );
+
+    CBufFlat* flatBuf = 0;
+    TRAPD( err, flatBuf
+        = SICustomCommandData::ExternalizeDesCArrayArrayL( aTrainArray ) );
+
+    if ( err != KErrNone )
+        {
+        delete flatBuf;
+        return err;
+        }
+
+    // SRS will signal, when the rule IDs are ready.
+	TInt ret = iController.CustomCommandSync( iDestinationPckg, ESrAddVoiceTags,
+                                              pckg, flatBuf->Ptr( 0 ) ); // Async
+    delete flatBuf;
+
+    return( ret );
+    }
+
+#ifdef __SINDE_TRAINING
+// -----------------------------------------------------------------------------
+// Trains a voice tag. Adds the text to the lexicon, and creates the required
+// rules and rule variants.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::AddVoiceTag( const MDesCArray& aTrainArray,
+                                                               const RArray<RLanguageArray>& aLanguageArray,
+                                                               TSILexiconID aLexiconID,
+                                                               TSIGrammarID aGrammarID,
+                                                               TSIRuleID& aRuleID )
+    {
+    TSrsAddSindeVoiceTag srsAddVoiceTagData( aLexiconID, aGrammarID, &aRuleID, aLanguageArray );
+    TSrsAddSindeVoiceTagPckg pckg( srsAddVoiceTagData );
+
+    CBufFlat* flatBuf( NULL );
+    TRAPD( err, flatBuf = SICustomCommandData::ExternalizeDesCArrayL( aTrainArray ) );
+
+    if ( err != KErrNone )
+        {
+        return err;
+        }
+
+    // SRS plugin will signal, when the rule IDs are ready.
+	TInt ret = iController.CustomCommandSync( iDestinationPckg, ESrAddSindeVoiceTag,
+                                              pckg, flatBuf->Ptr( 0 ) ); // Async
+
+    delete flatBuf;
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// Trains voice tags. If the training fails for some of the names (but not all),
+// it is signaled by setting the Rule ID to KInvalidRuleID.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::AddVoiceTags( const RPointerArray<MDesCArray>& aTrainArray,
+                                                                const RArray<RLanguageArray>& aLanguageArray,
+                                                                TSILexiconID aLexiconID,
+                                                                TSIGrammarID aGrammarID,
+                                                                RArray<TSIRuleID>& /*aRuleID*/)
+    {
+    TSrsAddSindeVoiceTag srsAddVoiceTagData( aLexiconID, aGrammarID, NULL, aLanguageArray );
+    TSrsAddSindeVoiceTagPckg pckg( srsAddVoiceTagData );
+
+    CBufFlat* flatBuf( NULL );
+    TRAPD( err, flatBuf = SICustomCommandData::ExternalizeDesCArrayArrayL( aTrainArray ) );
+
+    if ( err != KErrNone )
+        {
+        delete flatBuf;
+        return err;
+        }
+
+    // SRS plugin will signal, when the rule IDs are ready.
+	TInt ret = iController.CustomCommandSync( iDestinationPckg, ESrAddSindeVoiceTags,
+                                              pckg, flatBuf->Ptr( 0 ) ); // Async
+    delete flatBuf;
+
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// Pre-starts sampling before Record() call
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::PreStartSampling()
+    {
+    return iController.CustomCommandSync( iDestinationPckg, ESrPreStartSampling,
+                                          KNullDesC8, KNullDesC8 ); // Async      
+    }
+    
+#endif // SINDE_TRAINING
+
+// -----------------------------------------------------------------------------
+// Creates a new rule.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::CreateRule(TSIGrammarID aGrammarID, TSIRuleID& aRuleID)
+    {
+    TSrsAddRule srsCreateRule( aGrammarID, KInvalidLexiconID, KInvalidPronunciationID, &aRuleID );
+    TSrsAddRulePckg pckg( srsCreateRule );
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrCreateRule,
+                                         pckg, KNullDesC8 ); // Async    
+    }
+
+// -----------------------------------------------------------------------------
+// Starts recognition
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::Recognize( CSIClientResultSet& aResultSet )
+    {
+    TRAPD( err, DoRecognizeSIL( aResultSet ) );
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+// Stops recognition. Unlike Cancel(), this function gives
+// the recognition result, if it can be guessed.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::EndRecord()
+    {
+    return iController.CustomCommandSync( iDestinationPckg, ESrEndRecord,
+                                          KNullDesC8, KNullDesC8 ); // Async
+    }
+
+// -----------------------------------------------------------------------------
+// Deactivates a grammar.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt RSISpeechRecognitionCustomCommands::UnloadGrammar( TSIGrammarID aGrammarID )
+    {
+    TSrsGrammarIDPckg pckg( aGrammarID );
+
+	return iController.CustomCommandSync(iDestinationPckg, ESrUnloadGrammar,
+                                         pckg, KNullDesC8 ); // Async
+    }
+
+
+/************************** New SI functions stop here ************************/
+
+// End of file