diff -r 588ad05716be -r c15b68295419 devicediagnosticsfw/diagresultsdb/server/inc/diagresultsdbstore.h --- a/devicediagnosticsfw/diagresultsdb/server/inc/diagresultsdbstore.h Sat May 01 10:33:10 2010 +0530 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,453 +0,0 @@ -/* -* Copyright (c) 2007-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: Permanent File Store for diagnostics test records. -* libraries : -* -*/ - - -#ifndef DIAGRESULTSDBSTORE_H -#define DIAGRESULTSDBSTORE_H - -//System includes -#include //CPermanentFileStore -#include //Rfs, RFile -#include - -class CDiagResultsDatabaseItem; -class CDiagResultsDbTestRecord; -class CDiagResultsDbTestRecordHandle; -class TDiagResultsDatabaseTestRecordInfo; -class CDiagResultsDbRecordEngineParam; - -/** -* An interface that must be implemented in order to call -* ExistingRecordsAsyncL that is an asynchronous method. -* -* @since S60 v5.0 -**/ -class MRecordLoadingObserver - { -public: - /** - * Returns an array of test records. Contains all test records from a - * single database file. - * - * @param aError Indicates if there were any errors. - * @param aArray An array of test records. Ownership is transferred. - **/ - virtual void ExistingRecordsL( TInt aError, - RPointerArray* aArray ) = 0; - - }; - -/** -* An interface that must be implemented in order to call CompleteRecordAsyncL. -* -* @since S60 v5.0 -**/ -class MRecordCompletionObserver - { -public: - - /** - * This is called when test record is completed. - * - * @param aError Symbian error code or KErrNone. - **/ - virtual void CompletedRecordL( TInt aError ) = 0; - }; - -/** -* Permanent file store class that manipulates results database file. -* Database files are saved under server's private directory. -* For example epoc32\WINSCW\C\private\10282cd9\ in WINSCW. -* Provides functions to load, save, compact and cleanup data. -* -* Files have format [UID].dat e.g. [21234563].dat -* -* Stream Ids of the test record handle are stored into the root stream. -* Handles contain the stream ids to the test results. -* -* Implementation uses 3 kinds of streams: -* 1) root stream -* 2) Test record handle stream -* 3) Test result stream -* 4) Last results buffer (buffer for overflowing test results) -* -* In order to retrieve a test result, we must first know which record -* is needed and then ask from the handle where test result is. -* Of course we can browse all test records, because root stream -* contains stream ids into test record handles. -* -* @since S60 v5.0 -**/ -class CDiagResultsDbStore : public CActive - { -public: - - /** - * Destructor - **/ - ~CDiagResultsDbStore(); - - /** - * NewL. - * - * @param aUid UID of the database file. This class manipulates only one - * database file at a time. If multiple database files needs - * to be open, use another instance. - * @return New object. - **/ - static CDiagResultsDbStore* NewL( TUid aUid ); - static CDiagResultsDbStore* NewLC( TUid aUid ); - - /** - * Create and return a new record. Ownership is transferred. - * - * @return a new test record. - **/ - CDiagResultsDbTestRecordHandle* CreateNewRecordL( - CDiagResultsDbRecordEngineParam* aEngineParam ); - - /** - * Write test record into the database. - * - * @param aHandle The test record to be written into the database. - * @return KErrNone or symbian error code. - **/ - TInt CompleteRecord( CDiagResultsDbTestRecordHandle& aHandle ); - - /** - * Write one test item into the DB. - * - * @param aCommit Indicates should we commit the store. - * @param aHandle Handle that is updated to contain the item. - * @param aTestItem An item to be added. - * - * @return Symbian error code or KErrNone. - **/ - TInt CompleteTestResult( TBool aCommit, - CDiagResultsDbTestRecordHandle& aHandle, - CDiagResultsDatabaseItem& aTestItem ); - - /** - * Search database for a test record handle. - * Handle does not contain test results directly. It only contains - * stream ids to the test results and general record info. - * - * @param aUid test record is searched based on the uid. - * @return The found test record or NULL. - **/ - CDiagResultsDbTestRecordHandle* OpenExistingHandleL( TUid aUid ); - - - /** - * Search database for a test record. - * - * @param aUid test record is searched based on the uid. - * @param aReadOnly indicates should we allow writing. - * @return The found test record or NULL. - */ - CDiagResultsDbTestRecord* OpenExistingRecordL( TUid aUid, - TBool aReadOnly ); - - /** - * Opens a single database item. - * @param aId Stream id that represents the item. - * - * @return The found item or NULL. - **/ - CDiagResultsDatabaseItem* OpenExistingTestResultL( TStreamId aId ); - - /** - * Returns all record infos. Client is responsible for deleting the array. - * - * @return Record info array. - **/ - RArray* ExistingRecordInfosL(); - - /** - * Retrieve all test records from the database asynchronously. - * - * @param aObserver Observer is notified after test records have - * been loaded. - **/ - void ExistingRecordsAsyncL( MRecordLoadingObserver& aObserver ); - - - - /** - * Open last results buffer. It contains the test results that would have - * been otherwise deleted. These are needed when all last results are - * retrieved. Use with CleanUpDatabaseUseLastResultsBufferL. - * - * @return Test record. - **/ - CDiagResultsDbTestRecord* OpenExistingLastResultsBufferL(); - - /** - * Compacts database to have only necessary information. This should be - * done as often as necessary after writing. Compacting should not be - * done after reading! - * However note that this operation could take a long time. - **/ - void CompactDatabase(); - - /** - * Cleanup database. Used deletion algorithm is taken from the - * Central Repository. - * - * @param aCommit ETrue commits the store. - **/ - void CleanUpDatabaseL( TBool aCommit ); - - /** - * Read available test record handle uids. - * - * @param aUids Contains available test record handle uids. - **/ - void RecordUidsL( RArray& aUids ); - -protected: //From CActive - - /** - * Called from CActive::Cancel. - **/ - virtual void DoCancel(); - - /** - * Asynchronous service function. - **/ - virtual void RunL(); - - /** - * Called if error happens in RunL. - **/ - virtual TInt RunError(TInt aError); - -private: - - /** - * Cleanup database to have only certain amount of test records - * inside per each database file. - * - * @param aCommit ETrue commits the store. - **/ - void CleanUpDatabaseNoLastResultsL( TBool aCommit ); - - /** - * Cleanup database and move some of the test results into the - * last results buffer. This function guarantees that the DB - * keeps last results. CleanUpDatabase does not do that. - * - * @param aCommit ETrue commits the store. - **/ - void CleanUpDatabaseUseLastResultsBufferL( TBool aCommit ); - - /** - * Read all stream ids from the root stream. - * - * @param aIds StreamId array. - **/ - void ReadRootStreamL( RArray& aIds ); - - /** - * Create empty root stream. - * - * @param aStore Root stream is created into this store. - **/ - void CreateEmptyRootStreamL( CPermanentFileStore& aStore ); - - /** - * Replace root stream with an array. - * - * @param aArray Array that replaces any existing root stream. - **/ - void ReplaceRootStreamL( RArray& aArray ); - - /** - * Write test record into the database file. - * - * @param aCompletedRecord is the record closed/completed or not. - * @param aCommit Commit the store or not. - * @param aTestRecord The test record to be written into the file. - **/ - void DoCompleteRecordL( CDiagResultsDbTestRecordHandle& aHandle ); - - /** - * Complete test result i.e. write it into the store. - * @param aHandle Handle to be written. - * @param aTestItem Contains test results that are written into the store. - **/ - void DoCompleteTestResultL( TBool aCommit, - CDiagResultsDbTestRecordHandle& aHandle, - CDiagResultsDatabaseItem& aTestItem ); - - - /** - * Constructor. - * - * @param aDbUid Database file uid. - **/ - CDiagResultsDbStore( TUid aDbUid ); - - /** - * ConstructL. - **/ - void ConstructL(); - - /** - * Complete own request is needed in some cases because this class uses - * CActive to partition tasks into smaller pieces. This function completes - * TRequestStatus so that the RunL is called. - **/ - void CompleteOwnRequest(); - - //State of this class. These are used only in asynchronous methods. - enum EState - { - ENotRunning, - EGetRootStream, - EGetRecord, - ERecordsReady, - }; - - enum EDeletionAlgorithm - { - EMaxRecordCountAlgorithm, - ELastResultsAlgorithm, - }; - - /** - * Write handle into the store. Handle knows where test results are. - * @param aHandle The handle that is written into the store. - **/ - void WriteHandleIntoDbL( CDiagResultsDbTestRecordHandle& aHandle ); - - - /** - * Append one ID into the root stream. - * @param aId ID to be added. - **/ - void AppendRootStreamL( TStreamId& aId ); - - - /** - * Deletes the oldest handle from the store. - * - * @param aIds Root stream. - **/ - void DeleteOldestHandleL( RArray& aIds ); - - /** - * Delete handle and its test results. - * - * @param aIndex Index of the handle in the root stream. - * @param aIds Root stream. - * - **/ - void DeleteHandleL( TInt aIndex, RArray& aIds ); - - /** - * Create last results buffer. It can be used to store test results - * that would be deleted otherwise. - **/ - void CreateLastResultsBufferStreamL(); - - /** - * Open test record handle and its test results. - * - * @param aId Handle root stream ID. - * @param aRecord Returned test record. - * @param aHandle Returned test record handle. - **/ - void OpenExistingRecordAndHandleL( TStreamId aId, - CDiagResultsDbTestRecord*& aRecord, - CDiagResultsDbTestRecordHandle*& aHandle ); - - /** - * Check last results buffer and add test results into it if needed. - * - * @param aIds Root stream. - **/ - ///@@@KSR: changes for Codescanner error val = High - //void CheckOverflowingTestResults( RArray& aIds ); - void CheckOverflowingTestResultsL( RArray& aIds ); - - /** - * Return maximum file size defined in the Central Repository. - * This can be used to prevent a DB file from using too much disk space. - * - * @return Maximum file size in bytes. - **/ - TInt GetMaximumFileSizeL(); - - /** - * Return the deletion algorithm defined in the central repository. - * - * @return The type of the deletion algorithm. - **/ - TInt GetDeletionAlgorithmL(); - - /** - * Get maximum file size from the central repository and check the file size. - * - * @param aRfs Opened file server session. - * @param aFileName File name of the DB file. - * @param aFileSize Size of the DB file in bytes. - **/ - void CheckMaximumFileSizeLimitL( RFs& aRfs, - const TDesC& aFileName, - TInt aFileSize ); - -private: // Data - - // Store that is owned by this class. Performs many file manipulation operations. - CPermanentFileStore* iStore; - - // File DB uid. [UID].dat - TUid iDbUid; - - // File server session - RFs iRfs; - - // The database file. - RFile iFile; - - // Loading observer to be notified async. - MRecordLoadingObserver* iLoadingObserver; - - // Completion observer (notified async). - MRecordCompletionObserver* iCompletionObserver; - - // Pointer to test record arrays. Used in async methods. - RPointerArray* iRecordArray; - - // Contains available record ids. Used in async methods. - RArray* iRecordIds; - - // Used in async methods to remember what record was loaded. - TInt iRecordNumber; - - // Contains the test record to be completed (Used only in async methods). - CDiagResultsDbTestRecord* iTestRecord; - - // State of the asynchronous operation. - EState iState; - - EDeletionAlgorithm iDeletionAlgorithm; - }; - -#endif // DIAGRESULTSDBSTORE_H