diff -r 000000000000 -r bf1d17376201 srsf/nssvasapi/nssvasdb/inc/nssvascvasdb.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srsf/nssvasapi/nssvasdb/inc/nssvascvasdb.h Thu Dec 17 08:46:30 2009 +0200 @@ -0,0 +1,566 @@ +/* +* Copyright (c) 2004-2006 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: +* +*/ + + +#ifndef CNSSVASDB_H +#define CNSSVASDB_H + +#include +#include +#include "nssvascvasdbsrvdef.h" +#include "nssvasdbkonsts.h" +#include "nssvascvasdbdataexchanger.h" +#include "nssvastvasdbcreator.h" +#include "nssvascspeechitembuilder.h" +#include "nssvasccontextbuilder.h" + +#include "nssvasctag.h" + + +class CNssVasBackupObserver; + + +// CLASS DECLARATION + +/** +* +* The CNssVasDb class definition. +* +* @lib NssVASApi.lib +* @since 2.8 +*/ +NONSHARABLE_CLASS( CNssVasDb ) : public CBase + { +public: + + /** + * Two-phased constructor. + * @since 2.0 + * @param aClient - client thread + * @param aServer - vasdb server + */ + static CNssVasDb* NewL( CNssContextBuilder& aContextBuilder, + CNssSpeechItemBuilder& aSpeechItemBuilder ); + + /** + * Destructor. + * @since 2.0 + * @param + * @return void + */ + ~CNssVasDb(); + +public: + + /** + * Read a context from the database. If context with this name is not present, + * leave with KErrNotFound. + * @since 2.8 + * @param aName the name of the context + * @return CArrayFixFlat A List of contexts. + */ + CArrayPtrFlat* GetContextByNameL( const TDesC& aName ); + + /** + * Read all global contexts from the database. Contexts have a flag, which + * tells if they are global or not. + * Global context = "Context, which is recognized when the user presses + * the voice key" + * Currently, SIND names and command words are global. + * @since 2.8 + * @return CArrayFixFlat A List of contexts. + */ + CArrayPtrFlat* GetGlobalContexts(); + + /** + * Read all global contexts from the database. + * @since 2.8 + * @return CArrayFixFlat A List of contexts. + */ + CArrayPtrFlat* GetAllContexts(); + + /** + * Create a new database. + * @since 2.8 + * @return none + */ + void CreateDatabaseL(); + + /** + * Open database. + * @since 2.8 + * @return none + */ + void OpenDatabaseL(); + + /** + * Close database. + * @since 2.8 + * @return Symbian-wide error codes + */ + TInt CloseDatabase(); + + /** + * Get model bank id and lexicon id from some context. All contexts + * have the same model bank id. + * @since 2.8 + * @param aModelBankId Place to store model bank ID. + * @param aLexiconId Place to store lexicon ID. + * @return ETrue if successful (leaves, if not successful) + */ + TBool GetModelBankIdLexiconIdL( TUint32& aModelBankId, TUint32& aLexiconId ); + + /** + * Check if a context has tags or not. + * @since 2.8 + * @param aContextId context id + * @return ETrue if there are tags, EFalse if not. + */ + TBool TagExistL( TInt aContextId ); + + /** + * How many tags there are in this context? + * @since 2.8 + * @param aContextId context id + * @return The number of tags + */ + TInt TagCountL( TInt aContextId ); + + /** + * Saves a context. When a context is save, a unique Context ID + * is assigned to it. This ID is returned in aNewContextId reference variable. + * @since 2.8 + * @param aContext The context + * @param aNewContextId Place to store the newly assigned context ID. + * @return none + */ + void SaveContextL( CNssContext& aContext, TInt& aNewContextId ); + + /** + * Updates the information of an existing context. + * @since 2.8 + * @param aContext The context + * @return none + */ + void UpdateContextL( CNssContext& aContext ); + + /** + * Updates the client data of an existing context. + * @since 2.8 + * @param aContext The context + * @return none + */ + void UpdateContextClientDataL( CNssContext& aContext ); + + /** + * Saves a tag. When a tag is saved, a unique ID is assigned to it + * @since 2.8 + * @param aContext The context + * @return none + */ + void SaveTagL( CNssTag& aTag, TInt& aNewId ); + + /** + * Get tag reference list. A tag reference contains only the name and the ID. + * @since 2.8 + * @param aContextId The context + * @return Tag references for all tags in the context. + */ + TNssTagReferenceListArray* GetTagReferenceListL( TInt aContextId ); + + /** + * Get a tag, given the grammar ID and rule ID of the tag. + * Used when resolving recognition result. + * @since 2.8 + * @param aGrammarIdRuleId Dedicated struct to pass gramamr ID and rule ID. + * @return Tag with the given rule ID. + */ + CArrayPtrFlat* GetTagL( TNssGrammarIdRuleId aGrammarIdRuleId ); + + /** + * Get a list of tags tag, given the list of grammar IDs and rule IDs of + * the tags. + * Used when resolving recognition result. + * @since 2.8 + * @param aGrammarIdRuleIds Array of gramamr ID and rule ID pairs + * @return List of tags with the given rule ID and grammar ID. + */ + CArrayPtrFlat* GetTagsL( TNssGrammarIdRuleIdListArray& aGrammarIdRuleIds ); + + /** + * Get a tag, given the recognition phrase. + * @since 2.8 + * @param aName Recognition phrase of the tag + * @return Tag with the given rule ID. + */ + CArrayPtrFlat* GetTagL( const TDesC& aName ); + + /** + * Get a list of tags based on RRD integer data. + * The client can save 5 integer for each tag. This function gets those tags, + * which have value aNum in position aPosition. + * @since 2.8 + * @param aContextId Context ID + * @param aNum The number we search for. + * @param aPosition RRD integer position. There are 5 slots, numbered 0-4. + * @return List of tags + */ + CArrayPtrFlat* GetTagL( TInt aContextId, TInt aNum, TInt aPosition ); + + /** + * Get a list of tags based on RRD text data. + * The client can save 5 strings for each tag. This function gets those tags, + * for which the text data at slot aPosition matches to aText. + * @since 2.8 + * @param aContextId Context ID + * @param aText The text we search for. + * @param aPosition RRD text position. There are 5 slots, numbered 0-4. + * @return List of tags + */ + CArrayPtrFlat* GetTagL( TInt aContextId, const TDesC& aText, TInt aPosition ); + + /** + * Gets all tags from this context. + * @since 2.8 + * @param aContext A context + * @return List of tags + */ + CArrayPtrFlat* GetTagL( const CNssContext& aContext ); + + /** + * Get a tag, given a tag ID. + * @since 2.8 + * @param aTagId tag id + * @return List of tags + */ + CArrayPtrFlat* GetTagL( TUint32 aTagId ); + + /** + * Method to get the default model bank id + * @since 2.8 + * @param aId reference where to put the model bank Id + * @return symbian-wide error code + */ + void GetDefaultModelBankIdL( TUint32& aId ); + + /** + * Modifies the context table so that all contexts start using + * the new id as their model bank id. + * @since 2.8 + * @param aNewId new model bank id + * @return symbian-wide error code + */ + void ResetModelBankL( TUint32 aNewId ); + + /** + * Deletes a context. + * @since 2.8 + * @param aName Name of the context to be deleted. + * @return none + */ + void DeleteContextL( const TDesC& aName ); + + /** + * Deletes a tag. + * @since 2.8 + * @param aName Name of the tag to be deleted. + * @return none + */ + void DeleteTagL( const TDesC& aName ); + + /** + * Deletes a tag. + * @since 2.8 + * @param aTagId The unique ID of the tag. + * @return none + */ + void DeleteTagL( TUint32 aTagId ); + + /** + * Deletes a tag without starting a transaction. + * @since 2.8 + * @param aTagId Tag id + * @return none + */ + void DeleteTagInsideTransactionL( TUint32 aTagId ); + + /** + * Deletes a list of tags. + * @since 2.8 + * @param aTagArray A list of tags + */ + void DeleteTagsL( const RArray& aTagIdArray ); + + /** + * Updates the rule ids of some tags. + * The rule ID changes, if an already trained tag is retrained. + * @since 2.8 + * @param aRetrainedTags Tags which need an update for rule ID. + * @return TInt Success status. + */ + void UpdateTagRuleIDsL( const RArray& aRetrainedTags ); + + /** + * Saves a list of tags. + * @since 2.8 + * @param aTagArray A list of trained tags + * @param aTagIdArray The newly assigned Tag IDs are placed here. + */ + void SaveTagsL( CArrayPtrFlat* aTagArray, RArray& aTagIdArray ); + + /** + * Permit transactions. Used when e.g. backup or restore begins + * @since 3.1 + */ + void LockTransactionsL(); + + /** + * Allow transactions. Used when e.g. backup or restore ends + * @since 3.1 + */ + void UnlockTransactionsL(); + +private: + + /* + * First phase constructor. + */ + CNssVasDb( CNssContextBuilder& contextBuilder, + CNssSpeechItemBuilder& speechItemBuilder ); + + /* + * Second phase constructor. + */ + void ConstructL(); + + /* + * Get a list of contexts. + * The pipeline for the public GetContextL variants is: + * (1) Turn parameters into an SQL query + * (2) Call this function + */ + CArrayPtrFlat* GetContextL( const TDesC& aSqlStatement ); + + /* + * "workhorse" function for the the previous one. The previous function + * takes care of locking and unlocking the database. + */ + CArrayPtrFlat* GetContextInsideTransactionL( const TDesC& aSqlQuery ); + + /* + * Reads a list of contexts after query. RDbView object is created + * as a result of a query. + */ + void FillContextListArrayL( RDbView& aView, CArrayPtrFlat& aContextList ); + + /* + * Get the RRD data for a tag. The RRD table is separate from tag table. + */ + void FillRRDL( TUint32 aTagId, CNssRRD& aRRD ); + + /* + * Get a speech item after a query (which created the RDbView object). + * In addition to core tags data, it fetces the context and the RRD data + * form separate arrays. + */ + void FillSpeechItemL( RDbView& aView, CNssSpeechItem& aSpeechItem, TInt& aContextId ); + + /* + * Get a context after query. + */ + void FillContextL( RDbView& aView, CNssContext &aContext ); + + /* + * (1) Makes a tag out of context, speech item and RRD data. + * (2) Adds the tag to aTagList. + */ + void FillTagListArrayL( CArrayPtrFlat& aTagList, + CNssContext* aContext, + CNssSpeechItem* aSpeechItem, + CNssRRD* aRRD ); + + /* + * Saves a context. + */ + void SaveContextL( CNssContext* aContext, TInt& aNewContextId ); + + /* + * Saves RRD data. + */ + void SaveRRDL(CNssRRD* aRRD); + + /* + * Saves a tags. When a tag is saved for the first time, an ID is assigned + * to it. This ID is stored to aTagId. + */ + void SaveTagL( CNssTag* aTag, TInt& aTagId); + + /* + * The public GetTagL / GetTagListL variants make an SQL query from their + * parameters and call this function to do the rest. + */ + CArrayPtrFlat* GetTagListByQueryL(const TDesC& aSqlQuery); + + /* + * Deletes RRD data + */ + void DeleteRRDL( TUint32 aTagId ); + + /* + * Update an existing tag. Locks database. + */ + void UpdateTagL( CNssTag& aTag ); + + /* + * Update an existing tag. + */ + void UpdateTagInTransactionL( CNssTag& aTag ); + + /* + * Updates an existing context. Does not lock database. + */ + void DoUpdateContextL( CNssContext& aContext ); + + /* + * Updates the client data of an existing context. Does not lock database. + */ + void DoUpdateContextClientDataL( CNssContext& aContext ); + + /* + * Updates RRD data. Does not lock database. + */ + void UpdateRRDL( CNssRRD& aRRD ); + + /* + * Updates speech item. Does not lock database. + */ + void UpdateSpeechItemL( CNssSpeechItem& aSpeechItem ); + + /* + * Gets a tag list from view. A mid-phase between GetTagListByQuery and + * the lower functions (those which get RRD and speech item). + */ + void GetTagListFromViewL( RDbView& aView, + CArrayPtrFlat* aTagList, + CNssContext* aContext ); + + /* + * Locks the database with Begin(). + */ + TInt StartTransaction(); + + /* + * Commits a transaction. + * If the client has locked the database (Lock()), keeps the database locked + * by calling Begin() immediately again. + * @param "TBool aCompact" ETrue if compact should be called + */ + TInt CommitTransaction( TBool aCompact ); + + /* + * Rolls back a transaction. + * If the client has locked the database (Lock()), keeps the database locked + * by calling Begin() immediately again. + */ + TInt RollbackTransaction(); + + /* + * Commits or rolls back according to success status, which is one of the + * symbian-wide error codes. + * @param aCompactIfSuccess If ETrue and commit is going to happen, compacts + * the DB after the Commit + */ + void CommitIfSuccess( RDbDatabase aDatabase, TInt aSuccess, TBool aCompactIfCommit = EFalse ); + + /* + * This method is used to create a TCleanupOperation, which rolls back + * transaction. This way, rollback can be pushed to the cleanup stack. + */ + static void RollbackCleanupFunction( TAny* aArg ); + + /* + * Reserves disk space. Leaves (KErrDiskFull), if not + * enough space. + */ + void ReserveDiskSpaceL( TInt aRequestSize ); + + /* + * Release the previously reserved disk space + */ + void ReleaseDiskSpace(); + + /** + * Updates the information of an existing context inside already opened transaction. + * @since 3.0 + * @param aContext The context + * @return none + */ + void UpdateContextInsideTransactionL( CNssContext& aContext ); + + /** + * Creates a cleanup item and pushes it to the cleanup stack. In case of a + * leave, PopAndDestroying this item will call RollbackCleanupFunction + */ + void CreatePushRollbackItemLC(); + +private: + // Data + + // DB session + RDbs iDbSession; + + // DB + RDbNamedDatabase iDatabase; + + // Have we yet opened the DB file + TBool iClientHasOpenedDatabase; + + // Used to check drive space + TInt iDrive; + + // Used to store an SQL query. + TBuf iSQLStatement; + + // Used to create the database + TNssVasDbCreator iDbcreator; + + // Is the databas locked to us + TBool iLocked; + + // Should the database be relocked after commit + // to ensure it stays locked for us + TBool iShouldBeLocked; + + // Mutex which makes sure that multiple processes don't get the exclusive + // write lock at the same time + RMutex iMutex; + + // Critical section is used in locking transactions inside one object + RCriticalSection iCriticalSection; + + // backup and restore observer + CNssVasBackupObserver* iBackupObserver; + + // For creating empty CNssContext-objects + CNssContextBuilder& iContextBuilder; + + // For creating empty CNssSpeechItem-objects + CNssSpeechItemBuilder& iSpeechItemBuilder; + }; + +#endif // __CVASDB_H +