srsf/sisrscontrollerplugin/src/simodelbankdb.cpp
changeset 13 57b735022c18
parent 1 b13cd05eeb2f
--- a/srsf/sisrscontrollerplugin/src/simodelbankdb.cpp	Mon Jan 18 20:20:30 2010 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,875 +0,0 @@
-/*
-* Copyright (c) 2004-2008 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 class handles the storage and access of user trained models
-*               and utterances into a database.  It performs checksum verification
-*               for the stored data.  It is also responsible for allocating memory
-*               when loading the models into the recognizer.
-*
-*/
-
-
-// INCLUDE FILES
-#include <e32std.h>
-#include <e32base.h>
-#include <f32file.h>
-#include "siresourcehandler.h"
-#include "asrplugindataloader.h"
-#include "simodelbankdb.h"
-#include "rubydebug.h"
-
-// CONSTANTS
-const TInt KModelBankPackageType=3;
-const TInt KModelBankLanguageType=0;
-const TInt KModelBankStartPos=0;
-
-// _LIT(KModelFileName,"c:\\system\\Apps\\model_data\\qhmms_fxp"); // Commented out to remove "not referenced" warning
-// ============================ MEMBER FUNCTIONS ===============================
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::CSIModelBankDB
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CSIModelBankDB::CSIModelBankDB( RDbNamedDatabase& aDatabase, 
-                                RDbs& aDbSession,
-                                TInt aDrive )
-                               : CSICommonDB(aDatabase, aDbSession, aDrive ),
-                                 iAcousticModelPtr(0,0,0)
-    {
-    }
-
- // -----------------------------------------------------------------------------
-// CSIModelBankDB::ConstructL
-// Symbian 2nd phase constructor can leave.
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::ConstructL()
-    {
-    RUBY_DEBUG_BLOCK( "CSIModelBankDB::ConstructL" );
-
-    // Resource handler 
-    CSIResourceHandler* resourceHandler = CSIResourceHandler::NewL();
-    CleanupStack::PushL(resourceHandler);
-    //  Data loader
-    iDataLoader = CDataLoader::NewL( 
-        *(resourceHandler->iDataFilenamePrefix), 
-        *(resourceHandler->iDataFilenameSeperator),
-        *(resourceHandler->iDataFilenamePostfix) );
-    CleanupStack::PopAndDestroy(1); //resourceHandler
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CSIModelBankDB* CSIModelBankDB::NewL( RDbNamedDatabase& aDatabase, 
-                                      RDbs& aDbSession,
-                                      TInt aDrive )
-    {
-    RUBY_DEBUG_BLOCK( "CSIModelBankDB::NewL" );
-    
-    CSIModelBankDB* self 
-        = new( ELeave ) CSIModelBankDB( aDatabase, aDbSession, aDrive );
-    CleanupStack::PushL( self );
-    self->ConstructL();
-    CleanupStack::Pop();	
-    return self;
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::~CSIModelBankDB
-// Destructor
-// -----------------------------------------------------------------------------
-//
-CSIModelBankDB::~CSIModelBankDB()
-{
-	// Delete all elements of the array before deleting the array
-	iModelBankArray.ResetAndDestroy();
-	iModelBankArray.Close();
-	
- 	delete iDataLoader;
-}
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::GetAllAcousticModelsL
-// 
-// -----------------------------------------------------------------------------
-//
-const CSIModelBank* CSIModelBankDB::GetAllAcousticModelsL( TSIModelBankID aModelBankID ) 
-    {
-    
-    // Construct the table name using the provided model bank ID
-    TBuf<40> KModelBankName(KSIModelBankTable);
-    KModelBankName.AppendNumUC(aModelBankID);
-    
-    TBuf<100> KSQLStatement;
-    // Declare a literal string to hold the SQL statement
-    // SELECT  KHmmColumn, KHmmChecksumColumn FROM KModelBankName
-    _LIT(KSQLSelect1, "SELECT ");
-    _LIT(KSQLSelect2, " FROM ");
-    
-    KSQLStatement = KSQLSelect1;
-    KSQLStatement.Append(KHmmColumn);
-    KSQLStatement.Append(KNext);
-    KSQLStatement.Append(KHmmChecksumColumn);
-    KSQLStatement.Append(KSQLSelect2);
-    KSQLStatement.Append(KModelBankName);
-    
-    RDbView view;
-    CleanupClosePushL(view);
-    User::LeaveIfError(view.Prepare(iDb, TDbQuery(KSQLStatement, EDbCompareNormal)));
-    User::LeaveIfError(view.EvaluateAll());
-    
-    // Get column set for column ordinals
-    CDbColSet* columns = view.ColSetL();
-    TDbColNo hmm_col = columns->ColNo(KHmmColumn);
-    TDbColNo hmmchecksum_col = columns->ColNo(KHmmChecksumColumn);
-    delete columns;
-    
-    // Create a model bank object
-    CSIModelBank* modelBank = CSIModelBank::NewLC(aModelBankID);
-    
-    TSIModelID modelID=KModelID;
-    TInt length;
-    TInt32 checksum;
-    // After evaluation, the first call to NextL() is equivalent to FirstL()
-    while ( view.NextL() )
-        {
-        // Retrieve the current row
-        view.GetL();
-        length = view.ColLength(hmm_col);
-        checksum = view.ColUint32(hmmchecksum_col);
-        
-        // Read the acoustic model into a buffer
-        TUint8* hmmBuf = new (ELeave) TUint8[length];
-        CleanupStack::PushL(hmmBuf);
-        TPtr8 hmmPtr(hmmBuf, 0, length);
-        RDbColReadStream colReadStrm;
-       	colReadStrm.OpenLC(view, hmm_col);
-       	colReadStrm.ReadL(hmmPtr, length);
-        // Cleanup colReadStrm
-        CleanupStack::PopAndDestroy();
-        
-        if ( VerifyChecksum( hmmPtr, checksum) )
-            {
-            CSIModel* model = CSIModel::NewLC(modelID);
-            HBufC8* aAcousticModel=HBufC8::NewL(length); 
-            *aAcousticModel=hmmPtr;
-            model->SetAcousticModel(aAcousticModel);
-            modelBank->AddL((CSIModel*)model);
-            //!
-            // Cleanup aAcousticModel and hmmBuf
-            CleanupStack::Pop();
-            CleanupStack::PopAndDestroy();
-            
-            }
-        else
-            {
-            User::Leave( KErrCorrupt );
-            }
-        }
-    
-    // Keep the reference of the modelBank
-    //User::LeaveIfError(iModelBankArray.Append(modelBank));
-    // Cleanup modelBank
-    CleanupStack::Pop();
-    
-    // Cleanup view
-    CleanupStack::PopAndDestroy();
-    
-    return modelBank;
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::AllAcousticModelsL
-// Loads all acoustic models within the specified model bank into a model bank
-// object, which is loaded into recognizer during recognition session.
-// -----------------------------------------------------------------------------
-//
-const CSIModelBank* CSIModelBankDB::AllAcousticModelsL( TSIModelBankID aModelBankID )
-    {
-    // Construct the table name using the provided model bank ID
-    TBuf<40> KModelBankName(KSIModelBankTable);
-    KModelBankName.AppendNumUC(aModelBankID);
-    
-    TBuf<100> KSQLStatement;
-    // Declare a literal string to hold the SQL statement
-    // SELECT  KHmmColumn, KHmmChecksumColumn FROM KModelBankName
-    _LIT(KSQLSelect1, "SELECT * ");
-    _LIT(KSQLSelect2, " FROM ");
-    
-    KSQLStatement = KSQLSelect1;
-    //	KSQLStatement.Append(KHmmColumn);
-    //	KSQLStatement.Append(KNext);
-    //	KSQLStatement.Append(KHmmChecksumColumn);
-    KSQLStatement.Append(KSQLSelect2);
-    KSQLStatement.Append(KModelBankName);
-    RDbView view;
-    CleanupClosePushL(view);
-    User::LeaveIfError(view.Prepare(iDb, TDbQuery(KSQLStatement, EDbCompareNormal)));
-    User::LeaveIfError(view.EvaluateAll());
-    
-    // Get column set for column ordinals
-    CDbColSet* columns = view.ColSetL();
-    TDbColNo hmm_col = columns->ColNo(KHmmColumn);
-    TDbColNo hmmchecksum_col = columns->ColNo(KHmmChecksumColumn);
-    delete columns;
-    
-    // Create a model bank object
-    CSIModelBank* modelBank = CSIModelBank::NewLC(aModelBankID);
-    
-    TSIModelID modelID=KModelID;
-    TInt length;
-    TInt32 checksum;
-    // After evaluation, the first call to NextL() is equivalent to FirstL()
-    while ( view.NextL() )
-        {
-        // Retrieve the current row
-        view.GetL();
-        length = view.ColLength(hmm_col);
-        checksum = view.ColUint32(hmmchecksum_col);
-        
-        // Read the acoustic model into a buffer
-        TUint8* hmmBuf = new (ELeave) TUint8[length];
-        CleanupStack::PushL(hmmBuf);
-        TPtr8 hmmPtr(hmmBuf, 0, length);
-        RDbColReadStream colReadStrm;
-       	colReadStrm.OpenLC(view, hmm_col);
-       	colReadStrm.ReadL(hmmPtr, length);
-        // Cleanup colReadStrm
-        CleanupStack::PopAndDestroy();
-
-#ifdef __SIND_HMMS_TO_FILE
-        {
-        TInt error( KErrNone );
-        RFile sampleFile; 
-        RFs fileSession; 
-        User::LeaveIfError( fileSession.Connect() );
-
-        _LIT( KCDrive,"c:\\" ); 
-        _LIT( KFileName, "data\\rec\\hmm_%08d.raw" ); 
-        _LIT( KStartOfYear, "20060101:000000.000000" ); 
-        TTime startOfYear( KStartOfYear ); 
-        TTimeIntervalSeconds secondsSince; 
-        TTime nowtime; 
-        nowtime.UniversalTime(); 
-        nowtime.SecondsFrom( startOfYear, secondsSince );
-
-        TFileName fileName; 
-        fileName.Append( KCDrive ); 
-        fileName.AppendFormat( KFileName, secondsSince.Int() ); 
-        error = sampleFile.Replace( fileSession, fileName, EFileWrite );
-        if ( !error ) 
-            {
-            TPtr8 ptr( hmmBuf, length ); 
-            ptr.SetLength( length ); 
-            sampleFile.Write( ptr );
-            sampleFile.Close();
-            }   
-        fileSession.Close();
-        }
-#endif
-        
-        if ( VerifyChecksum( hmmPtr, checksum) )
-            {
-            CSIModel* model = CSIModel::NewLC(modelID);
-            HBufC8* aAcousticModel=HBufC8::NewL(length); 
-            *aAcousticModel=hmmPtr;
-            SetAcousticModelL(aAcousticModel->Des());
-            model->SetAcousticModel(aAcousticModel);
-            modelBank->AddL((CSIModel*)model);
-            //!
-            // Cleanup aAcousticModel and hmmBuf
-            CleanupStack::Pop();
-            CleanupStack::PopAndDestroy();
-            }
-        else
-            {
-            User::Leave( KErrCorrupt );
-            }
-        }
-    
-    // Keep the reference of the modelBank
-    User::LeaveIfError(iModelBankArray.Append(modelBank));
-    // Cleanup modelBank
-    CleanupStack::Pop();
-    // Cleanup view
-    CleanupStack::PopAndDestroy();
-    
-    return modelBank;
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::AllModelCountL
-// Returns the total number of models in the system (all model banks).
-// -----------------------------------------------------------------------------
-//
-TInt CSIModelBankDB::AllModelCountL()
-    {
-    TBuf<100> KSQLStatement;
-    // Declare a literal string to hold the SQL statement
-    // SELECT KCounterColumn FROM KModelBankIdTable WHERE KUsedColumn = KUsed
-    _LIT(KSQLSelect1, "SELECT ");
-    _LIT(KSQLSelect2, " FROM ");
-    _LIT(KSQLSelect3, " WHERE ");
-    
-    KSQLStatement = KSQLSelect1;
-    KSQLStatement.Append(KCounterColumn);
-    KSQLStatement.Append(KSQLSelect2);
-    KSQLStatement.Append(KModelBankIdTable);
-    KSQLStatement.Append(KSQLSelect3);
-    KSQLStatement.Append(KUsedColumn);
-    KSQLStatement.Append(KEqual);
-    KSQLStatement.AppendNum(KUsed);
-    
-    RDbView view;
-    CleanupClosePushL(view);
-    User::LeaveIfError(view.Prepare(iDb, TDbQuery(KSQLStatement, EDbCompareNormal)));
-    User::LeaveIfError(view.EvaluateAll());
-    
-    // Get column set for column ordinals
-    CDbColSet* columns = view.ColSetL();
-    
-    delete columns;
-    
-    TInt counter = 0;
-    // After evaluation, the first call to NextL() is equivalent to FirstL()
-    while ( view.NextL() )
-        {
-        // Retrieve the current row
-        view.GetL();
-        //counter += view.ColInt(counter_col);
-        //!
-        counter ++;//=view.ColInt(used_col); 
-        }
-    
-    // Cleanup view
-    CleanupStack::PopAndDestroy();
-    
-    return counter;
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::CreateIDTableL
-// Creates a new model bank ID table in the database.
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::CreateIDTableL()
-    {
-    // Invoke function in the base class CSICommonDB.
-    CSICommonDB::CreateIDTableL(KModelBankIdTable, KModelBankIdColumn, KModelBankIndex);
-    };
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::CreateModelBankL
-// Creates a new model bank table in the database.
-// -----------------------------------------------------------------------------
-//
-TSIModelBankID CSIModelBankDB::CreateModelBankL( TUid aClientUid )
-    {
-    RUBY_DEBUG_BLOCK( "CSIModelBankDB::CreateModelBankL" );
-    
-    // Model bank is already exist in the 
-    RArray<TSIModelBankID> aExistModelBankIDs;
-    CleanupClosePushL( aExistModelBankIDs );
-    GetAllClientModelBankIDsL(aClientUid,aExistModelBankIDs);
-    
-    
-    if(aExistModelBankIDs.Count()>0) {
-        TSIModelBankID aExistModelBankID=aExistModelBankIDs[0];	
-        CleanupStack::PopAndDestroy( &aExistModelBankIDs );
-        return aExistModelBankID;
-        }
-    CleanupStack::PopAndDestroy( &aExistModelBankIDs );
-    
-    User::LeaveIfError( iDbSession.ReserveDriveSpace( iDrive, sizeof( CSIModelBank ) ) );
-    
-    // Generate a new model bank ID
-    TSIModelBankID modelBankID = STATIC_CAST(TSIModelBankID,CreateNewIDL(KModelBankIdTable, KModelBankIdColumn, aClientUid));
-    // Construct the table name using the new model bank ID
-    TBuf<40> KModelBankName(KSIModelBankTable);
-    KModelBankName.AppendNumUC(modelBankID);
-    // Create a table definition
-    CDbColSet* columns=CDbColSet::NewLC();
-    
-    // add the columns  
-    // 1) Binary data, 2) binary data size
-    columns->AddL(TDbCol(KHmmColumn,EDbColLongBinary));
-    columns->AddL(TDbCol(KHmmChecksumColumn,EDbColUint32));
-    
-    // Create a table
-    TInt err =iDb.CreateTable(KModelBankName,*columns);
-    
-    if ( err != KErrNone )
-        {
-        // Failed to create the table.
-        // Need to release the new ModelBank ID and leave.
-        ReleaseIdL(KModelBankIdTable, KModelBankIdColumn, modelBankID);
-        User::Leave(err);
-        }
-    
-    // cleanup the column set
-    CleanupStack::PopAndDestroy();
-    
-    // Put and empty Modelbank inside
-        {
-        //!!! Use the default model file to construct	
-        //!
-        HBufC8 *bf=NULL;		
-        bf= iDataLoader->LoadData( KModelBankPackageType,KModelBankLanguageType,KModelBankStartPos,KMaxTUint32);
-        // Modelbank file does not exist;
-        if(bf==NULL)
-            User::Leave(KErrNotFound);
-        CleanupStack::PushL(bf);
-        
-        iAcousticModelPtr.Set(bf->Des());
-        //.Set(_L8("empty"));
-        //iAcousticModelPtr=(_L8("empty"));
-        // Always 1 for each model bank
-        //TSIModelID modelID=KModelID; 
-        
-        TInt32 hmmChecksum = CalculateChecksum(iAcousticModelPtr);
-        
-        // Open model bank table
-        RDbTable dbTable;		// Provides access to table data as a rowset
-        User::LeaveIfError(dbTable.Open(iDb, KModelBankName, RDbTable::EUpdatable));
-        CleanupClosePushL(dbTable);
-        
-        // Get column set for column ordinals
-        columns = dbTable.ColSetL();
-        TDbColNo hmm_col = columns->ColNo(KHmmColumn);
-        TDbColNo hmmchecksum_col = columns->ColNo(KHmmChecksumColumn);
-        delete columns;
-        
-        // 		 No, insert new row
-        dbTable.InsertL();
-        dbTable.SetColL(hmm_col, iAcousticModelPtr);
-        
-        dbTable.SetColL(hmmchecksum_col, hmmChecksum);
-        
-        // Write the updated row
-        TRAPD(err, dbTable.PutL());
-        if( err != KErrNone )
-            {
-            // Error: cancel update
-            dbTable.Cancel();
-            dbTable.Reset();
-            User::Leave(err);
-            }
-        
-        // Cleanup bf dbTable 
-        CleanupStack::PopAndDestroy(2);
-        // Free up resources
-        Reset();
-        }
-        
-    iDbSession.FreeReservedSpace( iDrive );
-        
-    //AllAcousticModelsL(modelBankID);
-    return modelBankID;
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::GetAllClientModelBankIDsL
-// This function returns all model bank IDs owned by the specified client.
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::GetAllClientModelBankIDsL( TUid aClientUid,
-                                                RArray<TSIModelBankID>& aModelBankIDs )
-    {
-    // This is a hack to get the id aligned to 4-byte boundary,
-    // for some reason this does not happen in winscw build if 
-    // TSIModelBankID is taken from stack.
-    TSIModelBankID* id = new (ELeave) TSIModelBankID;
-    CleanupStack::PushL( id );
-    
-    RArray<TUint32> ix;
-    ix.Reset();
-    GetAllClientIDsL(KModelBankIdTable, KModelBankIdColumn, aClientUid, ix);
-    for(TInt i=0;i<ix.Count();i++) 
-        {
-        *id = STATIC_CAST( TSIModelBankID, ix[i] );
-        aModelBankIDs.Append( *id );
-        }
-    ix.Close();
-    CleanupStack::PopAndDestroy( id );
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::GetAllModelBankIDsL
-// This function returns all model bank IDs in the database.
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::GetAllModelBankIDsL( RArray<TSIModelBankID>& aModelBankIDs )
-    {
-    // This is a hack to get the id aligned to 4-byte boundary,
-    // for some reason this does not happen in winscw build if 
-    // TSIModelBankID is taken from stack.
-    TSIModelBankID* id = new ( ELeave ) TSIModelBankID;
-    CleanupStack::PushL( id );
-    
-    RArray<TUint32> ix;
-    ix.Reset();
-    GetAllIDsL( KModelBankIdTable, KModelBankIdColumn, ix );
-    for ( TInt i = 0; i < ix.Count(); i++ ) 
-        { 
-        *id = STATIC_CAST( TSIModelBankID, ix[i] );
-        aModelBankIDs.Append( *id );
-        }
-    ix.Close();
-    CleanupStack::PopAndDestroy( id );
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::GetAllModelIDsL
-// This function returns all model IDs within the specified model bank. It's
-// expected that the client has already done allocation on aModelIDs array object.
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::GetAllModelIDsL( TSIModelBankID /*aModelBankID*/,
-                                     RArray<TSIModelID>& aModelIDs )
-    {
-    // Only one id , and it is KModelID
-    aModelIDs.Append(KModelID);	
-    }
-	
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::IsModelBankValidL
-// Checks if the specified model bank table exists in the database and also verify
-// ownership.
-// -----------------------------------------------------------------------------
-//
-TBool CSIModelBankDB::IsModelBankValidL( TUid aClientUid,
-                                         TSIModelBankID aModelBankID )
-    {
-    VerifyOwnershipL(aClientUid, KModelBankIdTable, KModelBankIndex, aModelBankID);
-    return ETrue;
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::IsModelValidL
-// Checks if the specified model exists in the specified model bank table.
-// -----------------------------------------------------------------------------
-//
-TBool CSIModelBankDB::IsModelValidL( TSIModelBankID /*aModelBankID*/,
-                                     TSIModelID aModelID )
-    {
-    // Assume that ModelBankd ID is valid
-    if (aModelID==KModelID)
-        {
-        return ETrue;
-        }
-    else
-        {
-        return EFalse;
-        }
-    }
-    
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::UpdateModelBankIfInvalidL
-// Validate the adapted model bank against ROM version and update if not valid.
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::UpdateModelBankIfInvalidL( TSIModelBankID aModelBankID )
-    {    
-    RUBY_DEBUG_BLOCK( "CSIModelBankDB::UpdateModelBankIfInvalidL" );
-    
-    const TUint KModelBankHeaderSize(20);
-    
-    HBufC8 *bf = iDataLoader->LoadData( KModelBankPackageType,
-                                        KModelBankLanguageType,
-                                        KModelBankStartPos,
-                                        KMaxTUint32 );
-    
-    if( bf == NULL )
-        {
-        // Modelbank file does not exist;
-        User::Leave( KErrNotFound );
-        }
-        
-    CleanupStack::PushL( bf );
-    
-    TPtr8 origModelPtr( bf->Des() );
-
-    // Compare phoneme definitions
-    TBool areEqual( EFalse );
-    
-    TRAPD( error, 
-        const CSIModelBank* adaptedModelBank = GetAllAcousticModelsL( aModelBankID );
-        CleanupStack::PushL( (CSIModelBank*)adaptedModelBank );
-
-        TPtrC8 adaptedModelPtr = adaptedModelBank->AtL(0).AcousticModel();
-        
-        // 1. Compare size of phoneme definition
-        TInt adaptedSize = adaptedModelPtr[18];
-        adaptedSize |= adaptedModelPtr[19] << 8;
-            
-        TInt origSize = origModelPtr[18];
-        origSize |= origModelPtr[19] << 8;
-        
-        if ( adaptedSize == origSize )
-            {
-            // 2. compare content of phoneme definitions
-            TInt size = origSize + KModelBankHeaderSize;
-            if ( Mem::Compare( origModelPtr.Ptr(), size, adaptedModelPtr.Ptr(), size ) == 0 )
-                {
-                areEqual = ETrue;
-                }
-            }
-
-        CleanupStack::PopAndDestroy( (CSIModelBank*)adaptedModelBank );
-    );
-    
-    // GetAllAcousticModelsL will leave with KErrCorrupt if checksum doesn't match
-    // This case should be handled by updating model bank
-    if ( error != KErrNone && error != KErrCorrupt )
-        {
-        User::Leave( error );
-        }
-    
-    if ( !areEqual )
-        {
-        // replace the adapted model bank with the original model bank
-        RUBY_DEBUG0("phoneme definitions changed or model bank corrupted, update models" );
-        
-        SetAcousticModelL( origModelPtr );
-        SaveModelL( aModelBankID );
-        }
-
-    CleanupStack::PopAndDestroy( bf );
-    }
-    
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::GetUtteranceDurationL
-//
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::GetUtteranceDurationL( TSIModelBankID /*aModelBankID*/, 
-                                            TSIModelID /*aModelID*/,
-                                            TTimeIntervalMicroSeconds32& /*aDuration*/ )
-    {
-    User::Leave(KErrNotSupported);
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::ModelCountL
-// Returns the number of models in the specified model bank.
-// -----------------------------------------------------------------------------
-//
-TInt CSIModelBankDB::ModelCountL( TSIModelBankID /*aModelBankID*/ )
-    {
-    
-    //User::Leave(KErrNotSupported);
-    return 1;
-    // one model per modelbank by defination
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::RemoveModelBankL
-// Deletes a model bank table from the database.
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::RemoveModelBankL( TUid aClientUid,
-                                       TSIModelBankID aModelBankID )
-    {
-    VerifyOwnershipL(aClientUid, KModelBankIdTable, KModelBankIndex, aModelBankID);
-    
-    TInt diskSpace = ( ModelCountL(aModelBankID) * sizeof( CSIModel ) )
-        + sizeof( CSIModelBank );
-    User::LeaveIfError( iDbSession.ReserveDriveSpace( iDrive, diskSpace ) );
-    
-    // Construct the table name using the provided model bank ID
-    TBuf<40> KModelBankName(KSIModelBankTable);
-    KModelBankName.AppendNumUC(aModelBankID);
-    
-    TBuf<50> KSQLStatement;
-    // Declare a literal string to hold the SQL statement
-    // DROP TABLE KModelBankName
-    _LIT(KSQLDelete1, "DROP TABLE ");
-    
-    KSQLStatement = KSQLDelete1;
-    KSQLStatement.Append(KModelBankName);
-    
-    User::LeaveIfError(iDb.Execute(KSQLStatement));
-    
-    // Release the ModelBank ID
-    ReleaseIdL(KModelBankIdTable, KModelBankIdColumn, aModelBankID);
-    
-    // Cancel free disk space request
-    iDbSession.FreeReservedSpace( iDrive );
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::RemoveModelL
-// Removes a model from the model bank table by marking it as "not used".
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::RemoveModelL( TUid /*aClientUid*/,
-                                   TSIModelBankID /*aModelBankID*/,
-                                   TSIModelID /*aModelID*/ )
-    {
-    User::Leave(KErrNotSupported);
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::Reset
-// Deallocates the temporary memory allocated during training.
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::Reset()
-    {
-    iAcousticModelPtr.Set(0,0,0);
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::Reset
-// Deallocates the temporary memory allocated during recognition.
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::ResetAndDestroy()
-    {
-    iModelBankArray.ResetAndDestroy();
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::SaveModelL
-// Saves the trained model in the temporary memory into the database.
-// -----------------------------------------------------------------------------
-//
-TSIModelID CSIModelBankDB::SaveModelL( TSIModelBankID aModelBankID )
-    {
-    if ( iAcousticModelPtr.Length() <= 0 )
-        {
-        User::Leave(KErrNotReady);
-        }
-
-    User::LeaveIfError( iDbSession.ReserveDriveSpace( iDrive, sizeof( CSIModel ) ) );
-    
-    // Always 1 for each model bank
-    TSIModelID modelID=KModelID; 
-    // Construct the table name using the provided model bank ID
-    TBuf<40> KModelBankName(KSIModelBankTable);
-    KModelBankName.AppendNumUC(aModelBankID);
-    
-    TInt32 hmmChecksum = CalculateChecksum(iAcousticModelPtr);
-    
-    // Open model bank table
-    RDbTable dbTable;		// Provides access to table data as a rowset
-    User::LeaveIfError(dbTable.Open(iDb, KModelBankName, RDbTable::EUpdatable));
-    CleanupClosePushL(dbTable);
-    
-    // Get column set for column ordinals
-    CDbColSet* columns = dbTable.ColSetL();
-    TDbColNo hmm_col = columns->ColNo(KHmmColumn);
-    TDbColNo hmmchecksum_col = columns->ColNo(KHmmChecksumColumn);
-    delete columns;
-    
-    // 		Update it
-    dbTable.FirstL(); 	
-    dbTable.UpdateL();
-    
-    dbTable.SetColL(hmm_col, iAcousticModelPtr);
-    dbTable.SetColL(hmmchecksum_col, hmmChecksum);
-    
-    // Write the updated row
-    TRAPD(err, dbTable.PutL());
-    if( err != KErrNone )
-        {
-        // Error: cancel update
-        dbTable.Cancel();
-        dbTable.Reset();
-        User::Leave(err);
-        }
-    iDbSession.FreeReservedSpace( iDrive );
-    // Cleanup dbTable
-    CleanupStack::PopAndDestroy();
-    // Free up resources
-    Reset();
-    
-    return modelID;
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::SetAcousticModelL
-// Saves the acoustic model into a temporary memory during training.
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::SetAcousticModelL( const TPtr8& aAcousticModelBuf )
-    {
-    if ( aAcousticModelBuf.Length() <= 0 )
-        {
-        User::Leave(KErrNotReady);
-        }
-    
-    iAcousticModelPtr.Set(aAcousticModelBuf);
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::SetUtteranceDurationL
-// Saves the utterance duration of a trained model in temporary memory during
-// training.
-// -----------------------------------------------------------------------------
-//
-void CSIModelBankDB::SetUtteranceDurationL( TInt /*aUtteranceDuration*/ )
-    {
-    User::Leave( KErrNotSupported );
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::CalculateChecksum
-// Calculates a checksum value for the given buffer.
-// -----------------------------------------------------------------------------
-//
-TInt32 CSIModelBankDB::CalculateChecksum( const TPtr8& aBuf )
-    {
-    TInt32 checksum = 0;
-    TInt length = aBuf.Length();
-    
-    for( TInt i = 0; i < length; i++ )
-        {
-        checksum += aBuf[i];
-        }
-    return checksum;
-    }
-
-// -----------------------------------------------------------------------------
-// CSIModelBankDB::VerifyChecksum
-// Verifies the checksum value for the given buffer by comparing it with the
-// provided aChecksum value.
-// -----------------------------------------------------------------------------
-//
-TBool CSIModelBankDB::VerifyChecksum( const TPtr8& aBuf,
-                                      TInt32 aChecksum )
-    {
-    TInt32 checksum = CalculateChecksum(aBuf);
-    return (checksum == aChecksum);
-    }
-
-
-// -----------------------------------------------------------------------------
-// Unit Test only
-// -----------------------------------------------------------------------------
-//
-#ifdef __CONSOLETEST__
-// Returns array of loaded model banks
-RPointerArray<CSIModelBank>& CSIModelBankDB::ModelBankArray()
-    {
-    return iModelBankArray;
-    }
-
-#endif
-
-//  End of File