srsf/sisrscontrollerplugin/src/sicontrollerplugin.h
branchRCL_3
changeset 19 e36f3802f733
parent 0 bf1d17376201
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srsf/sisrscontrollerplugin/src/sicontrollerplugin.h	Wed Sep 01 12:29:17 2010 +0100
@@ -0,0 +1,1092 @@
+/*
+* Copyright (c) 2002-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:  This is the main implementation of the SI Controller Plugin.
+*               Finite State Machine is implemented here.
+*
+*/
+
+
+#ifndef SICONTROLLERPLUGIN_H
+#define SICONTROLLERPLUGIN_H
+
+// ============================================================================
+// Uncomment the following directive for Bit Exact Testing.
+// ============================================================================
+//
+ 
+// INCLUDES
+#include "srsfbldvariant.hrh"
+#include <nsssispeechrecognitiondataclient.h>
+#include <nsssispeechrecognitiondatacommon.h>
+#include <nssdevasr.h>
+#include <d32dbms.h>
+
+// FORWARD DECLARATIONS
+class CSIControllerPluginInterface;
+class CDevASR;
+class CSIResourceHandler;
+class CSDClientResultSet;
+
+class CSIGrammarDB; 
+class CSIModelBankDB;
+class CSILexiconDB; 
+class CDataLoader;
+class CSIDatabase;
+
+#ifdef __SINDE_TRAINING
+class CSindeTrainer;
+#endif // __SINDE_TRAINING
+
+// CLASS DECLARATION
+
+/**
+*  This is the main class of SI Controller Plugin
+*
+*  @lib SIControllerPlugin.lib
+*  @since 2.0
+*/
+class CSIControllerPlugin : public CActive, public MDevASRObserver
+{
+public:  // Constructors and destructor
+    
+    /**
+    * Two-phased constructor.    CSIControllerPluginInterface& aControllerIf
+    */
+    static CSIControllerPlugin* NewL( CSIControllerPluginInterface& aControllerInterface );
+    
+    /**
+    * Destructor.
+    */
+    virtual ~CSIControllerPlugin();
+    
+public: // Functions from base classes
+    
+    /**
+    * From MDevASRObserver
+    * Spontaneous or non-spontaneous event received from DevASR.
+    * @since 2.0
+    * @param    aEvent                event code
+    * @param    aError                error code
+    */
+    void DevASREvent( TDevASREvent aEvent, TDevASRError aError );
+    
+    /**
+    * From MDevASRObserver
+    * Notification from DevASR when feature vectors are available.
+    * @since 2.0
+    * @param    aFV                    buffer containing the feature vector data
+    * @param    aSNR                signal-to-noise ratio
+    * @param    aPosition            indicates whether the feature vector is the first, middle, or end.
+    */
+    void FeatureVectorDataRcvd( const TDesC8& aFV, TInt32 aSNR, TInt32 aPosition ); 
+    
+    /**
+    * From MDevASRObserver
+    * A message in response to a custom command.
+    * @since 2.0
+    * @param    aMsg                buffer containing the message
+    */
+    void DevASRMessage( TDesC8& aMsg );
+
+    /**
+    * From MDevASRObserver
+    * DevASR calls this method to get lexicon data.
+    * @since 2.8
+    * @param    anID lexicon ID
+    * @return    Lexicon object
+    */
+    CSILexicon* SILexiconL( TSILexiconID anID );
+    
+    /**
+    * DevASR calls this method to get configuration data.
+    *
+    * @since 2.8
+    * @param "TUint32 aPackageType" Type identifier.
+    * @param "TUint32 aPackageID" Identifier of package.
+    * @param "TUint32 aStartPosition" Starting position within package in bytes.
+    * @param "TUint32 aEndPosition" Ending position within package in bytes.
+    * @return Pointer to created buffer containing the request data.
+    */
+    HBufC8* ConfigurationData( TUint32 aPackageType, 
+                               TUint32 aPackageID,
+                               TUint32 aStartPosition,
+                               TUint32 aEndPosition );
+    
+    /**
+    * Get speech data from audio buffer
+    *
+    * @since 2.8
+    */    
+    void RequestSpeechData();    
+    
+#ifdef DEVASR_KEEP_SD
+    CSDLexicon* SDLexiconL( TSILexiconID anID ) ;
+#endif
+    
+public: // New functions
+    
+    /**
+    * Adds a new pronunciation for the given model into the specified lexicon.
+    * @since 2.0
+    * @param    aLexiconID            lexicon Id, where the new pronunciation is added to
+    * @param    aModelBankID        model bank Id
+    * @param    aModelID            model Id
+    * @param    aPronunciationID    reference where a new pronunciation Id is assigned to
+    */
+    void AddPronunciationL( TSILexiconID aLexiconID, TSIModelBankID aModelBankID,
+        TSIModelID aModelID, TSIPronunciationID& aPronunciationID );
+    
+    void AddPronunciationL( TSILexiconID aLexiconID, TSIModelBankID aModelBankID,
+        const TDesC8& aPronunciationPr, TSIPronunciationID& aPronunciationID );
+    
+    /**
+    * Adds a new rule for the given pronunciation into the specified grammar.
+    * @since 2.0
+    * @param    aGrammarID            grammar Id, where the new rule is added to
+    * @param    aLexiconID            lexicon Id
+    * @param    aPronunciationID    pronunciation Id
+    * @param    aRuleID                reference where a new rule Id is assigned to
+    */
+    void AddRuleL( TSIGrammarID aGrammarID, TSILexiconID aLexiconID,
+        TSIPronunciationID aPronunciationID, TSIRuleID& aRuleID );
+    
+    /**
+    * Cancels the current activity and returns the plugin to Idle state.
+    * @since 2.0
+    */
+    void Cancel();
+    
+    /**
+    * Commits (saves) the current trained model into a permanent storage.
+    * @since 2.0
+    */
+    void CommitChangesL( TBool aCompact );
+    
+    /**
+    * Creates a new grammar.
+    * @since 2.0
+    * @param    aGrammarID            reference where a new rule Id is assigned to
+    */
+    void CreateGrammarL( TSIGrammarID& aGrammarID );
+    
+    /**
+    * Creates a new lexicon.
+    * @since 2.0
+    * @param    aLexiconID            reference where a new lexicon Id is assigned to
+    */
+    void CreateLexiconL( TSILexiconID& aLexiconID );
+    
+    /**
+    * Creates a new model bank.
+    * @since 2.0
+    * @param    aModelBankID        reference where a new model bank Id is assigned to
+    */
+    void CreateModelBankL( TSIModelBankID& aModelBankID );
+    
+    /**
+    * Ends the current recognition session.  Resources allocated for recognition are freed.
+    * @since 2.0
+    * @param    -
+    */
+    void EndRecSessionL();
+    
+    /**
+    * Returns all grammar Ids that belong to the current client, whose UID was set
+    * with SetClientUidL().
+    * @since 2.0
+    * @param    aGrammarIDs            reference where grammar Ids are stored
+    */
+    void GetAllClientGrammarIDsL( RArray<TSIGrammarID>& aGrammarIDs );
+    
+    /**
+    * Returns all lexicon Ids that belong to the current client, whose UID was set
+    * with SetClientUidL().
+    * @since 2.0
+    * @param    aLexiconIDs            reference where lexicon Ids are stored
+    */
+    void GetAllClientLexiconIDsL( RArray<TSILexiconID>& aLexiconIDs );
+    
+    /**
+    * Returns all model bank Ids that belong to the current client, whose UID was set
+    * with SetClientUidL().
+    * @since 2.0
+    * @param    aModelBankIDs        reference where model bank Ids are stored
+    */
+    void GetAllClientModelBankIDsL( RArray<TSIModelBankID>& aModelBankIDs );
+    
+    /**
+    * Returns all grammar Ids that exist (for all clients).
+    * @since 2.0
+    * @param    aGrammarIDs            reference where grammar Ids are stored
+    */
+    void GetAllGrammarIDsL( RArray<TSIGrammarID>& aGrammarIDs );
+    
+    /**
+    * Returns all lexicon Ids that exist (for all clients).
+    * @since 2.0
+    * @param    aLexiconIDs            reference where lexicon Ids are stored
+    */
+    void GetAllLexiconIDsL( RArray<TSILexiconID>& aLexiconIDs );
+    
+    /**
+    * Returns all model bank Ids that exist (for all clients).
+    * @since 2.0
+    * @param    aModelBankIDs        reference where model bank Ids are stored
+    */
+    void GetAllModelBankIDsL( RArray<TSIModelBankID>& aModelBankIDs );
+    
+    /**
+    * Returns all model Ids that exist in the specified model bank.
+    * @since 2.0
+    * @param    aModelBankID        model bank Id
+    * @param    aModelIDs            reference where model Ids are stored
+    */
+    void GetAllModelIDsL( TSIModelBankID aModelBankID, RArray<TSIModelID>& aModelIDs );
+    
+    /**
+    * Returns all pronunciation Ids that exist in the specified lexicon.
+    * @since 2.0
+    * @param    aLexiconID            lexicon Id
+    * @param    aPronunciationIDs    reference where pronunciation Ids are stored
+    */
+    void GetAllPronunciationIDsL( TSILexiconID aLexiconID,
+        RArray<TSIPronunciationID>& aPronunciationIDs );
+    
+    /**
+    * Returns all rule Ids that exist in the specified grammar.
+    * @since 2.0
+    * @param    aGrammarID            grammar Id
+    * @param    aRuleIDs            reference where rule Ids are stored
+    */
+    void GetAllRuleIDsL( TSIGrammarID aGrammarID, RArray<TSIRuleID>& aRuleIDs );
+    
+    /**
+    * Returns the number of models available for training system wide, based on
+    * available disk space.
+    * @since 2.0
+    * @param    aCount                reference where the number of available models is set
+    */
+    void GetAvailableStorageL( TInt& aCount );
+    
+    /**
+    * Returns the engine properties specified by the engine property ID array.
+    * On return aPropertyValue contains an array of engine properties.
+    * @since 2.0
+    * @param    aPropertyId            constant reference to array of engine property Ids
+    * @param    aPropertyValue        reference to array of engine property values
+    */
+    void GetEnginePropertiesL( const RArray<TInt>& aPropertyId,
+        RArray<TInt>& aPropertyValue );
+    
+    /**
+    * Returns the number of models in the specified model bank.
+    * @since 2.0
+    * @param    aModelBankID        model bank Id
+    * @param    aCount                reference where the number of models is set
+    */
+    void GetModelCountL( TSIModelBankID aModelBankID, TInt& aCount );
+
+    /**
+    * Returns the number of pronunciationin the specified lexicon.
+    * @since 2.0
+    * @param    aLexiconID            lexicon Id
+    * @param    aCount                reference where the number of models is set
+    */
+    
+    void GetPronunciationCountL(TSILexiconID aLexiconID, TInt& aCount );
+
+    /**
+    * Returns the number of rules in the specified grammar.
+    * @since 2.0
+    * @param    aGrammarID        Grammar Id
+    * @param    aCount                reference where the number of models is set
+    */
+    void GetRuleCountL(TSIGrammarID aGrammarID, TInt& aCount );
+    
+    /**
+    * Checks if the rule is valid or not.
+    * @since 2.0
+    * @param    aGrammarID            grammar Id
+    * @param    aRuleID                rule Id
+    * @param    aValid                reference where the validity of the rule is set
+    */
+    void GetRuleValidityL( TSIGrammarID aGrammarID, TSIRuleID aRuleID, TBool& aValid );
+    
+    /**
+    * Returns the duration of the utterance for the specified model.
+    * @since 2.0
+    * @param    aModelBankID        model bank Id
+    * @param    aModelID            model Id
+    * @param    aDuration            reference where the duration of utterance is set
+    */
+    void GetUtteranceDurationL( TSIModelBankID aModelBankID, TSIModelID aModelID,
+        TTimeIntervalMicroSeconds32& aDuration );
+    
+    /**
+    * Loads the specified recognizer parameter(s).  These parameters are used to
+    * alter the recognizer's default parameters.  The parameters are specified as
+    * attribute and value pairs.
+    * @since 2.0
+    * @param    aParameterID        list of parameter Ids
+    * @param    aParameterValue        list of parameter values
+    */
+    void LoadEngineParametersL( const RArray<TInt>& aParameterId,
+        const RArray<TInt>& aParameterValue );
+    
+    /**
+    * Loads the specified grammar into the recognizer; done prior to recognition.
+    * @since 2.0
+    * @param    aGrammarID            grammar Id
+    */
+    void LoadGrammarL( TSIGrammarID aGrammarID );
+    
+    /**
+    * Loads the specified lexicon into the recognizer; done prior to recognition.
+    * @since 2.0
+    * @param    aLexiconID            lexicon Id
+    */
+    void LoadLexiconL( TSILexiconID aLexiconID );
+    
+    /**
+    * Loads the specified model bank into the recognizer; done prior to recognition.
+    * @since 2.0
+    * @param    aModelBankID        model bank Id
+    */
+    void LoadModelsL( TSIModelBankID aModelBankID );
+    
+    /**
+    * Plays the previously trained utterance.
+    * @since 2.0
+    * @param    aModelBankID        model bank Id
+    * @param    aModelID            model Id, whose utterance is played
+    */
+    void PlayUtteranceL( TSIModelBankID aModelBankID, TSIModelID aModelID );
+    
+    /**
+    * Initiates recognition; performed following loading of model bank, lexicon, and grammar.
+    * @since 2.0
+    * @param    aClientResultSet    reference where the recognition result is set
+    */
+    void RecognizeL( CSDClientResultSet& aClientResultSet );
+    
+    /**
+    * Records uder utterance for training and recognition.
+    * @since 2.0
+    * @param    aRecordTime            recording time in microseconds
+    */
+    void RecordL( TTimeIntervalMicroSeconds32 aRecordTime );
+    
+    /**
+    * Pre-starts sampling.
+    * @since 3.2
+    */
+    void PreStartSamplingL();
+    
+    /**
+    * Removes the specified grammar from the permanent storage.
+    * Removing a grammar will remove all rules within the grammar.
+    * @since 2.0
+    * @param    aGrammarID            grammar Id
+    */
+    void RemoveGrammarL( TSIGrammarID aGrammarID );
+    
+    /**
+    * Removes the specified lexicon from the permanent storage.
+    * Removing a lexicon will remove all pronunciations within the lexicon.
+    * @since 2.0
+    * @param    aLexiconID            lexicon Id
+    */
+    void RemoveLexiconL( TSILexiconID aLexiconID );
+    
+    /**
+    * Removes the specified model bank from the permanent storage.
+    * Removing a model bank will remove all models within the model bank.
+    * @since 2.0
+    * @param    aModelBankID        model bank Id
+    */
+    void RemoveModelBankL( TSIModelBankID aModelBankID );
+    
+    /**
+    * Removes the specified model from the specified model bank permanently.
+    * @since 2.0
+    * @param    aModelBankID        model bank Id
+    * @param    aModelID            model Id
+    */
+    void RemoveModelL( TSIModelBankID aModelBankID, TSIModelID aModelID );
+    
+    /**
+    * Removes the specified pronunciation from the specified lexicon permanently.
+    * @since 2.0
+    * @param    aLexiconID            lexicon Id
+    * @param    aPronunciationID    pronunciation Id
+    */
+    void RemovePronunciationL( TSILexiconID aLexiconID, TSIPronunciationID aPronunciationID );
+    
+    /**
+    * Removes the specified rule from the specified grammar permanently.
+    * @since 2.0
+    * @param    aGrammarID            grammar Id
+    * @param    aRuleID                rule Id
+    */
+    void RemoveRuleL( TSIGrammarID aGrammarID, TSIRuleID aRuleID );
+
+    /**
+    * Removes the specified rules from the specified grammar permanently.
+    * @since 2.0
+    * @param    aGrammarID            grammar Id
+    * @param    aRuleIDs            rule Ids
+    */
+    void RemoveRulesL(TSIGrammarID aGrammarID,RArray<TSIRuleID>& aRuleIDs );
+    
+    /**
+    * Sets the client's UID for data ownership identification.
+    * @since 2.0
+    * @param    aClientUid            client's UID
+    */
+    void SetClientUid( TUid aClientUid );
+    
+    /**
+    * Sets the priority settings for this controller.
+    * @since 2.0
+    * @param    aPrioritySettings    new priority settings
+    */
+    void SetPrioritySettings( const TMMFPrioritySettings& aPrioritySettings );
+    
+    /**
+    * Starts a new recognition session.
+    * @since 2.0
+    */
+    void StartRecSessionL();
+    
+    /**
+    * Trains a new model into the specified model bank.
+    * @since 2.0
+    * @param    aModelBankID        model bank Id
+    * @param    aModelID            reference where a new model Id is assigned to
+    */
+    void TrainL( TSIModelBankID aModelBankID, TSIModelID& aModelID );
+    
+    /**
+    * Unloads the specified rule from the specified grammar in temporary memory, previously
+    * loaded with LoadGrammarL.  The rule in the permanent storage remains intact.
+    * @since 2.0
+    * @param    aGrammarID            grammar Id
+    * @param    aRuleID                rule Id
+    */
+    void UnloadRuleL( TSIGrammarID aGrammarID, TSIRuleID aRuleID );
+    
+    
+    // SI component
+    
+    /**
+    *  
+    * Does speaker adapation to speaker independent models
+    * @since 2.8
+    * @param    aResultSet            a recognition result containing adaptation data
+    * @param    aCorrect            identifies the correct recognition result from the N-best list.
+    */
+    void AdaptL( CSIClientResultSet& aResultSet ,TInt aCorrect );
+
+    /**
+    * Adds a new pronunciation for the given model into the specified lexicon.
+    * @since 2.0
+    * @param    aLexiconID            lexicon Id
+    * @param    aTrainText:            the text to be trained
+    * @param    aTrainText:            the text to be trained        
+    * @param    aLanguage            the pronunciation language    
+    * @param    aPronunciationID: reference where a new pronunciation identifier is set.
+    */
+    void AddPronunciationL( TSILexiconID aLexiconID,
+                            const TDesC& aTrainText, 
+                            TLanguage aLanguage, 
+                            TSIPronunciationID& aPronunciationID );
+
+    /**
+    * From MSpeechRecognitionCustomCommandImplementor
+    * Adds a new rule variant for the given pronunciation into the specified grammar.
+    * @since 2.0
+    * @param    aGrammarID            grammar Id, where the new rule is added to
+    * @param    aLexiconID            lexicon Id
+    * @param    aPronunciationIDs    pronunciation Id array
+    * @param    aRuleVariantID        reference where a new rule Variant Id is assigned to
+    */
+    void AddRuleVariantL( TSIGrammarID aGrammarID, 
+                          TSILexiconID aLexiconID,
+                          RArray<TSIPronunciationID>& aPronunciationIDs, 
+                          TSIRuleID aRuleID,TSIRuleVariantID& aRuleVariantID );
+
+    /**
+    * Trains a new voice tag. The recognition phrase is the concatenation of words in the aTrainArray. 
+    * Pronunciations are created with all given languages, which are supported.
+    * @since 2.8
+    * @param    aTrainArray:        Recognition phrase is formed by concatenating the descriptors in this array.
+    * @param    aLanguageArray        Pronunciations are created with these languages. Not all languages are supported. The argument can be NULL.
+    * @param    aLexiconID            lexicon Id
+    * @param    aGrammarID            grammar Id, where the new rule is added to
+    * @param    aRuleID        reference where a new rule Id is assigned to
+    */
+    void AddVoiceTagL( MDesCArray& aTrainArray, 
+                       RArray<TLanguage>& aLanguageArray, 
+                       TSILexiconID aLexiconID, 
+                       TSIGrammarID aGrammarID, 
+                       TSIRuleID& aRuleID );
+    
+    /**
+    * Adds several new voice tags.
+    * @since 2.8
+    * @param    aTrainArray : An array of MDesCArrays. The recognition phrases are formed by concatenating the descriptors in the MDesCArrays.
+    * @param    aLanguageArray        Pronunciations are created with these languages. Not all languages are supported. The argument can be NULL.
+    * @param    aLexiconID            lexicon Id
+    * @param    aGrammarID            grammar Id, where the new rule is added to
+    * @param    aRuleID        reference where a new rule Id is assigned to
+    */
+    void AddVoiceTagsL( RPointerArray<MDesCArray>& aTrainArray,
+                        RArray<TLanguage>& aLanguageArray, 
+                        TSILexiconID aLexiconID, 
+                        TSIGrammarID aGrammarID,
+                        RArray<TSIRuleID>& aRuleID );
+    
+#ifdef __SINDE_TRAINING
+    /**
+    * Trains one new SINDE voice tag. The recognition phrase is the 
+    * concatenation of words in the aTrainArray. Pronunciations are 
+    * created with all given languages, which are supported.
+    *
+    * @since 3.1
+    * @param aTrainArray Recognition phrase is formed by concatenating 
+    *                    the descriptors in this array.
+    * @param aLanguageArray Pronunciations are created with these languages..
+    * @param aLexiconID Lexicon Id
+    * @param aGrammarID Grammar Id, where the new rule is added to.
+    * @param aRuleID Reference where a new rule Id is assigned to.
+    */
+    void AddSindeVoiceTagL( MDesCArray& aTrainArray, 
+                            RArray<RLanguageArray>& aLanguageArray, 
+                            TSILexiconID aLexiconID, 
+                            TSIGrammarID aGrammarID, 
+                            TSIRuleID& aRuleID );
+    
+    /**
+    * Adds several new SINDE voice tags.
+    *
+    * @since 3.1
+    * @param aTrainArray Recognition phrase is formed by concatenating 
+    *                    the descriptors in this array.
+    * @param aLanguageArray Pronunciations are created with these languages..
+    * @param aLexiconID Lexicon Id
+    * @param aGrammarID Grammar Id, where the new rule is added to.
+    * @param aRuleID Reference where a new rule Ids are assigned to.
+    */
+    void AddSindeVoiceTagsL( RPointerArray<MDesCArray>& aTrainArray,
+                             RArray<RLanguageArray>& aLanguageArray, 
+                             TSILexiconID aLexiconID, 
+                             TSIGrammarID aGrammarID,
+                             RArray<TSIRuleID>& aRuleID );
+
+#endif // __SINDE_TRAINING
+
+    /**
+    * Creates a new empty rule.
+    * @since 2.8
+    * @param    aGrammarID            grammar Id, where the new rule is added to
+    * @param    aRuleID        reference where a new rule Id is assigned to
+    */
+    void CreateRuleL( TSIGrammarID aGrammarID, TSIRuleID& aRuleID );
+
+    /**
+    * Initiates recognition; performed following loading of model bank, lexicon, and grammar.
+    * @since 2.8
+    * @param    aResultSet: reference where the recognition result is set. 
+    */   
+    void RecognizeL( CSIClientResultSet& aResultSet );
+
+    /**
+    * Ends recording. Unlike Cancel(), this function may return a recognition 
+    * result if adequate number of samples was already recorded.        
+    * @since 2.8
+    */         
+    void EndRecordL();
+
+    /**
+    * Unloads the specified grammar from the temporary memory, 
+    * previously loaded with MSrLoadGrammarL. The grammar in the permanent storage remains intact. 
+    * result if adequate number of samples was already recorded.        
+    * @since 2.0
+    * @param    aGrammarID            grammar Id, where the new rule is added to
+    */ 
+    void UnloadGrammarL( TSIGrammarID aGrammarID );
+
+    /**
+     * Activate the grammar for the recognition         
+    * @since 2.8
+    * @param    aGrammarID            grammar Id 
+    */
+    void  ActivateGrammarL( TSIGrammarID aGrammarID ) ;
+    /**
+     * Deactivate the grammar          
+    * @since 2.8
+    * @param    aGrammarID            grammar Id
+    */    
+    void DeactivateGrammarL( TSIGrammarID aGrammarID );     
+        
+    /**
+    * Create a empty rule into a given grammar
+    * @since 2.8
+    * @param    aGrammar  : a compiled grammar 
+    * @return    Created rule
+    */    
+    CSIRule* CreateNewRuleL( CSICompiledGrammar* aGrammar );
+    
+    /**
+    * Create a pronunciation into a given lexicon
+    * @since 2.8
+    * @param    aLexicon          : a lexicon  
+    * @param    aPronunciationPr  : phoneme sequence of the pronunciation
+    * @param    aModelBankID      : modelbank id 
+    * @return    Created pronunciation id
+    */            
+    TSIPronunciationID CreateNewPronunciationL( CSILexicon* aLexicon,
+                                                TDesC8& aPronunciationPr,
+                                                TSIModelBankID aModelBankID );
+    
+    /**
+    * Add rule variants into a given rule
+    * @since 2.8
+    * @param    aRule              :    a given rule
+    * @param    aLexiconID          : a lexicon ID, the added rule variant's pronunciations belong to this lexicon
+    * @param    aPronunciationIDs : array of Pronunciation IDs,
+    * @param    aParameters          : other parameters,such as language ID, for rule variants
+    */            
+    void AddNewRuleVariantL( CSIRule& aRule,
+                             TSILexiconID aLexiconID,
+                             RArray<TSIPronunciationID>& aPronunciationIDs, 
+                             CSIParameters& aParameters );    
+    
+    // Test functions
+    CSIRule*  CreateRule1L(void);    
+    CSIRule*  CreateRule2L(void);
+    void CheckRule1L(const CSIRule* aRule);
+    void CheckRule2L(const CSIRule* aRule);
+#ifdef __CONSOLETEST__
+    
+    // Unit Test
+    public:
+        
+        // Returns reference to a database
+        RDbNamedDatabase& GetDb();
+        
+        // Returns reference to model bank array
+        RPointerArray<CSIModelBank>& ModelBankArray();
+        
+        // Returns current plugin state
+        TInt PluginState();
+#endif
+        
+    private:
+        
+        /**
+        * C++ default constructor.
+        */
+        CSIControllerPlugin( CSIControllerPluginInterface& aControllerIf );
+        
+        /**
+        * By default Symbian 2nd phase constructor is private.
+        */
+        void ConstructL();
+        
+        /**
+        * RunL from CActive class.
+        */
+        void RunL();
+        
+        /**
+        * Cancel handle from CActive class.
+        */
+        void DoCancel();
+        
+        /**
+        * This method completes the request status and set the object active
+        * to provide asynchronous behavior.
+        * @since 2.0
+        */
+        void DoAsynch();
+        
+        /**
+        * Plays the previously trained utterance.
+        * @since 2.0
+        * @param    aModelBankID        model bank Id
+        * @param    aModelID            model Id, whose utterance is played
+        */
+        void PlayL( TSIModelBankID aModelBankID, TSIModelID aModelID );
+        
+        /**
+        * Handles DevASR events received while in Training state.
+        * @since 2.0
+        * @param    aEvent                event code
+        * @param    aError                error code
+        */
+        void HandleEventTrainL( TDevASREvent aEvent, TDevASRError aError );
+        
+        /**
+        * Handles DevASR events received while in Recognition state.
+        * @since 2.0
+        * @param    aEvent                event code
+        * @param    aError                error code
+        */
+        void HandleEventRecognize( TDevASREvent aEvent, TDevASRError aError );
+
+        /**
+        * Handles DevASR events received while in remove rule state.
+        * @since 2.8
+        * @param    aEvent                event code
+        * @param    aError                error code
+        */    
+        void HandleEventRemoveRule( TDevASREvent aEvent, TDevASRError aError );
+
+        /**
+        * Handles DevASR events received while in remove rules state.
+        * @since 2.8
+        * @param    aEvent                event code
+        * @param    aError                error code
+        */    
+        void HandleEventRemoveRules( TDevASREvent aEvent, TDevASRError aError );
+        
+        /**
+        * Handles DevASR events received while in TTP state.
+        * @since 2.8
+        * @param    aEvent                event code
+        * @param    aError                error code
+        */        
+        void HandleEventTTP( TDevASREvent aEvent,
+                             TDevASRError aError );
+        
+        /**
+        * Handles DevASR events received while in Play state.
+        * @since 2.0
+        * @param    aEvent                event code
+        * @param    aError                error code
+        */
+        void HandleEventPlayL( TDevASREvent aEvent, TDevASRError aError );
+     
+        /**
+        * Frees memory allocated during recognition and resets the state to Idle.
+        * @since 2.0
+        */
+        void RecognitionReset();
+        
+        /**
+        * Handles the acoustic model and the user utterance from DevASR received upon
+        * TrainComplete event.
+        * @since 2.0
+        */
+        void ProcessTrainCompleteL();
+        
+        /**
+        * Handles the transfer of recognition result from DevASR into client's
+        * recognition result.
+        * @since 2.0
+        * @return    Number of results to the client
+        */
+        TInt ProcessRecognitionComplete();
+        
+        /**
+        * Save TTP result into the given grammar and lexicon of the plugin database
+        * @since 2.8
+        * @param    aSITtpWordList      :    data structure contains ttp results, word entries and their corresponding prounication
+        * @param    aLexiconID          : a lexicon ID, the added rule variant's pronunciations belong to this lexicon
+        * @param    aRuleIDs          : array of generated Rule IDs,
+        * @param    aParameters          : other parameters,such as language ID, for rule variants
+        */
+//        void  UpdateGrammarAndLexiconL(CSITtpWordList* aSITtpWordList , TSILexiconID aLexiconID, TSIGrammarID aGrammarID, RArray<TSIRuleID>& aRuleIDs);
+        
+        /**
+        * Save TTP result into the given grammar and lexicon of the plugin database
+        * @since 2.8
+        * @param    aSITtpWordList      :    data structure contains ttp results, word entries and their corresponding prounication
+        * @param    aLexiconID          : a lexicon ID, the added rule variant's pronunciations belong to this lexicon
+        * @param    aGrammarID          : a grammar Id                
+        * @param    aRuleIDs          : array of generated Rule IDs,
+        */
+        void  UpdateGrammarAndLexiconDBL( CSITtpWordList* aSITtpWordList, 
+                                          TSILexiconID aLexiconID, 
+                                          TSIGrammarID aGrammarID, 
+                                          RArray<TSIRuleID>& aRuleIDs );
+         
+        /**
+        * Is the lexicon id valid in the database
+        * @since 2.8
+        * @param    aLexiconID          : a lexicon ID,  
+        * @return    True or false
+        */
+        TBool  IsLexiconIDInvalid( TSILexiconID aLexiconID );
+    
+        /**
+        * Is the Grammar id valid in the database
+        * @since 2.8
+        * @param    aGrammarID          : a grammar Id
+        * @return    True or false
+        */
+        TBool  IsGrammarIDInvalid( TSIGrammarID aGrammarID );
+
+        // ============================================================================
+        // These methods are handlers for asynchronous messages that are called from
+        // the RunL.  The parameters are identical to how they were initially received
+        // under Public section of this class, therefore not repeated here.
+        // ============================================================================
+        //
+//        void HandleAddPronunciationL( TSILexiconID aLexiconID, TSIModelBankID aModelBankID,
+//            TSIModelID aModelID, TSIPronunciationID& aPronunciationID );
+        
+//        void HandleAddPronunciationL( TSILexiconID aLexiconID, TSIModelBankID aModelBankID,
+//            TDesC8& aPronunciationPr, TSIPronunciationID& aPronunciationID );
+        
+        void HandleAddRuleL( TSIGrammarID aGrammarID, TSILexiconID aLexiconID,
+            TSIPronunciationID aPronunciationID, TSIRuleID& aRuleID );
+        
+        void HandleCreateGrammarL( TSIGrammarID& aGrammarID );
+        
+        void HandleCreateLexiconL( TSILexiconID& aLexiconID );
+        
+        void HandleCreateModelBankL( TSIModelBankID& aModelBankID );
+        
+        void HandleGetAllClientGrammarIDsL( RArray<TSIGrammarID>& aGrammarIDs );
+        
+        void HandleGetAllClientLexiconIDsL( RArray<TSILexiconID>& aLexiconIDs );
+        
+        void HandleGetAllClientModelBankIDsL( RArray<TSIModelBankID>& aModelBankIDs );
+        
+        void HandleGetAllGrammarIDsL( RArray<TSIGrammarID>& aGrammarIDs );
+        
+        void HandleGetAllLexiconIDsL( RArray<TSILexiconID>& aLexiconIDs );
+        
+        void HandleGetAllModelBankIDsL( RArray<TSIModelBankID>& aModelBankIDs );
+        
+        void HandleGetAllModelIDsL( TSIModelBankID aModelBankID, RArray<TSIModelID>& aModelIDs );
+        
+        void HandleGetAllPronunciationIDsL( TSILexiconID aLexiconID,
+            RArray<TSIPronunciationID>& aPronunciationIDs );
+        
+        void HandleGetAllRuleIDsL( TSIGrammarID aGrammarID, RArray<TSIRuleID>& aRuleIDs );
+        
+        void HandleGetAvailableStorageL( TInt& aCount );
+        
+        void HandleGetModelCountL( TSIModelBankID aModelBankID, TInt& aCount );
+        
+        void HandleGetPronunciationCountL(TSIModelBankID aLexiconID,TInt& aCount );
+        
+        void HandleGetRuleCountL(TSIGrammarID aGrammarID,TInt& aCount );
+
+        void HandleGetRuleValidityL( TSIGrammarID aGrammarID, TSIRuleID aRuleID, TBool& aValid );
+        
+        void HandleGetUtteranceDurationL( TSIModelBankID aModelBankID, TSIModelID aModelID,
+            TTimeIntervalMicroSeconds32& aDuration );
+        
+        void HandleLoadGrammarL( TSIGrammarID aGrammarID );
+        
+        void HandleLoadLexiconL( TSILexiconID aLexiconID );
+        
+        void HandleLoadModelsL( TSIModelBankID aModelBankID );
+                
+        void HandleRecognizeL();
+        
+        void HandleRecordL( TTimeIntervalMicroSeconds32 aRecordTime );
+        
+        void HandleRemoveGrammarL( TSIGrammarID aGrammarID );
+        
+        void HandleRemoveLexiconL( TSILexiconID aLexiconID );
+        
+        void HandleRemoveModelBankL( TSIModelBankID aModelBankID );
+        
+        void HandleRemoveModelL( TSIModelBankID aModelBankID, TSIModelID aModelID );
+        
+        void HandleRemovePronunciationL( TSILexiconID aLexiconID, TSIPronunciationID aPronunciationID );
+        
+        void HandleRemoveRuleL( TSIGrammarID aGrammarID, TSIRuleID aRuleID );
+        
+        void  HandleRemoveRulesL( TSIGrammarID aGrammarID,RArray<TSIRuleID>& aRuleIDs );
+        
+        void HandleTrainL( TSIModelBankID aModelBankID );
+        
+        void HandleUnloadRuleL( TSIGrammarID aGrammarID, TSIRuleID aRuleID );
+        
+        void HandlePlayUtteranceL(TSIModelBankID aModelBankID, TSIModelID aModelID); 
+        // SI component
+        
+        void HandleAdaptL(CSIClientResultSet& aResultSet ,TInt aCorrect);
+        
+        
+//        void HandleAddPronunciationL(TSILexiconID aLexiconID,  TPtrC& aTrainText,
+//            TLanguage aLanguage, TSIPronunciationID* aPronunciationID) ;
+        
+        void HandleAddRuleVariantL(TSIGrammarID aGrammarID, TSILexiconID aLexiconID,
+            RArray<TSIPronunciationID>& aPronunciationIDs,TSIRuleID aRuleID, TSIRuleVariantID& aRuleVariantID );
+        
+        void HandleAddVoiceTagL( MDesCArray& aTrainArray,  RArray<TLanguage>& aLanguageArray, 
+            TSILexiconID aLexiconID, TSIGrammarID aGrammarID, TSIRuleID* aRuleIDPtr);
+        
+        void HandleAddVoiceTagsL( RPointerArray<MDesCArray>* aTrainArray,  RArray<TLanguage>& aLanguageArray, TSILexiconID aLexiconID,
+            TSIGrammarID aGrammarID/*, 
+            RArray<TSIRuleID>& aRuleID*/);
+
+#ifdef __SINDE_TRAINING            
+        void HandleAddSindeVoiceTagsL( RPointerArray<MDesCArray>* aTrainArrays,
+                                       RArray<RLanguageArray>& aLanguageArray,
+                                       TSILexiconID aLexiconID,
+                                       TSIGrammarID aGrammarID );
+#endif // __SINDE_TRAINING
+        
+        void HandleCreateRuleL(TSIGrammarID aGrammarID, TSIRuleID& aRuleID) ;
+        
+//        void HandleRecognizeL( CSIClientResultSet& aResultSet );
+        
+        void HandleEndRecordL();
+        
+        void HandleUnloadGrammarL( TSIGrammarID aGrammarID );
+        
+//        void  HandleUpdateGrammarAndLexiconL(CSITtpWordList* iSITtpWordList , TSILexiconID aLexiconID, TSIGrammarID aGrammarID, RArray<TSIRuleID>& aRuleID);
+        
+        void HandlePreStartSamplingL();
+        
+    private:    // Data
+        
+        // SI Controller Plugin states
+        enum TControllerState
+            {
+            ESiPluginIdle,
+            ESdPluginTrain,
+            ESiPluginRecognize,
+            ESiPluginAdapt,
+            ESiPluginTrainText,
+            ESiPluginRemoveRule ,
+            ESiPluginRemoveRules,
+            ESiPluginPlay,
+            ESiPluginTrainSinde
+            };
+        
+        
+         // SI Controller Plugin state
+        TControllerState iState;
+        // Result to be sent to the client
+        TInt iResult;
+        
+        // Reference to Controller Interface
+        CSIControllerPluginInterface& iControllerIf;
+
+        // SI Database
+        CSIDatabase* iSIDatabase;
+        
+        
+        // SI part
+        // Model Bank database
+        CSIModelBankDB* iSIModelBankDB;
+        // Lexicon database
+        CSILexiconDB* iSILexiconDB;
+        // Grammar database
+        CSIGrammarDB* iSIGrammarDB;
+        TBool iVoiceTagDBLocked;        
+        // Resource file handler
+        CSIResourceHandler* iResourceHandler;
+        
+        // Client's UID for data ownership identification
+        TUid iClientUid;
+        TBool iClientRegistered;
+        
+        // DevASR
+        CDevASR* iDevASR;
+        
+        CSIResultSet* iSIResultSet;                    // Used during recognition
+        
+        /// Begin: data used in async handling of requests
+        TInt iRequestFunction;
+        TSIGrammarID iGrammarID;
+        TSILexiconID iLexiconID;
+        TSIModelBankID iModelBankID;
+        TSIRuleID iRuleID;
+        TSIRuleVariantID iRuleVariantID;
+        TSIPronunciationID iPronunciationID;
+        //RArray<TSIPronunciationID> iPronunciationIDs;
+        TSIModelID iModelID;
+        TTimeIntervalMicroSeconds32 iRecordTime;
+        TSIGrammarID* iGrammarIDPtr;
+        TSILexiconID* iLexiconIDPtr;
+        
+        TSIModelBankID* iModelBankIDPtr;
+        TSIRuleID* iRuleIDPtr;
+        TSIRuleVariantID* iRuleVariantIDPtr;
+        TSIPronunciationID* iPronunciationIDPtr;
+        TSIModelID* iModelIDPtr;
+        TInt* iCountPtr;
+        TBool* iValidPtr;
+        TTimeIntervalMicroSeconds32* iDurationPtr;
+
+
+     
+        RArray<TSIGrammarID>* iGrammarIDs;
+        RArray<TSILexiconID>* iLexiconIDs;
+
+        RArray<TSIModelBankID>* iModelBankIDs;
+        RArray<TSIModelID>* iModelIDs;
+        RArray<TSIPronunciationID>* iPronunciationIDs;
+        RArray<TSIRuleID>* iRuleIDs;
+
+        // End: data used in async handling of requests
+        
+        
+        // SI componet
+        CSIClientResultSet* iSIClientResultSet ;
+
+        TInt iCorrect;     
+        TPtrC iTrainTextPtr;
+        TLanguage iLanguage;
+        RArray<TLanguage>* iLanguageArray;
+        RArray<RLanguageArray>* iLanguageArrayArray;
+        MDesCArray *iTrainArray ;
+        RPointerArray<MDesCArray>* iTrainArrays;
+        CSITtpWordList* iSITtpWordList;    
+        RArray<TUint32> iMaxNPronunsForWord;
+        TPtrC8 iPronunciationPr;
+        CSICompiledGrammar *iSICompiledGrammar;
+        TSIPronunciationID* iLastAddedPronunciationIDPtr;
+        TSIRuleID* iLastAddedRuleIDPtr;
+
+        // recompile grammar during remove rule .
+        CSICompiledGrammar* iSICompiledGrammarRecompile; // Pointer to grammar to in remove rule
+        TSIGrammarID iGrammarIDRecompile;
+        TBool iIsGrammarRecompile;
+        TSIRuleID iRuleIDRemove;
+        TBool iIsRecompileGrammarActive;
+
+        // TTP data loader
+        
+        //CTTPDataLoader* iTtpLoader;
+        CDataLoader* iDataLoader;
+        
+        // Audio 
+        HBufC8* iAudioBuffer;
+        TInt iNSamplesSent;
+        TPtrC8 iCurrentAudioBuffer;
+        
+        TTimeIntervalMicroSeconds32 iRecordDurations;
+        //TSIRuleVariantID iRuleVariantID;
+         RDbNotifier iRDbNotifier;
+         
+#ifdef __SINDE_TRAINING         
+         // Class which takes care of SINDE type of training process
+         CSindeTrainer* iSindeTrainer;
+#endif // __SINDE_TRAINING
+    };
+    
+#endif // __CSIControllerPlugin_H__
+    
+// End of File