devicediagnosticsfw/diagresultsdb/server/inc/diagresultsdbsession.h
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/devicediagnosticsfw/diagresultsdb/server/inc/diagresultsdbsession.h	Thu Dec 17 09:07:52 2009 +0200
@@ -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 <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