devicediagnosticsfw/diagresultsdb/server/inc/diagresultsdbsession.h
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 09:07:52 +0200
changeset 0 b497e44ab2fc
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* 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 <e32cmn.h> //TUid
#include <e32base.h>

/**
* 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<CDiagResultsDbTestRecord>* 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<CDiagResultsDbTestRecord>* 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<TUid>& aUidArray, 
                         RPointerArray<CDiagResultsDbTestRecord>& aTestRecordArray, 
                         RPointerArray<CDiagResultsDatabaseItem>& aResultsArray );
        
    /**
    * Reads uids that are searched from the buffer and creates the test result array.
    *
    * @param aArray Contains all test records.
    **/                         
    void FindLastResultsL( RPointerArray<CDiagResultsDbTestRecord>& 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<TUid>& aUidArray,                           
                         RPointerArray<CDiagResultsDatabaseItem>& 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<CDiagResultsDatabaseItem>* 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