srsf/nssvasapi/nssvasdb/src/nssvascvasdatabase.cpp
changeset 0 bf1d17376201
child 1 b13cd05eeb2f
equal deleted inserted replaced
-1:000000000000 0:bf1d17376201
       
     1 /*
       
     2 * Copyright (c) 2003-2005 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  CNssVasDatabase is responsible for the issuing of requests  to
       
    15 *               to the VasDb server and returning the results to the VasDb Managers.
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 #include "srsfbldvariant.hrh"
       
    21 #include <e32base.h>
       
    22 #include <e32test.h>
       
    23 #include "nssvascvasdatabase.h"
       
    24 #include "nssvascspeechitem.h"
       
    25 #include "nssvascvasdbsrvdef.h"
       
    26 #include "nssvastspeechitemconstant.h"
       
    27 #include <f32file.h>
       
    28 #include "rubydebug.h"
       
    29 
       
    30 // Complementary macro for TRAPD:
       
    31 // TRAPD( err, doSomething() );
       
    32 // REACT( err, return( err ) );
       
    33 #define REACT(a,b) if ( a < 0 ) {b;}
       
    34 
       
    35 const TInt KTagRefListGranularity = 2;
       
    36 
       
    37 const TInt KFetchedTagRefListGranularity = 50;
       
    38 
       
    39 #ifdef _DEBUG
       
    40 // used in UDEB macros only
       
    41 _LIT( KVasDatabasePanic, "CNssVasDatabase.cpp" );
       
    42 #endif // _DEBUG
       
    43 
       
    44 // ============================ Methods ===============================
       
    45 
       
    46 //-------------------------------------------------------- 
       
    47 //C++ default constructor can NOT contain any code that
       
    48 // might leave.
       
    49 //--------------------------------------------------------    
       
    50 CNssVASDatabase::CNssVASDatabase( TInt /*aPriority*/ )
       
    51 : iIsLocked( EFalse )
       
    52     {
       
    53     }
       
    54 
       
    55 // -----------------------------------------------------------------------------
       
    56 // CNssVasDatabase::NewLC
       
    57 // Two-phased constructor.
       
    58 // -----------------------------------------------------------------------------
       
    59 //
       
    60 CNssVASDatabase* CNssVASDatabase::NewLC( TInt aPriority )
       
    61     {
       
    62 	CNssVASDatabase* self = new(ELeave)CNssVASDatabase( aPriority );
       
    63 	CleanupStack::PushL( self );
       
    64 	self->ConstructL();
       
    65 	return self;
       
    66     }
       
    67 
       
    68 // -----------------------------------------------------------------------------
       
    69 // CNssVasDatabase::NewL
       
    70 // Two-phased constructor.
       
    71 // -----------------------------------------------------------------------------
       
    72 //
       
    73 CNssVASDatabase* CNssVASDatabase::NewL( TInt aPriority )
       
    74     {
       
    75 	CNssVASDatabase* self = NewLC( aPriority );
       
    76 	CleanupStack::Pop( self );
       
    77 	return self;
       
    78     }
       
    79 
       
    80 // -----------------------------------------------------------------------------
       
    81 // CNssVasDatabase::ConstructL
       
    82 // Symbian 2nd phase constructor can leave.
       
    83 // -----------------------------------------------------------------------------
       
    84 //
       
    85 void CNssVASDatabase::ConstructL()
       
    86     {
       
    87     iContextBuilder         = CNssContextBuilder::NewL();
       
    88     iSpeechItemBuilder      = CNssSpeechItemBuilder::NewL( this );
       
    89     iVasDb                  = CNssVasDb::NewL( *iContextBuilder, 
       
    90                                                *iSpeechItemBuilder);
       
    91     iTNssTagRefList         = new(ELeave) TNssTagReferenceListArray( KTagRefListGranularity );
       
    92     }
       
    93 
       
    94 //------------------------------------------
       
    95 // CNssVASDatabase::~CNssVASDatabase
       
    96 // Destructor
       
    97 //------------------------------------------
       
    98 CNssVASDatabase::~CNssVASDatabase()
       
    99     {
       
   100     RUBY_DEBUG0( "CNssVASDatabase::~CNssVASDatabase" ); 
       
   101 
       
   102     if ( iGrammarIdRuleIdPackage )
       
   103 	    {
       
   104 	    delete iGrammarIdRuleIdPackage;
       
   105         }
       
   106 
       
   107 	if ( iSpeechItemBuilder )
       
   108 	    {
       
   109 	    delete iSpeechItemBuilder;
       
   110 	    }
       
   111 
       
   112 	if ( iVASDBEventMonitor )
       
   113 	    {
       
   114 	    delete iVASDBEventMonitor;
       
   115 	    }
       
   116 
       
   117 	if ( iTNssTagRefList )
       
   118 	    {
       
   119         iTNssTagRefList->Reset();
       
   120 	    delete iTNssTagRefList;
       
   121 	    }
       
   122 
       
   123 	if ( iVasDb )
       
   124 	    {
       
   125 	    delete iVasDb;
       
   126 	    }
       
   127 	if ( iContextBuilder )
       
   128 	    {
       
   129 	    delete iContextBuilder;
       
   130         }	    
       
   131     }
       
   132     
       
   133 // -----------------------------------------------------------------------------
       
   134 // RNssVasDbSession::OpenDatabase
       
   135 // Method to open the database.
       
   136 // -----------------------------------------------------------------------------
       
   137 //
       
   138 TInt CNssVASDatabase::OpenDatabase()
       
   139     {
       
   140     if ( iConnected )
       
   141         {
       
   142         iConnected++;
       
   143         return KErrDbAlreadyOpen;
       
   144         }
       
   145 
       
   146     TRAPD( error, iVasDb->OpenDatabaseL() ); 
       
   147 
       
   148     if ( error == KErrNone )
       
   149         {
       
   150         iConnected++;
       
   151         }
       
   152 
       
   153     return error;
       
   154     }
       
   155 	
       
   156 // -----------------------------------------------------------------------------
       
   157 // RNssVasDbSession::CloseDatabase
       
   158 // Method to close the database.
       
   159 // -----------------------------------------------------------------------------
       
   160 //
       
   161 void CNssVASDatabase::CloseDatabase()
       
   162     {
       
   163     // Check if already closed (or never opened)
       
   164     if ( iConnected > 0 )
       
   165         {
       
   166         // Some other VAS instance in the same thread may be using the database.
       
   167         iConnected--;
       
   168 
       
   169         // If not, close it.
       
   170         if ( iConnected <= 0 )
       
   171             {
       
   172             iVasDb->CloseDatabase();
       
   173             }
       
   174         }
       
   175     }
       
   176 
       
   177 // -----------------------------------------------------------------------------
       
   178 // CNssVasDatabase::CreateDb
       
   179 // Method to create vas database
       
   180 // -----------------------------------------------------------------------------
       
   181 TInt CNssVASDatabase::CreateDb()
       
   182     {
       
   183     TRAPD( error, iVasDb->CreateDatabaseL() );
       
   184     
       
   185     return error;
       
   186     }
       
   187 
       
   188 // -----------------------------------------------------------------------------
       
   189 // CNssVasDatabase::StartMonitoringDatabaseL
       
   190 // Method to start monitoring changes to vas database
       
   191 // -----------------------------------------------------------------------------
       
   192 void CNssVASDatabase::StartMonitoringDatabaseL()
       
   193     {
       
   194     //iVASDBEventMonitor = CNssVASDBEventMonitor::NewL();
       
   195     }
       
   196 
       
   197 // -----------------------------------------------------------------------------
       
   198 // CNssVasDatabase::AddObserverL
       
   199 // Method to add an observer of the vas database
       
   200 // -----------------------------------------------------------------------------
       
   201 void CNssVASDatabase::AddObserverL( MNssVASDatabaseObserver* /*aObserver*/ )
       
   202     {
       
   203     User::Leave( KErrNotSupported );
       
   204     }
       
   205 
       
   206 // -----------------------------------------------------------------------------
       
   207 // CNssVasDatabase::RemoveObserverL
       
   208 // Method to remove an observer of the vas database
       
   209 // -----------------------------------------------------------------------------
       
   210 TInt CNssVASDatabase::RemoveObserver( MNssVASDatabaseObserver* /*aObserver*/ )
       
   211     {
       
   212 	return KErrNotFound;
       
   213     }
       
   214 
       
   215 // -----------------------------------------------------------------------------
       
   216 // CNssVasDatabase::ModelBankAndLexiconExist
       
   217 // Method to determine if modelbank and lexicon ids exist.
       
   218 // -----------------------------------------------------------------------------
       
   219 TBool CNssVASDatabase::ModelBankAndLexiconExist( TUint32 &aModelBankId, TUint32 &aLexiconId )
       
   220     {
       
   221     TBool ret = EFalse;
       
   222 
       
   223     TRAPD( err, ret = iVasDb->GetModelBankIdLexiconIdL( aModelBankId, aLexiconId ) );
       
   224 
       
   225     // To remove warning
       
   226     if ( err != KErrNone )
       
   227         {
       
   228         }
       
   229 
       
   230     return ret;
       
   231     }
       
   232 
       
   233 //-----------------------------------------------------------------------------
       
   234 //CNssVasDatabase::TagExist
       
   235 //Method to determine if tags exist for a context.
       
   236 //-----------------------------------------------------------------------------
       
   237 TBool CNssVASDatabase::TagExist( CNssContext* aContext )
       
   238     {
       
   239     TBool ret( EFalse );
       
   240 
       
   241     if ( aContext->ContextId() != KNssVASDbDefaultValue )
       
   242         {
       
   243         TRAPD( error, ret = iVasDb->TagExistL( aContext->ContextId() ) );
       
   244         REACT( error, ret = EFalse );
       
   245         } 
       
   246     else
       
   247         {
       
   248         RUBY_DEBUG0( "CNssVASDatabase::TagExist ERROR:Unsaved context" );
       
   249         }
       
   250 
       
   251     return ret;
       
   252     }
       
   253 //-----------------------------------------------------------------------------
       
   254 //CNssVasDatabase::TagCount
       
   255 //Method to get the number of tags for a context.
       
   256 //-----------------------------------------------------------------------------
       
   257 TInt CNssVASDatabase::TagCount( CNssContext* aContext )
       
   258     {
       
   259     TInt ret( KErrNotFound );
       
   260    
       
   261     if ( aContext->ContextId() != KNssVASDbDefaultValue )
       
   262         {
       
   263         TRAPD( error, ret = iVasDb->TagCountL( aContext->ContextId() ) );
       
   264 
       
   265         // To remove warning
       
   266         if ( error != KErrNone )
       
   267             {
       
   268             }
       
   269         }
       
   270 
       
   271     return ret;
       
   272     }
       
   273 
       
   274 // -----------------------------------------------------------------------------
       
   275 // CNssVasDatabase::SaveContext
       
   276 // Method to save a context 
       
   277 // -----------------------------------------------------------------------------
       
   278 TInt CNssVASDatabase::SaveContext( CNssContext* aContext, TInt& aContextId )
       
   279     {
       
   280     TInt ret = KErrNone;
       
   281 
       
   282     aContextId = aContext->ContextId();
       
   283         
       
   284     if ( aContext->ContextId() == KNssVASDbDefaultValue )
       
   285         {
       
   286         TRAP( ret, iVasDb->SaveContextL( *aContext, aContextId ) );
       
   287         }
       
   288     else
       
   289         {
       
   290         TRAP( ret, iVasDb->UpdateContextL( *aContext ) );
       
   291         }
       
   292         
       
   293     return ret;  
       
   294     }
       
   295 
       
   296 // -----------------------------------------------------------------------------
       
   297 // CNssVasDatabase::SaveContextClientData
       
   298 // Method to save the clientdata of a context 
       
   299 // -----------------------------------------------------------------------------
       
   300 TInt CNssVASDatabase::SaveContextClientData( CNssContext* aContext )
       
   301     {
       
   302     TRAPD( error, iVasDb->UpdateContextClientDataL( *aContext ) );
       
   303     return error;
       
   304     }
       
   305 
       
   306 // -----------------------------------------------------------------------------
       
   307 // CNssVasDatabase::GetContext
       
   308 // Method to get a context by name
       
   309 // -----------------------------------------------------------------------------
       
   310 CArrayPtrFlat<CNssContext>* CNssVASDatabase::GetContext( const TDesC& aName )
       
   311     {
       
   312     CArrayPtrFlat<CNssContext>* result = NULL;
       
   313 
       
   314     TRAPD( error, result = iVasDb->GetContextByNameL( aName ) );
       
   315 
       
   316     // To remove warning
       
   317     if ( error != KErrNone )
       
   318         {
       
   319         }
       
   320 
       
   321     return result;
       
   322     }
       
   323 
       
   324 // -----------------------------------------------------------------------------
       
   325 // CNssVasDatabase::GetGlobalContexts
       
   326 // Method to get all global contexts 
       
   327 // -----------------------------------------------------------------------------
       
   328 CArrayPtrFlat<CNssContext>* CNssVASDatabase::GetGlobalContexts()
       
   329     {
       
   330     CArrayPtrFlat<CNssContext>* result = NULL;
       
   331 
       
   332     TRAPD( error, result = iVasDb->GetGlobalContexts() );
       
   333 
       
   334     // To remove warning
       
   335     if ( error != KErrNone )
       
   336         {
       
   337         }
       
   338 
       
   339     return( result );
       
   340     }
       
   341 
       
   342 // -----------------------------------------------------------------------------
       
   343 // CNssVasDatabase::GetAllContexts
       
   344 // Method to get all contexts 
       
   345 // -----------------------------------------------------------------------------
       
   346 //
       
   347 CArrayPtrFlat<CNssContext>* CNssVASDatabase::GetAllContexts()
       
   348     {
       
   349     CArrayPtrFlat<CNssContext>* result = NULL;
       
   350 
       
   351     TRAPD( error, result = iVasDb->GetAllContexts() );
       
   352 
       
   353     // To remove warning
       
   354     if ( error != KErrNone )
       
   355         {
       
   356         }
       
   357 
       
   358     return result;
       
   359     }
       
   360 
       
   361 // -----------------------------------------------------------------------------
       
   362 // CNssVasDatabase::SaveTag
       
   363 // Method to save a tag 
       
   364 // -----------------------------------------------------------------------------
       
   365 TInt CNssVASDatabase::SaveTag( CNssTag* aTag, TInt& aNewId )
       
   366     {
       
   367     TInt ret = KErrNone;
       
   368         
       
   369     if ( aTag->TagId() == KNssVASDbDefaultValue )
       
   370         {
       
   371         TRAP( ret, iVasDb->SaveTagL( *aTag, aNewId ) );
       
   372         }
       
   373     else
       
   374         {
       
   375         // Used to call RNssVasDbSession::UpdateTag
       
   376         // which returned KErrNotSupported
       
   377         ret = KErrNotSupported;
       
   378         }
       
   379 
       
   380     return ret;
       
   381     }
       
   382 
       
   383 // -----------------------------------------------------------------------------
       
   384 // CNssVasDatabase::DeleteTag
       
   385 // Method to delete several tags 
       
   386 // -----------------------------------------------------------------------------
       
   387 //
       
   388 TInt CNssVASDatabase::DeleteTags( const RArray<TUint32>& aTagIdArray )
       
   389     {
       
   390     TRAPD( error, iVasDb->DeleteTagsL( aTagIdArray ) );
       
   391 
       
   392     return error;
       
   393     }
       
   394 
       
   395 // -----------------------------------------------------------------------------
       
   396 // CNssVasDatabase::SaveTag
       
   397 // Method to save several tags 
       
   398 // -----------------------------------------------------------------------------
       
   399 //
       
   400 TInt CNssVASDatabase::SaveTags( RPointerArray<CNssTag>* aTagArray )
       
   401     {
       
   402     RUBY_DEBUG0("CNssVASDatabase::SaveTags");
       
   403         
       
   404     RArray<TInt> tagIdArray;
       
   405     
       
   406     TInt arrayCount = aTagArray ? aTagArray->Count() : 0;
       
   407     if( arrayCount == 0 )
       
   408         {
       
   409         arrayCount++;
       
   410         }
       
   411         
       
   412     CArrayPtrFlat<CNssTag>* ctagArray = new CArrayPtrFlat<CNssTag>( arrayCount );
       
   413     
       
   414     for( TInt i( 0 ); i < aTagArray->Count(); i++ )
       
   415         {
       
   416         TRAPD( error, ctagArray->AppendL( (*aTagArray)[i] ) );
       
   417         if( error != KErrNone )
       
   418             {
       
   419             delete ctagArray;
       
   420             return error;
       
   421             }
       
   422         }
       
   423 
       
   424     TRAPD( error, iVasDb->SaveTagsL( ctagArray, tagIdArray ) );
       
   425     
       
   426     if( error == KErrNone ) 
       
   427     	{
       
   428     	RUBY_ASSERT_DEBUG( ctagArray->Count() == tagIdArray.Count(), 
       
   429     	                   User::Panic( KVasDatabasePanic, __LINE__ ) );
       
   430 
       
   431     	for ( TInt k( 0 ); k < ctagArray->Count(); k++ )
       
   432         	{
       
   433         	(*aTagArray)[k]->SetTagId( tagIdArray[k] );
       
   434         	}
       
   435     	}
       
   436     else 
       
   437     	{
       
   438     	// iSess->SaveTags failed
       
   439     	/** @todo Higher level handler should display some "No memory" label if possible 
       
   440     	Or should we do it here? */
       
   441     	}
       
   442     	
       
   443     delete ctagArray;
       
   444     
       
   445     tagIdArray.Close();
       
   446     	
       
   447     return error;
       
   448     }
       
   449 
       
   450 // -----------------------------------------------------------------------------
       
   451 // CNssVasDatabase::GetTag
       
   452 // Method to get a tag by name
       
   453 // -----------------------------------------------------------------------------
       
   454 MNssTagListArray* CNssVASDatabase::GetTag( const TDesC& aName )
       
   455     {
       
   456     CArrayPtrFlat<CNssTag>* result = NULL;
       
   457 
       
   458     TRAPD( error, result = iVasDb->GetTagL( aName ) );
       
   459 
       
   460     // To remove warning
       
   461     if ( error != KErrNone )
       
   462         {
       
   463         }
       
   464     
       
   465     CArrayPtrFlat<MNssTag>* array = NULL;
       
   466     
       
   467     TInt arrayCount = result ? result->Count() : 0;
       
   468     if( arrayCount == 0 )
       
   469         {
       
   470         arrayCount++;
       
   471         }
       
   472     
       
   473     array = new CArrayPtrFlat<MNssTag>( arrayCount );
       
   474     if( !array )
       
   475         {
       
   476         return NULL;
       
   477         }
       
   478     
       
   479     if( result )
       
   480         {
       
   481         for( TInt i( 0 ); i < result->Count(); i++ )
       
   482             {
       
   483             TRAP( error, array->AppendL( result->At( i ) ) );
       
   484             if( error != KErrNone )
       
   485                 {
       
   486                 return NULL;
       
   487                 }
       
   488             }
       
   489             
       
   490         result->Reset();
       
   491         delete result;   
       
   492         }
       
   493         
       
   494     return array;
       
   495     }
       
   496 
       
   497 // -----------------------------------------------------------------------------
       
   498 // CNssVasDatabase::GetTag
       
   499 // Method to get a tag by context and name
       
   500 // Not fully implemented.
       
   501 // -----------------------------------------------------------------------------
       
   502  
       
   503 MNssTagListArray* CNssVASDatabase::GetTag(CNssContext* /*aContext*/,const TDesC& aName)
       
   504     {
       
   505     return GetTag(aName);
       
   506     }
       
   507 
       
   508 // -----------------------------------------------------------------------------
       
   509 // CNssVasDatabase::GetTag
       
   510 // Method to get a tag by context.
       
   511 // -----------------------------------------------------------------------------
       
   512 //
       
   513 CArrayPtrFlat<MNssTag>* CNssVASDatabase::GetTag( CNssContext* aContext )
       
   514     {
       
   515     CArrayPtrFlat<CNssTag>* result = NULL;
       
   516 
       
   517     TRAPD( error, result =  iVasDb->GetTagL( *aContext ) );
       
   518 
       
   519     // To remove warning
       
   520     if ( error != KErrNone )
       
   521         {
       
   522         }
       
   523     
       
   524     CArrayPtrFlat<MNssTag>* array = NULL;
       
   525     
       
   526     if( result )
       
   527         {
       
   528         array = new CArrayPtrFlat<MNssTag>( result->Count() );
       
   529         if( !array )
       
   530             {
       
   531             return NULL;
       
   532             }
       
   533         
       
   534         for( TInt i( 0 ); i < result->Count(); i++ )
       
   535             {
       
   536             CNssTag* tag = result->At( i );
       
   537             TRAP( error, array->AppendL( result->At( i ) ) );
       
   538             if( error != KErrNone )
       
   539                 {
       
   540                 return NULL;
       
   541                 }
       
   542             }
       
   543             
       
   544         result->Reset();
       
   545         delete result;        
       
   546         }
       
   547     
       
   548     return array;
       
   549     }
       
   550 
       
   551 // -----------------------------------------------------------------------------
       
   552 // CNssVasDatabase::GetTag
       
   553 // Method to get a tag by grammarid and ruleid.
       
   554 // -----------------------------------------------------------------------------
       
   555 //
       
   556 MNssTagListArray* CNssVASDatabase::GetTag( const TInt aGrammarID, const TInt aRuleID )
       
   557     {
       
   558     iTNssGrammarIdRuleId.iGrammarId = aGrammarID;
       
   559     iTNssGrammarIdRuleId.iRuleId    = aRuleID;
       
   560 
       
   561     CArrayPtrFlat<CNssTag>* result = NULL;
       
   562 
       
   563     TRAPD( error, result =  iVasDb->GetTagL( iTNssGrammarIdRuleId ) );
       
   564 
       
   565     // To remove warning
       
   566     if ( error != KErrNone )
       
   567         {
       
   568         }
       
   569     
       
   570     CArrayPtrFlat<MNssTag>* array = NULL;
       
   571     
       
   572     TInt arrayCount = result ? result->Count() : 0;
       
   573     if( arrayCount == 0 )
       
   574         {
       
   575         arrayCount++;
       
   576         }
       
   577     
       
   578     array = new CArrayPtrFlat<MNssTag>( arrayCount );
       
   579     if( !array )
       
   580         {
       
   581         return NULL;
       
   582         }
       
   583     
       
   584     if( result )
       
   585         {
       
   586         for( TInt i( 0 ); i < result->Count(); i++ )
       
   587             {
       
   588             TRAP( error, array->AppendL( result->At( i ) ) );
       
   589             if( error != KErrNone )
       
   590                 {
       
   591                 return NULL;
       
   592                 }
       
   593             }
       
   594             
       
   595         result->Reset();
       
   596         delete result;    
       
   597         }
       
   598     
       
   599     return array;
       
   600     }
       
   601 
       
   602 // -----------------------------------------------------------------------------
       
   603 // CNssVasDatabase::GetTags
       
   604 // Method to get tags by their grammarid and ruleid.
       
   605 // -----------------------------------------------------------------------------
       
   606 //
       
   607 MNssTagListArray* CNssVASDatabase::GetTags( TNssGrammarIdRuleIdListArray& aGrammarIdRuleIds)
       
   608 	{
       
   609 	CArrayPtrFlat<CNssTag>* result = NULL;
       
   610 
       
   611     TRAPD( error, result =  iVasDb->GetTagsL( aGrammarIdRuleIds ) );
       
   612 
       
   613     // To remove warning
       
   614     if ( error != KErrNone )
       
   615         {
       
   616         }
       
   617     
       
   618     CArrayPtrFlat<MNssTag>* array = NULL;
       
   619     
       
   620     TInt arrayCount = result ? result->Count() : 0;
       
   621     if( arrayCount == 0 )
       
   622         {
       
   623         arrayCount++;
       
   624         }
       
   625     
       
   626     array = new CArrayPtrFlat<MNssTag>( arrayCount );
       
   627     if( !array )
       
   628         {
       
   629         return NULL;
       
   630         }
       
   631     
       
   632     if( result )
       
   633         {
       
   634         for( TInt i( 0 ); i < result->Count(); i++ )
       
   635             {
       
   636             TRAP( error, array->AppendL( result->At( i ) ) );
       
   637             if( error != KErrNone )
       
   638                 {
       
   639                 return NULL;
       
   640                 }
       
   641             }
       
   642             
       
   643         result->Reset();
       
   644         delete result;        
       
   645         }
       
   646 
       
   647     return array;
       
   648 	}
       
   649 
       
   650 // -----------------------------------------------------------------------------
       
   651 // CNssVasDatabase::GetTag
       
   652 // Method to get a tag by tagid
       
   653 // -----------------------------------------------------------------------------
       
   654 MNssTagListArray* CNssVASDatabase::GetTag( const TUint32 aTagId )
       
   655     {
       
   656     CArrayPtrFlat<CNssTag>* result = NULL;
       
   657 
       
   658     TRAPD( error, result =  iVasDb->GetTagL( aTagId ) );
       
   659 
       
   660     // To remove warning
       
   661     if ( error != KErrNone )
       
   662         {
       
   663         }
       
   664     
       
   665     CArrayPtrFlat<MNssTag>* array = NULL;
       
   666     
       
   667     TInt arrayCount = result ? result->Count() : 0;
       
   668     if( arrayCount == 0 )
       
   669         {
       
   670         arrayCount++;
       
   671         }
       
   672     
       
   673     array = new CArrayPtrFlat<MNssTag>( arrayCount );
       
   674     if( !array )
       
   675         {
       
   676         return NULL;
       
   677         }
       
   678     
       
   679     if( result )
       
   680         {
       
   681         for( TInt i( 0 ); i < result->Count(); i++ )
       
   682             {
       
   683             TRAP( error, array->AppendL( result->At( i ) ) );
       
   684             if( error != KErrNone )
       
   685                 {
       
   686                 return NULL;
       
   687                 }
       
   688             }
       
   689             
       
   690         result->Reset();
       
   691         delete result;
       
   692         }
       
   693         
       
   694     return array;
       
   695     }
       
   696 
       
   697 // -----------------------------------------------------------------------------
       
   698 // CNssVasDatabase::GetTagList
       
   699 // Method to get tags by rrd int position.
       
   700 // -----------------------------------------------------------------------------
       
   701 MNssTagListArray* CNssVASDatabase::GetTagList( CNssContext* aContext, TInt aNum, TInt aPosition )
       
   702     {    
       
   703     CArrayPtrFlat<CNssTag>* result = NULL;
       
   704 
       
   705     TRAPD( error, result = iVasDb->GetTagL( aContext->ContextId(),
       
   706                                             aNum, aPosition ) );
       
   707 
       
   708     // To remove warning
       
   709     if ( error != KErrNone )
       
   710         {
       
   711         }
       
   712     
       
   713     CArrayPtrFlat<MNssTag>* array = NULL;
       
   714     
       
   715     TInt arrayCount = result ? result->Count() : 0;
       
   716     if( arrayCount == 0 )
       
   717         {
       
   718         arrayCount++;
       
   719         }
       
   720     
       
   721     array = new CArrayPtrFlat<MNssTag>( arrayCount );
       
   722     if( !array )
       
   723         {
       
   724         return NULL;
       
   725         }
       
   726     
       
   727     if( result )
       
   728         {
       
   729         for( TInt i( 0 ); i < result->Count(); i++ )
       
   730             {
       
   731             TRAP( error, array->AppendL( result->At( i ) ) );
       
   732             if( error != KErrNone )
       
   733                 {
       
   734                 return NULL;
       
   735                 }
       
   736             }
       
   737             
       
   738         result->Reset();
       
   739         delete result;        
       
   740         }
       
   741     
       
   742     return array;
       
   743     }
       
   744 
       
   745 // -----------------------------------------------------------------------------
       
   746 // CNssVasDatabase::GetTagList
       
   747 // Method to get tags by rrd text value and position.
       
   748 // -----------------------------------------------------------------------------
       
   749 MNssTagListArray* CNssVASDatabase::GetTagList( CNssContext* aContext, 
       
   750                                                TDesC& aText, TInt aPosition )
       
   751     {
       
   752     CArrayPtrFlat<CNssTag>* result = NULL;
       
   753 
       
   754     TRAPD( error, result = iVasDb->GetTagL( aContext->ContextId(),
       
   755                                             aText, aPosition ) );
       
   756 
       
   757     // To remove warning
       
   758     if ( error != KErrNone )
       
   759         {
       
   760         }
       
   761     
       
   762     CArrayPtrFlat<MNssTag>* array = NULL;
       
   763     
       
   764     TInt arrayCount = result ? result->Count() : 0;
       
   765     if( arrayCount == 0 )
       
   766         {
       
   767         arrayCount++;
       
   768         }
       
   769     
       
   770     array = new CArrayPtrFlat<MNssTag>( arrayCount );
       
   771     if( !array )
       
   772         {
       
   773         return NULL;
       
   774         }
       
   775     
       
   776     if( result )
       
   777         {
       
   778         for( TInt i( 0 ); i < result->Count(); i++ )
       
   779             {
       
   780             TRAP( error, array->AppendL( result->At( i ) ) );
       
   781             if( error != KErrNone )
       
   782                 {
       
   783                 return NULL;
       
   784                 }
       
   785             }
       
   786             
       
   787         result->Reset();
       
   788         delete result;        
       
   789         }
       
   790     
       
   791     return array;
       
   792     }
       
   793 
       
   794 // -----------------------------------------------------------------------------
       
   795 // CNssVasDatabase::DeleteTag
       
   796 // Method to delete a tag.
       
   797 // -----------------------------------------------------------------------------
       
   798 TInt CNssVASDatabase::DeleteTag( CNssTag *aTag )
       
   799     {
       
   800     TInt ret( KErrNotFound );
       
   801    
       
   802     if ( aTag->TagId() != KNssVASDbDefaultValue )
       
   803         {
       
   804         ret = DeleteTag( aTag->TagId() );
       
   805         }
       
   806 
       
   807     return ret;
       
   808     }
       
   809 
       
   810 // -----------------------------------------------------------------------------
       
   811 // CNssVasDatabase::DeleteTag
       
   812 // Method to delete a tag by name.
       
   813 // -----------------------------------------------------------------------------
       
   814 TInt CNssVASDatabase::DeleteTag( const TDesC& aName )
       
   815     {
       
   816     TRAPD( error, iVasDb->DeleteTagL( aName ) );
       
   817 
       
   818     return( error );
       
   819     }
       
   820 
       
   821 // -----------------------------------------------------------------------------
       
   822 // CNssVasDatabase::DeleteTag
       
   823 // Method to delete a tag by key/id.
       
   824 // -----------------------------------------------------------------------------
       
   825 TInt CNssVASDatabase::DeleteTag( const TUint32 aTagId )
       
   826     {
       
   827     TRAPD( error, iVasDb->DeleteTagL( aTagId ) );
       
   828 
       
   829     return( error );
       
   830     }
       
   831 
       
   832 // -----------------------------------------------------------------------------
       
   833 // CNssVasDatabase::DeleteContext
       
   834 // Method to delete context.
       
   835 // -----------------------------------------------------------------------------
       
   836 TInt CNssVASDatabase::DeleteContext( CNssContext* aContext )
       
   837     {
       
   838     return( DeleteContext( aContext->ContextName() ) );
       
   839     }
       
   840 
       
   841 // -----------------------------------------------------------------------------
       
   842 // CNssVasDatabase::DeleteContext
       
   843 // Method to delete context by name.
       
   844 // -----------------------------------------------------------------------------
       
   845 TInt CNssVASDatabase::DeleteContext( const TDesC& aName )
       
   846     {
       
   847     TRAPD( error, iVasDb->DeleteContextL( aName ) );
       
   848 
       
   849     return( error );
       
   850     }
       
   851 
       
   852 // -----------------------------------------------------------------------------
       
   853 // CNssVasDatabase::DeleteContext
       
   854 // Method to all tag references of a context.
       
   855 // -----------------------------------------------------------------------------
       
   856 //
       
   857 CArrayPtrFlat<MNssTagReference>* CNssVASDatabase::GetTagReferenceList( CNssContext* aContext )
       
   858     {
       
   859     TNssTagReferenceListArray* ttagRefArray = NULL;
       
   860    
       
   861     TRAPD( error,
       
   862            ttagRefArray = iVasDb->GetTagReferenceListL( aContext->ContextId() ) );
       
   863 
       
   864     // To remove warning
       
   865     if ( error != KErrNone )
       
   866         {
       
   867         }
       
   868 
       
   869     if ( !ttagRefArray )
       
   870         {
       
   871         return( NULL );
       
   872         }
       
   873 
       
   874     // Convert TNssTagReferences to CNssTagReferences
       
   875     CArrayPtrFlat<MNssTagReference>* result = 
       
   876             new CArrayPtrFlat<MNssTagReference>( KFetchedTagRefListGranularity );
       
   877 
       
   878     if ( !result )
       
   879         {
       
   880         delete ttagRefArray;
       
   881         ttagRefArray = 0;
       
   882         return( NULL );
       
   883         }
       
   884 
       
   885     TRAPD( err, ConvertTNssTagRefToMNssTagRefL( ttagRefArray, result ) );
       
   886 
       
   887     delete ttagRefArray;
       
   888     ttagRefArray = 0;
       
   889 
       
   890     if ( err != KErrNone )
       
   891         {
       
   892         result->ResetAndDestroy();
       
   893         delete result;
       
   894         result = 0;
       
   895         }
       
   896 
       
   897     return( result );
       
   898     }
       
   899 
       
   900 
       
   901 // ------------------------
       
   902 // Private Utility Methods  
       
   903 // -----------------------
       
   904 
       
   905 // -----------------------------------------------------------------------------
       
   906 // CNssVASDatabase::ConvertTNssTagRefToMNssTagRefL
       
   907 //
       
   908 // -----------------------------------------------------------------------------
       
   909 //
       
   910 void CNssVASDatabase::ConvertTNssTagRefToMNssTagRefL( 
       
   911                             TNssTagReferenceListArray* aTNssTagRef, 
       
   912                             CArrayPtrFlat<MNssTagReference>* aCNssTagRef )
       
   913     {
       
   914     CNssTagReference* tagRefPtr=NULL;
       
   915 
       
   916     for ( TInt i( 0 ); i < aTNssTagRef->Count(); i++ )
       
   917         {
       
   918         tagRefPtr = new(ELeave)CNssTagReference();
       
   919         CleanupStack::PushL( tagRefPtr );
       
   920         tagRefPtr->SetTagNameL( (*aTNssTagRef)[i].iTagName );
       
   921         tagRefPtr->SetTagId( (*aTNssTagRef)[i].iTagId );
       
   922 	    aCNssTagRef->AppendL( tagRefPtr );
       
   923 	    CleanupStack::Pop( tagRefPtr );
       
   924         }
       
   925     }
       
   926 
       
   927 // -----------------------------------------------------------------------------
       
   928 // CNssVASDatabase::ConvertDBError
       
   929 //
       
   930 // -----------------------------------------------------------------------------
       
   931 //
       
   932 MNssVASDatabaseClient::TNssVASDBClientReturnCode CNssVASDatabase::ConvertDBError( TInt aError )
       
   933     {
       
   934     MNssVASDatabaseClient::TNssVASDBClientReturnCode failcode = 
       
   935                                         MNssVASDatabaseClient::EVASDBFailure;
       
   936 
       
   937     switch ( aError )
       
   938         {
       
   939         case KErrNone:
       
   940 		    failcode = MNssVASDatabaseClient::EVASDBSuccess;
       
   941         break;
       
   942         case KErrNotFound:
       
   943 		    failcode = MNssVASDatabaseClient::EVASDBItemNotFound;
       
   944 	    break;
       
   945         case KErrNoMemory:
       
   946             failcode = MNssVASDatabaseClient::EVASDBNoMemory;
       
   947         break;
       
   948         case KErrDiskFull:
       
   949 		    failcode = MNssVASDatabaseClient::EVASDBDiskFull;
       
   950 	    break;
       
   951         default:
       
   952             failcode = MNssVASDatabaseClient::EVASDBFailure;//just in case
       
   953         break;
       
   954         }
       
   955 
       
   956     return failcode;
       
   957     }
       
   958 
       
   959 // -----------------------------------------------------------------------------
       
   960 // CNssVASDatabase::GetDefaultModelBankId
       
   961 //
       
   962 // -----------------------------------------------------------------------------
       
   963 //
       
   964 TInt CNssVASDatabase::GetDefaultModelBankId( TUint32& aId )
       
   965     {
       
   966     TRAPD( error, iVasDb->GetDefaultModelBankIdL( aId ) );
       
   967     
       
   968     return error;
       
   969     }
       
   970 
       
   971 // -----------------------------------------------------------------------------
       
   972 // CNssVASDatabase::ResetModelBank
       
   973 //
       
   974 // -----------------------------------------------------------------------------
       
   975 //
       
   976 TInt CNssVASDatabase::ResetModelBank( TUint32 aNewId )
       
   977     {
       
   978     TRAPD( error, iVasDb->ResetModelBankL( aNewId ) );
       
   979     
       
   980     return error;
       
   981     }
       
   982 
       
   983 // -----------------------------------------------------------------------------
       
   984 // CNssVASDatabase::UpdateTagRuleIDs
       
   985 //
       
   986 // -----------------------------------------------------------------------------
       
   987 //
       
   988 TInt CNssVASDatabase::UpdateTagRuleIDs(
       
   989     const RArray<TNssSpeechItem>& aRetrainedTags )
       
   990     {
       
   991     TRAPD( error, iVasDb->UpdateTagRuleIDsL( aRetrainedTags ) );
       
   992     
       
   993     return( error );
       
   994     }