--- a/srsf/nssvasapi/nssvasdb/src/nssvasctagmgr.cpp Mon Jan 18 20:20:30 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,751 +0,0 @@
-/*
-* 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: CNssTagMgr implements the MNssTagMgr interface. In addition, it also provides
-* methods for internal use by VAS components.
-*
-*/
-
-
-// includes
-#include "nssvasctagmgr.h"
-#include "nssvasccontextmgr.h"
-#include "nssvascvasdatabase.h"
-#include "nssvascspeechitembuilder.h"
-#include "rubydebug.h"
-
-_LIT( KTagMgrPanic, "tagmgr.cpp" );
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::CNssTagMgr
-// C++ default constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CNssTagMgr::CNssTagMgr()
-: CActive( CActive::EPriorityStandard )
- {
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::CNssTagMgr
-// C++ overloaded constructor can NOT contain any code, that
-// might leave.
-// -----------------------------------------------------------------------------
-//
-CNssTagMgr::CNssTagMgr(CNssVASDatabase* aVasDatabase, CNssContextMgr *aContextManager)
-: CActive( CActive::EPriorityStandard ), iTagList( 0 ), iTagRefList( 0 )
- {
- iVasDatabase = aVasDatabase;
- iContextManager = aContextManager;
- iState = ENone;
- }
-
-// destructor
-CNssTagMgr::~CNssTagMgr()
- {
- Cancel();
-
- if( iTagList )
- {
- iTagList->ResetAndDestroy();
- delete iTagList;
- }
- if ( iSpeechItemBuilder )
- {
- delete iSpeechItemBuilder;
- iSpeechItemBuilder = NULL;
- }
-
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::NewL
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CNssTagMgr* CNssTagMgr::NewL( CNssVASDatabase* aVasDatabase, CNssContextMgr *aContextManager )
- {
- CNssTagMgr* self = NewLC(aVasDatabase, aContextManager);
- CleanupStack::Pop( self );
- return self;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::NewLC
-// Two-phased constructor.
-// -----------------------------------------------------------------------------
-//
-CNssTagMgr* CNssTagMgr::NewLC( CNssVASDatabase* aVasDatabase, CNssContextMgr *aContextManager )
- {
- CNssTagMgr* self = new(ELeave) CNssTagMgr(aVasDatabase, aContextManager);
- CleanupStack::PushL( self );
- self->ConstructL();
- return ( self );
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::ConstructL
-// EPOC constructor.
-// -----------------------------------------------------------------------------
-//
-void CNssTagMgr::ConstructL()
- {
- iSpeechItemBuilder = CNssSpeechItemBuilder::NewL( iVasDatabase );
-
- CActiveScheduler::Add( this );
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::CreateTagL
-// creates a new tag, taking in the context for the tag
-// -----------------------------------------------------------------------------
-//
-MNssTag* CNssTagMgr::CreateTagL( MNssContext* aContext )
- {
- if ( !aContext )
- {
- User::Leave( KErrArgument );
- }
-
- CNssContext *context = ((CNssContext*)(aContext))->CopyL();
- CleanupStack::PushL(context);
- CNssSpeechItem *speechItem = iSpeechItemBuilder->CreateEmptySpeechItemL(*context);
- CleanupStack::PushL(speechItem);
- CNssRRD* rrd = CNssRRD::NewL();
- CleanupStack::PushL(rrd);
- CNssTag *tag = new (ELeave) CNssTag(context, rrd, speechItem);
- CleanupStack::Pop(rrd);
- CleanupStack::Pop(speechItem);
- CleanupStack::Pop(context);
- return tag;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::CreateTagL
-// gets a tag list from VAS DB for a given context
-// -----------------------------------------------------------------------------
-//
-TInt CNssTagMgr::GetTagList( MNssGetTagClient* aTagClient,MNssContext* aContext )
- {
- if ( IsActive() || !aTagClient || !aContext )
- {
- return KErrGeneral;
- }
-
- iState = EGetTagClient;
- iGetTagClient = aTagClient;
-
- if( iTagList )
- {
- iTagList->ResetAndDestroy();
- delete iTagList;
- iTagList = NULL;
- }
-
- iTagList = iVasDatabase->GetTag((CNssContext*)(aContext));
-
- if ( !iTagList || iTagList->Count() == 0 )
- {
- return KErrGeneral;
- }
-
- TRequestStatus* pRS = &iStatus;
- User::RequestComplete(pRS, KErrNone);
- SetActive();
-
- return KErrNone;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::GetTagList
-// gets a tag list from VAS DB for a given name
-// -----------------------------------------------------------------------------
-//
-TInt CNssTagMgr::GetTagList( MNssGetTagClient* aTagClient,
- MNssContext* aContext, const TDesC& aName )
- {
- if ( IsActive() || !aTagClient ||
- !aContext || aName.Length() == 0 )
- {
- return KErrGeneral;
- }
-
- iState = EGetTagClient;
- iGetTagClient = aTagClient;
-
- if( iTagList )
- {
- iTagList->ResetAndDestroy();
- delete iTagList;
- iTagList = NULL;
- }
-
- iTagList = iVasDatabase->GetTag((CNssContext*)(aContext), aName);
-
- if ( !iTagList || iTagList->Count() == 0 )
- {
- return KErrGeneral;
- }
-
- TRequestStatus* pRS = &iStatus;
- User::RequestComplete(pRS, KErrNone);
- SetActive();
-
- return KErrNone;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::DeleteTag
-// deletes a tag from VAS
-// -----------------------------------------------------------------------------
-//
-TInt CNssTagMgr::DeleteTag( MNssDeleteTagClient* aTagClient, MNssTag* aTag )
- {
- if ( IsActive() || !aTagClient || !aTag )
- {
- return KErrGeneral;
- }
-
- iState = EDeleteTagClient;
- iDeleteTagClient = aTagClient;
- iLocalTag = (CNssTag*) (aTag);
- iLocalSpeechItem = (CNssSpeechItem*) (iLocalTag->SpeechItem());
-
- TInt ret( KErrNone );
-
- MNssCoreSrsDBEventHandler::TNssSrsDBResult srsDBResult =
- MNssCoreSrsDBEventHandler::EVasSuccess;
- TRAPD( err, (srsDBResult =
- iLocalSpeechItem->NSSBeginDeleteFromSrs( iDeleteTagClient, iLocalTag )) );
-
- if(err != KErrNone || srsDBResult != MNssCoreSrsDBEventHandler::EVasSuccess)
- {
- ret = KErrGeneral;
- }
-
- return ret;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::SaveTag
-// saves a tag to VAS
-// -----------------------------------------------------------------------------
-//
-TInt CNssTagMgr::SaveTag( MNssSaveTagClient* aTagClient, MNssTag* aTag )
- {
- if ( IsActive() || !aTagClient || !aTag )
- {
- return KErrGeneral;
- }
-
- // Client can save only trained tags.
- if ( aTag->SpeechItem()->TrainedType() == TNssVasCoreConstant::EVasNotTrained )
- {
- return KErrNotReady;
- }
-
- iSaveTagClient = aTagClient;
-
- iState = ESaveTagClient;
-
- /********************* Debug rule ID and grammar ID ***********************/
- /*
- RFs session;
- RFile file;
- _LIT( aFileName, "c:\\documents\\savetag.txt" );
-
- session.Connect();
- if ( file.Open( session, aFileName, EFileWrite ) != KErrNone )
- {
- if ( file.Create( session, aFileName, EFileWrite ) != KErrNone )
- {
- User::Panic( _L("SDContrlDebug"), __LINE__ );
- }
- }
-
- TInt size = 0;
- file.Seek( ESeekEnd, size );
-
- TBuf8<100> debugBuf;
- debugBuf.AppendFormat( _L8("Saving tag with RID:%d, GID:%d\n"), ((CNssSpeechItem*)aTag->SpeechItem())->RuleID(),((CNssContext*)aTag->Context())->GrammarId() );
- file.Write( debugBuf );
-
- file.Close();
- session.Close();
- */
- /**************************************************************************/
- TInt ret( KErrNone );
- CNssTag* tag = (CNssTag*)aTag;
- TInt err;
-
- iLocalSpeechItem = (CNssSpeechItem*)tag->SpeechItem();
- err = iLocalSpeechItem->NSSBeginSaveToSrs( aTagClient, tag );
-
- if ( err != KErrNone )
- {
- ret = KErrGeneral;
- }
-
- return ret;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::GetTag
-// get tag from VAS DB based on grammar id and rule id
-// -----------------------------------------------------------------------------
-//
-CNssTag* CNssTagMgr::GetTag( TUint32 aGrammarId, TUint32 aRuleId )
- {
- MNssTag* result = 0;
-
- if( iTagList )
- {
- iTagList->ResetAndDestroy();
- delete iTagList;
- iTagList = NULL;
- }
-
- iTagList = iVasDatabase->GetTag( aGrammarId, aRuleId );
-
- // If there are tags in the list, return the first one.
- if ( iTagList != 0 )
- {
- if ( iTagList->Count() > 0 )
- {
- result = (*iTagList)[0];
-
- iTagList->Delete( 0 );
-
- __ASSERT_DEBUG( iTagList->Count() == 0, User::Panic( KTagMgrPanic, __LINE__ ) );
- }
-
- // Release the memory
- iTagList->ResetAndDestroy();
- delete iTagList;
- iTagList = 0;
- }
-
- // Cast is safe, since only CNssTag implements MNssTag.
- return( STATIC_CAST( CNssTag*, result ) );
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::GetTags
-// get tags from VAS DB based on theirgrammar id and rule id
-// -----------------------------------------------------------------------------
-MNssTagListArray* CNssTagMgr::GetTags( TNssGrammarIdRuleIdListArray& aGrammarIdRuleIds)
- {
- MNssTagListArray* result = iVasDatabase->GetTags( aGrammarIdRuleIds );
- return result;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::VASDatabaseComplete
-// call back from CNssVASDatabase
-// -----------------------------------------------------------------------------
-//
-void CNssTagMgr::VASDatabaseComplete( CArrayPtrFlat<CNssContext>* /*aContextList*/,
- CArrayPtrFlat<CNssTag>* /*aTagList*/,
- CArrayPtrFlat<CNssTagReference>* /*aTagRefList*/,
- MNssVASDatabaseClient::TNssVASDBClientReturnCode /*aCode*/ )
- {
- User::Panic( KTagMgrPanic, __LINE__ );
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::HandleSaveSrsDBCompleted
-// call back from SRS DB
-// -----------------------------------------------------------------------------
-//
-void CNssTagMgr::HandleSaveSrsDBCompleted()
- {
- TInt newTagId;
-
- CNssSpeechItem* item = (CNssSpeechItem*)iLocalTag->SpeechItem();
-
- // Save tag to VAS.
- TInt ret = iVasDatabase->SaveTag( iLocalTag, newTagId );
-
- // If VAS DB saving failed, roll back Plugin DB changes.
- if ( ret != KErrNone )
- {
- CNssSpeechItem* item = (CNssSpeechItem*)iLocalTag->SpeechItem();
- item->RollbackSrsChanges();
-
- if(iSaveTagClient)
- {
- iSaveTagClient->SaveTagCompleted( ret );
- }
- return;
- }
-
- MNssCoreSrsDBEventHandler::TNssSrsDBResult srsret = item->CommitSrsChanges();
-
- if ( srsret == EVasSuccess )
- {
- if(iSaveTagClient)
- {
- iSaveTagClient->SaveTagCompleted( KErrNone );
- }
- }
- else{
- if(iSaveTagClient)
- {
- iSaveTagClient->SaveTagCompleted( KErrGeneral );
- }
- }
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::HandleDeleteSrsDBCompleted
-// call back from SRS DB
-// -----------------------------------------------------------------------------
-//
-void CNssTagMgr::HandleDeleteSrsDBCompleted()
- {
- iState = ENone;
-
- TInt ret = iVasDatabase->DeleteTag( iLocalTag );
-
- // trained, not saved -case
- if ( ret != KErrNone && ret != KErrNotFound )
- {
- iLocalSpeechItem->RollbackSrsChanges();
-
- iDeleteTagClient->DeleteTagCompleted( ret );
- return;
- }
-
- if ( iLocalSpeechItem->CommitSrsChanges() != MNssCoreSrsDBEventHandler::EVasSuccess )
- {
- iDeleteTagClient->DeleteTagCompleted( KErrGeneral );
- return;
- }
-
- iDeleteTagClient->DeleteTagCompleted( KErrNone );
- return;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::HandleResetSrsDBCompleted
-// call back from SRS DB
-// -----------------------------------------------------------------------------
-//
-void CNssTagMgr::HandleResetSrsDBCompleted()
- {
- // Should never be called
- RUBY_DEBUG0( "CNssTagMgr::HandleResetSrsDBCompleted - ERROR" );
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::HandleSrsDBError
-// call back from SRS DB
-// -----------------------------------------------------------------------------
-//
-void CNssTagMgr::HandleSrsDBError( MNssCoreSrsDBEventHandler::TNssSrsDBResult /*aResult*/ )
- {
-
- switch(iState)
- {
- case EDeleteTagClient:
- iState = ENone;
- iDeleteTagClient->DeleteTagCompleted( KErrGeneral );
- break;
- case ESaveTagClient:
- iState = ENone;
- iSaveTagClient->SaveTagCompleted( KErrGeneral );
- break;
- default:
- break;
- }
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::CNssTagListToMNssTagListConvertorL
-// utility function for CNssTag list to MNssTag list conversion, and call back to client
-// -----------------------------------------------------------------------------
-//
-void CNssTagMgr::CNssTagListToMNssTagListConvertorL(CArrayPtrFlat<CNssTag>* aSourceList)
- {
- CArrayPtrFlat<MNssTag> *destinationList = new (ELeave) CArrayPtrFlat<MNssTag>(1);
- CleanupStack::PushL(destinationList);
- for(TInt i = 0; i < aSourceList->Count(); i++)
- {
- destinationList->AppendL( (MNssTag*) ((*aSourceList)[i]) );
- }
- aSourceList->Reset();
- delete aSourceList;
- CleanupStack::Pop(destinationList);
- iGetTagClient->GetTagListCompleted(destinationList, KErrNone);
-#ifndef __SIND_RD_BREAK_PHONEBOOK_COMPATIBILITY
- iGetTagClient->GetTagListCompleted( destinationList );
-#endif // __SIND_RD_BREAK_PHONEBOOK_COMPATIBILITY
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::CancelGetTag
-// cancel get tag for inter-comp clients
-// -----------------------------------------------------------------------------
-//
-void CNssTagMgr::CancelGetTag()
- {
- iInterCompTagMgrClient = NULL;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::TagCount
-// gets a tag count from VAS DB for a given context
-// -----------------------------------------------------------------------------
-//
-TInt CNssTagMgr::TagCount( MNssContext* aContext )
- {
- return iVasDatabase->TagCount( (CNssContext*)aContext );
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::Tag
-// gets a tag from VAS DB based on rrd int value and position
-// -----------------------------------------------------------------------------
-//
-TInt CNssTagMgr::GetTagList(MNssGetTagClient* aTagClient,MNssContext* aContext,
- TInt aNum,TInt aPosition)
- {
- if ( IsActive() || !aTagClient || !aContext
- || aPosition < 0 )
- {
- return KErrGeneral;
- }
- iState = EGetTagClient;
- iGetTagClient = aTagClient;
-
- if( iTagList )
- {
- iTagList->ResetAndDestroy();
- delete iTagList;
- iTagList = NULL;
- }
-
- iTagList = iVasDatabase->GetTagList( (CNssContext*)aContext, aNum, aPosition );
-
- if ( !iTagList || iTagList->Count() == 0 )
- {
- return KErrGeneral;
- }
-
- TRequestStatus* pRS = &iStatus;
- User::RequestComplete(pRS, KErrNone);
- SetActive();
-
- return KErrNone;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::GetTagList
-// gets a tag from VAS DB based on rrd text value and position
-// -----------------------------------------------------------------------------
-//
-TInt CNssTagMgr::GetTagList( MNssGetTagClient* aTagClient,MNssContext* aContext,
- TDesC& aText,TInt aPosition )
- {
- if ( IsActive() || !aTagClient || !aContext ||
- aText.Length() == 0 || aPosition < 0 )
- {
- return KErrGeneral;
- }
-
- iState = EGetTagClient;
- iGetTagClient = aTagClient;
-
- if( iTagList )
- {
- iTagList->ResetAndDestroy();
- delete iTagList;
- iTagList = NULL;
- }
-
- iTagList = iVasDatabase->GetTagList( (CNssContext*)aContext, aText, aPosition );
-
- if ( !iTagList || iTagList->Count() == 0 )
- {
- return KErrGeneral;
- }
-
- TRequestStatus* pRS = &iStatus;
- User::RequestComplete(pRS, KErrNone);
- SetActive();
-
- return KErrNone;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::GetTagReferenceList
-// get a list of tag references from VAS DB based on a context
-// -----------------------------------------------------------------------------
-//
-TInt CNssTagMgr::GetTagReferenceList( MNssGetTagReferenceClient* aTagRefClient,
- MNssContext* aContext)
- {
- if ( IsActive() || !aTagRefClient || !aContext )
- {
- return KErrGeneral;
- }
-
- iState = EGetTagReferenceClient;
- iGetTagReferenceClient = aTagRefClient;
-
- if ( iTagRefList )
- {
- iTagRefList->ResetAndDestroy();
- delete iTagRefList;
- iTagRefList = NULL;
- }
-
- iTagRefList = iVasDatabase->GetTagReferenceList( (CNssContext*)aContext );
-
- if ( !iTagRefList || iTagRefList->Count() == 0 )
- {
- return KErrGeneral;
- }
-
- TRequestStatus* pRS = &iStatus;
- User::RequestComplete(pRS, KErrNone);
- SetActive();
-
- return KErrNone;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::GetTag
-// get a tag from VAS DB based on tagreference (using the TagId of the tagreference)
-// -----------------------------------------------------------------------------
-//
-TInt CNssTagMgr::GetTag(MNssGetTagClient* aTagClient,MNssTagReference* aTagReference)
- {
- CNssTagReference* ctagRef = (CNssTagReference*) aTagReference;
-
- if ( IsActive() || !aTagClient || !aTagReference )
- {
- return KErrGeneral;
- }
-
- iState = EGetTagClient;
- iGetTagClient = aTagClient;
-
- if( iTagList )
- {
- iTagList->ResetAndDestroy();
- delete iTagList;
- iTagList = NULL;
- }
-
- iTagList = iVasDatabase->GetTag( ctagRef->TagId() );
-
- if ( !iTagList || iTagList->Count() == 0 )
- {
- return KErrGeneral;
- }
-
- TRequestStatus* pRS = &iStatus;
- User::RequestComplete(pRS, KErrNone);
- SetActive();
-
- return KErrNone;
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::CNssTagRefListToMNssTagRefListConvertorL
-// utility function for CNssTagReference list to MNssTagReference list conversion,
-// and call back to client
-// -----------------------------------------------------------------------------
-//
-void CNssTagMgr::CNssTagRefListToMNssTagRefListConvertorL(
- CArrayPtrFlat<CNssTagReference>* aSourceList )
- {
-
- CArrayPtrFlat<MNssTagReference> *destinationList =
- new (ELeave) CArrayPtrFlat<MNssTagReference>(1);
- CleanupStack::PushL(destinationList);
- for(TInt i = 0; i < aSourceList->Count(); i++)
- {
- destinationList->AppendL( (MNssTagReference*) ((*aSourceList)[i]) );
- }
- aSourceList->Reset();
- delete aSourceList;
- CleanupStack::Pop(destinationList);
- iGetTagReferenceClient->GetTagReferenceListCompleted( destinationList,
- KErrNone );
- }
-
-
-/************ ACTIVE OBJECT *************/
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::DoCancel
-//
-// -----------------------------------------------------------------------------
-//
-void CNssTagMgr::DoCancel()
- {
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::RunL
-//
-// -----------------------------------------------------------------------------
-//
-void CNssTagMgr::RunL()
- {
- switch (iState)
- {
- case ESaveTagClient:
- iSaveTagClient->SaveTagCompleted( KErrNone );
- break;
-
- case EGetTagClient:
- {
- MNssTagListArray* ret = iTagList;
- iTagList = 0;
-
- iGetTagClient->GetTagListCompleted( ret, KErrNone );
-#ifndef __SIND_RD_BREAK_PHONEBOOK_COMPATIBILITY
- iGetTagClient->GetTagListCompleted( ret );
-#endif // __SIND_RD_BREAK_PHONEBOOK_COMPATIBILITY
- }
- break;
-
- case EGetTagReferenceClient:
- {
- CArrayPtrFlat<MNssTagReference>* ret = iTagRefList;
- iTagRefList = 0;
-
- iGetTagReferenceClient->GetTagReferenceListCompleted( ret, KErrNone );
- }
- break;
-
- default:
- User::Panic( KTagMgrPanic, __LINE__ );
- }
- }
-
-// -----------------------------------------------------------------------------
-// CNssTagMgr::RunError
-//
-// -----------------------------------------------------------------------------
-//
-TInt CNssTagMgr::RunError(TInt /*aError*/)
-{
- Cancel();
-
- return KErrNone;
-}