// Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "Symbian Foundation License v1.0" to Symbian Foundation members and "Symbian Foundation End User License Agreement v1.0" to non-members
// which accompanies this distribution, and is available
// at the URL "http://www.symbianfoundation.org/legal/licencesv10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
//

#ifndef __SPEECHRECOGNITIONCUSTOMCOMMANDS_H__
#define __SPEECHRECOGNITIONCUSTOMCOMMANDS_H__

//  INCLUDES
#include	<mmf/common/mmfcontroller.h>
#include 	<mmf/common/speechrecognitiondataclient.h>

/**
@publishedAll
@released

This is the main class of Speech Recognition Custom Commands.

@since  8.0
*/
class RSpeechRecognitionCustomCommands : public RMMFCustomCommandsBase
	{
public:
	/**
	Public C++ constructor for RSpeechRecognitionCustomCommands class.

	@param  aController			
	        A reference to a RMMFController object.

	@since  8.0
	*/
	IMPORT_C RSpeechRecognitionCustomCommands(RMMFController& aController);
	
	/** 
	Adds a new pronunciation for the given model into the specified lexicon.

	@param  aLexiconID
	        The lexicon ID to where the new pronunciation is added.
	@param  aModelBankID
	        The model bank ID.
	@param  aModelID
	        The model ID.
	@param  aPronunciationID
	        A reference to where a new pronunciation ID is assigned.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
	*/
	IMPORT_C TInt AddPronunciation(TLexiconID aLexiconID,
					TModelBankID aModelBankID, TModelID aModelID,
					TPronunciationID& aPronunciationID);

	/**
	Adds a new rule for the given pronunciation into the specified grammar.

	@param  aGrammarID			
	        The grammar ID to where the new rule is added.
	@param  aLexiconID			
	        The lexicon ID.
	@param  aPronunciationID	
	        The pronunciation ID.
	@param  aRuleID				
	        A reference to where a new rule ID is assigned.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
	*/
	IMPORT_C TInt AddRule(TGrammarID aGrammarID, TLexiconID aLexiconID,
					TPronunciationID aPronunciationID, TRuleID& aRuleID);

	/**
	Cancels the current operation.

	@since  8.0
	*/
	IMPORT_C void Cancel();

	/**
	Commits the current train operation to the database.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
	*/
	IMPORT_C TInt CommitChanges();

	/**
	Creates a new grammar.

	@param  aGrammarID
	        A reference to where the grammar ID is stored.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt CreateGrammar(TGrammarID& aGrammarID);

	/**
	Creates a new lexicon.

	@param  aLexiconID			
	        A reference where lexicon ID is stored.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt CreateLexicon(TLexiconID& aLexiconID);

    /**
	Creates a new model bank.

	@param  aModelBankID		
	        A reference to where a new model bank ID is assigned.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt CreateModelBank(TModelBankID& aModelBankID);

	/**
	Ends the current recognition session.
	
	The resources allocated for recognition are freed.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt EndRecSession();

	/**
	Returns all grammar IDs owned by the client.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetAllClientGrammarIDs();

	/**
	Returns all lexicon IDs owned by the client.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.
	
	@since  8.0
    */
	IMPORT_C TInt GetAllClientLexiconIDs();

	/**
	Returns all modelBank IDs owned by the client.

    @return An error code indicating if the function call was successful. KErrNone on success, otherwise
	           another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetAllClientModelBankIDs();

	/**
	Returns all grammar IDs owned by the client.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetAllGrammarIDs();

	/**
	Returns all lexicon IDs owned by the client.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetAllLexiconIDs();


	/**
	Returns all modelBank IDs owned by the client.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetAllModelBankIDs();

	/**
	Returns all model IDs that exist in the specified model bank.

	@param  aModelBankID		
	        The model bank ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetAllModelIDs(TModelBankID aModelBankID);

	/**
	Returns all pronunciation IDs that exist in the specified lexicon.

	@param  aLexiconID			
	        The lexicon ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetAllPronunciationIDs(TLexiconID aLexiconID);

	/**
	Returns all rule IDs that exist in the specified grammar.

    @param  aGrammarID			
	        The grammar ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetAllRuleIDs(TGrammarID aGrammarID);

	/**
	Returns the number of models available for training system wide,
	based on available disk space.

	@param  aAvailableStorage	
	        The number of models that can be held in available storage space.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetAvailableStorage(TInt& aAvailableStorage);

	/**
	Returns the engine properties specified by the engine property
	ID array. On return aPropertyValue contains an array of engine
	properties.

	@param  aPropertyId		
	        A constant reference to an array of engine property IDs.
	@param  aPropertyValue	
	        A reference to an array of engine property values.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetEngineProperties(const RArray<TInt>& aPropertyId,
					RArray<TInt>& aPropertyValue);

	/**
	Returns the number of models in the specified model bank.

	@param  aModelBankID		
	        The model bank ID.
	@param  aModelCount			
	        The reference where the number of models is set.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetModelCount(TModelBankID aModelBankID,
					TInt& aModelCount);


	/**
	Checks if the rule is valid or not.

	@param  aGrammarID			
            The grammar ID.
	@param  aRuleID				
	        The rule ID.
	@param  aValid				
	        A reference where the validity of the rule is set.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt GetRuleValidity(TGrammarID aGrammarID, TRuleID aRuleID, 
					TBool& aValid);

	/**
    *
    *	Returns the duration of the utterance for the specified model.
    * @since 8.0
    * @param	aModelBankID		model bank Id
	* @param	aModelID			model Id
	* @param	aDuration			reference where the duration of 
	*								utterance is set
    * @return	System-wide errors
    */
	IMPORT_C TInt GetUtteranceDuration(TModelBankID aModelBankID, 
				TModelID aModelID, TTimeIntervalMicroSeconds32& aDuration);

	/**
    Loads the specified grammar into the recognizer; done prior to recognition.

    @param  aGrammarID			
	        The grammar ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

    @since  8.0
    */
	IMPORT_C TInt LoadGrammar(TGrammarID aGrammarID);

	/**
	Loads the specified lexicon into the recognizer; done prior to recognition.

	@param  aLexiconID			
	        The lexicon ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt LoadLexicon(TLexiconID aLexiconID);

	/**
	Loads the specified model bank into the recognizer; done prior to recognition.

	@param  aModelBankID		
	        The model bank ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt LoadModels(TModelBankID aModelBankID);

	/**
	Plays the previously trained utterance.

	@param  aModelBankID		
	        The model bank ID.
	@param  aModelID			
	        The model ID, whose utterance is played.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt PlayUtterance(TModelBankID aModelBankID,
					TModelID aModelID);

	/**
	Initiates recognition; performed following loading of model bank, lexicon, and grammar.

	@param  aResultSet			
	        A reference where the recognition result is set.

    @return An error code indicating if the function call was successful. KErrNone on success, otherwise
            another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt Recognize(CSDClientResultSet& aResultSet);

	/**
	Records the user utterance for training and recognition.

	@param  aRecordTime			
	        The recording time in microseconds.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	         another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt Record(TTimeIntervalMicroSeconds32 aRecordTime);

	/**
	Removes the specified grammar from the permanent storage.

	Removing a grammar will remove all rules within the grammar.

	@param  aGrammarID			
	        The grammar ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.
	
	@since  8.0
    */
	IMPORT_C TInt RemoveGrammar(TGrammarID aGrammarID);

	/**
	Removes the specified lexicon from the permanent storage.

	Removing a lexicon will remove all pronunciations within the lexicon.

	@param  aLexiconID			
	        The lexicon ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.
	@since  8.0
    */
	IMPORT_C TInt RemoveLexicon(TLexiconID aLexiconID);

	/**
	Removes the specified model bank from the permanent storage.

	Removing a model bank will remove all models within the model bank.

	@param  aModelBankID		
	        The model bank ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt RemoveModelBank(TModelBankID aModelBankID);

	/**
	Removes the specified model from the specified model bank permanently.

	@param  aModelBankID		
	        The model bank ID.
	@param  aModelID			
	        The model ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt RemoveModel(TModelBankID aModelBankID,
								TModelID aModelID);

	/**
	Removes the specified pronunciation from the specified lexicon permanently.

	@param  aLexiconID
	        The lexicon ID.
	@param  aPronunciationID
	        The pronunciation ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since	8.0
    */
	IMPORT_C TInt RemovePronunciation(TLexiconID aLexiconID,
								TPronunciationID aPronunciationID);

	/**
	Removes the specified rule from the specified grammar permanently.

	@param  aGrammarID			
	        The grammar ID.
	@param  aRuleID				
	        The rule ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt RemoveRule(TGrammarID aGrammarID, TRuleID aRuleID);

	/**
	Sets the client UID for client.

	@param  aClientUid			
	        The client UID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
	*/
	IMPORT_C TInt SetClientUid(TUid aClientUid);

	/**
	Starts a new recognition session.

	@param  aMode				
	        The recognition mode.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt StartRecSession(TRecognitionMode aMode);

    /**
	Trains a new model into the specified model bank.

	@param  aModelBankID		
	        The model bank ID.
	@param  aModelID			
	        The reference to where a new model ID is assigned.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt Train(TModelBankID aModelBankID, TModelID& aModelID);

	/**
	Unloads the specified rule from the specified grammar in temporary
	memory, previously loaded with LoadGrammarL(). The rule in the
	permanent storage remains intact.

	@param  aGrammarID
	        The grammar ID.
	@param  aRuleID
	        The rule ID.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt UnloadRule(TGrammarID aGrammarID, TRuleID aRuleID);

	/**
	Uploads the specified parameters into the engine.

	@param  aParameterId		
	        An array of parameter IDs.
	@param  aParameterValue
	        An array of parameter values.

	@return An error code indicating if the function call was successful. KErrNone on success, otherwise
	        another of the system-wide error codes.

	@since  8.0
    */
	IMPORT_C TInt LoadEngineParameters(const RArray<TInt>& aParameterId,
								const RArray<TInt>& aParameterValue);

	/**
	Gets an array of pronunciation IDs previously requested by GetAllPronunciationIDs.

	@param  aPronunciationIDs
	        An array to store pronunciation IDs.

    @since  8.0
    */
	IMPORT_C void GetPronunciationIDArrayL(RArray<TPronunciationID>& aPronunciationIDs);

	/**
	Gets an array of rule IDs previously requested by GetAllRuleIDs.

	@param  aRuleIDs
	        An array to store rule IDs.

    @since  8.0
    */
	IMPORT_C void GetRuleIDArrayL(RArray<TRuleID>& aRuleIDs);

	/**
	Gets an array of model IDs previously requested by GetAllModelIDs.

	@param  aModelIDs
	        An array to store model IDs.

    @since  8.0
    */
	IMPORT_C void GetModelIDArrayL(RArray<TModelID>& aModelIDs);

	/**
	Gets an array of grammar IDs previously requested by GetAllGrammarIDs.

	@param  aGrammarIDs
	        An array to store grammar IDs.

    @since  8.0
    */
	IMPORT_C void GetGrammarIDArrayL(RArray<TGrammarID>& aGrammarIDs);

	/**
	Gets an array of lexicon IDs previously requested by GetAllLexiconIDs.

	@param  aLexiconIDs
	        An array to store lexicon IDs.

	@since  8.0
    */
	IMPORT_C void GetLexiconIDArrayL(RArray<TLexiconID>& aLexiconIDs);


	/**
	Gets an array of modelBank IDs previously requested by GetAllModelBankIDs.

	@param  aModelBankIDs
	        An array to store modelBank IDs.

    @since  8.0
    */
	IMPORT_C void GetModelBankIDArrayL(RArray<TModelBankID>& aModelBankIDs);


	/**
	Gets a client result set previously created by a call to Recognise().

	@param  aResultSet
	        The ResultSet used to contain the recognition results

    @since  8.0
    */
	IMPORT_C void GetResultSetL(CSDClientResultSet& aResultSet);
	
private:
	void DoGetEnginePropertiesL(const RArray<TInt>& aPropertyId, 
					RArray<TInt>& aPropertyValue);
	void DoLoadEngineParametersL(const RArray<TInt>& aParameterId, 
								const RArray<TInt>& aParameterValue);

					
	CBufFlat* ExternalizeIntArrayL(const RArray<TInt>& aArray);
	void InternalizeIntArrayL(TDes8& aDes, TInt aNumberElements, RArray<TInt>& aArray);
	
	void DoRecognizeL(CSDClientResultSet& aResultSet);
private:
	TAny* iReservedPtr_1;	// reserved for future expansion
	TAny* iReservedPtr_2;	// reserved for future expansion
};

#endif  // __SPEECHRECOGNITIONCUSTOMCOMMANDS_H__
