Update contrib.
1 // Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
16 #ifndef __LOGSERVSESSION_H__
17 #define __LOGSERVSESSION_H__
20 #include "LogServDefs.h"
21 #include "LogServDatabaseChangeObserver.h"
24 class TLogClientServerData;
25 class MLogServSessionLifetimeObserver;
26 class MLogServTaskInterface;
27 class MLogServOperationManager;
28 class MLogServBackupInterface;
29 class MLogServDatabaseChangeInterface;
30 class MLogServDatabaseTransactionInterface;
33 class CLogServViewBase;
36 Handles client requests such as "add event", "change event", etc.
37 and dispatches them for execution to the hitters.
38 "Hitter" is an active object which class type is one of (CLogActive derived class):
45 - CLogServViewWindowFetcher;
47 Every client request is processed asynchronously and consists of two IPC calls:
48 - ELogOperationInitiate - the client initiates asynchronous operation that will be executed by
50 - ELogOperationGetResult - after the hitter completes the execution of the requested operation and
51 if there is a result for the client, the client can collect the result issuing this IPC request;
53 The client requests processing is relatively complex and I hope the following "add event" step-by-step
54 example can clarify how the LogEng server works.
55 1. LogEng client issues "add event" request
56 2. The request is handled by CLogServSession::ServiceL()
57 3. CLogServSession::ServiceL() calls CLogServSession::ServiceOperationFunctionL() where the IPC command
58 is identified as ELogOperationInitiate and a new operation is created by calling
59 4. LogServFactory::NewOperationL(). Here the client request type is identified as ELogOperationEventAdd
60 and an instance of CLogServOpEventAdd class is created
61 5. The CLogServOpEventAdd class derives from CLogServOperationBase. The CLogServOperationBase constructor
62 will add the just created operation to a queue of pending operations maintained by an instance of the
63 CLogServOperationQueue class, which implements the MLogServOperationManager interface.
64 The CLogServOpEventAdd instance is added to the queue by calling
65 MLogServOperationManager::OMOperationQueueAdd().
66 6. The CLogServOperationQueue instance is an active object.
67 CLogServOperationQueue::OMOperationQueueAdd() completes itsef and calls SetActive().
68 The execution control is returned to the server side session object. Later, when the active scheduler
69 takes the execution control the CLogServOperationQueue::RunL() will be called.
70 7. CLogServOperationQueue::RunL() will pick up the next pending operation from the queue and calls the
71 operation's StartL() method - CLogServOpEventAdd::StartL().
72 8. CLogServOpEventAdd::StartL() reads the client "add event" data from the message object and calls
73 MLogServTaskInterface::TaskEventAddL() passing the client data as call arguments.
74 9. MLogServTaskInterface, as the class name states, is an interface class implemented by the
75 CLogServDatabaseDriver class.
76 10. CLogServDatabaseDriver::TaskEventAddL() will call the StartL() method of the hitter -
77 CLogAddEvent::StartL().
78 11. CLogAddEvent::StartL() will complete itself and call SetActive().
79 12. The next time when the active scheduler takes the execution control, it will call
80 CLogActive::RunL() --> CLogAddEvent::DoRunL(). And the "add event" request will be executed
81 13. The LogEng client then can complete the "add event" request by calling the server using the
82 ELogOperationGetResult IPC code. CLogServOperationQueue::OMGetResultL() will retrieve the result of the
83 operation and destroy the "add event" oeration.
86 @see CLogServOpEventAdd
87 @see MLogServOperationManager
88 @see CLogServOperationQueue
89 @see MLogServTaskInterface
90 @see CLogServDatabaseDriver
96 class CLogServSession : public CSession2, public MLogServDatabaseChangeObserver
99 CLogServSession(TLogServSessionId aSessionId,
100 MLogServSessionLifetimeObserver& aObserver,
101 MLogServBackupInterface& aBackupInterface,
102 MLogServTaskInterface& aTaskInterface,
103 MLogServOperationManager& aOperationManager,
104 MLogServDatabaseChangeInterface& aChangeInterface,
105 MLogServDatabaseTransactionInterface& aDatabase);
108 inline TLogServSessionId Id() const;
109 CLogServServer& Server() const;
112 void DCOHandleGlobalChangeEventL(const TLogServDatabaseChangeDefinition& aChange);//FROM MLogServDatabaseChangeObserver
114 virtual void ServiceL(const RMessage2& aMessage);
115 virtual void ServiceError(const RMessage2& aMessage,TInt aError);
116 CLogServViewBase& ViewByIdL(TLogViewId aViewId);
117 TInt ViewPositionById(TLogViewId aViewId) const;
118 void ReadClientServerDataL(TLogClientServerData& aClientServerData,
119 const RMessage2& aMessage, TInt aMinOperation, TInt aMaxOperation);
120 void ServiceViewFunctionL(const RMessage2& aMessage);
121 void ServiceOperationFunctionL(const RMessage2& aMessage);
122 void ExtendedNotifyCompleteL(TInt aCompletionCode);
125 TLogServSessionId iSessionId;
126 MLogServSessionLifetimeObserver& iObserver;
127 MLogServBackupInterface& iBackupInterface;
128 MLogServTaskInterface& iTaskInterface;
129 MLogServOperationManager& iOperationManager;
130 MLogServDatabaseChangeInterface& iChangeInterface;
131 MLogServDatabaseTransactionInterface& iDatabase;
132 CLogPackage* iPackage;
134 RPointerArray<CLogServViewBase> iViewList;
135 RMessage2 iExtendedNotificationMessage;
136 RArray<TLogServDatabaseChangeDefinition> iPendingGlobalChanges;
137 TBool iExtendedNotificationRequested;
138 #ifdef LOGGING_ENABLED
139 TName iClientThreadName;
144 inline TLogServSessionId CLogServSession::Id() const
149 #endif//__LOGSERVSESSION_H__