loggingservices/eventlogger/LogServ/inc/logservsession.h
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/loggingservices/eventlogger/LogServ/inc/logservsession.h	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,149 @@
+// Copyright (c) 2002-2009 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 __LOGSERVSESSION_H__
+#define __LOGSERVSESSION_H__
+
+#include <logcli.h>
+#include "LogServDefs.h"
+#include "LogServDatabaseChangeObserver.h"
+
+// Classes referenced
+class TLogClientServerData;
+class MLogServSessionLifetimeObserver;
+class MLogServTaskInterface;
+class MLogServOperationManager;
+class MLogServBackupInterface;
+class MLogServDatabaseChangeInterface;
+class MLogServDatabaseTransactionInterface;
+class CLogServServer;
+class CLogNotify;
+class CLogServViewBase;
+
+/**
+Handles client requests such as "add event", "change event", etc.  
+and dispatches them for execution to the hitters.
+"Hitter" is an active object which class type is one of (CLogActive derived class): 
+ - CLogAddEvent;
+ - CLogGetEvent;
+ - CLogChangeEvent;
+ - CLogDeleteEvent;
+ - CLogChangeConfig;
+ - CLogMaintenance;
+ - CLogServViewWindowFetcher;
+  
+Every client request is processed asynchronously and consists of two IPC calls:
+ - ELogOperationInitiate - the client initiates asynchronous operation that will be executed by 
+   one of the hitters;
+ - ELogOperationGetResult - after the hitter completes the execution of the requested operation and
+   if there is a result for the client, the client can collect the result issuing this IPC request;
+
+The client requests processing is relatively complex and I hope the following "add event" step-by-step
+example can clarify how the LogEng server works.
+ 1. LogEng client issues "add event" request
+ 2. The request is handled by CLogServSession::ServiceL()
+ 3. CLogServSession::ServiceL() calls CLogServSession::ServiceOperationFunctionL() where the IPC command 
+    is identified as ELogOperationInitiate and a new operation is created by calling
+ 4. LogServFactory::NewOperationL(). Here the client request type is identified as ELogOperationEventAdd
+    and an instance of CLogServOpEventAdd class is created
+ 5. The CLogServOpEventAdd class derives from CLogServOperationBase. The CLogServOperationBase constructor
+    will add the just created operation to a queue of pending operations maintained by an instance of the
+    CLogServOperationQueue class, which implements the MLogServOperationManager interface.
+    The CLogServOpEventAdd instance is added to the queue by calling 
+    MLogServOperationManager::OMOperationQueueAdd().
+ 6. The CLogServOperationQueue instance is an active object. 
+    CLogServOperationQueue::OMOperationQueueAdd() completes itsef and calls SetActive().
+    The execution control is returned to the server side session object. Later, when the active scheduler
+    takes the execution control the CLogServOperationQueue::RunL() will be called.
+ 7. CLogServOperationQueue::RunL() will pick up the next pending operation from the queue and calls the
+    operation's StartL() method - CLogServOpEventAdd::StartL().
+ 8. CLogServOpEventAdd::StartL() reads the client "add event" data from the message object and calls
+    MLogServTaskInterface::TaskEventAddL() passing the client data as call arguments.
+ 9. MLogServTaskInterface, as the class name states, is an interface class implemented by the 
+    CLogServDatabaseDriver class.
+10. CLogServDatabaseDriver::TaskEventAddL() will call the StartL() method of the hitter - 
+    CLogAddEvent::StartL().
+11. CLogAddEvent::StartL() will complete itself and call SetActive().
+12. The next time when the active scheduler takes the execution control, it will call 
+    CLogActive::RunL() --> CLogAddEvent::DoRunL(). And the "add event" request will be executed
+13. The LogEng client then can complete the "add event" request by calling the server using the 
+    ELogOperationGetResult IPC code. CLogServOperationQueue::OMGetResultL() will retrieve the result of the
+    operation and destroy the "add event" oeration. 
+    
+@see LogServFactory    
+@see CLogServOpEventAdd
+@see MLogServOperationManager
+@see CLogServOperationQueue
+@see MLogServTaskInterface
+@see CLogServDatabaseDriver
+@see CLogActive
+@see CLogAddEvent
+
+@internalComponent
+*/
+class CLogServSession : public CSession2, public MLogServDatabaseChangeObserver
+	{
+public:
+	CLogServSession(TLogServSessionId aSessionId, 
+                    MLogServSessionLifetimeObserver& aObserver, 
+                    MLogServBackupInterface& aBackupInterface, 
+                    MLogServTaskInterface& aTaskInterface, 
+                    MLogServOperationManager& aOperationManager, 
+                    MLogServDatabaseChangeInterface& aChangeInterface, 
+                    MLogServDatabaseTransactionInterface& aDatabase);
+	~CLogServSession();
+
+    inline TLogServSessionId Id() const;
+    CLogServServer& Server() const;
+	
+private:
+	void DCOHandleGlobalChangeEventL(const TLogServDatabaseChangeDefinition& aChange);//FROM MLogServDatabaseChangeObserver
+	void CreateL();
+	virtual void ServiceL(const RMessage2& aMessage);
+	virtual void ServiceError(const RMessage2& aMessage,TInt aError);
+	CLogServViewBase& ViewByIdL(TLogViewId aViewId);
+	TInt ViewPositionById(TLogViewId aViewId) const;
+    void ReadClientServerDataL(TLogClientServerData& aClientServerData, 
+    		const RMessage2& aMessage, TInt aMinOperation, TInt aMaxOperation);
+	void ServiceViewFunctionL(const RMessage2& aMessage);
+	void ServiceOperationFunctionL(const RMessage2& aMessage);
+	void ExtendedNotifyCompleteL(TInt aCompletionCode);
+
+private:
+	TLogServSessionId iSessionId;
+	MLogServSessionLifetimeObserver& iObserver;
+	MLogServBackupInterface& iBackupInterface;
+	MLogServTaskInterface& iTaskInterface;
+	MLogServOperationManager& iOperationManager;
+	MLogServDatabaseChangeInterface& iChangeInterface;
+	MLogServDatabaseTransactionInterface& iDatabase;
+	CLogPackage* iPackage;
+	CLogNotify* iNotify;
+	RPointerArray<CLogServViewBase> iViewList;
+	RMessage2 iExtendedNotificationMessage;
+	RArray<TLogServDatabaseChangeDefinition> iPendingGlobalChanges;
+	TBool iExtendedNotificationRequested;
+#ifdef LOGGING_ENABLED
+	TName iClientThreadName;
+#endif
+
+	};
+
+inline TLogServSessionId CLogServSession::Id() const
+	{
+	return iSessionId;
+	}
+
+#endif//__LOGSERVSESSION_H__