srsf/nssvasapi/nssvasrecognition/inc/nssvascrecognitionhandler.h
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:29:17 +0100
branchRCL_3
changeset 19 e36f3802f733
parent 0 bf1d17376201
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2003-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:  The CNssRecognitionHandler class performs the recognition function.  
*
*/


#ifndef NSSVASCRECOGNITIONHANDLER_H
#define NSSVASCRECOGNITIONHANDLER_H

//  INCLUDES
#include <nsssispeechrecognitionutilityobserver.h>
#include "nssvasmrecognitionhandler.h"
#include "nssvasccontextmgr.h"
#include "nssvasmadaptationeventhandler.h"

// FORWARD DECLARATIONS

class CNssSiUtilityWrapper;
class CNssTagMgr;
class CNssVASDBBuilder;
class CNssAdaptationItem;

// CLASS DECLARATION

/**
*
*  The CNssRecognitionHandler class performs the recognition function.
*
*  @lib NssVASApi.lib
*  @since 2.8
*/

class CNssRecognitionHandler :public CBase, 
                           public MNssRecognitionHandler, 
                           public MSISpeechRecognitionUtilityObserver
{

   public:  //enum

        enum TNssRState
        {
        EVasIdle,
        EVasWaitingForLoadModelsComplete,
        EVasWaitingForLoadLexiconComplete,
        EVasWaitingForLoadGrammarComplete,
        EVasWaitingForRecognitionReadyRecognitionInit,
        EVasWaitingForRecognize,
        EVasWaitingForRecordStarted,
        EVasWaitingForEouDetected,
        EVasWaitingForRecognitionComplete,
        EVasWaitingForSelectTag,
        EVasWaitingForUnloadRuleComplete,
        EVasWaitingForRecognitionReadyRejectTag,
        EVasDirectAdaptation,
        EVasIdleAdaptation,
        EVasCorrectingPluginDatabase
        };


    public:  // Constructors and destructor
        
        /**
        * Two-phased constructor.
        */        
        static CNssRecognitionHandler* NewL();

        /**
        * Two-phased constructor.
        */    
        static CNssRecognitionHandler* NewLC();
        
        /**
        * Destructor.
        */                
        virtual ~CNssRecognitionHandler();

    public: // Functions from base classes

         /**
        * Perform initialization for the recognize funtion.
        * @since 2.0
        * @param aInitCompleteHandler The event call back to receive recognize 
        *                             init events.
        * @param aRecognitionVocabulary List of context, which are active in recognition.
        * @param aMaxResults The maximum number of voice tags to be recognized.
        * @return TNssRecognitionResult Return indicating request is valid.
        */               
        TNssRecognitionResult RecognizeInitL(
                            MNssRecognizeInitCompleteHandler* aInitCompleteHandler,
                            const CArrayPtrFlat<MNssContext>& aRecognitionVocabulary,
                            TInt aMaxResults);
         /**
        * Perform initialization for the recognize funtion. Automatically loads
        * the commands and the names as recognition vocabulary.
        * @since 2.0
        * @param aInitCompleteHandler The event call back to receive recognize 
        *                             init events.
        * @param aMaxResults The maximum number of voice tags to be recognized.
        * @return TNssRecognitionResult Return indicating request is valid.
        */               
        TNssRecognitionResult RecognizeInitL(
                            MNssRecognizeInitCompleteHandler* aInitCompleteHandler,
                            TInt aMaxResults );
        /**
        * From MNssRecognitionHandler Interface 
        * Perform the recognize function.
        * @since 2.0
        * @param aEventHandler The event call back to receive recognize events.
        * @return TNssRecognitionResult Return indicating request is valid.
        */        
        TNssRecognitionResult Recognize( MNssRecognizeEventHandler* aEventHandler );

        /**
        * From MNssRecognitionHandler
        * Starts sampling already before RecognizeInitL and Recognize calls.
        * This is used to ensure that there is no delay between user notification
        * and sampling start.
        *
        * @since 3.2
        * @param aInitCompleteHandler Callback handler
        * @return Return indicating request is valid.
        */
        TNssRecognitionResult PreStartSampling( MNssRecognizeInitCompleteHandler* aInitCompleteHandler );

        /**
        * From MNssRecognitionHandler Interface 
        * Initiate the Select Tag event.
        * @since 2.0
        * @param aClientTag The voice tag which was selected. The tag is owned
        *                   by the client.
        * @return TNssRecognitionResult Return indicating request is valid.
        */        
        TNssRecognitionResult SelectTagL( MNssTag* aClientTag );

        /**
        * From MNssRecognitionHandler Interface 
        * Initiate the Select Tag event.
        * @since 2.0
        * @param aClientTag The voice tag which was selected. The tag is owned
        *                   by the client.
        * @param aNotifyHandlers If false, the global context handlers won't be notified.
        * @return TNssRecognitionResult Return indicating request is valid.
        */        
        TNssRecognitionResult SelectTagL( MNssTag* aClientTag, TBool aNotifyHandlers );

        /**
        * Request Reject Tag, i.e. blacklisting.
        * @since 2.0 
        * @param aClientTagList The list of voice tags which is to be rejected, i.e. 
        *                       blacklisted. The tag list is owned by the client.
        * @return TNssRecognitionResult Return indicating request is valid.
        */
        TNssRecognitionResult RejectTagL(
                             MNssRejectTagCompleteHandler* aRejectTagCompleteHandler,
                             CArrayPtrFlat<MNssTag>* aClientTagList );

        /**
        * From MNssRecognitionHandler Interface 
        * Cancel the last recognition function.
        * @since 2.0
        * @param -
        * @return TNssRecognitionResult Return indicating request is valid.
        */                
        TNssRecognitionResult Cancel();
 
        /**
        * From MNssRecognitionHandler Interface
        * Get the adaptation item to adapt, when you know whether
        * the result was correct or not.
        * @since 2.0
        * @param -
        * @return MNssAdaptationItem The adaptation item.
        */
        MNssAdaptationItem* GetAdaptationItemL();

        /**
        * From MSpeechRecognitionEvent Interface
        * Handle Speech Recognition Utility event
        * @since 2.0
        * @param aEvent The event callback to receive Speech Recognition Utility 
        *               events.
        * @param aResult The result value associated with aEvent.
        * @return -
        */
        void MsruoEvent( TUid aEvent, TInt aResult );

    public: // New functions

        /**
        * AdaptL - called by adaptation item. Adapts the acoustic models.
        * @since 2.0
        * @return None
        */
        void AdaptL( MNssAdaptationEventHandler* aCallback,
                     CSIClientResultSet* aResultSet,
                     TInt aCorrect );

        /**
        * RemoveAdaptationItem - When an adaptation item is destroyed,
        * it signals to its "host" recognition handler. This way, the host
        * knows to remove it from the list of active adaptation items.
        */
        void RemoveAdaptationItem( CNssAdaptationItem* anItem );

    private:

        /**
        * Constructor.
        */        
        CNssRecognitionHandler();

       /**
        * By default Symbian 2nd phase constructor is private.
        */        
        void ConstructL();

        /**
        * Perform required cleanup to get back to the EIdle state and issue the
        * HandleRecognizeInitError event with RecognizeInitFailed error code
        * @return void
        */ 
        void CleanupRecognizeInitFailed();

        /**
        * Perform required cleanup to get back to the EIdle state and issue the
        * HandleRecognizeError event with RecognizeFailed error code
        * @return void
        */ 
        void CleanupRecognizeFailed();

        /**
        * Perform required cleanup to get back to the EIdle state and issue the
        * HandleRejectTagError event with RejectTagFailed error code
        * @return void
        */ 
        void CleanupRejectTagFailed();

        /**
        * Perform required cleanup to get back to the EIdle state
        * @return void
        */ 
        void Cleanup();

        /**
        * Gracefully terminate and delete the SRF object, iSrsApi.
        * @return void
        */ 
        void DeleteSrf();

        /**
        * Delete context objects from iContextList
        * @return void
        */ 
        void ClearContextList();

        /**
        * Delete the tag objects from iTagList
        * @return void
        */ 
        void ClearTagList();

        /**
        * Delete the TRuleEntry objects from iRuleList
        * @return void
        */ 
        void ClearRuleList();

        /**
        * Delete entries from iContextStatus
        * @return void
        */ 
        void ClearContextStatus();

        /**
        * Cleanup and determine the correct event handler
        * @return void
        */
        void UnexpectedEvent();

        /**
        * Handle LoadModelsComplete SRF event
        * @return void
        */
        void DoLoadModelsComplete();

        /**
        * Handle LoadModelsFailed SRF event
        * @return void
        */
        void DoLoadModelsFailed();

        /**
        * Handle LoadLexiconComplete SRF event
        * @return void
        */
        void DoLoadLexiconComplete();

        /**
        * Handle LoadLexiconFailed SRF event
        * @return void
        */
        void DoLoadLexiconFailed();

        /**
        * Handle LoadGrammarComplete SRF event
        * @return void
        */
        void DoLoadGrammarComplete();

        /**
        * Handle LoadGrammarFailed SRF event
        * @return void
        */
        void DoLoadGrammarFailed();

        /**
        * Handle RecognitionReady SRF event
        * @return void
        */
        void DoRecognitionReady();

        /**
        * Handle RecognitionComplete SRF event
        * @return void
        */
        void DoRecognitionComplete();
        
        /**
        * Handle RecognitionFailedNoSpeech, RecognitionFailedTooEarly, 
        * RecognitionFailedTooLong, and RecognitionFailedTooShort SRF events
        * @param aResult The Msruo event Result code.
        * @return void
        */        
        void DoRecognitionFailedNoSpeech( TInt aResult );

        /**
        * Handle RecognitionFailedNoMatch SRF event
        * @return void
        */
        void DoRecognitionFailedNoMatch();

        /**
        * Handle RecognitionFailed SRF event
        * @return void
        */
        void DoRecognitionFailed();

        /**
        * Handle RecordStarted SRF event
        * @return void
        */
        void DoRecordStarted();

        /**
        * Handle RecordFailed SRF event
        * @param aResult The Msruo event Result code.
        * @return void
        */
        void DoRecordFailed( TInt aResult );

        /**
        * Handle EouDetected SRF event
        * @return void
        */
        void DoEouDetected();

        /**
        * Handle UnloadRuleComplete SRF event
        * @return void
        */
        void DoUnloadRuleComplete();

        /**
        * Handle UnloadRuleFailed SRF event
        * @return void
        */
        void DoUnloadRuleFailed();
        
        /**
        * Handle PreStartSampling SRSF event
        */
        void DoPreStartSamplingComplete( TInt aError );

        /**
        * Handle Tag Check for contexts
        * @return void
        */
        void HandleTagCheckL();

        /**
        * Create the SRF object, iSrsApi.
        * @return void
        */ 
        void CreateSrfL();

        /**
        * Perform those RecognizeInitL tasks,
        * which do not depend on vocabulary.
        */
        MNssRecognitionHandler::TNssRecognitionResult CommonRecognizeInitL(
            MNssRecognizeInitCompleteHandler* aInitCompleteHandler,
            TInt aMaxResults );


    struct TRuleEntry 
    {
        TUint32 ruleId;
        TUint32 grammarId;
    };


    private:    // Data

        // Pointer to SRS Utility object.
        CNssSiUtilityWrapper*     iSrsApi;

        // Pointer to SRS to ClientResultSet object, i.e. returned SRS data.
        CSIClientResultSet*            iSIClientResultSet;

        // Pointer to RecognizeInit Complete Event Handler object.
        MNssRecognizeInitCompleteHandler* iInitCompleteHandler;

        // Pointer to Recognize Complete Event Handler object.
        MNssRecognizeEventHandler*        iEventHandler;

        // Pointer to RejectTag Complete Event Handler object.
        MNssRejectTagCompleteHandler*       iRejectTagCompleteHandler;

        // Pointer to VAS Database Builder object.
        CNssVASDBBuilder*                 iVasDBBuilder;

        // Pointer to Context Manager object.
        CNssContextMgr*                   iContextMgr;

        // Pointer to Context List object.
        TMNssContextList*                 iContextList;

        // Pointer to Tag Manager object.
        CNssTagMgr*                       iTagMgr;

        // Pointer to Tag List object.
        CArrayPtrFlat<CNssTag>*           iTagList;

        // Pointer to Rule List object - used during RejectTag 
        CArrayFixFlat<TRuleEntry>*     iRuleList;

        // Context Status Array - True indicates tags for context exist
        // False indicates there are not tags in the context
        CArrayFixFlat<TBool>*           iContextStatus;

        // Current Loop Counter used across asynch Context logic
        // during RecognizeInit
        TInt                           iContextCurrentLoopCount;

        // Number of contexts - used across asynch Context logic
        // during RecognizeInit
        TInt                           iContextCount;

        // Current Loop Counter used across asynch Result (tag) logic
        // during Recognize
        TInt                           iTagCurrentLoopCount;

        // Number of returned Results (tags) -  used across asynch tag logic
        // during Recognize
        TInt                           iTagCount;

        // Current Loop Counter used across asynch RejectTag logic
        TInt                           iRejectTagCurrentLoopCount;

        // Number of rejected tags - used across asynch RejectTag logic
        TInt                           iRejectTagCount;

        // Maximum number of voice tags to be recognized, requested by client 
        TInt                           iMaxResults;

        // The current recognition state.
        TNssRState                        iRState;

        // Array of adaptation items. Each MNssAdaptationItem is
        // internally linked to some "host" CNssRecognitionHandler.
        RPointerArray<CNssAdaptationItem> iAdaptItemArray;

        // Callback after adaptation
        MNssAdaptationEventHandler*       iAdaptationHandler;
        
        // Wait loop
        CActiveSchedulerWait iWait;
};

#endif // NSSVASCRECOGNITIONHANDLER_H   
            
// End of File