diff -r b183ec05bd8c -r 19bba8228ff0 devicediagnosticsfw/diagresultsdb/server/inc/diagresultsdbsession.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/devicediagnosticsfw/diagresultsdb/server/inc/diagresultsdbsession.h Wed Sep 01 12:27:42 2010 +0100 @@ -0,0 +1,273 @@ +/* +* 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: Symbian OS server session. +* libraries : +* +*/ + + +#ifndef DIAGRESULTSDBSESSION_H +#define DIAGRESULTSDBSESSION_H + +class CDiagResultsDbServer; +class CDiagResultsDbTestRecord; + +#include "diagresultsdbstore.h" + +//System includes +#include //TUid +#include + +/** +* Server session. Represents a session (version 2) +* for a client thread on the server-side. +* +* @since S60 v5.0 +**/ +class CDiagResultsDbSession : + public CSession2, + public MRecordLoadingObserver + { +public: + + /** + * Destructor. + **/ + ~CDiagResultsDbSession(); + + /** + * NewL. + * + * @param aServer Server object. + * @return DB session. + **/ + static CDiagResultsDbSession* NewL(CDiagResultsDbServer * aServer); + +public: // From CSession + + /** + * Handles the servicing of a client request that has been + * passed to the server. + * + * @param aMessage The message containing the details of the client request. + **/ + void ServiceL(const RMessage2 &aMessage); + +public: // New methods + + /** + * Handle the client message. + * + * @param aMessage Details of the client request. + * @return ETrue if client request is asynchronous, EFalse is synchronous. + **/ + TBool DispatchMessageL(const RMessage2 &aMessage); + + /** + * Create a new subsession. + * + * @param aTestRecord Test record that represents the subsession. + **/ + void CreateSubsessionL(CDiagResultsDbTestRecordHandle* aTestRecordHandle, + TBool aReadonly ); + + /** + * Close the subsession. + **/ + void CloseSubsessionL(); + + /** + * Returns the Uid of the results database file. + * + * @return TUid of the database file. + **/ + TUid DbUid() const; + + /** + * Returns the results store. + * + * @return Results store. + **/ + CDiagResultsDbStore& Store(); + + /** + * Helper function to read buffer from client side. + * + * @param aMessage Details of the client request. + * @param aParam Message argument number. + * @param aBuffer Buffer that is filled with client side data. + **/ + void ReadBufferL(const RMessage2& aMessage, TInt aParam, + CBufFlat*& aBuffer); + + /** + * Subsession must tell to the session has it written data. + **/ + void HasWritten(); + + /** + * Indicates has the session wrote any data. + * @return ETrue if session has wrote data, EFalse otherwise. + **/ + TBool SessionHasWritten() const; + + /** + * Turn off compacting. For example KErrDiskFull causes compacting to fail. + **/ + void DoNotCompact(); + + +public: //From MRecordLoadingObserver + + /** + * 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. + **/ + void ExistingRecordsL( TInt aError, + RPointerArray* aArray ); + +protected: // service functions for client requests + // Look at DiagResultsDatabaseCommon.h for the client requests. + + void ConnectSubsessionL( const RMessage2 &aMessage ); + + void CreateNewRecordL ( const RMessage2 &aMessage ); + + void GetLastRecordL( const RMessage2 &aMessage ); + + void GetLastNotCompletedRecordL( const RMessage2 &aMessage ); + + void GetRecordListL( const RMessage2 &aMessage ); + + void GetRecordInfoListL( const RMessage2 &aMessage ); + + void GetLastResultsL( const RMessage2 &aMessage ); + + void CancelLastResultsL(const RMessage2 &aMessage); + + void GetSingleLastResultL( const RMessage2 &aMessage ); + +private: + + /** + * Constructor. + * + * @param aServer Server object. + **/ + CDiagResultsDbSession(CDiagResultsDbServer * aServer); + + /** + * ConstructL. + **/ + void ConstructL(); + + /** + * Find database item from the array based on uid. + * + * @param aUid Uid of the database item. + * @param aArray Pointer array that contains test records. + * @return Database item or NULL if not found. + **/ + CDiagResultsDatabaseItem* FindDatabaseItemL( + TUid aUid, + RPointerArray* aArray ); + + /** + * Search for the newest test results. + * + * @param aUidArray Contains the uids to be searched. + * @param aTestRecordArray Contains all test records. + * @param aResultsArray Contains the found results or NULL if the test + * result was not found. + **/ + void SearchLastResultsL( + const CArrayFixFlat& aUidArray, + RPointerArray& aTestRecordArray, + RPointerArray& aResultsArray ); + + /** + * Reads uids that are searched from the buffer and creates the test result array. + * + * @param aArray Contains all test records. + **/ + void FindLastResultsL( RPointerArray& aArray ); + + /** + * Read last results buffer if there would be any additional test results. + * + * @param aUidArray Test results to be searched. + * @param aResultsArray results array. Found test results are appended into this. + **/ + void CheckLastResultsBufferL( + const CArrayFixFlat& aUidArray, + RPointerArray& aResultsArray ); + + /** + * Read last results buffer if there would be any additional test results. + * + * @param aTestUid UID to be searched from the last buffer. + * @param aResult Returns the last result if found. Otherwise NULL. + **/ + void CheckLastResultsBufferL( + TUid aTestUid, + CDiagResultsDatabaseItem*& aResult ); + + +private: // Data + + // Server pointer. + CDiagResultsDbServer *iServer; + + // Counts subsession. + CObjectCon* iSubsessionContainer; + + // Index to the container. + CObjectIx* iSubsessionIndex; + + // Client request details. + RMessage2 iMsg; + + //Indicates are we handling InitiateGetLastResults or InitiateGetLastResult + TInt iLastResultCommand; + + // This is needed when InitiateGetLastResults is called. + RMessage2 iLastResultsMsg; + + // This is needed when InitiateGetLastResult is called. + RMessage2 iLastSingleResultsMsg; + + // Database uid. + TUid iDbUid; + + // Contains the permanent file store. + CDiagResultsDbStore* iStore; + + // GetLastResultsL operation needs this. + RPointerArray* iBufferedLastResults; + + // Contains buffered test result. + // + CDiagResultsDatabaseItem* iBufferedSingleResult; + + // Indicates has this session wrote any data. + TBool iHasWrittenData; + + // Dynamic flat buffer for transmitting data across IPC. + CBufFlat* iBuffer; + }; + +#endif // DIAGRESULTSDBSESSION_H